From webhook-mailer at python.org Mon Feb 1 00:15:55 2021 From: webhook-mailer at python.org (ned-deily) Date: Mon, 01 Feb 2021 05:15:55 -0000 Subject: [Python-checkins] bpo-42688: Fix ffi alloc/free when using external libffi on macos (GH-23868) (GH-23888) Message-ID: https://github.com/python/cpython/commit/7e729978fa08a360cbf936dc215ba7dd25a06a08 commit: 7e729978fa08a360cbf936dc215ba7dd25a06a08 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ned-deily date: 2021-02-01T00:15:23-05:00 summary: bpo-42688: Fix ffi alloc/free when using external libffi on macos (GH-23868) (GH-23888) Automerge-Triggered-By: GH:ronaldoussoren (cherry picked from commit b3c77ecbbe0ad3e3cc6dbd885792203e9e6ec858) Co-authored-by: erykoff files: M Modules/_ctypes/malloc_closure.c diff --git a/Modules/_ctypes/malloc_closure.c b/Modules/_ctypes/malloc_closure.c index 4f220e42ff3fc..788bae6a96c7f 100644 --- a/Modules/_ctypes/malloc_closure.c +++ b/Modules/_ctypes/malloc_closure.c @@ -91,11 +91,15 @@ static void more_core(void) /* put the item back into the free list */ void Py_ffi_closure_free(void *p) { -#if USING_APPLE_OS_LIBFFI && HAVE_FFI_CLOSURE_ALLOC +#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; @@ -105,10 +109,14 @@ void Py_ffi_closure_free(void *p) /* return one item from the free list, allocating more if needed */ void *Py_ffi_closure_alloc(size_t size, void** codeloc) { -#if USING_APPLE_OS_LIBFFI && HAVE_FFI_CLOSURE_ALLOC +#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) From webhook-mailer at python.org Mon Feb 1 02:37:48 2021 From: webhook-mailer at python.org (serhiy-storchaka) Date: Mon, 01 Feb 2021 07:37:48 -0000 Subject: [Python-checkins] bpo-43016: Fix test_curses on platform without cursesw (GH-24405) (GH-24407) Message-ID: https://github.com/python/cpython/commit/304f9d2622fa4fd0833d60d31ddf7321a6a8141b commit: 304f9d2622fa4fd0833d60d31ddf7321a6a8141b branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: serhiy-storchaka date: 2021-02-01T09:37:29+02:00 summary: bpo-43016: Fix test_curses on platform without cursesw (GH-24405) (GH-24407) (cherry picked from commit a1e9a1e120a11c563e166c15721169184c802f8b) Co-authored-by: Serhiy Storchaka files: M Lib/test/test_curses.py diff --git a/Lib/test/test_curses.py b/Lib/test/test_curses.py index f5287e0143fcb..c1ad23b456e20 100644 --- a/Lib/test/test_curses.py +++ b/Lib/test/test_curses.py @@ -239,13 +239,21 @@ def test_refresh_control(self): 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) - stdscr.addch('\u20ac') + 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) @@ -257,19 +265,25 @@ def test_output_character(self): stdscr.echochar('A') stdscr.echochar(b'A') stdscr.echochar(65) - self.assertRaises(OverflowError, stdscr.echochar, '\u20ac') + 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') - func('????') + 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) @@ -280,7 +294,11 @@ def test_output_string(self): stdscr.move(0, 0) func('1234', 3) func(b'1234', 3) - func('\u0661\u0662\u0663\u0664', 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) @@ -470,7 +488,7 @@ def test_background(self): win = curses.newwin(5, 15, 5, 2) win.addstr(0, 0, 'Lorem ipsum') - self.assertEqual(win.getbkgd(), 0) + self.assertIn(win.getbkgd(), (0, 32)) # bkgdset() win.bkgdset('_') From webhook-mailer at python.org Mon Feb 1 02:37:48 2021 From: webhook-mailer at python.org (serhiy-storchaka) Date: Mon, 01 Feb 2021 07:37:48 -0000 Subject: [Python-checkins] bpo-43016: Fix test_curses on platform without cursesw (GH-24405) (GH-24408) Message-ID: https://github.com/python/cpython/commit/aab84a58063e68cb7ff5f7b8d96c431200d0e340 commit: aab84a58063e68cb7ff5f7b8d96c431200d0e340 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: serhiy-storchaka date: 2021-02-01T09:37:12+02:00 summary: bpo-43016: Fix test_curses on platform without cursesw (GH-24405) (GH-24408) (cherry picked from commit a1e9a1e120a11c563e166c15721169184c802f8b) Co-authored-by: Serhiy Storchaka files: M Lib/test/test_curses.py diff --git a/Lib/test/test_curses.py b/Lib/test/test_curses.py index f47c9876eed88..7dd0695aa7277 100644 --- a/Lib/test/test_curses.py +++ b/Lib/test/test_curses.py @@ -239,13 +239,21 @@ def test_refresh_control(self): 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) - stdscr.addch('\u20ac') + 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) @@ -257,19 +265,25 @@ def test_output_character(self): stdscr.echochar('A') stdscr.echochar(b'A') stdscr.echochar(65) - self.assertRaises(OverflowError, stdscr.echochar, '\u20ac') + 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') - func('????') + 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) @@ -280,7 +294,11 @@ def test_output_string(self): stdscr.move(0, 0) func('1234', 3) func(b'1234', 3) - func('\u0661\u0662\u0663\u0664', 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) @@ -470,7 +488,7 @@ def test_background(self): win = curses.newwin(5, 15, 5, 2) win.addstr(0, 0, 'Lorem ipsum') - self.assertEqual(win.getbkgd(), 0) + self.assertIn(win.getbkgd(), (0, 32)) # bkgdset() win.bkgdset('_') From webhook-mailer at python.org Mon Feb 1 05:42:36 2021 From: webhook-mailer at python.org (markshannon) Date: Mon, 01 Feb 2021 10:42:36 -0000 Subject: [Python-checkins] bpo-42990: Further refactoring of PyEval_ functions. (GH-24368) Message-ID: https://github.com/python/cpython/commit/0332e569c12d3dc97171546c6dc10e42c27de34b commit: 0332e569c12d3dc97171546c6dc10e42c27de34b branch: master author: Mark Shannon committer: markshannon date: 2021-02-01T10:42:03Z summary: bpo-42990: Further refactoring of PyEval_ functions. (GH-24368) * Further refactoring of PyEval_EvalCode and friends. Break into make-frame, and eval-frame parts. * Simplify function vector call using new _PyEval_Vector. * Remove unused internal functions: _PyEval_EvalCodeWithName and _PyEval_EvalCode. * Don't use legacy function PyEval_EvalCodeEx. files: A Misc/NEWS.d/next/Core and Builtins/2021-01-30-11-31-44.bpo-42990.69h_zK.rst M Include/cpython/frameobject.h M Include/eval.h M Include/internal/pycore_ceval.h M Objects/call.c M Objects/frameobject.c M Objects/funcobject.c M Python/bltinmodule.c M Python/ceval.c diff --git a/Include/cpython/frameobject.h b/Include/cpython/frameobject.h index f162e2465f3a4..5a19c006d9153 100644 --- a/Include/cpython/frameobject.h +++ b/Include/cpython/frameobject.h @@ -71,8 +71,8 @@ PyAPI_FUNC(PyFrameObject *) PyFrame_New(PyThreadState *, PyCodeObject *, PyObject *, PyObject *); /* only internal use */ -PyFrameObject* _PyFrame_New_NoTrack(PyThreadState *, PyCodeObject *, - PyObject *, PyObject *, PyObject *); +PyFrameObject* +_PyFrame_New_NoTrack(PyThreadState *, PyFrameConstructor *, PyObject *); /* The rest of the interface is specific for frame objects */ diff --git a/Include/eval.h b/Include/eval.h index 2c1c2d0549a9a..eda28df8f6528 100644 --- a/Include/eval.h +++ b/Include/eval.h @@ -18,16 +18,6 @@ PyAPI_FUNC(PyObject *) PyEval_EvalCodeEx(PyObject *co, PyObject *kwdefs, PyObject *closure); #ifndef Py_LIMITED_API -PyAPI_FUNC(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); - PyAPI_FUNC(PyObject *) _PyEval_CallTracing(PyObject *func, PyObject *args); #endif diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index a9da8b8f45073..0491d48a789eb 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -40,12 +40,11 @@ _PyEval_EvalFrame(PyThreadState *tstate, PyFrameObject *f, int throwflag) return tstate->interp->eval_frame(tstate, f, throwflag); } -extern PyObject *_PyEval_EvalCode( - PyThreadState *tstate, - PyFrameConstructor *desc, PyObject *locals, - PyObject *const *args, Py_ssize_t argcount, - PyObject *const *kwnames, PyObject *const *kwargs, - Py_ssize_t kwcount, int kwstep); +extern PyObject * +_PyEval_Vector(PyThreadState *tstate, + PyFrameConstructor *desc, PyObject *locals, + PyObject* const* args, size_t argcount, + PyObject *kwnames); #ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS extern int _PyEval_ThreadsInitialized(PyInterpreterState *interp); diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-30-11-31-44.bpo-42990.69h_zK.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-30-11-31-44.bpo-42990.69h_zK.rst new file mode 100644 index 0000000000000..8ac39713e116a --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-01-30-11-31-44.bpo-42990.69h_zK.rst @@ -0,0 +1,5 @@ +Refactor the ``PyEval_`` family of functions. + +* An new function ``_PyEval_Vector`` is added to simplify calls to Python from C. +* ``_PyEval_EvalCodeWithName`` is removed +* ``PyEval_EvalCodeEx`` is retained as part of the API, but is not used internally diff --git a/Objects/call.c b/Objects/call.c index 7972693918bbb..960c37e1961f0 100644 --- a/Objects/call.c +++ b/Objects/call.c @@ -328,87 +328,24 @@ PyCFunction_Call(PyObject *callable, PyObject *args, PyObject *kwargs) /* --- PyFunction call functions ---------------------------------- */ -static PyObject* _Py_HOT_FUNCTION -function_code_fastcall(PyThreadState *tstate, PyCodeObject *co, - PyObject *const *args, Py_ssize_t nargs, - PyFunctionObject *func) -{ - assert(tstate != NULL); - assert(func != NULL); - - /* XXX Perhaps we should create a specialized - _PyFrame_New_NoTrack() that doesn't take locals, but does - take builtins without sanity checking them. - */ - PyFrameObject *f = _PyFrame_New_NoTrack(tstate, co, func->func_globals, func->func_builtins, NULL); - if (f == NULL) { - return NULL; - } - - PyObject **fastlocals = f->f_localsplus; - - for (Py_ssize_t i = 0; i < nargs; i++) { - Py_INCREF(*args); - fastlocals[i] = *args++; - } - PyObject *result = _PyEval_EvalFrame(tstate, f, 0); - - if (Py_REFCNT(f) > 1) { - Py_DECREF(f); - _PyObject_GC_TRACK(f); - } - else { - ++tstate->recursion_depth; - Py_DECREF(f); - --tstate->recursion_depth; - } - return result; -} - - PyObject * _PyFunction_Vectorcall(PyObject *func, PyObject* const* stack, size_t nargsf, PyObject *kwnames) { assert(PyFunction_Check(func)); - assert(kwnames == NULL || PyTuple_CheckExact(kwnames)); - + PyFrameConstructor *f = PyFunction_AS_FRAME_CONSTRUCTOR(func); Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); assert(nargs >= 0); - Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames); - assert((nargs == 0 && nkwargs == 0) || stack != NULL); - /* kwnames must only contain strings and all keys must be unique */ - PyThreadState *tstate = _PyThreadState_GET(); - PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(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(tstate, co, stack, nargs, (PyFunctionObject *)func); - } - 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(tstate, co, - stack, PyTuple_GET_SIZE(argdefs), - (PyFunctionObject *)func); - } + assert(nargs == 0 || stack != NULL); + if (((PyCodeObject *)f->fc_code)->co_flags & CO_OPTIMIZED) { + return _PyEval_Vector(tstate, f, NULL, stack, nargs, kwnames); + } + else { + return _PyEval_Vector(tstate, f, f->fc_globals, stack, nargs, kwnames); } - - return _PyEval_EvalCode(tstate, - PyFunction_AS_FRAME_CONSTRUCTOR(func), (PyObject *)NULL, - stack, nargs, - nkwargs ? _PyTuple_ITEMS(kwnames) : NULL, - stack + nargs, - nkwargs, 1); } - /* --- More complex call functions -------------------------------- */ /* External interface to call any callable object. diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 45a275bd90124..57105e1a9eb1e 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -816,11 +816,10 @@ frame_alloc(PyCodeObject *code) PyFrameObject* _Py_HOT_FUNCTION -_PyFrame_New_NoTrack(PyThreadState *tstate, PyCodeObject *code, - PyObject *globals, PyObject *builtins, PyObject *locals) +_PyFrame_New_NoTrack(PyThreadState *tstate, PyFrameConstructor *con, PyObject *locals) { #ifdef Py_DEBUG - if (code == NULL || globals == NULL || builtins == NULL || + if (con == NULL || con->fc_code == NULL || (locals != NULL && !PyMapping_Check(locals))) { PyErr_BadInternalCall(); return NULL; @@ -829,38 +828,21 @@ _PyFrame_New_NoTrack(PyThreadState *tstate, PyCodeObject *code, PyFrameObject *back = tstate->frame; - PyFrameObject *f = frame_alloc(code); + PyFrameObject *f = frame_alloc((PyCodeObject *)con->fc_code); if (f == NULL) { return NULL; } f->f_stackdepth = 0; - Py_INCREF(builtins); - f->f_builtins = builtins; + Py_INCREF(con->fc_builtins); + f->f_builtins = con->fc_builtins; Py_XINCREF(back); f->f_back = back; - Py_INCREF(code); - Py_INCREF(globals); - f->f_globals = globals; - /* Most functions have CO_NEWLOCALS and CO_OPTIMIZED set. */ - if ((code->co_flags & (CO_NEWLOCALS | CO_OPTIMIZED)) == - (CO_NEWLOCALS | CO_OPTIMIZED)) - ; /* f_locals = NULL; will be set by PyFrame_FastToLocals() */ - else if (code->co_flags & CO_NEWLOCALS) { - locals = PyDict_New(); - if (locals == NULL) { - Py_DECREF(f); - return NULL; - } - f->f_locals = locals; - } - else { - if (locals == NULL) { - locals = globals; - } - Py_INCREF(locals); - f->f_locals = locals; - } + Py_INCREF(con->fc_code); + Py_INCREF(con->fc_globals); + f->f_globals = con->fc_globals; + Py_XINCREF(locals); + f->f_locals = locals; f->f_lasti = -1; f->f_lineno = 0; @@ -875,12 +857,23 @@ _PyFrame_New_NoTrack(PyThreadState *tstate, PyCodeObject *code, return f; } +/* Legacy API */ PyFrameObject* PyFrame_New(PyThreadState *tstate, PyCodeObject *code, PyObject *globals, PyObject *locals) { PyObject *builtins = _PyEval_BuiltinsFromGlobals(globals); - PyFrameObject *f = _PyFrame_New_NoTrack(tstate, code, globals, builtins, locals); + PyFrameConstructor desc = { + .fc_globals = globals, + .fc_builtins = builtins, + .fc_name = code->co_name, + .fc_qualname = code->co_name, + .fc_code = (PyObject *)code, + .fc_defaults = NULL, + .fc_kwdefaults = NULL, + .fc_closure = NULL + }; + PyFrameObject *f = _PyFrame_New_NoTrack(tstate, &desc, locals); Py_DECREF(builtins); if (f) _PyObject_GC_TRACK(f); diff --git a/Objects/funcobject.c b/Objects/funcobject.c index f839d7b429e0b..b331c4c4d6e35 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -575,9 +575,9 @@ func_new_impl(PyTypeObject *type, PyCodeObject *code, PyObject *globals, newfunc = (PyFunctionObject *)PyFunction_New((PyObject *)code, globals); - if (newfunc == NULL) + if (newfunc == NULL) { return NULL; - + } if (name != Py_None) { Py_INCREF(name); Py_SETREF(newfunc->func_name, name); diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 352fb83d55e05..8c4e6e5107f9e 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -8,6 +8,7 @@ #include "pycore_pyerrors.h" // _PyErr_NoMemory() #include "pycore_pystate.h" // _PyThreadState_GET() #include "pycore_tuple.h" // _PyTuple_FromArray() +#include "pycore_ceval.h" // _PyEval_Vector() _Py_IDENTIFIER(__builtins__); _Py_IDENTIFIER(__dict__); @@ -219,9 +220,9 @@ builtin___build_class__(PyObject *self, PyObject *const *args, Py_ssize_t nargs, Py_TYPE(ns)->tp_name); goto error; } - cell = PyEval_EvalCodeEx(PyFunction_GET_CODE(func), PyFunction_GET_GLOBALS(func), ns, - NULL, 0, NULL, 0, NULL, 0, NULL, - PyFunction_GET_CLOSURE(func)); + PyFrameConstructor *f = PyFunction_AS_FRAME_CONSTRUCTOR(func); + PyThreadState *tstate = PyThreadState_GET(); + cell = _PyEval_Vector(tstate, f, ns, NULL, 0, NULL); if (cell != NULL) { if (bases != orig_bases) { if (PyMapping_SetItemString(ns, "__orig_bases__", orig_bases) < 0) { diff --git a/Python/ceval.c b/Python/ceval.c index 3aa2aa2c9bc19..3b67a6b79bfb7 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -890,12 +890,27 @@ static int unpack_iterable(PyThreadState *, PyObject *, int, int, PyObject **); PyObject * PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals) { - return PyEval_EvalCodeEx(co, - globals, locals, - (PyObject **)NULL, 0, - (PyObject **)NULL, 0, - (PyObject **)NULL, 0, - NULL, NULL); + if (locals == NULL) { + locals = globals; + } + PyObject *builtins = _PyEval_BuiltinsFromGlobals(globals); + if (builtins == NULL) { + return NULL; + } + PyFrameConstructor desc = { + .fc_globals = globals, + .fc_builtins = builtins, + .fc_name = ((PyCodeObject *)co)->co_name, + .fc_qualname = ((PyCodeObject *)co)->co_name, + .fc_code = co, + .fc_defaults = NULL, + .fc_kwdefaults = NULL, + .fc_closure = NULL + }; + PyThreadState *tstate = PyThreadState_GET(); + PyObject *res =_PyEval_Vector(tstate, &desc, locals, NULL, 0, NULL); + Py_DECREF(builtins); + return res; } @@ -4343,7 +4358,7 @@ too_many_positional(PyThreadState *tstate, PyCodeObject *co, static int positional_only_passed_as_keyword(PyThreadState *tstate, PyCodeObject *co, - Py_ssize_t kwcount, PyObject* const* kwnames, + Py_ssize_t kwcount, PyObject* kwnames, PyObject *qualname) { int posonly_conflicts = 0; @@ -4354,7 +4369,7 @@ positional_only_passed_as_keyword(PyThreadState *tstate, PyCodeObject *co, for (int k2=0; k2fc_code; assert(con->fc_defaults == NULL || PyTuple_CheckExact(con->fc_defaults)); - PyObject *retval = NULL; const Py_ssize_t total_args = co->co_argcount + co->co_kwonlyargcount; /* Create the frame */ - PyFrameObject *f = _PyFrame_New_NoTrack(tstate, co, con->fc_globals, con->fc_builtins, locals); + PyFrameObject *f = _PyFrame_New_NoTrack(tstate, con, locals); if (f == NULL) { return NULL; } @@ -4469,74 +4479,76 @@ _PyEval_EvalCode(PyThreadState *tstate, SETLOCAL(total_args, u); } - /* Handle keyword arguments passed as two strided arrays */ - kwcount *= kwstep; - for (i = 0; i < kwcount; i += kwstep) { - PyObject **co_varnames; - PyObject *keyword = kwnames[i]; - PyObject *value = kwargs[i]; - Py_ssize_t j; + /* Handle keyword arguments */ + if (kwnames != NULL) { + Py_ssize_t kwcount = PyTuple_GET_SIZE(kwnames); + for (i = 0; i < kwcount; i++) { + PyObject **co_varnames; + PyObject *keyword = PyTuple_GET_ITEM(kwnames, i); + PyObject *value = args[i+argcount]; + Py_ssize_t j; - if (keyword == NULL || !PyUnicode_Check(keyword)) { - _PyErr_Format(tstate, PyExc_TypeError, - "%U() keywords must be strings", + if (keyword == NULL || !PyUnicode_Check(keyword)) { + _PyErr_Format(tstate, PyExc_TypeError, + "%U() keywords must be strings", con->fc_qualname); - goto fail; - } - - /* Speed hack: do raw pointer compares. As names are - normally interned this should almost always hit. */ - co_varnames = ((PyTupleObject *)(co->co_varnames))->ob_item; - for (j = co->co_posonlyargcount; j < total_args; j++) { - PyObject *varname = co_varnames[j]; - if (varname == keyword) { - goto kw_found; + goto fail; } - } - /* Slow fallback, just in case */ - for (j = co->co_posonlyargcount; j < total_args; j++) { - PyObject *varname = co_varnames[j]; - int cmp = PyObject_RichCompareBool( keyword, varname, Py_EQ); - if (cmp > 0) { - goto kw_found; + /* Speed hack: do raw pointer compares. As names are + normally interned this should almost always hit. */ + co_varnames = ((PyTupleObject *)(co->co_varnames))->ob_item; + for (j = co->co_posonlyargcount; j < total_args; j++) { + PyObject *varname = co_varnames[j]; + if (varname == keyword) { + goto kw_found; + } } - else if (cmp < 0) { - goto fail; + + /* Slow fallback, just in case */ + for (j = co->co_posonlyargcount; j < total_args; j++) { + PyObject *varname = co_varnames[j]; + int cmp = PyObject_RichCompareBool( keyword, varname, Py_EQ); + if (cmp > 0) { + goto kw_found; + } + else if (cmp < 0) { + goto fail; + } } - } - assert(j >= total_args); - if (kwdict == NULL) { + assert(j >= total_args); + if (kwdict == NULL) { - if (co->co_posonlyargcount - && positional_only_passed_as_keyword(tstate, co, - kwcount, kwnames, + if (co->co_posonlyargcount + && positional_only_passed_as_keyword(tstate, co, + kwcount, kwnames, con->fc_qualname)) - { - goto fail; - } + { + goto fail; + } - _PyErr_Format(tstate, PyExc_TypeError, - "%U() got an unexpected keyword argument '%S'", + _PyErr_Format(tstate, PyExc_TypeError, + "%U() got an unexpected keyword argument '%S'", con->fc_qualname, keyword); - goto fail; - } + goto fail; + } - if (PyDict_SetItem(kwdict, keyword, value) == -1) { - goto fail; - } - continue; + if (PyDict_SetItem(kwdict, keyword, value) == -1) { + goto fail; + } + continue; - kw_found: - if (GETLOCAL(j) != NULL) { - _PyErr_Format(tstate, PyExc_TypeError, - "%U() got multiple values for argument '%S'", + kw_found: + if (GETLOCAL(j) != NULL) { + _PyErr_Format(tstate, PyExc_TypeError, + "%U() got multiple values for argument '%S'", con->fc_qualname, keyword); - goto fail; + goto fail; + } + Py_INCREF(value); + SETLOCAL(j, value); } - Py_INCREF(value); - SETLOCAL(j, value); } /* Check the number of positional arguments */ @@ -4631,36 +4643,71 @@ _PyEval_EvalCode(PyThreadState *tstate, freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o; } - /* Handle generator/coroutine/asynchronous generator */ - if (co->co_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR)) { - PyObject *gen; - int is_coro = co->co_flags & CO_COROUTINE; + return f; + +fail: /* Jump here from prelude on failure */ + + /* decref'ing the frame can cause __del__ methods to get invoked, + which can call back into Python. While we're done with the + current Python frame (f), the associated C stack is still in use, + so recursion_depth must be boosted for the duration. + */ + if (Py_REFCNT(f) > 1) { + Py_DECREF(f); + _PyObject_GC_TRACK(f); + } + else { + ++tstate->recursion_depth; + Py_DECREF(f); + --tstate->recursion_depth; + } + return NULL; +} + +static PyObject * +make_coro(PyFrameConstructor *con, PyFrameObject *f) +{ + assert (((PyCodeObject *)con->fc_code)->co_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR)); + PyObject *gen; + int is_coro = ((PyCodeObject *)con->fc_code)->co_flags & CO_COROUTINE; - /* Don't need to keep the reference to f_back, it will be set - * when the generator is resumed. */ - Py_CLEAR(f->f_back); + /* Don't need to keep the reference to f_back, it will be set + * when the generator is resumed. */ + Py_CLEAR(f->f_back); - /* Create a new generator that owns the ready to run frame - * and return that as the value. */ - if (is_coro) { + /* Create a new generator that owns the ready to run frame + * and return that as the value. */ + if (is_coro) { gen = PyCoro_New(f, con->fc_name, con->fc_qualname); - } else if (co->co_flags & CO_ASYNC_GENERATOR) { + } else if (((PyCodeObject *)con->fc_code)->co_flags & CO_ASYNC_GENERATOR) { gen = PyAsyncGen_New(f, con->fc_name, con->fc_qualname); - } else { + } else { gen = PyGen_NewWithQualName(f, con->fc_name, con->fc_qualname); - } - if (gen == NULL) { - return NULL; - } - - _PyObject_GC_TRACK(f); - - return gen; + } + if (gen == NULL) { + return NULL; } - retval = _PyEval_EvalFrame(tstate, f, 0); + _PyObject_GC_TRACK(f); -fail: /* Jump here from prelude on failure */ + return gen; +} + +PyObject * +_PyEval_Vector(PyThreadState *tstate, PyFrameConstructor *con, + PyObject *locals, + PyObject* const* args, size_t argcount, + PyObject *kwnames) +{ + PyFrameObject *f = _PyEval_MakeFrameVector( + tstate, con, locals, args, argcount, kwnames); + if (f == NULL) { + return NULL; + } + if (((PyCodeObject *)con->fc_code)->co_flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR)) { + return make_coro(con, f); + } + PyObject *retval = _PyEval_EvalFrame(tstate, f, 0); /* decref'ing the frame can cause __del__ methods to get invoked, which can call back into Python. While we're done with the @@ -4681,14 +4728,13 @@ _PyEval_EvalCode(PyThreadState *tstate, /* Legacy API */ 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) +PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals, + PyObject *const *args, int argcount, + PyObject *const *kws, int kwcount, + PyObject *const *defs, int defcount, + PyObject *kwdefs, PyObject *closure) { + PyObject *res; PyObject *defaults = _PyTuple_FromArray(defs, defcount); if (defaults == NULL) { return NULL; @@ -4698,44 +4744,75 @@ _PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals, Py_DECREF(defaults); return NULL; } + PyCodeObject *code = (PyCodeObject *)_co; + assert ((code->co_flags & (CO_NEWLOCALS | CO_OPTIMIZED)) == 0); + if (locals == NULL) { + locals = globals; + } + PyObject *kwnames; + PyObject *const *allargs; + PyObject **newargs; + if (kwcount == 0) { + allargs = args; + kwnames = NULL; + } + else { + kwnames = PyTuple_New(kwcount); + if (kwnames == NULL) { + res = NULL; + goto fail; + } + newargs = PyMem_Malloc(sizeof(PyObject *)*(kwcount+argcount)); + if (newargs == NULL) { + res = NULL; + Py_DECREF(kwnames); + goto fail; + } + for (int i = 0; i < argcount; i++) { + newargs[i] = args[i]; + } + for (int i = 0; i < kwcount; i++) { + Py_INCREF(kws[2*i]); + PyTuple_SET_ITEM(kwnames, i, kws[2*i]); + newargs[argcount+i] = kws[2*i+1]; + } + allargs = newargs; + } + PyObject **kwargs = PyMem_Malloc(sizeof(PyObject *)*kwcount); + if (kwargs == NULL) { + res = NULL; + Py_DECREF(kwnames); + goto fail; + } + for (int i = 0; i < kwcount; i++) { + Py_INCREF(kws[2*i]); + PyTuple_SET_ITEM(kwnames, i, kws[2*i]); + kwargs[i] = kws[2*i+1]; + } PyFrameConstructor constr = { .fc_globals = globals, .fc_builtins = builtins, - .fc_name = name, - .fc_qualname = qualname, + .fc_name = ((PyCodeObject *)_co)->co_name, + .fc_qualname = ((PyCodeObject *)_co)->co_name, .fc_code = _co, .fc_defaults = defaults, .fc_kwdefaults = kwdefs, .fc_closure = closure }; PyThreadState *tstate = _PyThreadState_GET(); - PyObject *res = _PyEval_EvalCode(tstate, &constr, locals, - args, argcount, - kwnames, kwargs, - kwcount, kwstep); + res = _PyEval_Vector(tstate, &constr, locals, + allargs, argcount, + kwnames); + if (kwcount) { + Py_DECREF(kwnames); + PyMem_Free(newargs); + } +fail: Py_DECREF(defaults); Py_DECREF(builtins); return res; } -/* Legacy API */ -PyObject * -PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals, - PyObject *const *args, int argcount, - PyObject *const *kws, int kwcount, - PyObject *const *defs, int defcount, - PyObject *kwdefs, PyObject *closure) -{ - return _PyEval_EvalCodeWithName( - _co, globals, locals, - args, argcount, - kws, kws != NULL ? kws + 1 : NULL, - kwcount, 2, - defs, defcount, - kwdefs, closure, - ((PyCodeObject *)_co)->co_name, - ((PyCodeObject *)_co)->co_name); -} static PyObject * special_lookup(PyThreadState *tstate, PyObject *o, _Py_Identifier *id) From webhook-mailer at python.org Mon Feb 1 10:47:03 2021 From: webhook-mailer at python.org (tirkarthi) Date: Mon, 01 Feb 2021 15:47:03 -0000 Subject: [Python-checkins] Fix typo in Lib/trace.py (GH-24309) Message-ID: https://github.com/python/cpython/commit/574aed16bfab1c5966af36ed6345d16ef119ac64 commit: 574aed16bfab1c5966af36ed6345d16ef119ac64 branch: master author: Yonatan Goldschmidt committer: tirkarthi date: 2021-02-01T21:16:38+05:30 summary: Fix typo in Lib/trace.py (GH-24309) files: M Lib/trace.py diff --git a/Lib/trace.py b/Lib/trace.py index c505d8bc72a98..2cf3643878d4b 100755 --- a/Lib/trace.py +++ b/Lib/trace.py @@ -116,7 +116,7 @@ def names(self, filename, modulename): return 0 def _modname(path): - """Return a plausible module name for the patch.""" + """Return a plausible module name for the path.""" base = os.path.basename(path) filename, ext = os.path.splitext(base) From webhook-mailer at python.org Mon Feb 1 11:27:06 2021 From: webhook-mailer at python.org (vstinner) Date: Mon, 01 Feb 2021 16:27:06 -0000 Subject: [Python-checkins] bpo-42834: Fix _json internal caches for subinterpreters (GH-24121) Message-ID: https://github.com/python/cpython/commit/b5931f1d9f1f9f907e5cb6e193154672f78c1225 commit: b5931f1d9f1f9f907e5cb6e193154672f78c1225 branch: master author: Ken Jin <28750310+Fidget-Spinner at users.noreply.github.com> committer: vstinner date: 2021-02-01T17:26:56+01:00 summary: bpo-42834: Fix _json internal caches for subinterpreters (GH-24121) Make internal caches of the _json extension module compatible with subinterpreters. files: A Misc/NEWS.d/next/Library/2021-01-05-23-55-24.bpo-42834.LxRnZC.rst M Modules/_json.c diff --git a/Misc/NEWS.d/next/Library/2021-01-05-23-55-24.bpo-42834.LxRnZC.rst b/Misc/NEWS.d/next/Library/2021-01-05-23-55-24.bpo-42834.LxRnZC.rst new file mode 100644 index 0000000000000..9e63a7e76062a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-01-05-23-55-24.bpo-42834.LxRnZC.rst @@ -0,0 +1 @@ +Make internal caches of the ``_json`` module compatible with subinterpreters. diff --git a/Modules/_json.c b/Modules/_json.c index faa3944eedd74..e10f83c96c565 100644 --- a/Modules/_json.c +++ b/Modules/_json.c @@ -79,7 +79,6 @@ static PyObject * ascii_escape_unicode(PyObject *pystr); static PyObject * 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); static PyObject * @@ -317,18 +316,22 @@ static void raise_errmsg(const char *msg, PyObject *s, Py_ssize_t end) { /* Use JSONDecodeError exception to raise a nice looking ValueError subclass */ - static PyObject *JSONDecodeError = NULL; - PyObject *exc; + _Py_static_string(PyId_decoder, "json.decoder"); + PyObject *decoder = _PyImport_GetModuleId(&PyId_decoder); + if (decoder == NULL) { + return; + } + + _Py_IDENTIFIER(JSONDecodeError); + PyObject *JSONDecodeError = _PyObject_GetAttrId(decoder, &PyId_JSONDecodeError); + Py_DECREF(decoder); if (JSONDecodeError == NULL) { - PyObject *decoder = PyImport_ImportModule("json.decoder"); - if (decoder == NULL) - return; - JSONDecodeError = PyObject_GetAttrString(decoder, "JSONDecodeError"); - Py_DECREF(decoder); - if (JSONDecodeError == NULL) - return; + return; } + + PyObject *exc; exc = PyObject_CallFunction(JSONDecodeError, "zOn", msg, s, end); + Py_DECREF(JSONDecodeError); if (exc) { PyErr_SetObject(JSONDecodeError, exc); Py_DECREF(exc); @@ -1308,28 +1311,28 @@ _encoded_const(PyObject *obj) { /* Return the JSON string representation of None, True, False */ if (obj == Py_None) { - static PyObject *s_null = NULL; + _Py_static_string(PyId_null, "null"); + PyObject *s_null = _PyUnicode_FromId(&PyId_null); if (s_null == NULL) { - s_null = PyUnicode_InternFromString("null"); + return NULL; } - Py_XINCREF(s_null); - return s_null; + return Py_NewRef(s_null); } else if (obj == Py_True) { - static PyObject *s_true = NULL; + _Py_static_string(PyId_true, "true"); + PyObject *s_true = _PyUnicode_FromId(&PyId_true); if (s_true == NULL) { - s_true = PyUnicode_InternFromString("true"); + return NULL; } - Py_XINCREF(s_true); - return s_true; + return Py_NewRef(s_true); } else if (obj == Py_False) { - static PyObject *s_false = NULL; + _Py_static_string(PyId_false, "false"); + PyObject *s_false = _PyUnicode_FromId(&PyId_false); if (s_false == NULL) { - s_false = PyUnicode_InternFromString("false"); + return NULL; } - Py_XINCREF(s_false); - return s_false; + return Py_NewRef(s_false); } else { PyErr_SetString(PyExc_ValueError, "not a const"); @@ -1493,9 +1496,12 @@ encoder_listencode_dict(PyEncoderObject *s, _PyAccu *acc, PyObject *dct, Py_ssize_t indent_level) { /* Encode Python dict dct a JSON term */ - static PyObject *open_dict = NULL; - static PyObject *close_dict = NULL; - static PyObject *empty_dict = NULL; + _Py_static_string(PyId_open_dict, "{"); + _Py_static_string(PyId_close_dict, "}"); + _Py_static_string(PyId_empty_dict, "{}"); + PyObject *open_dict = _PyUnicode_FromId(&PyId_open_dict); // borrowed ref + PyObject *close_dict = _PyUnicode_FromId(&PyId_close_dict); // borrowed ref + PyObject *empty_dict = _PyUnicode_FromId(&PyId_empty_dict); // borrowed ref PyObject *kstr = NULL; PyObject *ident = NULL; PyObject *it = NULL; @@ -1504,11 +1510,7 @@ encoder_listencode_dict(PyEncoderObject *s, _PyAccu *acc, Py_ssize_t idx; if (open_dict == NULL || close_dict == NULL || empty_dict == NULL) { - open_dict = PyUnicode_InternFromString("{"); - close_dict = PyUnicode_InternFromString("}"); - empty_dict = PyUnicode_InternFromString("{}"); - if (open_dict == NULL || close_dict == NULL || empty_dict == NULL) - return -1; + return -1; } if (PyDict_GET_SIZE(dct) == 0) /* Fast path */ return _PyAccu_Accumulate(acc, empty_dict); @@ -1650,19 +1652,18 @@ encoder_listencode_list(PyEncoderObject *s, _PyAccu *acc, PyObject *seq, Py_ssize_t indent_level) { /* Encode Python list seq to a JSON term */ - static PyObject *open_array = NULL; - static PyObject *close_array = NULL; - static PyObject *empty_array = NULL; + _Py_static_string(PyId_open_array, "["); + _Py_static_string(PyId_close_array, "]"); + _Py_static_string(PyId_empty_array, "[]"); + PyObject *open_array = _PyUnicode_FromId(&PyId_open_array); // borrowed ref + PyObject *close_array = _PyUnicode_FromId(&PyId_close_array); // borrowed ref + PyObject *empty_array = _PyUnicode_FromId(&PyId_empty_array); // borrowed ref PyObject *ident = NULL; PyObject *s_fast = NULL; Py_ssize_t i; if (open_array == NULL || close_array == NULL || empty_array == NULL) { - open_array = PyUnicode_InternFromString("["); - close_array = PyUnicode_InternFromString("]"); - empty_array = PyUnicode_InternFromString("[]"); - if (open_array == NULL || close_array == NULL || empty_array == NULL) - return -1; + return -1; } ident = NULL; s_fast = PySequence_Fast(seq, "_iterencode_list needs a sequence"); From webhook-mailer at python.org Mon Feb 1 12:39:17 2021 From: webhook-mailer at python.org (terryjreedy) Date: Mon, 01 Feb 2021 17:39:17 -0000 Subject: [Python-checkins] bpo-38307: Add end_lineno attribute to pyclbr Objects (GH-24348) Message-ID: https://github.com/python/cpython/commit/000cde59847beaf5fa7b73633e1f3c898fe5bf90 commit: 000cde59847beaf5fa7b73633e1f3c898fe5bf90 branch: master author: Aviral Srivastava committer: terryjreedy date: 2021-02-01T12:38:44-05:00 summary: bpo-38307: Add end_lineno attribute to pyclbr Objects (GH-24348) For back-compatibility, make the new constructor parameter for public classes Function and Class keyword-only with a default of None. Co-authored-by: Aviral Srivastava files: A Misc/NEWS.d/next/Library/2020-03-16-03-03-21.bpo-38307.2cmw2i.rst M Doc/whatsnew/3.10.rst M Lib/idlelib/idle_test/test_browser.py M Lib/pyclbr.py M Lib/test/test_pyclbr.py diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 3dccb7c50019b..d80ceeca85a89 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -435,6 +435,14 @@ py_compile Added ``--quiet`` option to command-line interface of :mod:`py_compile`. (Contributed by Gregory Schevchenko in :issue:`38731`.) +pyclbr +------ + +Added an ``end_lineno`` attribute to the ``Function`` and ``Class`` +objects in the tree returned by :func:`pyclbr.readline` and +:func:`pyclbr.readline_ex`. It matches the existing (start) ``lineno``. +(Contributed by Aviral Srivastava in :issue:`38307`.) + shelve ------ diff --git a/Lib/idlelib/idle_test/test_browser.py b/Lib/idlelib/idle_test/test_browser.py index 25d6dc6630364..03a50f22ca1e8 100644 --- a/Lib/idlelib/idle_test/test_browser.py +++ b/Lib/idlelib/idle_test/test_browser.py @@ -61,15 +61,15 @@ def test_close(self): # Nested tree same as in test_pyclbr.py except for supers on C0. C1. mb = pyclbr module, fname = 'test', 'test.py' -C0 = mb.Class(module, 'C0', ['base'], fname, 1) -F1 = mb._nest_function(C0, 'F1', 3) -C1 = mb._nest_class(C0, 'C1', 6, ['']) -C2 = mb._nest_class(C1, 'C2', 7) -F3 = mb._nest_function(C2, 'F3', 9) -f0 = mb.Function(module, 'f0', fname, 11) -f1 = mb._nest_function(f0, 'f1', 12) -f2 = mb._nest_function(f1, 'f2', 13) -c1 = mb._nest_class(f0, 'c1', 15) +C0 = mb.Class(module, 'C0', ['base'], fname, 1, end_lineno=9) +F1 = mb._nest_function(C0, 'F1', 3, 5) +C1 = mb._nest_class(C0, 'C1', 6, 9, ['']) +C2 = mb._nest_class(C1, 'C2', 7, 9) +F3 = mb._nest_function(C2, 'F3', 9, 9) +f0 = mb.Function(module, 'f0', fname, 11, end_lineno=15) +f1 = mb._nest_function(f0, 'f1', 12, 14) +f2 = mb._nest_function(f1, 'f2', 13, 13) +c1 = mb._nest_class(f0, 'c1', 15, 15) mock_pyclbr_tree = {'C0': C0, 'f0': f0} # Adjust C0.name, C1.name so tests do not depend on order. diff --git a/Lib/pyclbr.py b/Lib/pyclbr.py index f0c8381946c61..ebcc23c29da21 100644 --- a/Lib/pyclbr.py +++ b/Lib/pyclbr.py @@ -21,6 +21,7 @@ name -- name of the object; file -- file in which the object is defined; lineno -- line in the file where the object's definition starts; + end_lineno -- line in the file where the object's definition ends; parent -- parent of this object, if any; children -- nested objects contained in this object. The 'children' attribute is a dictionary mapping names to objects. @@ -52,40 +53,50 @@ class _Object: "Information about Python class or function." - def __init__(self, module, name, file, lineno, parent): + def __init__(self, module, name, file, lineno, end_lineno, parent): self.module = module self.name = name self.file = file self.lineno = lineno + self.end_lineno = end_lineno self.parent = parent self.children = {} if parent is not None: parent.children[name] = self + +# Odd Function and Class signatures are for back-compatibility. class Function(_Object): "Information about a Python function, including methods." - def __init__(self, module, name, file, lineno, parent=None, is_async=False): - super().__init__(module, name, file, lineno, parent) + def __init__(self, module, name, file, lineno, + parent=None, is_async=False, *, end_lineno=None): + super().__init__(module, name, file, lineno, end_lineno, parent) self.is_async = is_async if isinstance(parent, Class): parent.methods[name] = lineno + class Class(_Object): "Information about a Python class." - def __init__(self, module, name, super_, file, lineno, parent=None): - super().__init__(module, name, file, lineno, parent) + def __init__(self, module, name, super_, file, lineno, + parent=None, *, end_lineno=None): + super().__init__(module, name, file, lineno, end_lineno, parent) self.super = super_ or [] self.methods = {} + # These 2 functions are used in these tests # Lib/test/test_pyclbr, Lib/idlelib/idle_test/test_browser.py -def _nest_function(ob, func_name, lineno, is_async=False): +def _nest_function(ob, func_name, lineno, end_lineno, is_async=False): "Return a Function after nesting within ob." - return Function(ob.module, func_name, ob.file, lineno, ob, is_async) + return Function(ob.module, func_name, ob.file, lineno, + parent=ob, is_async=is_async, end_lineno=end_lineno) -def _nest_class(ob, class_name, lineno, super=None): +def _nest_class(ob, class_name, lineno, end_lineno, super=None): "Return a Class after nesting within ob." - return Class(ob.module, class_name, super, ob.file, lineno, ob) + return Class(ob.module, class_name, super, ob.file, lineno, + parent=ob, end_lineno=end_lineno) + def readmodule(module, path=None): """Return Class objects for the top-level classes in module. @@ -108,6 +119,7 @@ def readmodule_ex(module, path=None): """ return _readmodule(module, path or []) + def _readmodule(module, path, inpackage=None): """Do the hard work for readmodule[_ex]. @@ -198,9 +210,8 @@ def visit_ClassDef(self, node): bases.append(name) parent = self.stack[-1] if self.stack else None - class_ = Class( - self.module, node.name, bases, self.file, node.lineno, parent - ) + class_ = Class(self.module, node.name, bases, self.file, node.lineno, + parent=parent, end_lineno=node.end_lineno) if parent is None: self.tree[node.name] = class_ self.stack.append(class_) @@ -209,9 +220,8 @@ def visit_ClassDef(self, node): def visit_FunctionDef(self, node, *, is_async=False): parent = self.stack[-1] if self.stack else None - function = Function( - self.module, node.name, self.file, node.lineno, parent, is_async - ) + function = Function(self.module, node.name, self.file, node.lineno, + parent, is_async, end_lineno=node.end_lineno) if parent is None: self.tree[node.name] = function self.stack.append(function) diff --git a/Lib/test/test_pyclbr.py b/Lib/test/test_pyclbr.py index 2c7afa994f305..82c1ebb5b070f 100644 --- a/Lib/test/test_pyclbr.py +++ b/Lib/test/test_pyclbr.py @@ -176,15 +176,15 @@ def F3(): return 1+1 actual = mb._create_tree(m, p, f, source, t, i) # Create descriptors, linked together, and expected dict. - f0 = mb.Function(m, 'f0', f, 1) - f1 = mb._nest_function(f0, 'f1', 2) - f2 = mb._nest_function(f1, 'f2', 3) - c1 = mb._nest_class(f0, 'c1', 5) - C0 = mb.Class(m, 'C0', None, f, 6) - F1 = mb._nest_function(C0, 'F1', 8) - C1 = mb._nest_class(C0, 'C1', 11) - C2 = mb._nest_class(C1, 'C2', 12) - F3 = mb._nest_function(C2, 'F3', 14) + f0 = mb.Function(m, 'f0', f, 1, end_lineno=5) + f1 = mb._nest_function(f0, 'f1', 2, 4) + f2 = mb._nest_function(f1, 'f2', 3, 3) + c1 = mb._nest_class(f0, 'c1', 5, 5) + C0 = mb.Class(m, 'C0', None, f, 6, end_lineno=14) + F1 = mb._nest_function(C0, 'F1', 8, 10) + C1 = mb._nest_class(C0, 'C1', 11, 14) + C2 = mb._nest_class(C1, 'C2', 12, 14) + F3 = mb._nest_function(C2, 'F3', 14, 14) expected = {'f0':f0, 'C0':C0} def compare(parent1, children1, parent2, children2): @@ -203,8 +203,8 @@ def compare(parent1, children1, parent2, children2): self.assertIs(ob.parent, parent2) for key in children1.keys(): o1, o2 = children1[key], children2[key] - t1 = type(o1), o1.name, o1.file, o1.module, o1.lineno - t2 = type(o2), o2.name, o2.file, o2.module, o2.lineno + t1 = type(o1), o1.name, o1.file, o1.module, o1.lineno, o1.end_lineno + t2 = type(o2), o2.name, o2.file, o2.module, o2.lineno, o2.end_lineno self.assertEqual(t1, t2) if type(o1) is mb.Class: self.assertEqual(o1.methods, o2.methods) diff --git a/Misc/NEWS.d/next/Library/2020-03-16-03-03-21.bpo-38307.2cmw2i.rst b/Misc/NEWS.d/next/Library/2020-03-16-03-03-21.bpo-38307.2cmw2i.rst new file mode 100644 index 0000000000000..358089915fb6c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-03-16-03-03-21.bpo-38307.2cmw2i.rst @@ -0,0 +1,3 @@ +Add an 'end_lineno' attribute to the Class and Function objects that appear in the +tree returned by pyclbr functions. This and the existing 'lineno' +attribute define the extent of class and def statements. Patch by Aviral Srivastava. From webhook-mailer at python.org Mon Feb 1 15:32:56 2021 From: webhook-mailer at python.org (ezio-melotti) Date: Mon, 01 Feb 2021 20:32:56 -0000 Subject: [Python-checkins] bpo-41748: Handles unquoted attributes with commas (#24072) Message-ID: https://github.com/python/cpython/commit/9eb11a139fac5514d8456626806a68b3e3b7eafb commit: 9eb11a139fac5514d8456626806a68b3e3b7eafb branch: master author: Karl Dubost committer: ezio-melotti date: 2021-02-01T21:32:50+01:00 summary: bpo-41748: Handles unquoted attributes with commas (#24072) * bpo-41748: Adds tests for unquoted attributes with comma * bpo-41748: Handles unquoted attributes with comma * bpo-41748: Addresses review comments * bpo-41748: Addresses review comments * Adds more test cases * Simplifies the regex for handling spaces * bpo-41748: Moves attributes tests under the right class * bpo-41748: Addresses review about duplicate attributes * bpo-41748: Adds NEWS.d entry for this patch files: A Misc/NEWS.d/next/Library/2021-01-05-21-26-29.bpo-41748.KdC0w3.rst M Lib/html/parser.py M Lib/test/test_htmlparser.py diff --git a/Lib/html/parser.py b/Lib/html/parser.py index 60830779816a0..9e49effca1fcc 100644 --- a/Lib/html/parser.py +++ b/Lib/html/parser.py @@ -46,7 +46,7 @@ |"[^"]*" # LIT-enclosed value |(?!['"])[^>\s]* # bare value ) - (?:\s*,)* # possibly followed by a comma + \s* # possibly followed by a space )?(?:\s|/(?!>))* )* )? diff --git a/Lib/test/test_htmlparser.py b/Lib/test/test_htmlparser.py index a2bfb39d16a57..12917755a5601 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 @@ -766,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/Misc/NEWS.d/next/Library/2021-01-05-21-26-29.bpo-41748.KdC0w3.rst b/Misc/NEWS.d/next/Library/2021-01-05-21-26-29.bpo-41748.KdC0w3.rst new file mode 100644 index 0000000000000..52efa3ac3d40e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-01-05-21-26-29.bpo-41748.KdC0w3.rst @@ -0,0 +1,2 @@ +Fix HTMLParser parsing rules for element attributes containing +commas with spaces. Patch by Karl Dubost. \ No newline at end of file From webhook-mailer at python.org Mon Feb 1 15:53:24 2021 From: webhook-mailer at python.org (miss-islington) Date: Mon, 01 Feb 2021 20:53:24 -0000 Subject: [Python-checkins] bpo-41748: Handles unquoted attributes with commas (GH-24072) Message-ID: https://github.com/python/cpython/commit/0869a713f21f4b2fe021d802cf18f1b1af53695f commit: 0869a713f21f4b2fe021d802cf18f1b1af53695f branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2021-02-01T12:52:52-08:00 summary: bpo-41748: Handles unquoted attributes with commas (GH-24072) * bpo-41748: Adds tests for unquoted attributes with comma * bpo-41748: Handles unquoted attributes with comma * bpo-41748: Addresses review comments * bpo-41748: Addresses review comments * Adds more test cases * Simplifies the regex for handling spaces * bpo-41748: Moves attributes tests under the right class * bpo-41748: Addresses review about duplicate attributes * bpo-41748: Adds NEWS.d entry for this patch (cherry picked from commit 9eb11a139fac5514d8456626806a68b3e3b7eafb) Co-authored-by: Karl Dubost files: A Misc/NEWS.d/next/Library/2021-01-05-21-26-29.bpo-41748.KdC0w3.rst M Lib/html/parser.py M Lib/test/test_htmlparser.py diff --git a/Lib/html/parser.py b/Lib/html/parser.py index de81879a631ac..d19684ed1176d 100644 --- a/Lib/html/parser.py +++ b/Lib/html/parser.py @@ -47,7 +47,7 @@ |"[^"]*" # LIT-enclosed value |(?!['"])[^>\s]* # bare value ) - (?:\s*,)* # possibly followed by a comma + \s* # possibly followed by a space )?(?:\s|/(?!>))* )* )? diff --git a/Lib/test/test_htmlparser.py b/Lib/test/test_htmlparser.py index 326e34290ff13..d0dc67d91745a 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 @@ -773,6 +737,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/Misc/NEWS.d/next/Library/2021-01-05-21-26-29.bpo-41748.KdC0w3.rst b/Misc/NEWS.d/next/Library/2021-01-05-21-26-29.bpo-41748.KdC0w3.rst new file mode 100644 index 0000000000000..52efa3ac3d40e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-01-05-21-26-29.bpo-41748.KdC0w3.rst @@ -0,0 +1,2 @@ +Fix HTMLParser parsing rules for element attributes containing +commas with spaces. Patch by Karl Dubost. \ No newline at end of file From webhook-mailer at python.org Mon Feb 1 15:54:47 2021 From: webhook-mailer at python.org (miss-islington) Date: Mon, 01 Feb 2021 20:54:47 -0000 Subject: [Python-checkins] bpo-41748: Handles unquoted attributes with commas (GH-24072) Message-ID: https://github.com/python/cpython/commit/0874491bcc392f7bd9c394ec2fdab183e3f320dd commit: 0874491bcc392f7bd9c394ec2fdab183e3f320dd branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2021-02-01T12:54:43-08:00 summary: bpo-41748: Handles unquoted attributes with commas (GH-24072) * bpo-41748: Adds tests for unquoted attributes with comma * bpo-41748: Handles unquoted attributes with comma * bpo-41748: Addresses review comments * bpo-41748: Addresses review comments * Adds more test cases * Simplifies the regex for handling spaces * bpo-41748: Moves attributes tests under the right class * bpo-41748: Addresses review about duplicate attributes * bpo-41748: Adds NEWS.d entry for this patch (cherry picked from commit 9eb11a139fac5514d8456626806a68b3e3b7eafb) Co-authored-by: Karl Dubost files: A Misc/NEWS.d/next/Library/2021-01-05-21-26-29.bpo-41748.KdC0w3.rst M Lib/html/parser.py M Lib/test/test_htmlparser.py diff --git a/Lib/html/parser.py b/Lib/html/parser.py index 60830779816a0..9e49effca1fcc 100644 --- a/Lib/html/parser.py +++ b/Lib/html/parser.py @@ -46,7 +46,7 @@ |"[^"]*" # LIT-enclosed value |(?!['"])[^>\s]* # bare value ) - (?:\s*,)* # possibly followed by a comma + \s* # possibly followed by a space )?(?:\s|/(?!>))* )* )? diff --git a/Lib/test/test_htmlparser.py b/Lib/test/test_htmlparser.py index a2bfb39d16a57..12917755a5601 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 @@ -766,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/Misc/NEWS.d/next/Library/2021-01-05-21-26-29.bpo-41748.KdC0w3.rst b/Misc/NEWS.d/next/Library/2021-01-05-21-26-29.bpo-41748.KdC0w3.rst new file mode 100644 index 0000000000000..52efa3ac3d40e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-01-05-21-26-29.bpo-41748.KdC0w3.rst @@ -0,0 +1,2 @@ +Fix HTMLParser parsing rules for element attributes containing +commas with spaces. Patch by Karl Dubost. \ No newline at end of file From webhook-mailer at python.org Tue Feb 2 09:59:32 2021 From: webhook-mailer at python.org (markshannon) Date: Tue, 02 Feb 2021 14:59:32 -0000 Subject: [Python-checkins] Only eliminate jumps to successor block if jump is unconditional. (GH-24417) Message-ID: https://github.com/python/cpython/commit/802b645e81a72399a7ef47ef000d468c775dcd3e commit: 802b645e81a72399a7ef47ef000d468c775dcd3e branch: master author: Mark Shannon committer: markshannon date: 2021-02-02T14:59:15Z summary: Only eliminate jumps to successor block if jump is unconditional. (GH-24417) * Prevents elimination of the sole test of a value in statements like: if x or True: ... files: M Lib/test/test_bool.py M Python/compile.c diff --git a/Lib/test/test_bool.py b/Lib/test/test_bool.py index 7b3a3859e0893..bec44d0b9c591 100644 --- a/Lib/test/test_bool.py +++ b/Lib/test/test_bool.py @@ -354,6 +354,22 @@ def test_real_and_imag(self): self.assertIs(type(False.real), int) self.assertIs(type(False.imag), int) + def test_bool_called_at_least_once(self): + class X: + def __init__(self): + self.count = 0 + def __bool__(self): + self.count += 1 + return True + + def f(x): + if x or True: + pass + + x = X() + f(x) + self.assertGreaterEqual(x.count, 1) + def test_main(): support.run_unittest(BoolTest) diff --git a/Python/compile.c b/Python/compile.c index 9927f5abfb964..a0a257fa6bafc 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -6586,27 +6586,14 @@ optimize_cfg(struct assembler *a, PyObject *consts) for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) { if (b->b_iused > 0) { struct instr *b_last_instr = &b->b_instr[b->b_iused - 1]; - if (b_last_instr->i_opcode == POP_JUMP_IF_FALSE || - b_last_instr->i_opcode == POP_JUMP_IF_TRUE || - b_last_instr->i_opcode == JUMP_ABSOLUTE || + if (b_last_instr->i_opcode == JUMP_ABSOLUTE || b_last_instr->i_opcode == JUMP_FORWARD) { if (b_last_instr->i_target == b->b_next) { assert(b->b_next->b_iused); b->b_nofallthrough = 0; - switch(b_last_instr->i_opcode) { - case POP_JUMP_IF_FALSE: - case POP_JUMP_IF_TRUE: - b_last_instr->i_opcode = POP_TOP; - b_last_instr->i_target = NULL; - b_last_instr->i_oparg = 0; - break; - case JUMP_ABSOLUTE: - case JUMP_FORWARD: - b_last_instr->i_opcode = NOP; - clean_basic_block(b, -1); - maybe_empty_blocks = 1; - break; - } + b_last_instr->i_opcode = NOP; + clean_basic_block(b, -1); + maybe_empty_blocks = 1; } } } From webhook-mailer at python.org Tue Feb 2 14:54:31 2021 From: webhook-mailer at python.org (pablogsal) Date: Tue, 02 Feb 2021 19:54:31 -0000 Subject: [Python-checkins] bpo-42997: Improve error message for missing : before suites (GH-24292) Message-ID: https://github.com/python/cpython/commit/58fb156edda1a0e924a38bfed494bd06cb09c9a3 commit: 58fb156edda1a0e924a38bfed494bd06cb09c9a3 branch: master author: Pablo Galindo committer: pablogsal date: 2021-02-02T19:54:22Z summary: bpo-42997: Improve error message for missing : before suites (GH-24292) * Add to the peg generator a new directive ('&&') that allows to expect a token and hard fail the parsing if the token is not found. This allows to quickly emmit syntax errors for missing tokens. * Use the new grammar element to hard-fail if the ':' is missing before suites. files: A Misc/NEWS.d/next/Core and Builtins/2021-01-24-20-19-55.bpo-42997.QUOPgP.rst M Doc/tools/extensions/peg_highlight.py M Grammar/python.gram M Lib/test/test_syntax.py M Parser/parser.c M Parser/pegen.c M Parser/pegen.h M Tools/peg_generator/pegen/c_generator.py M Tools/peg_generator/pegen/grammar.py M Tools/peg_generator/pegen/grammar_parser.py M Tools/peg_generator/pegen/metagrammar.gram diff --git a/Doc/tools/extensions/peg_highlight.py b/Doc/tools/extensions/peg_highlight.py index 9a2acb7f320ba..4ade1bfeaa047 100644 --- a/Doc/tools/extensions/peg_highlight.py +++ b/Doc/tools/extensions/peg_highlight.py @@ -27,6 +27,12 @@ class PEGLexer(RegexLexer): tokens = { "ws": [(r"\n", Text), (r"\s+", Text), (r"#.*$", Comment.Singleline),], "lookaheads": [ + # Forced tokens + (r"(&&)(?=\w+\s?)", bygroups(None)), + (r"(&&)(?='.+'\s?)", bygroups(None)), + (r'(&&)(?=".+"\s?)', bygroups(None)), + (r"(&&)(?=\(.+\)\s?)", bygroups(None)), + (r"(?<=\|\s)(&\w+\s?)", bygroups(None)), (r"(?<=\|\s)(&'.+'\s?)", bygroups(None)), (r'(?<=\|\s)(&".+"\s?)', bygroups(None)), diff --git a/Grammar/python.gram b/Grammar/python.gram index e72158be22380..22f2b41b11ef6 100644 --- a/Grammar/python.gram +++ b/Grammar/python.gram @@ -162,22 +162,22 @@ dotted_name[expr_ty]: | NAME if_stmt[stmt_ty]: - | 'if' a=named_expression ':' b=block c=elif_stmt { + | 'if' a=named_expression &&':' b=block c=elif_stmt { _Py_If(a, b, CHECK(asdl_stmt_seq*, _PyPegen_singleton_seq(p, c)), EXTRA) } - | 'if' a=named_expression ':' b=block c=[else_block] { _Py_If(a, b, 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 { + | 'elif' a=named_expression &&':' b=block c=elif_stmt { _Py_If(a, b, CHECK(asdl_stmt_seq*, _PyPegen_singleton_seq(p, c)), EXTRA) } - | 'elif' a=named_expression ':' b=block c=[else_block] { _Py_If(a, b, c, EXTRA) } -else_block[asdl_stmt_seq*]: 'else' ':' b=block { b } + | 'elif' a=named_expression &&':' b=block c=[else_block] { _Py_If(a, b, c, EXTRA) } +else_block[asdl_stmt_seq*]: 'else' &&':' b=block { b } while_stmt[stmt_ty]: - | 'while' a=named_expression ':' b=block c=[else_block] { _Py_While(a, b, c, EXTRA) } + | '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] { + | '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] { + | ASYNC 'for' t=star_targets 'in' ~ ex=star_expressions &&':' tc=[TYPE_COMMENT] b=block el=[else_block] { CHECK_VERSION(stmt_ty, 5, "Async for loops are", _Py_AsyncFor(t, ex, b, el, NEW_TYPE_COMMENT(p, tc), EXTRA)) } | invalid_for_target @@ -190,18 +190,20 @@ with_stmt[stmt_ty]: CHECK_VERSION(stmt_ty, 5, "Async with statements are", _Py_AsyncWith(a, b, NULL, EXTRA)) } | ASYNC 'with' a[asdl_withitem_seq*]=','.with_item+ ':' tc=[TYPE_COMMENT] b=block { CHECK_VERSION(stmt_ty, 5, "Async with statements are", _Py_AsyncWith(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA)) } + | invalid_with_stmt + 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[asdl_excepthandler_seq*]=except_block+ el=[else_block] f=[finally_block] { _Py_Try(b, ex, el, f, EXTRA) } + | 'try' &&':' b=block f=finally_block { _Py_Try(b, NULL, NULL, f, EXTRA) } + | 'try' &&':' b=block ex[asdl_excepthandler_seq*]=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 { + | '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) } + | 'except' &&':' b=block { _Py_ExceptHandler(NULL, NULL, b, EXTRA) } finally_block[asdl_stmt_seq*]: 'finally' ':' a=block { a } return_stmt[stmt_ty]: @@ -216,11 +218,11 @@ function_def[stmt_ty]: | function_def_raw function_def_raw[stmt_ty]: - | 'def' n=NAME '(' params=[params] ')' a=['->' z=expression { z }] ':' tc=[func_type_comment] b=block { + | 'def' n=NAME '(' params=[params] ')' a=['->' z=expression { z }] &&':' tc=[func_type_comment] b=block { _Py_FunctionDef(n->v.Name.id, (params) ? params : CHECK(arguments_ty, _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 { + | ASYNC 'def' n=NAME '(' params=[params] ')' a=['->' z=expression { z }] &&':' tc=[func_type_comment] b=block { CHECK_VERSION( stmt_ty, 5, @@ -300,7 +302,7 @@ 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 { + | '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, @@ -718,7 +720,7 @@ 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 { + | expression 'as' a=expression &(',' | ')' | ':') { RAISE_SYNTAX_ERROR_INVALID_TARGET(STAR_TARGETS, a) } invalid_for_target: @@ -731,3 +733,7 @@ invalid_group: invalid_import_from_targets: | import_from_as_names ',' { RAISE_SYNTAX_ERROR("trailing comma not allowed without surrounding parentheses") } + +invalid_with_stmt: + | [ASYNC] 'with' ','.(expression ['as' star_target])+ &&':' + | [ASYNC] 'with' '(' ','.(expressions ['as' star_target])+ ','? ')' &&':' diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py index 604474f1e8387..6068dd9fc09e8 100644 --- a/Lib/test/test_syntax.py +++ b/Lib/test/test_syntax.py @@ -229,7 +229,7 @@ >>> with a as b Traceback (most recent call last): -SyntaxError: invalid syntax +SyntaxError: expected ':' >>> p = p = Traceback (most recent call last): @@ -331,7 +331,7 @@ >>> class C(x for x in L): ... pass Traceback (most recent call last): -SyntaxError: invalid syntax +SyntaxError: expected ':' >>> def g(*args, **kwargs): ... print(args, sorted(kwargs.items())) @@ -708,6 +708,107 @@ ... SyntaxError: cannot assign to function call + Missing ':' before suites: + + >>> def f() + ... pass + Traceback (most recent call last): + SyntaxError: expected ':' + + >>> class A + ... pass + Traceback (most recent call last): + SyntaxError: expected ':' + + >>> if 1 + ... pass + ... elif 1: + ... pass + ... else: + ... x() = 1 + Traceback (most recent call last): + SyntaxError: expected ':' + + >>> if 1: + ... pass + ... elif 1 + ... pass + ... else: + ... x() = 1 + Traceback (most recent call last): + SyntaxError: expected ':' + + >>> if 1: + ... pass + ... elif 1: + ... pass + ... else + ... x() = 1 + Traceback (most recent call last): + SyntaxError: expected ':' + + >>> for x in range(10) + ... pass + Traceback (most recent call last): + SyntaxError: expected ':' + + >>> while True + ... pass + Traceback (most recent call last): + SyntaxError: expected ':' + + >>> with blech as something + ... pass + Traceback (most recent call last): + SyntaxError: expected ':' + + >>> with blech + ... pass + Traceback (most recent call last): + SyntaxError: expected ':' + + >>> with blech, block as something + ... pass + Traceback (most recent call last): + SyntaxError: expected ':' + + >>> with blech, block as something, bluch + ... pass + Traceback (most recent call last): + SyntaxError: expected ':' + + >>> with (blech as something) + ... pass + Traceback (most recent call last): + SyntaxError: expected ':' + + >>> with (blech) + ... pass + Traceback (most recent call last): + SyntaxError: expected ':' + + >>> with (blech, block as something) + ... pass + Traceback (most recent call last): + SyntaxError: expected ':' + + >>> with (blech, block as something, bluch) + ... pass + Traceback (most recent call last): + SyntaxError: expected ':' + + >>> try + ... pass + Traceback (most recent call last): + SyntaxError: expected ':' + + >>> try: + ... pass + ... except + ... pass + Traceback (most recent call last): + SyntaxError: expected ':' + Make sure that the old "raise X, Y[, Z]" form is gone: >>> raise X, Y Traceback (most recent call last): @@ -992,7 +1093,7 @@ def func2(): finally: pass """ - self._check_error(code, "invalid syntax") + self._check_error(code, "expected ':'") def test_invalid_line_continuation_left_recursive(self): # Check bpo-42218: SyntaxErrors following left-recursive rules diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-24-20-19-55.bpo-42997.QUOPgP.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-24-20-19-55.bpo-42997.QUOPgP.rst new file mode 100644 index 0000000000000..889f4c5d99689 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-01-24-20-19-55.bpo-42997.QUOPgP.rst @@ -0,0 +1 @@ +Improve error message for missing ":" before blocks. Patch by Pablo Galindo. \ No newline at end of file diff --git a/Parser/parser.c b/Parser/parser.c index d333accf71cca..c709e45dae565 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -231,161 +231,171 @@ static KeywordToken *reserved_keywords[] = { #define invalid_for_target_type 1162 #define invalid_group_type 1163 #define invalid_import_from_targets_type 1164 -#define _loop0_1_type 1165 -#define _loop0_2_type 1166 -#define _loop0_4_type 1167 -#define _gather_3_type 1168 -#define _loop0_6_type 1169 -#define _gather_5_type 1170 -#define _loop0_8_type 1171 -#define _gather_7_type 1172 -#define _loop0_10_type 1173 -#define _gather_9_type 1174 -#define _loop1_11_type 1175 -#define _loop0_13_type 1176 -#define _gather_12_type 1177 -#define _tmp_14_type 1178 -#define _tmp_15_type 1179 -#define _tmp_16_type 1180 -#define _tmp_17_type 1181 -#define _tmp_18_type 1182 -#define _tmp_19_type 1183 -#define _tmp_20_type 1184 -#define _tmp_21_type 1185 -#define _loop1_22_type 1186 -#define _tmp_23_type 1187 -#define _tmp_24_type 1188 -#define _loop0_26_type 1189 -#define _gather_25_type 1190 -#define _loop0_28_type 1191 -#define _gather_27_type 1192 -#define _tmp_29_type 1193 -#define _tmp_30_type 1194 -#define _loop0_31_type 1195 -#define _loop1_32_type 1196 -#define _loop0_34_type 1197 -#define _gather_33_type 1198 -#define _tmp_35_type 1199 -#define _loop0_37_type 1200 -#define _gather_36_type 1201 -#define _tmp_38_type 1202 -#define _loop0_40_type 1203 -#define _gather_39_type 1204 -#define _loop0_42_type 1205 -#define _gather_41_type 1206 -#define _loop0_44_type 1207 -#define _gather_43_type 1208 -#define _loop0_46_type 1209 -#define _gather_45_type 1210 -#define _tmp_47_type 1211 -#define _loop1_48_type 1212 -#define _tmp_49_type 1213 -#define _tmp_50_type 1214 -#define _tmp_51_type 1215 -#define _tmp_52_type 1216 -#define _tmp_53_type 1217 -#define _loop0_54_type 1218 -#define _loop0_55_type 1219 -#define _loop0_56_type 1220 -#define _loop1_57_type 1221 -#define _loop0_58_type 1222 -#define _loop1_59_type 1223 -#define _loop1_60_type 1224 -#define _loop1_61_type 1225 -#define _loop0_62_type 1226 -#define _loop1_63_type 1227 -#define _loop0_64_type 1228 -#define _loop1_65_type 1229 -#define _loop0_66_type 1230 -#define _loop1_67_type 1231 -#define _loop1_68_type 1232 -#define _tmp_69_type 1233 -#define _loop1_70_type 1234 -#define _loop0_72_type 1235 -#define _gather_71_type 1236 -#define _loop1_73_type 1237 -#define _loop0_74_type 1238 -#define _loop0_75_type 1239 -#define _loop0_76_type 1240 -#define _loop1_77_type 1241 -#define _loop0_78_type 1242 -#define _loop1_79_type 1243 -#define _loop1_80_type 1244 -#define _loop1_81_type 1245 -#define _loop0_82_type 1246 -#define _loop1_83_type 1247 -#define _loop0_84_type 1248 -#define _loop1_85_type 1249 -#define _loop0_86_type 1250 -#define _loop1_87_type 1251 -#define _loop1_88_type 1252 -#define _loop1_89_type 1253 -#define _loop1_90_type 1254 -#define _tmp_91_type 1255 -#define _loop0_93_type 1256 -#define _gather_92_type 1257 -#define _tmp_94_type 1258 -#define _tmp_95_type 1259 -#define _tmp_96_type 1260 -#define _tmp_97_type 1261 -#define _loop1_98_type 1262 -#define _tmp_99_type 1263 -#define _tmp_100_type 1264 -#define _loop0_102_type 1265 -#define _gather_101_type 1266 -#define _loop1_103_type 1267 -#define _loop0_104_type 1268 -#define _loop0_105_type 1269 -#define _loop0_107_type 1270 -#define _gather_106_type 1271 -#define _tmp_108_type 1272 -#define _loop0_110_type 1273 -#define _gather_109_type 1274 -#define _loop0_112_type 1275 -#define _gather_111_type 1276 -#define _loop0_114_type 1277 -#define _gather_113_type 1278 -#define _loop0_116_type 1279 -#define _gather_115_type 1280 -#define _loop0_117_type 1281 -#define _loop0_119_type 1282 -#define _gather_118_type 1283 -#define _loop1_120_type 1284 -#define _tmp_121_type 1285 -#define _loop0_123_type 1286 -#define _gather_122_type 1287 -#define _loop0_125_type 1288 -#define _gather_124_type 1289 -#define _tmp_126_type 1290 -#define _loop0_127_type 1291 -#define _loop0_128_type 1292 -#define _loop0_129_type 1293 -#define _tmp_130_type 1294 -#define _tmp_131_type 1295 -#define _tmp_132_type 1296 -#define _loop0_133_type 1297 -#define _loop1_134_type 1298 -#define _loop0_135_type 1299 -#define _loop1_136_type 1300 -#define _tmp_137_type 1301 -#define _tmp_138_type 1302 -#define _tmp_139_type 1303 -#define _tmp_140_type 1304 -#define _tmp_141_type 1305 -#define _tmp_142_type 1306 -#define _tmp_143_type 1307 -#define _tmp_144_type 1308 -#define _tmp_145_type 1309 -#define _tmp_146_type 1310 -#define _tmp_147_type 1311 -#define _tmp_148_type 1312 -#define _tmp_149_type 1313 -#define _tmp_150_type 1314 -#define _tmp_151_type 1315 -#define _tmp_152_type 1316 -#define _tmp_153_type 1317 -#define _tmp_154_type 1318 -#define _tmp_155_type 1319 +#define invalid_with_stmt_type 1165 +#define _loop0_1_type 1166 +#define _loop0_2_type 1167 +#define _loop0_4_type 1168 +#define _gather_3_type 1169 +#define _loop0_6_type 1170 +#define _gather_5_type 1171 +#define _loop0_8_type 1172 +#define _gather_7_type 1173 +#define _loop0_10_type 1174 +#define _gather_9_type 1175 +#define _loop1_11_type 1176 +#define _loop0_13_type 1177 +#define _gather_12_type 1178 +#define _tmp_14_type 1179 +#define _tmp_15_type 1180 +#define _tmp_16_type 1181 +#define _tmp_17_type 1182 +#define _tmp_18_type 1183 +#define _tmp_19_type 1184 +#define _tmp_20_type 1185 +#define _tmp_21_type 1186 +#define _loop1_22_type 1187 +#define _tmp_23_type 1188 +#define _tmp_24_type 1189 +#define _loop0_26_type 1190 +#define _gather_25_type 1191 +#define _loop0_28_type 1192 +#define _gather_27_type 1193 +#define _tmp_29_type 1194 +#define _tmp_30_type 1195 +#define _loop0_31_type 1196 +#define _loop1_32_type 1197 +#define _loop0_34_type 1198 +#define _gather_33_type 1199 +#define _tmp_35_type 1200 +#define _loop0_37_type 1201 +#define _gather_36_type 1202 +#define _tmp_38_type 1203 +#define _loop0_40_type 1204 +#define _gather_39_type 1205 +#define _loop0_42_type 1206 +#define _gather_41_type 1207 +#define _loop0_44_type 1208 +#define _gather_43_type 1209 +#define _loop0_46_type 1210 +#define _gather_45_type 1211 +#define _tmp_47_type 1212 +#define _loop1_48_type 1213 +#define _tmp_49_type 1214 +#define _tmp_50_type 1215 +#define _tmp_51_type 1216 +#define _tmp_52_type 1217 +#define _tmp_53_type 1218 +#define _loop0_54_type 1219 +#define _loop0_55_type 1220 +#define _loop0_56_type 1221 +#define _loop1_57_type 1222 +#define _loop0_58_type 1223 +#define _loop1_59_type 1224 +#define _loop1_60_type 1225 +#define _loop1_61_type 1226 +#define _loop0_62_type 1227 +#define _loop1_63_type 1228 +#define _loop0_64_type 1229 +#define _loop1_65_type 1230 +#define _loop0_66_type 1231 +#define _loop1_67_type 1232 +#define _loop1_68_type 1233 +#define _tmp_69_type 1234 +#define _loop1_70_type 1235 +#define _loop0_72_type 1236 +#define _gather_71_type 1237 +#define _loop1_73_type 1238 +#define _loop0_74_type 1239 +#define _loop0_75_type 1240 +#define _loop0_76_type 1241 +#define _loop1_77_type 1242 +#define _loop0_78_type 1243 +#define _loop1_79_type 1244 +#define _loop1_80_type 1245 +#define _loop1_81_type 1246 +#define _loop0_82_type 1247 +#define _loop1_83_type 1248 +#define _loop0_84_type 1249 +#define _loop1_85_type 1250 +#define _loop0_86_type 1251 +#define _loop1_87_type 1252 +#define _loop1_88_type 1253 +#define _loop1_89_type 1254 +#define _loop1_90_type 1255 +#define _tmp_91_type 1256 +#define _loop0_93_type 1257 +#define _gather_92_type 1258 +#define _tmp_94_type 1259 +#define _tmp_95_type 1260 +#define _tmp_96_type 1261 +#define _tmp_97_type 1262 +#define _loop1_98_type 1263 +#define _tmp_99_type 1264 +#define _tmp_100_type 1265 +#define _loop0_102_type 1266 +#define _gather_101_type 1267 +#define _loop1_103_type 1268 +#define _loop0_104_type 1269 +#define _loop0_105_type 1270 +#define _loop0_107_type 1271 +#define _gather_106_type 1272 +#define _tmp_108_type 1273 +#define _loop0_110_type 1274 +#define _gather_109_type 1275 +#define _loop0_112_type 1276 +#define _gather_111_type 1277 +#define _loop0_114_type 1278 +#define _gather_113_type 1279 +#define _loop0_116_type 1280 +#define _gather_115_type 1281 +#define _loop0_117_type 1282 +#define _loop0_119_type 1283 +#define _gather_118_type 1284 +#define _loop1_120_type 1285 +#define _tmp_121_type 1286 +#define _loop0_123_type 1287 +#define _gather_122_type 1288 +#define _loop0_125_type 1289 +#define _gather_124_type 1290 +#define _tmp_126_type 1291 +#define _loop0_127_type 1292 +#define _loop0_128_type 1293 +#define _loop0_129_type 1294 +#define _tmp_130_type 1295 +#define _tmp_131_type 1296 +#define _tmp_132_type 1297 +#define _loop0_133_type 1298 +#define _loop1_134_type 1299 +#define _loop0_135_type 1300 +#define _loop1_136_type 1301 +#define _tmp_137_type 1302 +#define _tmp_138_type 1303 +#define _tmp_139_type 1304 +#define _loop0_141_type 1305 +#define _gather_140_type 1306 +#define _loop0_143_type 1307 +#define _gather_142_type 1308 +#define _tmp_144_type 1309 +#define _tmp_145_type 1310 +#define _tmp_146_type 1311 +#define _tmp_147_type 1312 +#define _tmp_148_type 1313 +#define _tmp_149_type 1314 +#define _tmp_150_type 1315 +#define _tmp_151_type 1316 +#define _tmp_152_type 1317 +#define _tmp_153_type 1318 +#define _tmp_154_type 1319 +#define _tmp_155_type 1320 +#define _tmp_156_type 1321 +#define _tmp_157_type 1322 +#define _tmp_158_type 1323 +#define _tmp_159_type 1324 +#define _tmp_160_type 1325 +#define _tmp_161_type 1326 +#define _tmp_162_type 1327 +#define _tmp_163_type 1328 +#define _tmp_164_type 1329 static mod_ty file_rule(Parser *p); static mod_ty interactive_rule(Parser *p); @@ -552,6 +562,7 @@ 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 void *invalid_with_stmt_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); @@ -691,10 +702,10 @@ static asdl_seq *_loop1_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 asdl_seq *_loop0_141_rule(Parser *p); +static asdl_seq *_gather_140_rule(Parser *p); +static asdl_seq *_loop0_143_rule(Parser *p); +static asdl_seq *_gather_142_rule(Parser *p); static void *_tmp_144_rule(Parser *p); static void *_tmp_145_rule(Parser *p); static void *_tmp_146_rule(Parser *p); @@ -707,6 +718,15 @@ static void *_tmp_152_rule(Parser *p); static void *_tmp_153_rule(Parser *p); static void *_tmp_154_rule(Parser *p); static void *_tmp_155_rule(Parser *p); +static void *_tmp_156_rule(Parser *p); +static void *_tmp_157_rule(Parser *p); +static void *_tmp_158_rule(Parser *p); +static void *_tmp_159_rule(Parser *p); +static void *_tmp_160_rule(Parser *p); +static void *_tmp_161_rule(Parser *p); +static void *_tmp_162_rule(Parser *p); +static void *_tmp_163_rule(Parser *p); +static void *_tmp_164_rule(Parser *p); // file: statements? $ @@ -3542,8 +3562,8 @@ dotted_name_raw(Parser *p) } // if_stmt: -// | 'if' named_expression ':' block elif_stmt -// | 'if' named_expression ':' block else_block? +// | 'if' named_expression &&':' block elif_stmt +// | 'if' named_expression &&':' block else_block? static stmt_ty if_stmt_rule(Parser *p) { @@ -3563,12 +3583,12 @@ if_stmt_rule(Parser *p) 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' 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")); + 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; @@ -3579,14 +3599,14 @@ if_stmt_rule(Parser *p) && (a = named_expression_rule(p)) // named_expression && - (_literal = _PyPegen_expect_token(p, 11)) // token=':' + (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_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")); + 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--); @@ -3606,14 +3626,14 @@ if_stmt_rule(Parser *p) } 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")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' named_expression &&':' block elif_stmt")); } - { // 'if' named_expression ':' block else_block? + { // '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?")); + 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; @@ -3624,14 +3644,14 @@ if_stmt_rule(Parser *p) && (a = named_expression_rule(p)) // named_expression && - (_literal = _PyPegen_expect_token(p, 11)) // token=':' + (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_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?")); + 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--); @@ -3651,7 +3671,7 @@ if_stmt_rule(Parser *p) } 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?")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' named_expression &&':' block else_block?")); } _res = NULL; done: @@ -3660,8 +3680,8 @@ if_stmt_rule(Parser *p) } // elif_stmt: -// | 'elif' named_expression ':' block elif_stmt -// | 'elif' named_expression ':' block else_block? +// | 'elif' named_expression &&':' block elif_stmt +// | 'elif' named_expression &&':' block else_block? static stmt_ty elif_stmt_rule(Parser *p) { @@ -3681,12 +3701,12 @@ elif_stmt_rule(Parser *p) 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 + { // '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")); + 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; @@ -3697,14 +3717,14 @@ elif_stmt_rule(Parser *p) && (a = named_expression_rule(p)) // named_expression && - (_literal = _PyPegen_expect_token(p, 11)) // token=':' + (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_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")); + 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--); @@ -3724,14 +3744,14 @@ elif_stmt_rule(Parser *p) } 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")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'elif' named_expression &&':' block elif_stmt")); } - { // 'elif' named_expression ':' block else_block? + { // '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?")); + 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; @@ -3742,14 +3762,14 @@ elif_stmt_rule(Parser *p) && (a = named_expression_rule(p)) // named_expression && - (_literal = _PyPegen_expect_token(p, 11)) // token=':' + (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_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?")); + 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--); @@ -3769,7 +3789,7 @@ elif_stmt_rule(Parser *p) } 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?")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'elif' named_expression &&':' block else_block?")); } _res = NULL; done: @@ -3777,7 +3797,7 @@ elif_stmt_rule(Parser *p) return _res; } -// else_block: 'else' ':' block +// else_block: 'else' &&':' block static asdl_stmt_seq* else_block_rule(Parser *p) { @@ -3788,24 +3808,24 @@ else_block_rule(Parser *p) } asdl_stmt_seq* _res = NULL; int _mark = p->mark; - { // 'else' ':' block + { // '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")); + D(fprintf(stderr, "%*c> else_block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'else' &&':' block")); Token * _keyword; Token * _literal; asdl_stmt_seq* b; if ( (_keyword = _PyPegen_expect_token(p, 516)) // token='else' && - (_literal = _PyPegen_expect_token(p, 11)) // token=':' + (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && (b = block_rule(p)) // block ) { - D(fprintf(stderr, "%*c+ else_block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'else' ':' 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; @@ -3816,7 +3836,7 @@ else_block_rule(Parser *p) } 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")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'else' &&':' block")); } _res = NULL; done: @@ -3824,7 +3844,7 @@ else_block_rule(Parser *p) return _res; } -// while_stmt: 'while' named_expression ':' block else_block? +// while_stmt: 'while' named_expression &&':' block else_block? static stmt_ty while_stmt_rule(Parser *p) { @@ -3844,12 +3864,12 @@ while_stmt_rule(Parser *p) 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? + { // '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?")); + 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; @@ -3860,14 +3880,14 @@ while_stmt_rule(Parser *p) && (a = named_expression_rule(p)) // named_expression && - (_literal = _PyPegen_expect_token(p, 11)) // token=':' + (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_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?")); + 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--); @@ -3887,7 +3907,7 @@ while_stmt_rule(Parser *p) } 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?")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'while' named_expression &&':' block else_block?")); } _res = NULL; done: @@ -3896,8 +3916,8 @@ while_stmt_rule(Parser *p) } // 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? +// | '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) @@ -3918,12 +3938,12 @@ for_stmt_rule(Parser *p) 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? + { // '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?")); + 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; @@ -3944,7 +3964,7 @@ for_stmt_rule(Parser *p) && (ex = star_expressions_rule(p)) // star_expressions && - (_literal = _PyPegen_expect_token(p, 11)) // token=':' + (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && (tc = _PyPegen_expect_token(p, TYPE_COMMENT), 1) // TYPE_COMMENT? && @@ -3953,7 +3973,7 @@ for_stmt_rule(Parser *p) (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?")); + 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--); @@ -3973,18 +3993,18 @@ for_stmt_rule(Parser *p) } 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?")); + 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? + { // 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?")); + 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; @@ -4008,7 +4028,7 @@ for_stmt_rule(Parser *p) && (ex = star_expressions_rule(p)) // star_expressions && - (_literal = _PyPegen_expect_token(p, 11)) // token=':' + (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && (tc = _PyPegen_expect_token(p, TYPE_COMMENT), 1) // TYPE_COMMENT? && @@ -4017,7 +4037,7 @@ for_stmt_rule(Parser *p) (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?")); + 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--); @@ -4037,7 +4057,7 @@ for_stmt_rule(Parser *p) } 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?")); + 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; @@ -4073,6 +4093,7 @@ for_stmt_rule(Parser *p) // | 'with' ','.with_item+ ':' TYPE_COMMENT? block // | ASYNC 'with' '(' ','.with_item+ ','? ')' ':' block // | ASYNC 'with' ','.with_item+ ':' TYPE_COMMENT? block +// | invalid_with_stmt static stmt_ty with_stmt_rule(Parser *p) { @@ -4292,6 +4313,25 @@ with_stmt_rule(Parser *p) 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")); } + if (p->call_invalid_rules) { // invalid_with_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> with_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_with_stmt")); + void *invalid_with_stmt_var; + if ( + (invalid_with_stmt_var = invalid_with_stmt_rule(p)) // invalid_with_stmt + ) + { + D(fprintf(stderr, "%*c+ with_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_with_stmt")); + _res = invalid_with_stmt_var; + 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, "invalid_with_stmt")); + } _res = NULL; done: D(p->level--); @@ -4394,8 +4434,8 @@ with_item_rule(Parser *p) } // try_stmt: -// | 'try' ':' block finally_block -// | 'try' ':' block except_block+ else_block? finally_block? +// | 'try' &&':' block finally_block +// | 'try' &&':' block except_block+ else_block? finally_block? static stmt_ty try_stmt_rule(Parser *p) { @@ -4415,12 +4455,12 @@ try_stmt_rule(Parser *p) 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 + { // '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")); + D(fprintf(stderr, "%*c> try_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'try' &&':' block finally_block")); Token * _keyword; Token * _literal; asdl_stmt_seq* b; @@ -4428,14 +4468,14 @@ try_stmt_rule(Parser *p) if ( (_keyword = _PyPegen_expect_token(p, 511)) // token='try' && - (_literal = _PyPegen_expect_token(p, 11)) // token=':' + (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_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")); + 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--); @@ -4455,14 +4495,14 @@ try_stmt_rule(Parser *p) } 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")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'try' &&':' block finally_block")); } - { // 'try' ':' block except_block+ else_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?")); + 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_stmt_seq* b; @@ -4472,7 +4512,7 @@ try_stmt_rule(Parser *p) if ( (_keyword = _PyPegen_expect_token(p, 511)) // token='try' && - (_literal = _PyPegen_expect_token(p, 11)) // token=':' + (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && (b = block_rule(p)) // block && @@ -4483,7 +4523,7 @@ try_stmt_rule(Parser *p) (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?")); + 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--); @@ -4503,7 +4543,7 @@ try_stmt_rule(Parser *p) } 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?")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'try' &&':' block except_block+ else_block? finally_block?")); } _res = NULL; done: @@ -4511,7 +4551,7 @@ try_stmt_rule(Parser *p) return _res; } -// except_block: 'except' expression ['as' NAME] ':' block | 'except' ':' block +// except_block: 'except' expression ['as' NAME] &&':' block | 'except' &&':' block static excepthandler_ty except_block_rule(Parser *p) { @@ -4531,12 +4571,12 @@ except_block_rule(Parser *p) 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 + { // '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")); + 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_stmt_seq* b; @@ -4549,12 +4589,12 @@ except_block_rule(Parser *p) && (t = _tmp_49_rule(p), 1) // ['as' NAME] && - (_literal = _PyPegen_expect_token(p, 11)) // token=':' + (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_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")); + 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--); @@ -4574,26 +4614,26 @@ except_block_rule(Parser *p) } 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")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'except' expression ['as' NAME] &&':' block")); } - { // 'except' ':' 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")); + D(fprintf(stderr, "%*c> except_block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except' &&':' block")); Token * _keyword; Token * _literal; asdl_stmt_seq* b; if ( (_keyword = _PyPegen_expect_token(p, 521)) // token='except' && - (_literal = _PyPegen_expect_token(p, 11)) // token=':' + (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && (b = block_rule(p)) // block ) { - D(fprintf(stderr, "%*c+ except_block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except' ':' 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--); @@ -4613,7 +4653,7 @@ except_block_rule(Parser *p) } 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")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'except' &&':' block")); } _res = NULL; done: @@ -4892,8 +4932,8 @@ function_def_rule(Parser *p) } // function_def_raw: -// | 'def' NAME '(' params? ')' ['->' expression] ':' func_type_comment? block -// | ASYNC 'def' NAME '(' params? ')' ['->' expression] ':' func_type_comment? block +// | '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) { @@ -4913,12 +4953,12 @@ function_def_raw_rule(Parser *p) 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 + { // '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")); + 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; @@ -4941,14 +4981,14 @@ function_def_raw_rule(Parser *p) && (a = _tmp_51_rule(p), 1) // ['->' expression] && - (_literal_2 = _PyPegen_expect_token(p, 11)) // token=':' + (_literal_2 = _PyPegen_expect_forced_token(p, 11, ":")) // forced_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")); + 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--); @@ -4968,14 +5008,14 @@ function_def_raw_rule(Parser *p) } 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")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'def' NAME '(' params? ')' ['->' expression] &&':' func_type_comment? block")); } - { // ASYNC '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")); + 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; @@ -5001,14 +5041,14 @@ function_def_raw_rule(Parser *p) && (a = _tmp_52_rule(p), 1) // ['->' expression] && - (_literal_2 = _PyPegen_expect_token(p, 11)) // token=':' + (_literal_2 = _PyPegen_expect_forced_token(p, 11, ":")) // forced_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")); + 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--); @@ -5028,7 +5068,7 @@ function_def_raw_rule(Parser *p) } 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")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "ASYNC 'def' NAME '(' params? ')' ['->' expression] &&':' func_type_comment? block")); } _res = NULL; done: @@ -6174,7 +6214,7 @@ class_def_rule(Parser *p) return _res; } -// class_def_raw: 'class' NAME ['(' arguments? ')'] ':' block +// class_def_raw: 'class' NAME ['(' arguments? ')'] &&':' block static stmt_ty class_def_raw_rule(Parser *p) { @@ -6194,12 +6234,12 @@ class_def_raw_rule(Parser *p) 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 + { // '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")); + 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; @@ -6212,12 +6252,12 @@ class_def_raw_rule(Parser *p) && (b = _tmp_69_rule(p), 1) // ['(' arguments? ')'] && - (_literal = _PyPegen_expect_token(p, 11)) // token=':' + (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_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")); + 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--); @@ -6237,7 +6277,7 @@ class_def_raw_rule(Parser *p) } 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")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'class' NAME ['(' arguments? ')'] &&':' block")); } _res = NULL; done: @@ -15699,7 +15739,7 @@ invalid_double_type_comments_rule(Parser *p) return _res; } -// invalid_with_item: expression 'as' expression +// invalid_with_item: expression 'as' expression &(',' | ')' | ':') static void * invalid_with_item_rule(Parser *p) { @@ -15710,12 +15750,12 @@ invalid_with_item_rule(Parser *p) } void * _res = NULL; int _mark = p->mark; - { // expression 'as' expression + { // 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")); + 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; @@ -15725,9 +15765,11 @@ invalid_with_item_rule(Parser *p) (_keyword = _PyPegen_expect_token(p, 520)) // token='as' && (a = expression_rule(p)) // expression + && + _PyPegen_lookahead(1, _tmp_139_rule, p) ) { - D(fprintf(stderr, "%*c+ invalid_with_item[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression 'as' 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; @@ -15738,7 +15780,7 @@ invalid_with_item_rule(Parser *p) } 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")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression 'as' expression &(',' | ')' | ':')")); } _res = NULL; done: @@ -15885,6 +15927,93 @@ invalid_import_from_targets_rule(Parser *p) return _res; } +// invalid_with_stmt: +// | ASYNC? 'with' ','.(expression ['as' star_target])+ &&':' +// | ASYNC? 'with' '(' ','.(expressions ['as' star_target])+ ','? ')' &&':' +static void * +invalid_with_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ASYNC? 'with' ','.(expression ['as' star_target])+ &&':' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_with_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC? 'with' ','.(expression ['as' star_target])+ &&':'")); + asdl_seq * _gather_140_var; + Token * _keyword; + Token * _literal; + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + if ( + (_opt_var = _PyPegen_expect_token(p, ASYNC), 1) // ASYNC? + && + (_keyword = _PyPegen_expect_token(p, 519)) // token='with' + && + (_gather_140_var = _gather_140_rule(p)) // ','.(expression ['as' star_target])+ + && + (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' + ) + { + D(fprintf(stderr, "%*c+ invalid_with_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC? 'with' ','.(expression ['as' star_target])+ &&':'")); + _res = _PyPegen_dummy_name(p, _opt_var, _keyword, _gather_140_var, _literal); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_with_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "ASYNC? 'with' ','.(expression ['as' star_target])+ &&':'")); + } + { // ASYNC? 'with' '(' ','.(expressions ['as' star_target])+ ','? ')' &&':' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_with_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC? 'with' '(' ','.(expressions ['as' star_target])+ ','? ')' &&':'")); + asdl_seq * _gather_142_var; + Token * _keyword; + Token * _literal; + Token * _literal_1; + Token * _literal_2; + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + void *_opt_var_1; + UNUSED(_opt_var_1); // Silence compiler warnings + if ( + (_opt_var = _PyPegen_expect_token(p, ASYNC), 1) // ASYNC? + && + (_keyword = _PyPegen_expect_token(p, 519)) // token='with' + && + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (_gather_142_var = _gather_142_rule(p)) // ','.(expressions ['as' star_target])+ + && + (_opt_var_1 = _PyPegen_expect_token(p, 12), 1) // ','? + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + && + (_literal_2 = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' + ) + { + D(fprintf(stderr, "%*c+ invalid_with_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC? 'with' '(' ','.(expressions ['as' star_target])+ ','? ')' &&':'")); + _res = _PyPegen_dummy_name(p, _opt_var, _keyword, _literal, _gather_142_var, _opt_var_1, _literal_1, _literal_2); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_with_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "ASYNC? 'with' '(' ','.(expressions ['as' star_target])+ ','? ')' &&':'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + // _loop0_1: NEWLINE static asdl_seq * _loop0_1_rule(Parser *p) @@ -17133,12 +17262,12 @@ _loop1_22_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_22[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); - void *_tmp_139_var; + void *_tmp_144_var; while ( - (_tmp_139_var = _tmp_139_rule(p)) // star_targets '=' + (_tmp_144_var = _tmp_144_rule(p)) // star_targets '=' ) { - _res = _tmp_139_var; + _res = _tmp_144_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -17641,12 +17770,12 @@ _loop0_31_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_31[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')")); - void *_tmp_140_var; + void *_tmp_145_var; while ( - (_tmp_140_var = _tmp_140_rule(p)) // '.' | '...' + (_tmp_145_var = _tmp_145_rule(p)) // '.' | '...' ) { - _res = _tmp_140_var; + _res = _tmp_145_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -17707,12 +17836,12 @@ _loop1_32_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_32[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')")); - void *_tmp_141_var; + void *_tmp_146_var; while ( - (_tmp_141_var = _tmp_141_rule(p)) // '.' | '...' + (_tmp_146_var = _tmp_146_rule(p)) // '.' | '...' ) { - _res = _tmp_141_var; + _res = _tmp_146_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -19869,12 +19998,12 @@ _loop1_68_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_68[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('@' named_expression NEWLINE)")); - void *_tmp_142_var; + void *_tmp_147_var; while ( - (_tmp_142_var = _tmp_142_rule(p)) // '@' named_expression NEWLINE + (_tmp_147_var = _tmp_147_rule(p)) // '@' named_expression NEWLINE ) { - _res = _tmp_142_var; + _res = _tmp_147_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -19987,12 +20116,12 @@ _loop1_70_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_70[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_expression)")); - void *_tmp_143_var; + void *_tmp_148_var; while ( - (_tmp_143_var = _tmp_143_rule(p)) // ',' star_expression + (_tmp_148_var = _tmp_148_rule(p)) // ',' star_expression ) { - _res = _tmp_143_var; + _res = _tmp_148_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -20172,12 +20301,12 @@ _loop1_73_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_73[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' expression)")); - void *_tmp_144_var; + void *_tmp_149_var; while ( - (_tmp_144_var = _tmp_144_rule(p)) // ',' expression + (_tmp_149_var = _tmp_149_rule(p)) // ',' expression ) { - _res = _tmp_144_var; + _res = _tmp_149_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -21202,12 +21331,12 @@ _loop1_88_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_88[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('or' conjunction)")); - void *_tmp_145_var; + void *_tmp_150_var; while ( - (_tmp_145_var = _tmp_145_rule(p)) // 'or' conjunction + (_tmp_150_var = _tmp_150_rule(p)) // 'or' conjunction ) { - _res = _tmp_145_var; + _res = _tmp_150_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -21273,12 +21402,12 @@ _loop1_89_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_89[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('and' inversion)")); - void *_tmp_146_var; + void *_tmp_151_var; while ( - (_tmp_146_var = _tmp_146_rule(p)) // 'and' inversion + (_tmp_151_var = _tmp_151_rule(p)) // 'and' inversion ) { - _res = _tmp_146_var; + _res = _tmp_151_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -22194,12 +22323,12 @@ _loop0_104_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_104[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('if' disjunction)")); - void *_tmp_147_var; + void *_tmp_152_var; while ( - (_tmp_147_var = _tmp_147_rule(p)) // 'if' disjunction + (_tmp_152_var = _tmp_152_rule(p)) // 'if' disjunction ) { - _res = _tmp_147_var; + _res = _tmp_152_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -22260,12 +22389,12 @@ _loop0_105_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_105[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('if' disjunction)")); - void *_tmp_148_var; + void *_tmp_153_var; while ( - (_tmp_148_var = _tmp_148_rule(p)) // 'if' disjunction + (_tmp_153_var = _tmp_153_rule(p)) // 'if' disjunction ) { - _res = _tmp_148_var; + _res = _tmp_153_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -22331,7 +22460,7 @@ _loop0_107_rule(Parser *p) while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = _tmp_149_rule(p)) // starred_expression | named_expression !'=' + (elem = _tmp_154_rule(p)) // starred_expression | named_expression !'=' ) { _res = elem; @@ -22394,7 +22523,7 @@ _gather_106_rule(Parser *p) void *elem; asdl_seq * seq; if ( - (elem = _tmp_149_rule(p)) // starred_expression | named_expression !'=' + (elem = _tmp_154_rule(p)) // starred_expression | named_expression !'=' && (seq = _loop0_107_rule(p)) // _loop0_107 ) @@ -22940,12 +23069,12 @@ _loop0_117_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_117[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_target)")); - void *_tmp_150_var; + void *_tmp_155_var; while ( - (_tmp_150_var = _tmp_150_rule(p)) // ',' star_target + (_tmp_155_var = _tmp_155_rule(p)) // ',' star_target ) { - _res = _tmp_150_var; + _res = _tmp_155_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -23120,12 +23249,12 @@ _loop1_120_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_120[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_target)")); - void *_tmp_151_var; + void *_tmp_156_var; while ( - (_tmp_151_var = _tmp_151_rule(p)) // ',' star_target + (_tmp_156_var = _tmp_156_rule(p)) // ',' star_target ) { - _res = _tmp_151_var; + _res = _tmp_156_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -23581,12 +23710,12 @@ _loop0_128_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_128[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); - void *_tmp_152_var; + void *_tmp_157_var; while ( - (_tmp_152_var = _tmp_152_rule(p)) // star_targets '=' + (_tmp_157_var = _tmp_157_rule(p)) // star_targets '=' ) { - _res = _tmp_152_var; + _res = _tmp_157_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -23647,12 +23776,12 @@ _loop0_129_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_129[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); - void *_tmp_153_var; + void *_tmp_158_var; while ( - (_tmp_153_var = _tmp_153_rule(p)) // star_targets '=' + (_tmp_158_var = _tmp_158_rule(p)) // star_targets '=' ) { - _res = _tmp_153_var; + _res = _tmp_158_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -24181,15 +24310,15 @@ _tmp_137_rule(Parser *p) } D(fprintf(stderr, "%*c> _tmp_137[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); Token * _literal; - void *_tmp_154_var; + void *_tmp_159_var; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (_tmp_154_var = _tmp_154_rule(p)) // ')' | '**' + (_tmp_159_var = _tmp_159_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_154_var); + _res = _PyPegen_dummy_name(p, _literal, _tmp_159_var); goto done; } p->mark = _mark; @@ -24239,15 +24368,15 @@ _tmp_138_rule(Parser *p) } D(fprintf(stderr, "%*c> _tmp_138[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); Token * _literal; - void *_tmp_155_var; + void *_tmp_160_var; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (_tmp_155_var = _tmp_155_rule(p)) // ':' | '**' + (_tmp_160_var = _tmp_160_rule(p)) // ':' | '**' ) { D(fprintf(stderr, "%*c+ _tmp_138[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); - _res = _PyPegen_dummy_name(p, _literal, _tmp_155_var); + _res = _PyPegen_dummy_name(p, _literal, _tmp_160_var); goto done; } p->mark = _mark; @@ -24260,7 +24389,7 @@ _tmp_138_rule(Parser *p) return _res; } -// _tmp_139: star_targets '=' +// _tmp_139: ',' | ')' | ':' static void * _tmp_139_rule(Parser *p) { @@ -24271,87 +24400,62 @@ _tmp_139_rule(Parser *p) } void * _res = NULL; int _mark = p->mark; - { // star_targets '=' + { // ',' if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_139[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c> _tmp_139[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; - expr_ty z; if ( - (z = star_targets_rule(p)) // star_targets - && - (_literal = _PyPegen_expect_token(p, 22)) // token='=' + (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_139[%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; - } + 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, "star_targets '='")); - } - _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; + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } - 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, "'.'")); + 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='.' + (_literal = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_140[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); + 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_140[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->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_140[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); + 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='...' + (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_140[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); + 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_140[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->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: @@ -24359,54 +24463,113 @@ _tmp_140_rule(Parser *p) return _res; } -// _tmp_141: '.' | '...' -static void * -_tmp_141_rule(Parser *p) +// _loop0_141: ',' (expression ['as' star_target]) +static asdl_seq * +_loop0_141_rule(Parser *p) { D(p->level++); if (p->error_indicator) { D(p->level--); return NULL; } - void * _res = 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 ['as' star_target]) if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_141[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c> _loop0_141[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (expression ['as' star_target])")); Token * _literal; - if ( - (_literal = _PyPegen_expect_token(p, 23)) // token='.' + void *elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = _tmp_161_rule(p)) // expression ['as' star_target] ) { - D(fprintf(stderr, "%*c+ _tmp_141[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); - _res = _literal; - goto done; + _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 _tmp_141[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c%s _loop0_141[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (expression ['as' star_target])")); } - { // '...' + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_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_UNTYPED(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_141_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_140: (expression ['as' star_target]) _loop0_141 +static asdl_seq * +_gather_140_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // (expression ['as' star_target]) _loop0_141 if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_141[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); - Token * _literal; + D(fprintf(stderr, "%*c> _gather_140[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_141")); + void *elem; + asdl_seq * seq; if ( - (_literal = _PyPegen_expect_token(p, 52)) // token='...' + (elem = _tmp_161_rule(p)) // expression ['as' star_target] + && + (seq = _loop0_141_rule(p)) // _loop0_141 ) { - D(fprintf(stderr, "%*c+ _tmp_141[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); - _res = _literal; + D(fprintf(stderr, "%*c+ _gather_140[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_141")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); 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, "'...'")); + D(fprintf(stderr, "%*c%s _gather_140[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(expression ['as' star_target]) _loop0_141")); } _res = NULL; done: @@ -24414,23 +24577,291 @@ _tmp_141_rule(Parser *p) return _res; } -// _tmp_142: '@' named_expression NEWLINE -static void * -_tmp_142_rule(Parser *p) +// _loop0_143: ',' (expressions ['as' star_target]) +static asdl_seq * +_loop0_143_rule(Parser *p) { D(p->level++); if (p->error_indicator) { D(p->level--); return NULL; } - void * _res = NULL; + void *_res = NULL; int _mark = p->mark; - { // '@' named_expression NEWLINE - if (p->error_indicator) { - D(p->level--); + 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; + { // ',' (expressions ['as' star_target]) + if (p->error_indicator) { + D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_142[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); + D(fprintf(stderr, "%*c> _loop0_143[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (expressions ['as' star_target])")); + Token * _literal; + void *elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = _tmp_162_rule(p)) // expressions ['as' 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_143[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (expressions ['as' star_target])")); + } + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_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_UNTYPED(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_143_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_142: (expressions ['as' star_target]) _loop0_143 +static asdl_seq * +_gather_142_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // (expressions ['as' star_target]) _loop0_143 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_142[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_143")); + void *elem; + asdl_seq * seq; + if ( + (elem = _tmp_162_rule(p)) // expressions ['as' star_target] + && + (seq = _loop0_143_rule(p)) // _loop0_143 + ) + { + D(fprintf(stderr, "%*c+ _gather_142[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_143")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_142[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(expressions ['as' star_target]) _loop0_143")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_144: star_targets '=' +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; + { // star_targets '=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_144[%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_144[%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_144[%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_145: '.' | '...' +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; + { // '.' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_145[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 23)) // token='.' + ) + { + D(fprintf(stderr, "%*c+ _tmp_145[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); + _res = _literal; + 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, "'.'")); + } + { // '...' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_145[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 52)) // token='...' + ) + { + D(fprintf(stderr, "%*c+ _tmp_145[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); + _res = _literal; + 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, "'...'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_146: '.' | '...' +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 (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_146[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 23)) // token='.' + ) + { + D(fprintf(stderr, "%*c+ _tmp_146[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); + _res = _literal; + 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 (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_146[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 52)) // token='...' + ) + { + D(fprintf(stderr, "%*c+ _tmp_146[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); + _res = _literal; + 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, "'...'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_147: '@' named_expression NEWLINE +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; + { // '@' named_expression NEWLINE + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_147[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); Token * _literal; expr_ty f; Token * newline_var; @@ -24442,7 +24873,7 @@ _tmp_142_rule(Parser *p) (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' ) { - D(fprintf(stderr, "%*c+ _tmp_142[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); + D(fprintf(stderr, "%*c+ _tmp_147[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); _res = f; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24452,7 +24883,7 @@ _tmp_142_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_142[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_147[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'@' named_expression NEWLINE")); } _res = NULL; @@ -24461,9 +24892,9 @@ _tmp_142_rule(Parser *p) return _res; } -// _tmp_143: ',' star_expression +// _tmp_148: ',' star_expression static void * -_tmp_143_rule(Parser *p) +_tmp_148_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24477,7 +24908,7 @@ _tmp_143_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_143[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_expression")); + D(fprintf(stderr, "%*c> _tmp_148[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_expression")); Token * _literal; expr_ty c; if ( @@ -24486,7 +24917,7 @@ _tmp_143_rule(Parser *p) (c = star_expression_rule(p)) // star_expression ) { - D(fprintf(stderr, "%*c+ _tmp_143[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_expression")); + D(fprintf(stderr, "%*c+ _tmp_148[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_expression")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24496,7 +24927,7 @@ _tmp_143_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_143[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_148[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_expression")); } _res = NULL; @@ -24505,9 +24936,9 @@ _tmp_143_rule(Parser *p) return _res; } -// _tmp_144: ',' expression +// _tmp_149: ',' expression static void * -_tmp_144_rule(Parser *p) +_tmp_149_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24521,7 +24952,7 @@ _tmp_144_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_144[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); + D(fprintf(stderr, "%*c> _tmp_149[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); Token * _literal; expr_ty c; if ( @@ -24530,7 +24961,7 @@ _tmp_144_rule(Parser *p) (c = expression_rule(p)) // expression ) { - D(fprintf(stderr, "%*c+ _tmp_144[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' expression")); + D(fprintf(stderr, "%*c+ _tmp_149[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' expression")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24540,7 +24971,7 @@ _tmp_144_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_144[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_149[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); } _res = NULL; @@ -24549,9 +24980,9 @@ _tmp_144_rule(Parser *p) return _res; } -// _tmp_145: 'or' conjunction +// _tmp_150: 'or' conjunction static void * -_tmp_145_rule(Parser *p) +_tmp_150_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24565,7 +24996,7 @@ _tmp_145_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_145[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); + D(fprintf(stderr, "%*c> _tmp_150[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); Token * _keyword; expr_ty c; if ( @@ -24574,7 +25005,7 @@ _tmp_145_rule(Parser *p) (c = conjunction_rule(p)) // conjunction ) { - D(fprintf(stderr, "%*c+ _tmp_145[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); + D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24584,7 +25015,7 @@ _tmp_145_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_145[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_150[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'or' conjunction")); } _res = NULL; @@ -24593,9 +25024,9 @@ _tmp_145_rule(Parser *p) return _res; } -// _tmp_146: 'and' inversion +// _tmp_151: 'and' inversion static void * -_tmp_146_rule(Parser *p) +_tmp_151_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24609,7 +25040,7 @@ _tmp_146_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_146[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'and' inversion")); + D(fprintf(stderr, "%*c> _tmp_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'and' inversion")); Token * _keyword; expr_ty c; if ( @@ -24618,7 +25049,7 @@ _tmp_146_rule(Parser *p) (c = inversion_rule(p)) // inversion ) { - D(fprintf(stderr, "%*c+ _tmp_146[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'and' inversion")); + D(fprintf(stderr, "%*c+ _tmp_151[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'and' inversion")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24628,7 +25059,7 @@ _tmp_146_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_146[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_151[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'and' inversion")); } _res = NULL; @@ -24637,9 +25068,9 @@ _tmp_146_rule(Parser *p) return _res; } -// _tmp_147: 'if' disjunction +// _tmp_152: 'if' disjunction static void * -_tmp_147_rule(Parser *p) +_tmp_152_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24653,7 +25084,7 @@ _tmp_147_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_147[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c> _tmp_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); Token * _keyword; expr_ty z; if ( @@ -24662,7 +25093,7 @@ _tmp_147_rule(Parser *p) (z = disjunction_rule(p)) // disjunction ) { - D(fprintf(stderr, "%*c+ _tmp_147[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c+ _tmp_152[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24672,7 +25103,7 @@ _tmp_147_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_147[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_152[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' disjunction")); } _res = NULL; @@ -24681,9 +25112,9 @@ _tmp_147_rule(Parser *p) return _res; } -// _tmp_148: 'if' disjunction +// _tmp_153: 'if' disjunction static void * -_tmp_148_rule(Parser *p) +_tmp_153_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24697,7 +25128,7 @@ _tmp_148_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_148[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c> _tmp_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); Token * _keyword; expr_ty z; if ( @@ -24706,7 +25137,7 @@ _tmp_148_rule(Parser *p) (z = disjunction_rule(p)) // disjunction ) { - D(fprintf(stderr, "%*c+ _tmp_148[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c+ _tmp_153[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24716,7 +25147,7 @@ _tmp_148_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_148[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_153[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' disjunction")); } _res = NULL; @@ -24725,9 +25156,9 @@ _tmp_148_rule(Parser *p) return _res; } -// _tmp_149: starred_expression | named_expression !'=' +// _tmp_154: starred_expression | named_expression !'=' static void * -_tmp_149_rule(Parser *p) +_tmp_154_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24741,18 +25172,18 @@ _tmp_149_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_149[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "starred_expression")); + D(fprintf(stderr, "%*c> _tmp_154[%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_149[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression")); + D(fprintf(stderr, "%*c+ _tmp_154[%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_149[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_154[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "starred_expression")); } { // named_expression !'=' @@ -24760,7 +25191,7 @@ _tmp_149_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_149[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "named_expression !'='")); + D(fprintf(stderr, "%*c> _tmp_154[%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 @@ -24768,12 +25199,12 @@ _tmp_149_rule(Parser *p) _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 22) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_149[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "named_expression !'='")); + D(fprintf(stderr, "%*c+ _tmp_154[%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_149[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_154[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "named_expression !'='")); } _res = NULL; @@ -24782,9 +25213,9 @@ _tmp_149_rule(Parser *p) return _res; } -// _tmp_150: ',' star_target +// _tmp_155: ',' star_target static void * -_tmp_150_rule(Parser *p) +_tmp_155_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24798,7 +25229,7 @@ _tmp_150_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_150[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c> _tmp_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); Token * _literal; expr_ty c; if ( @@ -24807,7 +25238,7 @@ _tmp_150_rule(Parser *p) (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")); + D(fprintf(stderr, "%*c+ _tmp_155[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24817,7 +25248,7 @@ _tmp_150_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_150[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_155[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_target")); } _res = NULL; @@ -24826,9 +25257,9 @@ _tmp_150_rule(Parser *p) return _res; } -// _tmp_151: ',' star_target +// _tmp_156: ',' star_target static void * -_tmp_151_rule(Parser *p) +_tmp_156_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24842,7 +25273,7 @@ _tmp_151_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c> _tmp_156[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); Token * _literal; expr_ty c; if ( @@ -24851,7 +25282,7 @@ _tmp_151_rule(Parser *p) (c = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_151[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c+ _tmp_156[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24861,7 +25292,7 @@ _tmp_151_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_151[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_156[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_target")); } _res = NULL; @@ -24870,9 +25301,9 @@ _tmp_151_rule(Parser *p) return _res; } -// _tmp_152: star_targets '=' +// _tmp_157: star_targets '=' static void * -_tmp_152_rule(Parser *p) +_tmp_157_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24886,7 +25317,7 @@ _tmp_152_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c> _tmp_157[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); Token * _literal; expr_ty star_targets_var; if ( @@ -24895,12 +25326,12 @@ _tmp_152_rule(Parser *p) (_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 '='")); + D(fprintf(stderr, "%*c+ _tmp_157[%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, ' ', + D(fprintf(stderr, "%*c%s _tmp_157[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); } _res = NULL; @@ -24909,9 +25340,9 @@ _tmp_152_rule(Parser *p) return _res; } -// _tmp_153: star_targets '=' +// _tmp_158: star_targets '=' static void * -_tmp_153_rule(Parser *p) +_tmp_158_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24925,7 +25356,7 @@ _tmp_153_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c> _tmp_158[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); Token * _literal; expr_ty star_targets_var; if ( @@ -24934,12 +25365,12 @@ _tmp_153_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_153[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c+ _tmp_158[%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_153[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_158[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); } _res = NULL; @@ -24948,9 +25379,9 @@ _tmp_153_rule(Parser *p) return _res; } -// _tmp_154: ')' | '**' +// _tmp_159: ')' | '**' static void * -_tmp_154_rule(Parser *p) +_tmp_159_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24964,18 +25395,18 @@ _tmp_154_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c> _tmp_159[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_154[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c+ _tmp_159[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_154[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_159[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); } { // '**' @@ -24983,18 +25414,18 @@ _tmp_154_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c> _tmp_159[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 35)) // token='**' ) { - D(fprintf(stderr, "%*c+ _tmp_154[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c+ _tmp_159[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_154[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_159[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'")); } _res = NULL; @@ -25003,9 +25434,9 @@ _tmp_154_rule(Parser *p) return _res; } -// _tmp_155: ':' | '**' +// _tmp_160: ':' | '**' static void * -_tmp_155_rule(Parser *p) +_tmp_160_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -25019,18 +25450,18 @@ _tmp_155_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_160[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_155[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_160[%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, ' ', + D(fprintf(stderr, "%*c%s _tmp_160[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } { // '**' @@ -25038,18 +25469,18 @@ _tmp_155_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c> _tmp_160[%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, "'**'")); + D(fprintf(stderr, "%*c+ _tmp_160[%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, ' ', + D(fprintf(stderr, "%*c%s _tmp_160[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'")); } _res = NULL; @@ -25058,6 +25489,164 @@ _tmp_155_rule(Parser *p) return _res; } +// _tmp_161: expression ['as' star_target] +static void * +_tmp_161_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // expression ['as' star_target] + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_161[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + expr_ty expression_var; + if ( + (expression_var = expression_rule(p)) // expression + && + (_opt_var = _tmp_163_rule(p), 1) // ['as' star_target] + ) + { + D(fprintf(stderr, "%*c+ _tmp_161[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); + _res = _PyPegen_dummy_name(p, expression_var, _opt_var); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_161[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression ['as' star_target]")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_162: expressions ['as' star_target] +static void * +_tmp_162_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // expressions ['as' star_target] + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_162[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + expr_ty expressions_var; + if ( + (expressions_var = expressions_rule(p)) // expressions + && + (_opt_var = _tmp_164_rule(p), 1) // ['as' star_target] + ) + { + D(fprintf(stderr, "%*c+ _tmp_162[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); + _res = _PyPegen_dummy_name(p, expressions_var, _opt_var); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_162[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expressions ['as' star_target]")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_163: 'as' star_target +static void * +_tmp_163_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'as' star_target + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_163[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + Token * _keyword; + expr_ty star_target_var; + if ( + (_keyword = _PyPegen_expect_token(p, 520)) // token='as' + && + (star_target_var = star_target_rule(p)) // star_target + ) + { + D(fprintf(stderr, "%*c+ _tmp_163[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + _res = _PyPegen_dummy_name(p, _keyword, star_target_var); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_163[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' star_target")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_164: 'as' star_target +static void * +_tmp_164_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'as' star_target + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_164[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + Token * _keyword; + expr_ty star_target_var; + if ( + (_keyword = _PyPegen_expect_token(p, 520)) // token='as' + && + (star_target_var = star_target_rule(p)) // star_target + ) + { + D(fprintf(stderr, "%*c+ _tmp_164[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + _res = _PyPegen_dummy_name(p, _keyword, star_target_var); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_164[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' star_target")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + void * _PyPegen_parse(Parser *p) { diff --git a/Parser/pegen.c b/Parser/pegen.c index 2554273877f78..68f0e329f083d 100644 --- a/Parser/pegen.c +++ b/Parser/pegen.c @@ -782,7 +782,6 @@ _PyPegen_is_memoized(Parser *p, int type, void *pres) return 0; } - int _PyPegen_lookahead_with_name(int positive, expr_ty (func)(Parser *), Parser *p) { @@ -836,6 +835,28 @@ _PyPegen_expect_token(Parser *p, int type) return t; } +Token * +_PyPegen_expect_forced_token(Parser *p, int type, const char* expected) { + + if (p->error_indicator == 1) { + return NULL; + } + + 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) { + RAISE_SYNTAX_ERROR_KNOWN_LOCATION(t, "expected '%s'", expected); + return NULL; + } + p->mark += 1; + return t; +} + expr_ty _PyPegen_expect_soft_keyword(Parser *p, const char *keyword) { diff --git a/Parser/pegen.h b/Parser/pegen.h index f82a3a00b2ba0..2a165c12d252c 100644 --- a/Parser/pegen.h +++ b/Parser/pegen.h @@ -102,10 +102,7 @@ typedef struct { arg_ty kwarg; } StarEtc; -typedef struct { - operator_ty kind; -} AugOperator; - +typedef struct { operator_ty kind; } AugOperator; typedef struct { void *element; int is_keyword; @@ -118,12 +115,14 @@ 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_int(int, Token *(func)(Parser *, int), Parser *, int); int _PyPegen_lookahead_with_string(int , expr_ty (func)(Parser *, const char*), Parser *, const char*); int _PyPegen_lookahead(int, void *(func)(Parser *), Parser *); Token *_PyPegen_expect_token(Parser *p, int type); +Token *_PyPegen_expect_forced_token(Parser *p, int type, const char* expected); expr_ty _PyPegen_expect_soft_keyword(Parser *p, const char *keyword); Token *_PyPegen_get_last_nonnwhitespace_token(Parser *); int _PyPegen_fill_token(Parser *p); diff --git a/Tools/peg_generator/pegen/c_generator.py b/Tools/peg_generator/pegen/c_generator.py index 6af0d3f7a2a14..f5ef5d8d3340e 100644 --- a/Tools/peg_generator/pegen/c_generator.py +++ b/Tools/peg_generator/pegen/c_generator.py @@ -8,6 +8,7 @@ from pegen.grammar import ( Alt, Cut, + Forced, Gather, GrammarVisitor, Group, @@ -252,6 +253,24 @@ def visit_PositiveLookahead(self, node: PositiveLookahead) -> FunctionCall: def visit_NegativeLookahead(self, node: NegativeLookahead) -> FunctionCall: return self.lookahead_call_helper(node, 0) + def visit_Forced(self, node: Forced) -> FunctionCall: + call = self.generate_call(node.node) + if call.nodetype == NodeTypes.GENERIC_TOKEN: + val = ast.literal_eval(node.node.value) + 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_forced_token", + arguments=["p", type, f'"{val}"'], + nodetype=NodeTypes.GENERIC_TOKEN, + return_type="Token *", + comment=f"forced_token='{val}'", + ) + else: + raise NotImplementedError( + f"Forced tokens don't work with {call.nodetype} tokens") + def visit_Opt(self, node: Opt) -> FunctionCall: call = self.generate_call(node.node) return FunctionCall( diff --git a/Tools/peg_generator/pegen/grammar.py b/Tools/peg_generator/pegen/grammar.py index 332ee3c3eec5e..66fd5b329a513 100644 --- a/Tools/peg_generator/pegen/grammar.py +++ b/Tools/peg_generator/pegen/grammar.py @@ -288,6 +288,23 @@ def collect_todo(self, gen: ParserGenerator) -> None: gen.callmakervisitor.visit(self.item) +class Forced: + def __init__(self, node: Plain): + self.node = node + + def __str__(self) -> str: + return f"&&{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 Lookahead: def __init__(self, node: Plain, sign: str): self.node = node @@ -459,7 +476,7 @@ def initial_names(self) -> AbstractSet[str]: Plain = Union[Leaf, Group] -Item = Union[Plain, Opt, Repeat, Lookahead, Rhs, Cut] +Item = Union[Plain, Opt, Repeat, Forced, Lookahead, Rhs, Cut] RuleName = Tuple[str, str] MetaTuple = Tuple[str, Optional[str]] MetaList = List[MetaTuple] diff --git a/Tools/peg_generator/pegen/grammar_parser.py b/Tools/peg_generator/pegen/grammar_parser.py index 6e3bc5068f5a7..fde0145ee8891 100644 --- a/Tools/peg_generator/pegen/grammar_parser.py +++ b/Tools/peg_generator/pegen/grammar_parser.py @@ -13,6 +13,7 @@ from pegen.grammar import ( Alt, Cut, + Forced, Gather, Group, Item, @@ -402,7 +403,7 @@ def items(self) -> Optional[NamedItemList]: @memoize def named_item(self) -> Optional[NamedItem]: - # named_item: NAME '[' NAME '*' ']' '=' ~ item | NAME '[' NAME ']' '=' ~ item | NAME '=' ~ item | item | lookahead + # named_item: NAME '[' NAME '*' ']' '=' ~ item | NAME '[' NAME ']' '=' ~ item | NAME '=' ~ item | item | forced_atom | lookahead mark = self.mark() cut = False if ( @@ -465,6 +466,13 @@ def named_item(self) -> Optional[NamedItem]: self.reset(mark) if cut: return None cut = False + if ( + (it := self.forced_atom()) + ): + return NamedItem ( None , it ) + self.reset(mark) + if cut: return None + cut = False if ( (it := self.lookahead()) ): @@ -473,6 +481,25 @@ def named_item(self) -> Optional[NamedItem]: if cut: return None return None + @memoize + def forced_atom(self) -> Optional[NamedItem]: + # forced_atom: '&' '&' ~ atom + mark = self.mark() + cut = False + if ( + (literal := self.expect('&')) + and + (literal_1 := self.expect('&')) + and + (cut := True) + and + (atom := self.atom()) + ): + return Forced ( atom ) + self.reset(mark) + if cut: return None + return None + @memoize def lookahead(self) -> Optional[LookaheadOrCut]: # lookahead: '&' ~ atom | '!' ~ atom | '~' diff --git a/Tools/peg_generator/pegen/metagrammar.gram b/Tools/peg_generator/pegen/metagrammar.gram index 4802f56b68f7b..bb4355fd189e0 100644 --- a/Tools/peg_generator/pegen/metagrammar.gram +++ b/Tools/peg_generator/pegen/metagrammar.gram @@ -4,6 +4,7 @@ from ast import literal_eval from pegen.grammar import ( Alt, Cut, + Forced, Gather, Group, Item, @@ -87,8 +88,12 @@ named_item[NamedItem]: | NAME '[' type=NAME ']' '=' ~ item {NamedItem(name.string, item, type.string)} | NAME '=' ~ item {NamedItem(name.string, item)} | item {NamedItem(None, item)} + | it=forced_atom {NamedItem(None, it)} | it=lookahead {NamedItem(None, it)} +forced_atom[NamedItem]: + | '&''&' ~ atom {Forced(atom)} + lookahead[LookaheadOrCut]: | '&' ~ atom {PositiveLookahead(atom)} | '!' ~ atom {NegativeLookahead(atom)} From webhook-mailer at python.org Tue Feb 2 15:24:32 2021 From: webhook-mailer at python.org (pablogsal) Date: Tue, 02 Feb 2021 20:24:32 -0000 Subject: [Python-checkins] bpo-41149: Fix a bug in threading that causes fals-y threads callables to fail to start. (GH-21201) Message-ID: https://github.com/python/cpython/commit/01c4fddc4b2ac707f226e0bd92679588d2252cc4 commit: 01c4fddc4b2ac707f226e0bd92679588d2252cc4 branch: master author: BarneyStratford committer: pablogsal date: 2021-02-02T20:24:24Z summary: bpo-41149: Fix a bug in threading that causes fals-y threads callables to fail to start. (GH-21201) files: A Misc/NEWS.d/next/Library/2020-06-28-16-13-02.bpo-41149.jiZWtJ.rst M Lib/test/test_threading.py M Lib/threading.py diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index 0a4372ec2df39..a7a716ed59fc4 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -855,6 +855,26 @@ def __del__(self): """) self.assertEqual(out.rstrip(), b"thread_dict.atexit = 'value'") + def test_boolean_target(self): + # bpo-41149: A thread that had a boolean value of False would not + # run, regardless of whether it was callable. The correct behaviour + # is for a thread to do nothing if its target is None, and to call + # the target otherwise. + class BooleanTarget(object): + def __init__(self): + self.ran = False + def __bool__(self): + return False + def __call__(self): + self.ran = True + + target = BooleanTarget() + thread = threading.Thread(target=target) + thread.start() + thread.join() + self.assertTrue(target.ran) + + class ThreadJoinOnShutdown(BaseTestCase): diff --git a/Lib/threading.py b/Lib/threading.py index 7b3d63dd211ea..ff2624a3e1e49 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -906,7 +906,7 @@ def run(self): """ try: - if self._target: + if self._target is not None: self._target(*self._args, **self._kwargs) finally: # Avoid a refcycle if the thread is running a function with diff --git a/Misc/NEWS.d/next/Library/2020-06-28-16-13-02.bpo-41149.jiZWtJ.rst b/Misc/NEWS.d/next/Library/2020-06-28-16-13-02.bpo-41149.jiZWtJ.rst new file mode 100644 index 0000000000000..abe09016a6525 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-06-28-16-13-02.bpo-41149.jiZWtJ.rst @@ -0,0 +1 @@ +Allow executing callables that have a boolean value of ``False`` when passed to :class:`Threading.thread` as the target. Patch contributed by Barney Stratford. From webhook-mailer at python.org Tue Feb 2 15:38:35 2021 From: webhook-mailer at python.org (pablogsal) Date: Tue, 02 Feb 2021 20:38:35 -0000 Subject: [Python-checkins] bpo-43108: Fix a reference leak in the curses module (GH-24420) Message-ID: https://github.com/python/cpython/commit/bb739ec922c6992a2be38f9fd3c544c2cc322dde commit: bb739ec922c6992a2be38f9fd3c544c2cc322dde branch: master author: Pablo Galindo committer: pablogsal date: 2021-02-02T20:38:26Z summary: bpo-43108: Fix a reference leak in the curses module (GH-24420) files: A Misc/NEWS.d/next/Library/2021-02-02-20-23-31.bpo-43108.lqcCZ6.rst M Modules/_cursesmodule.c diff --git a/Misc/NEWS.d/next/Library/2021-02-02-20-23-31.bpo-43108.lqcCZ6.rst b/Misc/NEWS.d/next/Library/2021-02-02-20-23-31.bpo-43108.lqcCZ6.rst new file mode 100644 index 0000000000000..8e45640bceae1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-02-02-20-23-31.bpo-43108.lqcCZ6.rst @@ -0,0 +1 @@ +Fixed a reference leak in the :mod:`curses` module. Patch by Pablo Galindo diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c index 4fcedc5fc4820..3df9f506052d3 100644 --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -388,6 +388,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; @@ -828,8 +829,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); From webhook-mailer at python.org Tue Feb 2 16:07:08 2021 From: webhook-mailer at python.org (ethanfurman) Date: Tue, 02 Feb 2021 21:07:08 -0000 Subject: [Python-checkins] bpo-8264: Document hasattr and getattr behavior for private attributes (GH-23513) Message-ID: https://github.com/python/cpython/commit/2edaf6a4fb7e20324dde1423232f07211347f092 commit: 2edaf6a4fb7e20324dde1423232f07211347f092 branch: master author: Ken Jin <28750310+Fidget-Spinner at users.noreply.github.com> committer: ethanfurman date: 2021-02-02T13:06:57-08:00 summary: bpo-8264: Document hasattr and getattr behavior for private attributes (GH-23513) Clarify ``getattr`` and ``setattr`` requirements for accessing name-mangled attributes Co-Authored-By: Catalin Iacob files: M Doc/library/functions.rst M Doc/reference/expressions.rst diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index f84353ce391d1..55dd3f03f929c 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -693,6 +693,13 @@ are always available. They are listed here in alphabetical order. ``x.foobar``. If the named attribute does not exist, *default* is returned if provided, otherwise :exc:`AttributeError` is raised. + .. note:: + + Since :ref:`private name mangling ` happens at + compilation time, one must manually mangle a private attribute's + (attributes with two leading underscores) name in order to retrieve it with + :func:`getattr`. + .. function:: globals() @@ -1512,6 +1519,13 @@ are always available. They are listed here in alphabetical order. object allows it. For example, ``setattr(x, 'foobar', 123)`` is equivalent to ``x.foobar = 123``. + .. note:: + + Since :ref:`private name mangling ` happens at + compilation time, one must manually mangle a private attribute's + (attributes with two leading underscores) name in order to set it with + :func:`setattr`. + .. class:: slice(stop) slice(start, stop[, step]) diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index 8ac626444843d..c8c9b4683e62d 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -77,6 +77,8 @@ When the name is bound to an object, evaluation of the atom yields that object. When a name is not bound, an attempt to evaluate it raises a :exc:`NameError` exception. +.. _private-name-mangling: + .. index:: pair: name; mangling pair: private; names From webhook-mailer at python.org Tue Feb 2 20:14:10 2021 From: webhook-mailer at python.org (zooba) Date: Wed, 03 Feb 2021 01:14:10 -0000 Subject: [Python-checkins] Add link to Microsoft docs for limitations in Windows Store package (GH-24422) Message-ID: https://github.com/python/cpython/commit/1ba08a121a25fcf7c947d8d37e72e46dae59168c commit: 1ba08a121a25fcf7c947d8d37e72e46dae59168c branch: master author: Steve Dower committer: zooba date: 2021-02-03T01:13:43Z summary: Add link to Microsoft docs for limitations in Windows Store package (GH-24422) files: M Doc/using/windows.rst diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index 265c07c7099f3..0f713fcab4be8 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -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: From webhook-mailer at python.org Tue Feb 2 20:24:03 2021 From: webhook-mailer at python.org (miss-islington) Date: Wed, 03 Feb 2021 01:24:03 -0000 Subject: [Python-checkins] Add link to Microsoft docs for limitations in Windows Store package (GH-24422) Message-ID: https://github.com/python/cpython/commit/12ec8ce471c5bae2c5ba8ce0d50dd59fc8d233c6 commit: 12ec8ce471c5bae2c5ba8ce0d50dd59fc8d233c6 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2021-02-02T17:23:27-08:00 summary: Add link to Microsoft docs for limitations in Windows Store package (GH-24422) (cherry picked from commit 1ba08a121a25fcf7c947d8d37e72e46dae59168c) Co-authored-by: Steve Dower files: M Doc/using/windows.rst diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index 94d0591ae7169..1d5e9e4b5d9f7 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -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: From webhook-mailer at python.org Tue Feb 2 20:36:10 2021 From: webhook-mailer at python.org (miss-islington) Date: Wed, 03 Feb 2021 01:36:10 -0000 Subject: [Python-checkins] Add link to Microsoft docs for limitations in Windows Store package (GH-24422) Message-ID: https://github.com/python/cpython/commit/3b9452691ae8f3ccf6591769b4529b03c42bc268 commit: 3b9452691ae8f3ccf6591769b4529b03c42bc268 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2021-02-02T17:35:55-08:00 summary: Add link to Microsoft docs for limitations in Windows Store package (GH-24422) (cherry picked from commit 1ba08a121a25fcf7c947d8d37e72e46dae59168c) Co-authored-by: Steve Dower files: M Doc/using/windows.rst diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index d0c342e1dad86..857308e77dd1b 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -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: From webhook-mailer at python.org Tue Feb 2 22:28:57 2021 From: webhook-mailer at python.org (rhettinger) Date: Wed, 03 Feb 2021 03:28:57 -0000 Subject: [Python-checkins] bpo-43082: Remove redundant 'the' in Descriptor howto (GH-24394) Message-ID: https://github.com/python/cpython/commit/a98fe02d735e7bfe369fc5ce6efb6c9d82adf3b7 commit: a98fe02d735e7bfe369fc5ce6efb6c9d82adf3b7 branch: master author: diegoe committer: rhettinger date: 2021-02-02T19:28:36-08:00 summary: bpo-43082: Remove redundant 'the' in Descriptor howto (GH-24394) files: M Doc/howto/descriptor.rst diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst index d172c9b181c1c..5455d914dce79 100644 --- a/Doc/howto/descriptor.rst +++ b/Doc/howto/descriptor.rst @@ -497,7 +497,7 @@ Definition and introduction 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 the +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 From webhook-mailer at python.org Tue Feb 2 22:33:41 2021 From: webhook-mailer at python.org (rhettinger) Date: Wed, 03 Feb 2021 03:33:41 -0000 Subject: [Python-checkins] bpo-43082: Remove redundant 'the' in Descriptor howto (GH-24394) (GH-24427) Message-ID: https://github.com/python/cpython/commit/f02ef7afcf67db52f169f809a1b0babb80ec8370 commit: f02ef7afcf67db52f169f809a1b0babb80ec8370 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: rhettinger date: 2021-02-02T19:33:35-08:00 summary: bpo-43082: Remove redundant 'the' in Descriptor howto (GH-24394) (GH-24427) files: M Doc/howto/descriptor.rst diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst index ab5a573c6a06d..0f999c95596aa 100644 --- a/Doc/howto/descriptor.rst +++ b/Doc/howto/descriptor.rst @@ -497,7 +497,7 @@ Definition and introduction 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 the +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 From webhook-mailer at python.org Wed Feb 3 01:17:34 2021 From: webhook-mailer at python.org (pablogsal) Date: Wed, 03 Feb 2021 06:17:34 -0000 Subject: [Python-checkins] Python 3.10.0a5 Message-ID: https://github.com/python/cpython/commit/22dbd9e8c05ece0126a5fc0fc131a42eac74c0a3 commit: 22dbd9e8c05ece0126a5fc0fc131a42eac74c0a3 branch: master author: Pablo Galindo committer: pablogsal date: 2021-02-02T20:41:05Z summary: Python 3.10.0a5 files: A Misc/NEWS.d/3.10.0a5.rst D Misc/NEWS.d/next/Build/2021-01-07-12-51-38.bpo-42856.n3cMHV.rst D Misc/NEWS.d/next/Build/2021-01-11-23-26-00.bpo-31904.ty8f3h.rst D Misc/NEWS.d/next/Build/2021-01-12-10-06-50.bpo-42874.XKK61g.rst D Misc/NEWS.d/next/Build/2021-01-18-20-52-06.bpo-36143.kgnIYo.rst D Misc/NEWS.d/next/Build/2021-01-26-14-48-40.bpo-43031.44nK9U.rst D Misc/NEWS.d/next/C API/2021-01-27-10-27-47.bpo-43030.loDcD_.rst D Misc/NEWS.d/next/C API/2021-01-28-01-11-59.bpo-42979.JrGkrm.rst D Misc/NEWS.d/next/Core and Builtins/2018-12-20-23-59-23.bpo-27772.idHEcj.rst D Misc/NEWS.d/next/Core and Builtins/2020-10-10-14-16-03.bpo-41994.Xop8sV.rst D Misc/NEWS.d/next/Core and Builtins/2020-12-12-20-09-12.bpo-37324.jB-9_U.rst D Misc/NEWS.d/next/Core and Builtins/2021-01-04-18-17-07.bpo-42823.dcSynu.rst D Misc/NEWS.d/next/Core and Builtins/2021-01-06-17-06-37.bpo-42827.jtRR0D.rst D Misc/NEWS.d/next/Core and Builtins/2021-01-11-17-58-52.bpo-42882.WfTdfg.rst D Misc/NEWS.d/next/Core and Builtins/2021-01-13-14-06-01.bpo-42924._WS1Ok.rst D Misc/NEWS.d/next/Core and Builtins/2021-01-14-23-15-34.bpo-42864.QgOAQ1.rst D Misc/NEWS.d/next/Core and Builtins/2021-01-15-20-05-56.bpo-42927.GI-l-7.rst D Misc/NEWS.d/next/Core and Builtins/2021-01-20-22-31-01.bpo-40176.anjyWw.rst D Misc/NEWS.d/next/Core and Builtins/2021-01-20-23-44-15.bpo-42986.sWoaGf.rst D Misc/NEWS.d/next/Core and Builtins/2021-01-24-18-02-05.bpo-43017.emEcXX.rst D Misc/NEWS.d/next/Core and Builtins/2021-01-24-20-19-55.bpo-42997.QUOPgP.rst D Misc/NEWS.d/next/Core and Builtins/2021-01-29-17-48-44.bpo-38631.jR-3kC.rst D Misc/NEWS.d/next/Core and Builtins/2021-01-30-11-31-44.bpo-42990.69h_zK.rst D Misc/NEWS.d/next/Documentation/2021-01-04-22-14-22.bpo-42811.HY2beA.rst D Misc/NEWS.d/next/Documentation/2021-01-20-23-03-49.bpo-40304.-LK7Ps.rst D Misc/NEWS.d/next/IDLE/2019-06-30-20-31-09.bpo-32631.e7_4BG.rst D Misc/NEWS.d/next/IDLE/2019-11-14-23-41-07.bpo-23544.3etemb.rst D Misc/NEWS.d/next/IDLE/2021-01-10-01-25-43.bpo-33065.zmyHYJ.rst D Misc/NEWS.d/next/IDLE/2021-01-26-18-12-17.bpo-43008.mbQUc7.rst D Misc/NEWS.d/next/Library/2018-04-23-13-44-10.bpo-33289.anBnUr.rst D Misc/NEWS.d/next/Library/2020-01-13-23-37-58.bpo-39273.m5hzxV.rst D Misc/NEWS.d/next/Library/2020-03-16-03-03-21.bpo-38307.2cmw2i.rst D Misc/NEWS.d/next/Library/2020-06-28-16-13-02.bpo-41149.jiZWtJ.rst D Misc/NEWS.d/next/Library/2020-08-21-15-24-14.bpo-41604.rTXleO.rst D Misc/NEWS.d/next/Library/2020-10-11-13-48-03.bpo-42005.Jq6Az-.rst D Misc/NEWS.d/next/Library/2020-11-17-14-30-12.bpo-42383.ubl0Y_.rst D Misc/NEWS.d/next/Library/2020-11-17-14-32-39.bpo-42384.1ZnQSn.rst D Misc/NEWS.d/next/Library/2020-12-30-14-56-25.bpo-24464.vbNVHe.rst D Misc/NEWS.d/next/Library/2021-01-01-15-29-16.bpo-42802.Lw-bzl.rst D Misc/NEWS.d/next/Library/2021-01-04-15-05-40.bpo-1635741.EOCfZY.rst D Misc/NEWS.d/next/Library/2021-01-05-00-52-30.bpo-40810.JxQqPe.rst D Misc/NEWS.d/next/Library/2021-01-05-21-26-29.bpo-41748.KdC0w3.rst D Misc/NEWS.d/next/Library/2021-01-05-23-55-24.bpo-42834.LxRnZC.rst D Misc/NEWS.d/next/Library/2021-01-07-11-44-22.bpo-42851.uyQFyd.rst D Misc/NEWS.d/next/Library/2021-01-07-23-31-17.bpo-42846.kukDjw.rst D Misc/NEWS.d/next/Library/2021-01-08-10-57-21.bpo-42866.Y1DnrO.rst D Misc/NEWS.d/next/Library/2021-01-08-15-49-20.bpo-42780.rtqi6B.rst D Misc/NEWS.d/next/Library/2021-01-11-17-36-59.bpo-42901.gFd-ta.rst D Misc/NEWS.d/next/Library/2021-01-12-19-34-06.bpo-42848.5G8oBl.rst D Misc/NEWS.d/next/Library/2021-01-13-12-15-13.bpo-42923.zBiNls.rst D Misc/NEWS.d/next/Library/2021-01-13-12-55-41.bpo-42877.Fi1zEG.rst D Misc/NEWS.d/next/Library/2021-01-14-15-07-16.bpo-38250.1fvhOk.rst D Misc/NEWS.d/next/Library/2021-01-15-00-23-50.bpo-42931.QD6U2B.rst D Misc/NEWS.d/next/Library/2021-01-15-11-48-00.bpo-42934.ILKoOI.rst D Misc/NEWS.d/next/Library/2021-01-18-10-41-44.bpo-42944.RrONvy.rst D Misc/NEWS.d/next/Library/2021-01-18-11-59-46.bpo-42955.CSWLC9.rst D Misc/NEWS.d/next/Library/2021-01-20-12-10-47.bpo-42323.PONB8e.rst D Misc/NEWS.d/next/Library/2021-01-24-00-37-40.bpo-43014.BVPhEr.rst D Misc/NEWS.d/next/Library/2021-01-27-20-49-32.bpo-41282.SEPdV0.rst D Misc/NEWS.d/next/Library/2021-01-30-15-20-06.bpo-43077.Owk61z.rst D Misc/NEWS.d/next/Library/2021-02-02-20-23-31.bpo-43108.lqcCZ6.rst D Misc/NEWS.d/next/Security/2021-01-18-09-27-31.bpo-42938.4Zn4Mp.rst D Misc/NEWS.d/next/Tests/2020-05-30-10-56-38.bpo-40810.LPqDLQ.rst D Misc/NEWS.d/next/Tests/2020-05-30-13-39-22.bpo-40823.yB7K5w.rst D Misc/NEWS.d/next/Windows/2020-12-07-11-40-52.bpo-42584.AsYnVX.rst D Misc/NEWS.d/next/Windows/2021-01-05-20-36-40.bpo-41837.bmS7vB.rst D Misc/NEWS.d/next/macOS/2021-01-26-14-36-11.bpo-42504.ZxWt71.rst diff --git a/Misc/NEWS.d/3.10.0a5.rst b/Misc/NEWS.d/3.10.0a5.rst new file mode 100644 index 0000000000000..3362d494602d4 --- /dev/null +++ b/Misc/NEWS.d/3.10.0a5.rst @@ -0,0 +1,670 @@ +.. bpo: 42938 +.. date: 2021-01-18-09-27-31 +.. nonce: 4Zn4Mp +.. release date: 2021-02-02 +.. section: Security + +Avoid static buffers when computing the repr of :class:`ctypes.c_double` and +:class:`ctypes.c_longdouble` values. + +.. + +.. bpo: 42990 +.. date: 2021-01-30-11-31-44 +.. nonce: 69h_zK +.. section: Core and Builtins + +Refactor the ``PyEval_`` family of functions. + +* An new function ``_PyEval_Vector`` is added to simplify calls to Python from C. +* ``_PyEval_EvalCodeWithName`` is removed +* ``PyEval_EvalCodeEx`` is retained as part of the API, but is not used internally + +.. + +.. bpo: 38631 +.. date: 2021-01-29-17-48-44 +.. nonce: jR-3kC +.. section: Core and Builtins + +Replace :c:func:`Py_FatalError` calls in the compiler with regular +:exc:`SystemError` exceptions. Patch by Victor Stinner. + +.. + +.. bpo: 42997 +.. date: 2021-01-24-20-19-55 +.. nonce: QUOPgP +.. section: Core and Builtins + +Improve error message for missing ":" before blocks. Patch by Pablo Galindo. + +.. + +.. bpo: 43017 +.. date: 2021-01-24-18-02-05 +.. nonce: emEcXX +.. section: Core and Builtins + +Improve error message in the parser when using un-parenthesised tuples in +comprehensions. Patch by Pablo Galindo. + +.. + +.. bpo: 42986 +.. date: 2021-01-20-23-44-15 +.. nonce: sWoaGf +.. section: Core and Builtins + +Fix parser crash when reporting syntax errors in f-string with newlines. +Patch by Pablo Galindo. + +.. + +.. bpo: 40176 +.. date: 2021-01-20-22-31-01 +.. nonce: anjyWw +.. section: Core and Builtins + +Syntax errors for unterminated string literals now point to the start of the +string instead of reporting EOF/EOL. + +.. + +.. bpo: 42927 +.. date: 2021-01-15-20-05-56 +.. nonce: GI-l-7 +.. section: Core and Builtins + +The inline cache for ``LOAD_ATTR`` now also optimizes access to attributes +defined by ``__slots__``. This makes reading such attribute up to 30% +faster. + +.. + +.. bpo: 42864 +.. date: 2021-01-14-23-15-34 +.. nonce: QgOAQ1 +.. section: Core and Builtins + +Improve error messages in the parser when parentheses are not closed. Patch +by Pablo Galindo. + +.. + +.. bpo: 42924 +.. date: 2021-01-13-14-06-01 +.. nonce: _WS1Ok +.. section: Core and Builtins + +Fix ``bytearray`` repetition incorrectly copying data from the start of the +buffer, even if the data is offset within the buffer (e.g. after reassigning +a slice at the start of the ``bytearray`` to a shorter byte string). + +.. + +.. bpo: 42882 +.. date: 2021-01-11-17-58-52 +.. nonce: WfTdfg +.. section: Core and Builtins + +Fix the :c:func:`_PyUnicode_FromId` function (_Py_IDENTIFIER(var) API) when +:c:func:`Py_Initialize` / :c:func:`Py_Finalize` is called multiple times: +preserve ``_PyRuntime.unicode_ids.next_index`` value. + +.. + +.. bpo: 42827 +.. date: 2021-01-06-17-06-37 +.. nonce: jtRR0D +.. section: Core and Builtins + +Fix a crash when working out the error line of a :exc:`SyntaxError` in some +multi-line expressions. + +.. + +.. bpo: 42823 +.. date: 2021-01-04-18-17-07 +.. nonce: dcSynu +.. section: Core and Builtins + +frame.f_lineno is correct even if frame.f_trace is set to True + +.. + +.. bpo: 37324 +.. date: 2020-12-12-20-09-12 +.. nonce: jB-9_U +.. section: Core and Builtins + +Remove deprecated aliases to :ref:`collections-abstract-base-classes` from +the :mod:`collections` module. + +.. + +.. bpo: 41994 +.. date: 2020-10-10-14-16-03 +.. nonce: Xop8sV +.. section: Core and Builtins + +Fixed possible leak in ``import`` when ``sys.modules`` is not a ``dict``. + +.. + +.. bpo: 27772 +.. date: 2018-12-20-23-59-23 +.. nonce: idHEcj +.. section: Core and Builtins + +In string formatting, preceding the *width* field by ``'0'`` no longer +affects the default alignment for strings. + +.. + +.. bpo: 43108 +.. date: 2021-02-02-20-23-31 +.. nonce: lqcCZ6 +.. section: Library + +Fixed a reference leak in the :mod:`curses` module. Patch by Pablo Galindo + +.. + +.. bpo: 43077 +.. date: 2021-01-30-15-20-06 +.. nonce: Owk61z +.. section: Library + +Update the bundled pip to 21.0.1 and setuptools to 52.0.0. + +.. + +.. bpo: 41282 +.. date: 2021-01-27-20-49-32 +.. nonce: SEPdV0 +.. section: Library + +Deprecate ``distutils`` in documentation and add warning on import. + +.. + +.. bpo: 43014 +.. date: 2021-01-24-00-37-40 +.. nonce: BVPhEr +.. section: Library + +Improve performance of :mod:`tokenize` by 20-30%. Patch by Anthony Sottile. + +.. + +.. bpo: 42323 +.. date: 2021-01-20-12-10-47 +.. nonce: PONB8e +.. section: Library + +Fix :func:`math.nextafter` for NaN on AIX. + +.. + +.. bpo: 42955 +.. date: 2021-01-18-11-59-46 +.. nonce: CSWLC9 +.. section: Library + +Add :data:`sys.stdlib_module_names`, containing the list of the standard +library module names. Patch by Victor Stinner. + +.. + +.. bpo: 42944 +.. date: 2021-01-18-10-41-44 +.. nonce: RrONvy +.. section: Library + +Fix ``random.Random.sample`` when ``counts`` argument is not ``None``. + +.. + +.. bpo: 42934 +.. date: 2021-01-15-11-48-00 +.. nonce: ILKoOI +.. section: Library + +Use :class:`~traceback.TracebackException`'s new ``compact`` param in +:class:`~unittest.TestResult` to reduce time and memory consumed by +traceback formatting. + +.. + +.. bpo: 42931 +.. date: 2021-01-15-00-23-50 +.. nonce: QD6U2B +.. section: Library + +Add :func:`randbytes` to ``random.__all__``. + +.. + +.. bpo: 38250 +.. date: 2021-01-14-15-07-16 +.. nonce: 1fvhOk +.. section: Library + +[Enum] Flags consisting of a single bit are now considered canonical, and +will be the only flags returned from listing and iterating over a Flag class +or a Flag member. Multi-bit flags are considered aliases; they will be +returned from lookups and operations that result in their value. Iteration +for both Flag and Flag members is in definition order. + +.. + +.. bpo: 42877 +.. date: 2021-01-13-12-55-41 +.. nonce: Fi1zEG +.. section: Library + +Added the ``compact`` parameter to the constructor of +:class:`traceback.TracebackException` to reduce time and memory for use +cases that only need to call :func:`TracebackException.format` and +:func:`TracebackException.format_exception_only`. + +.. + +.. bpo: 42923 +.. date: 2021-01-13-12-15-13 +.. nonce: zBiNls +.. section: Library + +The :c:func:`Py_FatalError` function and the :mod:`faulthandler` module now +dump the list of extension modules on a fatal error. + +.. + +.. bpo: 42848 +.. date: 2021-01-12-19-34-06 +.. nonce: 5G8oBl +.. section: Library + +Removed recursion from :class:`~traceback.TracebackException` to allow it to +handle long exception chains. + +.. + +.. bpo: 42901 +.. date: 2021-01-11-17-36-59 +.. nonce: gFd-ta +.. section: Library + +[Enum] move member creation from ``EnumMeta.__new__`` to +``_proto_member.__set_name__``, allowing members to be created and visible +in ``__init_subclass__``. + +.. + +.. bpo: 42780 +.. date: 2021-01-08-15-49-20 +.. nonce: rtqi6B +.. section: Library + +Fix os.set_inheritable() for O_PATH file descriptors on Linux. + +.. + +.. bpo: 42866 +.. date: 2021-01-08-10-57-21 +.. nonce: Y1DnrO +.. section: Library + +Fix a reference leak in the ``getcodec()`` function of CJK codecs. Patch by +Victor Stinner. + +.. + +.. bpo: 42846 +.. date: 2021-01-07-23-31-17 +.. nonce: kukDjw +.. section: Library + +Convert the 6 CJK codec extension modules (_codecs_cn, _codecs_hk, +_codecs_iso2022, _codecs_jp, _codecs_kr and _codecs_tw) to the multiphase +initialization API (:pep:`489`). Patch by Victor Stinner. + +.. + +.. bpo: 42851 +.. date: 2021-01-07-11-44-22 +.. nonce: uyQFyd +.. section: Library + +remove __init_subclass__ support for Enum members + +.. + +.. bpo: 42834 +.. date: 2021-01-05-23-55-24 +.. nonce: LxRnZC +.. section: Library + +Make internal caches of the ``_json`` module compatible with +subinterpreters. + +.. + +.. bpo: 41748 +.. date: 2021-01-05-21-26-29 +.. nonce: KdC0w3 +.. section: Library + +Fix HTMLParser parsing rules for element attributes containing commas with +spaces. Patch by Karl Dubost. + +.. + +.. bpo: 40810 +.. date: 2021-01-05-00-52-30 +.. nonce: JxQqPe +.. section: Library + +Require SQLite 3.7.15 or newer. Patch by Erlend E. Aasland. + +.. + +.. bpo: 1635741 +.. date: 2021-01-04-15-05-40 +.. nonce: EOCfZY +.. section: Library + +Convert the _multibytecodec extension module (CJK codecs) to multi-phase +initialization (:pep:`489`). Patch by Erlend E. Aasland. + +.. + +.. bpo: 42802 +.. date: 2021-01-01-15-29-16 +.. nonce: Lw-bzl +.. section: Library + +The distutils ``bdist_wininst`` command deprecated in Python 3.8 has been +removed. The distutils ``bidst_wheel`` command is now recommended to +distribute binary packages on Windows. + +.. + +.. bpo: 24464 +.. date: 2020-12-30-14-56-25 +.. nonce: vbNVHe +.. section: Library + +The undocumented built-in function ``sqlite3.enable_shared_cache`` is now +deprecated, scheduled for removal in Python 3.12. Its use is strongly +discouraged by the SQLite3 documentation. Patch by Erlend E. Aasland. + +.. + +.. bpo: 42384 +.. date: 2020-11-17-14-32-39 +.. nonce: 1ZnQSn +.. section: Library + +Make pdb populate sys.path[0] exactly the same as regular python execution. + +.. + +.. bpo: 42383 +.. date: 2020-11-17-14-30-12 +.. nonce: ubl0Y_ +.. section: Library + +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: 42005 +.. date: 2020-10-11-13-48-03 +.. nonce: Jq6Az- +.. section: Library + +Fix CLI of :mod:`cProfile` and :mod:`profile` to catch +:exc:`BrokenPipeError`. + +.. + +.. bpo: 41604 +.. date: 2020-08-21-15-24-14 +.. nonce: rTXleO +.. section: Library + +Don't decrement the reference count of the previous user_ptr when +set_panel_userptr fails. + +.. + +.. bpo: 41149 +.. date: 2020-06-28-16-13-02 +.. nonce: jiZWtJ +.. section: Library + +Allow executing callables that have a boolean value of ``False`` when passed +to :class:`Threading.thread` as the target. Patch contributed by Barney +Stratford. + +.. + +.. bpo: 38307 +.. date: 2020-03-16-03-03-21 +.. nonce: 2cmw2i +.. section: Library + +Add an 'end_lineno' attribute to the Class and Function objects that appear +in the tree returned by pyclbr functions. This and the existing 'lineno' +attribute define the extent of class and def statements. Patch by Aviral +Srivastava. + +.. + +.. bpo: 39273 +.. date: 2020-01-13-23-37-58 +.. nonce: m5hzxV +.. section: Library + +The ``BUTTON5_*`` constants are now exposed in the :mod:`curses` module if +available. + +.. + +.. bpo: 33289 +.. date: 2018-04-23-13-44-10 +.. nonce: anBnUr +.. section: Library + +Correct call to :mod:`tkinter.colorchooser` to return RGB triplet of ints +instead of floats. Patch by Cheryl Sabella. + +.. + +.. bpo: 40304 +.. date: 2021-01-20-23-03-49 +.. nonce: -LK7Ps +.. section: Documentation + +Fix doc for type(name, bases, dict). Patch by Boris Verkhovskiy and ?ric +Araujo. + +.. + +.. bpo: 42811 +.. date: 2021-01-04-22-14-22 +.. nonce: HY2beA +.. section: Documentation + +Updated importlib.utils.resolve_name() doc to use __spec__.parent instead of +__package__. (Thanks Yair Frid.) + +.. + +.. bpo: 40823 +.. date: 2020-05-30-13-39-22 +.. nonce: yB7K5w +.. section: Tests + +Use :meth:`unittest.TestLoader().loadTestsFromTestCase` instead of +:meth:`unittest.makeSuite` in :mod:`sqlite3` tests. Patch by Erlend E. +Aasland. + +.. + +.. bpo: 40810 +.. date: 2020-05-30-10-56-38 +.. nonce: LPqDLQ +.. section: Tests + +In :mod:`sqlite3`, fix ``CheckTraceCallbackContent`` for SQLite pre 3.7.15. + +.. + +.. bpo: 43031 +.. date: 2021-01-26-14-48-40 +.. nonce: 44nK9U +.. section: Build + +Pass ``--timeout=$(TESTTIMEOUT)`` option to the default profile task +``./python -m test --pgo`` command. + +.. + +.. bpo: 36143 +.. date: 2021-01-18-20-52-06 +.. nonce: kgnIYo +.. section: Build + +``make regen-all`` now also runs ``regen-keyword``. Patch by Victor Stinner. + +.. + +.. bpo: 42874 +.. date: 2021-01-12-10-06-50 +.. nonce: XKK61g +.. section: Build + +Removed the grep -q and -E flags in the tzpath validation section of the +configure script to better accomodate users of some platforms (specifically +Solaris 10). + +.. + +.. bpo: 31904 +.. date: 2021-01-11-23-26-00 +.. nonce: ty8f3h +.. section: Build + +Add library search path by wr-cc in add_cross_compiling_paths() for VxWorks. + +.. + +.. bpo: 42856 +.. date: 2021-01-07-12-51-38 +.. nonce: n3cMHV +.. section: Build + +Add ``--with-wheel-pkg-dir=PATH`` option to the ``./configure`` script. If +specified, the :mod:`ensurepip` module looks for ``setuptools`` and ``pip`` +wheel packages in this directory: if both are present, these wheel packages +are used instead of ensurepip bundled wheel packages. + +Some Linux distribution packaging policies recommend against bundling +dependencies. For example, Fedora installs wheel packages in the +``/usr/share/python-wheels/`` directory and don't install the +``ensurepip._bundled`` package. + +.. + +.. bpo: 41837 +.. date: 2021-01-05-20-36-40 +.. nonce: bmS7vB +.. section: Windows + +Updated Windows installer to include OpenSSL 1.1.1i + +.. + +.. bpo: 42584 +.. date: 2020-12-07-11-40-52 +.. nonce: AsYnVX +.. section: Windows + +Upgrade Windows installer to use SQLite 3.34.0. + +.. + +.. bpo: 42504 +.. date: 2021-01-26-14-36-11 +.. nonce: ZxWt71 +.. section: macOS + +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: 43008 +.. date: 2021-01-26-18-12-17 +.. nonce: mbQUc7 +.. section: IDLE + +Make IDLE invoke :func:`sys.excepthook` in normal, 2-process mode. Patch by +Ken Hilton. + +.. + +.. bpo: 33065 +.. date: 2021-01-10-01-25-43 +.. nonce: zmyHYJ +.. section: IDLE + +Fix problem debugging user classes with __repr__ method. + +.. + +.. bpo: 23544 +.. date: 2019-11-14-23-41-07 +.. nonce: 3etemb +.. section: IDLE + +Disable Debug=>Stack Viewer when user code is running or Debugger is active, +to prevent hang or crash. Patch by Zackery Spytz. + +.. + +.. bpo: 32631 +.. date: 2019-06-30-20-31-09 +.. nonce: e7_4BG +.. section: IDLE + +Finish zzdummy example extension module: make menu entries work; add +docstrings and tests with 100% coverage. + +.. + +.. bpo: 42979 +.. date: 2021-01-28-01-11-59 +.. nonce: JrGkrm +.. section: C API + +When Python is built in debug mode (with C assertions), calling a type slot +like ``sq_length`` (``__len__()`` in Python) now fails with a fatal error if +the slot succeeded with an exception set, or failed with no exception set. +The error message contains the slot, the type name, and the current +exception (if an exception is set). Patch by Victor Stinner. + +.. + +.. bpo: 43030 +.. date: 2021-01-27-10-27-47 +.. nonce: loDcD_ +.. section: C API + +Fixed a compiler warning in :c:func:`Py_UNICODE_ISSPACE()` on platforms with +signed ``wchar_t``. diff --git a/Misc/NEWS.d/next/Build/2021-01-07-12-51-38.bpo-42856.n3cMHV.rst b/Misc/NEWS.d/next/Build/2021-01-07-12-51-38.bpo-42856.n3cMHV.rst deleted file mode 100644 index 6aab7a6e51d07..0000000000000 --- a/Misc/NEWS.d/next/Build/2021-01-07-12-51-38.bpo-42856.n3cMHV.rst +++ /dev/null @@ -1,9 +0,0 @@ -Add ``--with-wheel-pkg-dir=PATH`` option to the ``./configure`` script. If -specified, the :mod:`ensurepip` module looks for ``setuptools`` and ``pip`` -wheel packages in this directory: if both are present, these wheel packages are -used instead of ensurepip bundled wheel packages. - -Some Linux distribution packaging policies recommend against bundling -dependencies. For example, Fedora installs wheel packages in the -``/usr/share/python-wheels/`` directory and don't install the -``ensurepip._bundled`` package. diff --git a/Misc/NEWS.d/next/Build/2021-01-11-23-26-00.bpo-31904.ty8f3h.rst b/Misc/NEWS.d/next/Build/2021-01-11-23-26-00.bpo-31904.ty8f3h.rst deleted file mode 100644 index bc02d0a04f528..0000000000000 --- a/Misc/NEWS.d/next/Build/2021-01-11-23-26-00.bpo-31904.ty8f3h.rst +++ /dev/null @@ -1 +0,0 @@ -Add library search path by wr-cc in add_cross_compiling_paths() for VxWorks. diff --git a/Misc/NEWS.d/next/Build/2021-01-12-10-06-50.bpo-42874.XKK61g.rst b/Misc/NEWS.d/next/Build/2021-01-12-10-06-50.bpo-42874.XKK61g.rst deleted file mode 100644 index c3ef7b34bc7d7..0000000000000 --- a/Misc/NEWS.d/next/Build/2021-01-12-10-06-50.bpo-42874.XKK61g.rst +++ /dev/null @@ -1,3 +0,0 @@ -Removed the grep -q and -E flags in the tzpath validation section of the -configure script to better accomodate users of some platforms (specifically -Solaris 10). diff --git a/Misc/NEWS.d/next/Build/2021-01-18-20-52-06.bpo-36143.kgnIYo.rst b/Misc/NEWS.d/next/Build/2021-01-18-20-52-06.bpo-36143.kgnIYo.rst deleted file mode 100644 index 5ac3269d95540..0000000000000 --- a/Misc/NEWS.d/next/Build/2021-01-18-20-52-06.bpo-36143.kgnIYo.rst +++ /dev/null @@ -1 +0,0 @@ -``make regen-all`` now also runs ``regen-keyword``. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Build/2021-01-26-14-48-40.bpo-43031.44nK9U.rst b/Misc/NEWS.d/next/Build/2021-01-26-14-48-40.bpo-43031.44nK9U.rst deleted file mode 100644 index 6e8377fb30612..0000000000000 --- a/Misc/NEWS.d/next/Build/2021-01-26-14-48-40.bpo-43031.44nK9U.rst +++ /dev/null @@ -1,2 +0,0 @@ -Pass ``--timeout=$(TESTTIMEOUT)`` option to the default profile task -``./python -m test --pgo`` command. diff --git a/Misc/NEWS.d/next/C API/2021-01-27-10-27-47.bpo-43030.loDcD_.rst b/Misc/NEWS.d/next/C API/2021-01-27-10-27-47.bpo-43030.loDcD_.rst deleted file mode 100644 index 7a432522db8a1..0000000000000 --- a/Misc/NEWS.d/next/C API/2021-01-27-10-27-47.bpo-43030.loDcD_.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed a compiler warning in :c:func:`Py_UNICODE_ISSPACE()` on platforms with -signed ``wchar_t``. diff --git a/Misc/NEWS.d/next/C API/2021-01-28-01-11-59.bpo-42979.JrGkrm.rst b/Misc/NEWS.d/next/C API/2021-01-28-01-11-59.bpo-42979.JrGkrm.rst deleted file mode 100644 index 15fd86bee9dba..0000000000000 --- a/Misc/NEWS.d/next/C API/2021-01-28-01-11-59.bpo-42979.JrGkrm.rst +++ /dev/null @@ -1,5 +0,0 @@ -When Python is built in debug mode (with C assertions), calling a type slot -like ``sq_length`` (``__len__()`` in Python) now fails with a fatal error if -the slot succeeded with an exception set, or failed with no exception set. The -error message contains the slot, the type name, and the current exception (if -an exception is set). Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-12-20-23-59-23.bpo-27772.idHEcj.rst b/Misc/NEWS.d/next/Core and Builtins/2018-12-20-23-59-23.bpo-27772.idHEcj.rst deleted file mode 100644 index 7345152fee356..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2018-12-20-23-59-23.bpo-27772.idHEcj.rst +++ /dev/null @@ -1,2 +0,0 @@ -In string formatting, preceding the *width* field by ``'0'`` no longer -affects the default alignment for strings. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-10-14-16-03.bpo-41994.Xop8sV.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-10-14-16-03.bpo-41994.Xop8sV.rst deleted file mode 100644 index 36d5011ee71a6..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-10-10-14-16-03.bpo-41994.Xop8sV.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed possible leak in ``import`` when ``sys.modules`` is not a ``dict``. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-12-12-20-09-12.bpo-37324.jB-9_U.rst b/Misc/NEWS.d/next/Core and Builtins/2020-12-12-20-09-12.bpo-37324.jB-9_U.rst deleted file mode 100644 index 5b57da4de5a77..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-12-12-20-09-12.bpo-37324.jB-9_U.rst +++ /dev/null @@ -1,2 +0,0 @@ -Remove deprecated aliases to :ref:`collections-abstract-base-classes` from -the :mod:`collections` module. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-04-18-17-07.bpo-42823.dcSynu.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-04-18-17-07.bpo-42823.dcSynu.rst deleted file mode 100644 index 77dbc0262f46f..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-01-04-18-17-07.bpo-42823.dcSynu.rst +++ /dev/null @@ -1 +0,0 @@ -frame.f_lineno is correct even if frame.f_trace is set to True diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-06-17-06-37.bpo-42827.jtRR0D.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-06-17-06-37.bpo-42827.jtRR0D.rst deleted file mode 100644 index 8e40ab6a65341..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-01-06-17-06-37.bpo-42827.jtRR0D.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a crash when working out the error line of a :exc:`SyntaxError` in some -multi-line expressions. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-11-17-58-52.bpo-42882.WfTdfg.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-11-17-58-52.bpo-42882.WfTdfg.rst deleted file mode 100644 index 6cc7c92194c26..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-01-11-17-58-52.bpo-42882.WfTdfg.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix the :c:func:`_PyUnicode_FromId` function (_Py_IDENTIFIER(var) API) when -:c:func:`Py_Initialize` / :c:func:`Py_Finalize` is called multiple times: -preserve ``_PyRuntime.unicode_ids.next_index`` value. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-13-14-06-01.bpo-42924._WS1Ok.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-13-14-06-01.bpo-42924._WS1Ok.rst deleted file mode 100644 index 33fbb5235ddb6..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-01-13-14-06-01.bpo-42924._WS1Ok.rst +++ /dev/null @@ -1 +0,0 @@ -Fix ``bytearray`` repetition incorrectly copying data from the start of the buffer, even if the data is offset within the buffer (e.g. after reassigning a slice at the start of the ``bytearray`` to a shorter byte string). diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-14-23-15-34.bpo-42864.QgOAQ1.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-14-23-15-34.bpo-42864.QgOAQ1.rst deleted file mode 100644 index 127a29f518d79..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-01-14-23-15-34.bpo-42864.QgOAQ1.rst +++ /dev/null @@ -1,2 +0,0 @@ -Improve error messages in the parser when parentheses are not closed. Patch -by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-15-20-05-56.bpo-42927.GI-l-7.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-15-20-05-56.bpo-42927.GI-l-7.rst deleted file mode 100644 index 8ee578e816215..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-01-15-20-05-56.bpo-42927.GI-l-7.rst +++ /dev/null @@ -1,2 +0,0 @@ -The inline cache for ``LOAD_ATTR`` now also optimizes access to attributes defined by ``__slots__``. -This makes reading such attribute up to 30% faster. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-20-22-31-01.bpo-40176.anjyWw.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-20-22-31-01.bpo-40176.anjyWw.rst deleted file mode 100644 index df7de3bdf37bc..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-01-20-22-31-01.bpo-40176.anjyWw.rst +++ /dev/null @@ -1,2 +0,0 @@ -Syntax errors for unterminated string literals now point to the start -of the string instead of reporting EOF/EOL. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-20-23-44-15.bpo-42986.sWoaGf.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-20-23-44-15.bpo-42986.sWoaGf.rst deleted file mode 100644 index 6e4ed60bf224d..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-01-20-23-44-15.bpo-42986.sWoaGf.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix parser crash when reporting syntax errors in f-string with newlines. -Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-24-18-02-05.bpo-43017.emEcXX.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-24-18-02-05.bpo-43017.emEcXX.rst deleted file mode 100644 index a809f5cbb1de1..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-01-24-18-02-05.bpo-43017.emEcXX.rst +++ /dev/null @@ -1,2 +0,0 @@ -Improve error message in the parser when using un-parenthesised tuples in -comprehensions. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-24-20-19-55.bpo-42997.QUOPgP.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-24-20-19-55.bpo-42997.QUOPgP.rst deleted file mode 100644 index 889f4c5d99689..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-01-24-20-19-55.bpo-42997.QUOPgP.rst +++ /dev/null @@ -1 +0,0 @@ -Improve error message for missing ":" before blocks. Patch by Pablo Galindo. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-29-17-48-44.bpo-38631.jR-3kC.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-29-17-48-44.bpo-38631.jR-3kC.rst deleted file mode 100644 index 485607e66126d..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-01-29-17-48-44.bpo-38631.jR-3kC.rst +++ /dev/null @@ -1,2 +0,0 @@ -Replace :c:func:`Py_FatalError` calls in the compiler with regular -:exc:`SystemError` exceptions. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-30-11-31-44.bpo-42990.69h_zK.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-30-11-31-44.bpo-42990.69h_zK.rst deleted file mode 100644 index 8ac39713e116a..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-01-30-11-31-44.bpo-42990.69h_zK.rst +++ /dev/null @@ -1,5 +0,0 @@ -Refactor the ``PyEval_`` family of functions. - -* An new function ``_PyEval_Vector`` is added to simplify calls to Python from C. -* ``_PyEval_EvalCodeWithName`` is removed -* ``PyEval_EvalCodeEx`` is retained as part of the API, but is not used internally diff --git a/Misc/NEWS.d/next/Documentation/2021-01-04-22-14-22.bpo-42811.HY2beA.rst b/Misc/NEWS.d/next/Documentation/2021-01-04-22-14-22.bpo-42811.HY2beA.rst deleted file mode 100644 index 768508e0ce1c1..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-01-04-22-14-22.bpo-42811.HY2beA.rst +++ /dev/null @@ -1,2 +0,0 @@ -Updated importlib.utils.resolve_name() doc to use __spec__.parent -instead of __package__. (Thanks Yair Frid.) diff --git a/Misc/NEWS.d/next/Documentation/2021-01-20-23-03-49.bpo-40304.-LK7Ps.rst b/Misc/NEWS.d/next/Documentation/2021-01-20-23-03-49.bpo-40304.-LK7Ps.rst deleted file mode 100644 index 3f2f14c2d7b89..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-01-20-23-03-49.bpo-40304.-LK7Ps.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix doc for type(name, bases, dict). Patch by Boris Verkhovskiy and -?ric Araujo. diff --git a/Misc/NEWS.d/next/IDLE/2019-06-30-20-31-09.bpo-32631.e7_4BG.rst b/Misc/NEWS.d/next/IDLE/2019-06-30-20-31-09.bpo-32631.e7_4BG.rst deleted file mode 100644 index c422f43b6d6dd..0000000000000 --- a/Misc/NEWS.d/next/IDLE/2019-06-30-20-31-09.bpo-32631.e7_4BG.rst +++ /dev/null @@ -1,2 +0,0 @@ -Finish zzdummy example extension module: make menu entries work; -add docstrings and tests with 100% coverage. diff --git a/Misc/NEWS.d/next/IDLE/2019-11-14-23-41-07.bpo-23544.3etemb.rst b/Misc/NEWS.d/next/IDLE/2019-11-14-23-41-07.bpo-23544.3etemb.rst deleted file mode 100644 index eb4a56bf100b5..0000000000000 --- a/Misc/NEWS.d/next/IDLE/2019-11-14-23-41-07.bpo-23544.3etemb.rst +++ /dev/null @@ -1,2 +0,0 @@ -Disable Debug=>Stack Viewer when user code is running or Debugger -is active, to prevent hang or crash. Patch by Zackery Spytz. diff --git a/Misc/NEWS.d/next/IDLE/2021-01-10-01-25-43.bpo-33065.zmyHYJ.rst b/Misc/NEWS.d/next/IDLE/2021-01-10-01-25-43.bpo-33065.zmyHYJ.rst deleted file mode 100644 index 87948f3cd1baa..0000000000000 --- a/Misc/NEWS.d/next/IDLE/2021-01-10-01-25-43.bpo-33065.zmyHYJ.rst +++ /dev/null @@ -1 +0,0 @@ -Fix problem debugging user classes with __repr__ method. diff --git a/Misc/NEWS.d/next/IDLE/2021-01-26-18-12-17.bpo-43008.mbQUc7.rst b/Misc/NEWS.d/next/IDLE/2021-01-26-18-12-17.bpo-43008.mbQUc7.rst deleted file mode 100644 index 55ab67ca94959..0000000000000 --- a/Misc/NEWS.d/next/IDLE/2021-01-26-18-12-17.bpo-43008.mbQUc7.rst +++ /dev/null @@ -1,2 +0,0 @@ -Make IDLE invoke :func:`sys.excepthook` in normal, 2-process mode. -Patch by Ken Hilton. diff --git a/Misc/NEWS.d/next/Library/2018-04-23-13-44-10.bpo-33289.anBnUr.rst b/Misc/NEWS.d/next/Library/2018-04-23-13-44-10.bpo-33289.anBnUr.rst deleted file mode 100644 index 52d9ac9dd902c..0000000000000 --- a/Misc/NEWS.d/next/Library/2018-04-23-13-44-10.bpo-33289.anBnUr.rst +++ /dev/null @@ -1,2 +0,0 @@ -Correct call to :mod:`tkinter.colorchooser` to return RGB triplet of ints -instead of floats. Patch by Cheryl Sabella. diff --git a/Misc/NEWS.d/next/Library/2020-01-13-23-37-58.bpo-39273.m5hzxV.rst b/Misc/NEWS.d/next/Library/2020-01-13-23-37-58.bpo-39273.m5hzxV.rst deleted file mode 100644 index c942da07da377..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-01-13-23-37-58.bpo-39273.m5hzxV.rst +++ /dev/null @@ -1,2 +0,0 @@ -The ``BUTTON5_*`` constants are now exposed in the :mod:`curses` module if -available. diff --git a/Misc/NEWS.d/next/Library/2020-03-16-03-03-21.bpo-38307.2cmw2i.rst b/Misc/NEWS.d/next/Library/2020-03-16-03-03-21.bpo-38307.2cmw2i.rst deleted file mode 100644 index 358089915fb6c..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-03-16-03-03-21.bpo-38307.2cmw2i.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add an 'end_lineno' attribute to the Class and Function objects that appear in the -tree returned by pyclbr functions. This and the existing 'lineno' -attribute define the extent of class and def statements. Patch by Aviral Srivastava. diff --git a/Misc/NEWS.d/next/Library/2020-06-28-16-13-02.bpo-41149.jiZWtJ.rst b/Misc/NEWS.d/next/Library/2020-06-28-16-13-02.bpo-41149.jiZWtJ.rst deleted file mode 100644 index abe09016a6525..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-06-28-16-13-02.bpo-41149.jiZWtJ.rst +++ /dev/null @@ -1 +0,0 @@ -Allow executing callables that have a boolean value of ``False`` when passed to :class:`Threading.thread` as the target. Patch contributed by Barney Stratford. diff --git a/Misc/NEWS.d/next/Library/2020-08-21-15-24-14.bpo-41604.rTXleO.rst b/Misc/NEWS.d/next/Library/2020-08-21-15-24-14.bpo-41604.rTXleO.rst deleted file mode 100644 index 0f9794cbdb321..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-08-21-15-24-14.bpo-41604.rTXleO.rst +++ /dev/null @@ -1,2 +0,0 @@ -Don't decrement the reference count of the previous user_ptr when -set_panel_userptr fails. diff --git a/Misc/NEWS.d/next/Library/2020-10-11-13-48-03.bpo-42005.Jq6Az-.rst b/Misc/NEWS.d/next/Library/2020-10-11-13-48-03.bpo-42005.Jq6Az-.rst deleted file mode 100644 index be4ed7f55ffde..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-11-13-48-03.bpo-42005.Jq6Az-.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix CLI of :mod:`cProfile` and :mod:`profile` to catch -:exc:`BrokenPipeError`. diff --git a/Misc/NEWS.d/next/Library/2020-11-17-14-30-12.bpo-42383.ubl0Y_.rst b/Misc/NEWS.d/next/Library/2020-11-17-14-30-12.bpo-42383.ubl0Y_.rst deleted file mode 100644 index ccf2106f28a93..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-17-14-30-12.bpo-42383.ubl0Y_.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix pdb: previously pdb would fail to restart the debugging target if it was -specified using a relative path and the current directory changed. diff --git a/Misc/NEWS.d/next/Library/2020-11-17-14-32-39.bpo-42384.1ZnQSn.rst b/Misc/NEWS.d/next/Library/2020-11-17-14-32-39.bpo-42384.1ZnQSn.rst deleted file mode 100644 index ae990162fbab7..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-17-14-32-39.bpo-42384.1ZnQSn.rst +++ /dev/null @@ -1 +0,0 @@ -Make pdb populate sys.path[0] exactly the same as regular python execution. diff --git a/Misc/NEWS.d/next/Library/2020-12-30-14-56-25.bpo-24464.vbNVHe.rst b/Misc/NEWS.d/next/Library/2020-12-30-14-56-25.bpo-24464.vbNVHe.rst deleted file mode 100644 index 2039c1ca9c0c4..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-12-30-14-56-25.bpo-24464.vbNVHe.rst +++ /dev/null @@ -1,3 +0,0 @@ -The undocumented built-in function ``sqlite3.enable_shared_cache`` is now -deprecated, scheduled for removal in Python 3.12. Its use is strongly -discouraged by the SQLite3 documentation. Patch by Erlend E. Aasland. diff --git a/Misc/NEWS.d/next/Library/2021-01-01-15-29-16.bpo-42802.Lw-bzl.rst b/Misc/NEWS.d/next/Library/2021-01-01-15-29-16.bpo-42802.Lw-bzl.rst deleted file mode 100644 index 9016cd02878cc..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-01-15-29-16.bpo-42802.Lw-bzl.rst +++ /dev/null @@ -1,3 +0,0 @@ -The distutils ``bdist_wininst`` command deprecated in Python 3.8 has been -removed. The distutils ``bidst_wheel`` command is now recommended to -distribute binary packages on Windows. diff --git a/Misc/NEWS.d/next/Library/2021-01-04-15-05-40.bpo-1635741.EOCfZY.rst b/Misc/NEWS.d/next/Library/2021-01-04-15-05-40.bpo-1635741.EOCfZY.rst deleted file mode 100644 index 7ba9a53ddf900..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-04-15-05-40.bpo-1635741.EOCfZY.rst +++ /dev/null @@ -1,2 +0,0 @@ -Convert the _multibytecodec extension module (CJK codecs) to multi-phase -initialization (:pep:`489`). Patch by Erlend E. Aasland. diff --git a/Misc/NEWS.d/next/Library/2021-01-05-00-52-30.bpo-40810.JxQqPe.rst b/Misc/NEWS.d/next/Library/2021-01-05-00-52-30.bpo-40810.JxQqPe.rst deleted file mode 100644 index 61d8780bb85dd..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-05-00-52-30.bpo-40810.JxQqPe.rst +++ /dev/null @@ -1 +0,0 @@ -Require SQLite 3.7.15 or newer. Patch by Erlend E. Aasland. diff --git a/Misc/NEWS.d/next/Library/2021-01-05-21-26-29.bpo-41748.KdC0w3.rst b/Misc/NEWS.d/next/Library/2021-01-05-21-26-29.bpo-41748.KdC0w3.rst deleted file mode 100644 index 52efa3ac3d40e..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-05-21-26-29.bpo-41748.KdC0w3.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix HTMLParser parsing rules for element attributes containing -commas with spaces. Patch by Karl Dubost. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2021-01-05-23-55-24.bpo-42834.LxRnZC.rst b/Misc/NEWS.d/next/Library/2021-01-05-23-55-24.bpo-42834.LxRnZC.rst deleted file mode 100644 index 9e63a7e76062a..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-05-23-55-24.bpo-42834.LxRnZC.rst +++ /dev/null @@ -1 +0,0 @@ -Make internal caches of the ``_json`` module compatible with subinterpreters. diff --git a/Misc/NEWS.d/next/Library/2021-01-07-11-44-22.bpo-42851.uyQFyd.rst b/Misc/NEWS.d/next/Library/2021-01-07-11-44-22.bpo-42851.uyQFyd.rst deleted file mode 100644 index 927283521e80e..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-07-11-44-22.bpo-42851.uyQFyd.rst +++ /dev/null @@ -1 +0,0 @@ -remove __init_subclass__ support for Enum members diff --git a/Misc/NEWS.d/next/Library/2021-01-07-23-31-17.bpo-42846.kukDjw.rst b/Misc/NEWS.d/next/Library/2021-01-07-23-31-17.bpo-42846.kukDjw.rst deleted file mode 100644 index 6f8a739ec1da2..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-07-23-31-17.bpo-42846.kukDjw.rst +++ /dev/null @@ -1,3 +0,0 @@ -Convert the 6 CJK codec extension modules (_codecs_cn, _codecs_hk, -_codecs_iso2022, _codecs_jp, _codecs_kr and _codecs_tw) to the multiphase -initialization API (:pep:`489`). Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Library/2021-01-08-10-57-21.bpo-42866.Y1DnrO.rst b/Misc/NEWS.d/next/Library/2021-01-08-10-57-21.bpo-42866.Y1DnrO.rst deleted file mode 100644 index 3ea6cc239aa69..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-08-10-57-21.bpo-42866.Y1DnrO.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a reference leak in the ``getcodec()`` function of CJK codecs. Patch by -Victor Stinner. diff --git a/Misc/NEWS.d/next/Library/2021-01-08-15-49-20.bpo-42780.rtqi6B.rst b/Misc/NEWS.d/next/Library/2021-01-08-15-49-20.bpo-42780.rtqi6B.rst deleted file mode 100644 index a491690507129..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-08-15-49-20.bpo-42780.rtqi6B.rst +++ /dev/null @@ -1 +0,0 @@ -Fix os.set_inheritable() for O_PATH file descriptors on Linux. diff --git a/Misc/NEWS.d/next/Library/2021-01-11-17-36-59.bpo-42901.gFd-ta.rst b/Misc/NEWS.d/next/Library/2021-01-11-17-36-59.bpo-42901.gFd-ta.rst deleted file mode 100644 index 206bca1fb634c..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-11-17-36-59.bpo-42901.gFd-ta.rst +++ /dev/null @@ -1,3 +0,0 @@ -[Enum] move member creation from ``EnumMeta.__new__`` to -``_proto_member.__set_name__``, allowing members to be created and visible -in ``__init_subclass__``. diff --git a/Misc/NEWS.d/next/Library/2021-01-12-19-34-06.bpo-42848.5G8oBl.rst b/Misc/NEWS.d/next/Library/2021-01-12-19-34-06.bpo-42848.5G8oBl.rst deleted file mode 100644 index 4490b6ae3405e..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-12-19-34-06.bpo-42848.5G8oBl.rst +++ /dev/null @@ -1 +0,0 @@ -Removed recursion from :class:`~traceback.TracebackException` to allow it to handle long exception chains. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2021-01-13-12-15-13.bpo-42923.zBiNls.rst b/Misc/NEWS.d/next/Library/2021-01-13-12-15-13.bpo-42923.zBiNls.rst deleted file mode 100644 index bb566f982b5ce..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-13-12-15-13.bpo-42923.zBiNls.rst +++ /dev/null @@ -1,2 +0,0 @@ -The :c:func:`Py_FatalError` function and the :mod:`faulthandler` module now -dump the list of extension modules on a fatal error. diff --git a/Misc/NEWS.d/next/Library/2021-01-13-12-55-41.bpo-42877.Fi1zEG.rst b/Misc/NEWS.d/next/Library/2021-01-13-12-55-41.bpo-42877.Fi1zEG.rst deleted file mode 100644 index 49bb74bc53665..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-13-12-55-41.bpo-42877.Fi1zEG.rst +++ /dev/null @@ -1,4 +0,0 @@ -Added the ``compact`` parameter to the constructor of -:class:`traceback.TracebackException` to reduce time and memory -for use cases that only need to call :func:`TracebackException.format` -and :func:`TracebackException.format_exception_only`. diff --git a/Misc/NEWS.d/next/Library/2021-01-14-15-07-16.bpo-38250.1fvhOk.rst b/Misc/NEWS.d/next/Library/2021-01-14-15-07-16.bpo-38250.1fvhOk.rst deleted file mode 100644 index e5a72468370fb..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-14-15-07-16.bpo-38250.1fvhOk.rst +++ /dev/null @@ -1,5 +0,0 @@ -[Enum] Flags consisting of a single bit are now considered canonical, and -will be the only flags returned from listing and iterating over a Flag class -or a Flag member. Multi-bit flags are considered aliases; they will be -returned from lookups and operations that result in their value. -Iteration for both Flag and Flag members is in definition order. diff --git a/Misc/NEWS.d/next/Library/2021-01-15-00-23-50.bpo-42931.QD6U2B.rst b/Misc/NEWS.d/next/Library/2021-01-15-00-23-50.bpo-42931.QD6U2B.rst deleted file mode 100644 index 01f8094944f70..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-15-00-23-50.bpo-42931.QD6U2B.rst +++ /dev/null @@ -1 +0,0 @@ -Add :func:`randbytes` to ``random.__all__``. diff --git a/Misc/NEWS.d/next/Library/2021-01-15-11-48-00.bpo-42934.ILKoOI.rst b/Misc/NEWS.d/next/Library/2021-01-15-11-48-00.bpo-42934.ILKoOI.rst deleted file mode 100644 index 92f2402d2324a..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-15-11-48-00.bpo-42934.ILKoOI.rst +++ /dev/null @@ -1,3 +0,0 @@ -Use :class:`~traceback.TracebackException`'s new ``compact`` param in -:class:`~unittest.TestResult` to reduce time and memory consumed by -traceback formatting. diff --git a/Misc/NEWS.d/next/Library/2021-01-18-10-41-44.bpo-42944.RrONvy.rst b/Misc/NEWS.d/next/Library/2021-01-18-10-41-44.bpo-42944.RrONvy.rst deleted file mode 100644 index b78d10aa25545..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-18-10-41-44.bpo-42944.RrONvy.rst +++ /dev/null @@ -1 +0,0 @@ -Fix ``random.Random.sample`` when ``counts`` argument is not ``None``. diff --git a/Misc/NEWS.d/next/Library/2021-01-18-11-59-46.bpo-42955.CSWLC9.rst b/Misc/NEWS.d/next/Library/2021-01-18-11-59-46.bpo-42955.CSWLC9.rst deleted file mode 100644 index 373b829b0fb76..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-18-11-59-46.bpo-42955.CSWLC9.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add :data:`sys.stdlib_module_names`, containing the list of the standard library -module names. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Library/2021-01-20-12-10-47.bpo-42323.PONB8e.rst b/Misc/NEWS.d/next/Library/2021-01-20-12-10-47.bpo-42323.PONB8e.rst deleted file mode 100644 index b2f7becee9d23..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-20-12-10-47.bpo-42323.PONB8e.rst +++ /dev/null @@ -1 +0,0 @@ -Fix :func:`math.nextafter` for NaN on AIX. diff --git a/Misc/NEWS.d/next/Library/2021-01-24-00-37-40.bpo-43014.BVPhEr.rst b/Misc/NEWS.d/next/Library/2021-01-24-00-37-40.bpo-43014.BVPhEr.rst deleted file mode 100644 index 02898e4a3a42e..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-24-00-37-40.bpo-43014.BVPhEr.rst +++ /dev/null @@ -1 +0,0 @@ -Improve performance of :mod:`tokenize` by 20-30%. Patch by Anthony Sottile. diff --git a/Misc/NEWS.d/next/Library/2021-01-27-20-49-32.bpo-41282.SEPdV0.rst b/Misc/NEWS.d/next/Library/2021-01-27-20-49-32.bpo-41282.SEPdV0.rst deleted file mode 100644 index c7b6b5233e8f2..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-27-20-49-32.bpo-41282.SEPdV0.rst +++ /dev/null @@ -1 +0,0 @@ -Deprecate ``distutils`` in documentation and add warning on import. diff --git a/Misc/NEWS.d/next/Library/2021-01-30-15-20-06.bpo-43077.Owk61z.rst b/Misc/NEWS.d/next/Library/2021-01-30-15-20-06.bpo-43077.Owk61z.rst deleted file mode 100644 index e555002433b4d..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-30-15-20-06.bpo-43077.Owk61z.rst +++ /dev/null @@ -1 +0,0 @@ -Update the bundled pip to 21.0.1 and setuptools to 52.0.0. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2021-02-02-20-23-31.bpo-43108.lqcCZ6.rst b/Misc/NEWS.d/next/Library/2021-02-02-20-23-31.bpo-43108.lqcCZ6.rst deleted file mode 100644 index 8e45640bceae1..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-02-02-20-23-31.bpo-43108.lqcCZ6.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed a reference leak in the :mod:`curses` module. Patch by Pablo Galindo 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 7df65a156feab..0000000000000 --- 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/Tests/2020-05-30-10-56-38.bpo-40810.LPqDLQ.rst b/Misc/NEWS.d/next/Tests/2020-05-30-10-56-38.bpo-40810.LPqDLQ.rst deleted file mode 100644 index eafd94cabede9..0000000000000 --- a/Misc/NEWS.d/next/Tests/2020-05-30-10-56-38.bpo-40810.LPqDLQ.rst +++ /dev/null @@ -1 +0,0 @@ -In :mod:`sqlite3`, fix ``CheckTraceCallbackContent`` for SQLite pre 3.7.15. diff --git a/Misc/NEWS.d/next/Tests/2020-05-30-13-39-22.bpo-40823.yB7K5w.rst b/Misc/NEWS.d/next/Tests/2020-05-30-13-39-22.bpo-40823.yB7K5w.rst deleted file mode 100644 index 55919521cf806..0000000000000 --- a/Misc/NEWS.d/next/Tests/2020-05-30-13-39-22.bpo-40823.yB7K5w.rst +++ /dev/null @@ -1,2 +0,0 @@ -Use :meth:`unittest.TestLoader().loadTestsFromTestCase` instead of -:meth:`unittest.makeSuite` in :mod:`sqlite3` tests. Patch by Erlend E. Aasland. diff --git a/Misc/NEWS.d/next/Windows/2020-12-07-11-40-52.bpo-42584.AsYnVX.rst b/Misc/NEWS.d/next/Windows/2020-12-07-11-40-52.bpo-42584.AsYnVX.rst deleted file mode 100644 index afb6530c8f66d..0000000000000 --- a/Misc/NEWS.d/next/Windows/2020-12-07-11-40-52.bpo-42584.AsYnVX.rst +++ /dev/null @@ -1 +0,0 @@ -Upgrade Windows installer to use SQLite 3.34.0. diff --git a/Misc/NEWS.d/next/Windows/2021-01-05-20-36-40.bpo-41837.bmS7vB.rst b/Misc/NEWS.d/next/Windows/2021-01-05-20-36-40.bpo-41837.bmS7vB.rst deleted file mode 100644 index 8d4bb34ff909c..0000000000000 --- a/Misc/NEWS.d/next/Windows/2021-01-05-20-36-40.bpo-41837.bmS7vB.rst +++ /dev/null @@ -1 +0,0 @@ -Updated Windows installer to include OpenSSL 1.1.1i diff --git a/Misc/NEWS.d/next/macOS/2021-01-26-14-36-11.bpo-42504.ZxWt71.rst b/Misc/NEWS.d/next/macOS/2021-01-26-14-36-11.bpo-42504.ZxWt71.rst deleted file mode 100644 index a47776effe905..0000000000000 --- a/Misc/NEWS.d/next/macOS/2021-01-26-14-36-11.bpo-42504.ZxWt71.rst +++ /dev/null @@ -1,3 +0,0 @@ -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. From webhook-mailer at python.org Wed Feb 3 08:41:18 2021 From: webhook-mailer at python.org (miss-islington) Date: Wed, 03 Feb 2021 13:41:18 -0000 Subject: [Python-checkins] bpo-43108: Fix a reference leak in the curses module (GH-24420) Message-ID: https://github.com/python/cpython/commit/12bfc595c49ef9681265407fe33b53b7a3623abc commit: 12bfc595c49ef9681265407fe33b53b7a3623abc branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2021-02-03T05:41:09-08:00 summary: bpo-43108: Fix a reference leak in the curses module (GH-24420) (cherry picked from commit bb739ec922c6992a2be38f9fd3c544c2cc322dde) Co-authored-by: Pablo Galindo files: A Misc/NEWS.d/next/Library/2021-02-02-20-23-31.bpo-43108.lqcCZ6.rst M Modules/_cursesmodule.c diff --git a/Misc/NEWS.d/next/Library/2021-02-02-20-23-31.bpo-43108.lqcCZ6.rst b/Misc/NEWS.d/next/Library/2021-02-02-20-23-31.bpo-43108.lqcCZ6.rst new file mode 100644 index 0000000000000..8e45640bceae1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-02-02-20-23-31.bpo-43108.lqcCZ6.rst @@ -0,0 +1 @@ +Fixed a reference leak in the :mod:`curses` module. Patch by Pablo Galindo diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c index d129248e36347..c84f8382274b5 100644 --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -365,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; @@ -679,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); From webhook-mailer at python.org Wed Feb 3 16:22:40 2021 From: webhook-mailer at python.org (Mariatta) Date: Wed, 03 Feb 2021 21:22:40 -0000 Subject: [Python-checkins] build(deps): bump actions/upload-artifact from v2.2.1 to v2.2.2 (GH-24411) Message-ID: https://github.com/python/cpython/commit/aa4caf9887944ab280a87712460e2dd49b55fe5e commit: aa4caf9887944ab280a87712460e2dd49b55fe5e branch: master author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> committer: Mariatta date: 2021-02-03T13:22:27-08:00 summary: build(deps): bump actions/upload-artifact from v2.2.1 to v2.2.2 (GH-24411) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from v2.2.1 to v2.2.2. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v2.2.1...e448a9b857ee2131e752b06002bf0e093c65e571) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> files: M .github/workflows/doc.yml diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml index 82e9645b5b337..864303bfff850 100644 --- a/.github/workflows/doc.yml +++ b/.github/workflows/doc.yml @@ -38,7 +38,7 @@ jobs: - name: 'Build documentation' run: xvfb-run make -C Doc/ PYTHON=../python SPHINXOPTS="-q -W --keep-going -j4" doctest html - name: 'Upload' - uses: actions/upload-artifact at v2.2.1 + uses: actions/upload-artifact at v2.2.2 with: name: doc-html path: Doc/build/html From webhook-mailer at python.org Wed Feb 3 16:25:35 2021 From: webhook-mailer at python.org (miss-islington) Date: Wed, 03 Feb 2021 21:25:35 -0000 Subject: [Python-checkins] Fix typo (GH-23019) Message-ID: https://github.com/python/cpython/commit/bfe544d2f2c2e7a7c03a764bed3276a1e27a0f5c commit: bfe544d2f2c2e7a7c03a764bed3276a1e27a0f5c branch: master author: Harry committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2021-02-03T13:25:28-08:00 summary: Fix typo (GH-23019) Fixed possible typo in comment files: M Lib/datetime.py diff --git a/Lib/datetime.py b/Lib/datetime.py index b896b94b0fe0e..6bf37ccfab7ac 100644 --- a/Lib/datetime.py +++ b/Lib/datetime.py @@ -2327,7 +2327,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. From webhook-mailer at python.org Wed Feb 3 16:46:44 2021 From: webhook-mailer at python.org (miss-islington) Date: Wed, 03 Feb 2021 21:46:44 -0000 Subject: [Python-checkins] Fix typo (GH-23019) Message-ID: https://github.com/python/cpython/commit/20d43758c317b52683505ab9c575b847dbbff93e commit: 20d43758c317b52683505ab9c575b847dbbff93e branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2021-02-03T13:46:23-08:00 summary: Fix typo (GH-23019) Fixed possible typo in comment (cherry picked from commit bfe544d2f2c2e7a7c03a764bed3276a1e27a0f5c) Co-authored-by: Harry files: M Lib/datetime.py diff --git a/Lib/datetime.py b/Lib/datetime.py index 9777e88df6ca4..aef8ca6972552 100644 --- a/Lib/datetime.py +++ b/Lib/datetime.py @@ -2323,7 +2323,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. From webhook-mailer at python.org Wed Feb 3 16:48:26 2021 From: webhook-mailer at python.org (miss-islington) Date: Wed, 03 Feb 2021 21:48:26 -0000 Subject: [Python-checkins] Fix typo (GH-23019) Message-ID: https://github.com/python/cpython/commit/2603d77a6b3200f08b890bd9bb4dc821970d68fe commit: 2603d77a6b3200f08b890bd9bb4dc821970d68fe branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2021-02-03T13:48:22-08:00 summary: Fix typo (GH-23019) Fixed possible typo in comment (cherry picked from commit bfe544d2f2c2e7a7c03a764bed3276a1e27a0f5c) Co-authored-by: Harry files: M Lib/datetime.py diff --git a/Lib/datetime.py b/Lib/datetime.py index e508d996fb1ed..23d2bf0918145 100644 --- a/Lib/datetime.py +++ b/Lib/datetime.py @@ -2358,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. From webhook-mailer at python.org Wed Feb 3 18:29:33 2021 From: webhook-mailer at python.org (pablogsal) Date: Wed, 03 Feb 2021 23:29:33 -0000 Subject: [Python-checkins] bpo-43121: Fix incorrect SyntaxError message for missing comma (GH-24436) Message-ID: https://github.com/python/cpython/commit/d4e6ed7e5fb43320ea714d7436bc11667c624d43 commit: d4e6ed7e5fb43320ea714d7436bc11667c624d43 branch: master author: Pablo Galindo committer: pablogsal date: 2021-02-03T23:29:26Z summary: bpo-43121: Fix incorrect SyntaxError message for missing comma (GH-24436) files: A Misc/NEWS.d/next/Core and Builtins/2021-02-03-22-33-05.bpo-43121.jqcViq.rst M Grammar/python.gram M Lib/test/test_syntax.py M Parser/parser.c diff --git a/Grammar/python.gram b/Grammar/python.gram index 22f2b41b11ef6..d1a36f0e4d094 100644 --- a/Grammar/python.gram +++ b/Grammar/python.gram @@ -694,7 +694,7 @@ invalid_primary: invalid_comprehension: | ('[' | '(' | '{') a=starred_expression for_if_clauses { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "iterable unpacking cannot be used in comprehension") } - | ('[' | '{') a=star_named_expression ',' [star_named_expressions] { + | ('[' | '{') a=star_named_expression ',' [star_named_expressions] for_if_clauses { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "did you forget parentheses around the comprehension target?") } invalid_dict_comprehension: | '{' a='**' bitwise_or for_if_clauses '}' { diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py index 6068dd9fc09e8..70dd22c62aa21 100644 --- a/Lib/test/test_syntax.py +++ b/Lib/test/test_syntax.py @@ -246,9 +246,25 @@ Traceback (most recent call last): SyntaxError: did you forget parentheses around the comprehension target? ->>> {x,y: None for x,y in range(100)} +# Missing commas in literals collections should not +# produce special error messages regarding missing +# parentheses + +>>> [1, 2 3] Traceback (most recent call last): -SyntaxError: did you forget parentheses around the comprehension target? +SyntaxError: invalid syntax + +>>> {1, 2 3} +Traceback (most recent call last): +SyntaxError: invalid syntax + +>>> {1:2, 2:5 3:12} +Traceback (most recent call last): +SyntaxError: invalid syntax + +>>> (1, 2 3) +Traceback (most recent call last): +SyntaxError: invalid syntax From compiler_complex_args(): diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-02-03-22-33-05.bpo-43121.jqcViq.rst b/Misc/NEWS.d/next/Core and Builtins/2021-02-03-22-33-05.bpo-43121.jqcViq.rst new file mode 100644 index 0000000000000..5030bda133c8d --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-02-03-22-33-05.bpo-43121.jqcViq.rst @@ -0,0 +1,2 @@ +Fixed an incorrect :exc:`SyntaxError` message for missing comma in literals. +Patch by Pablo Galindo. diff --git a/Parser/parser.c b/Parser/parser.c index c709e45dae565..f4501d3bca094 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -15217,7 +15217,7 @@ invalid_primary_rule(Parser *p) // invalid_comprehension: // | ('[' | '(' | '{') starred_expression for_if_clauses -// | ('[' | '{') star_named_expression ',' star_named_expressions? +// | ('[' | '{') star_named_expression ',' star_named_expressions? for_if_clauses static void * invalid_comprehension_rule(Parser *p) { @@ -15258,17 +15258,18 @@ invalid_comprehension_rule(Parser *p) 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")); } - { // ('[' | '{') star_named_expression ',' star_named_expressions? + { // ('[' | '{') star_named_expression ',' star_named_expressions? 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, "('[' | '{') star_named_expression ',' star_named_expressions?")); + D(fprintf(stderr, "%*c> invalid_comprehension[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('[' | '{') star_named_expression ',' star_named_expressions? for_if_clauses")); Token * _literal; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings void *_tmp_132_var; expr_ty a; + asdl_comprehension_seq* for_if_clauses_var; if ( (_tmp_132_var = _tmp_132_rule(p)) // '[' | '{' && @@ -15277,9 +15278,11 @@ invalid_comprehension_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 12)) // token=',' && (_opt_var = star_named_expressions_rule(p), 1) // star_named_expressions? + && + (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, "('[' | '{') star_named_expression ',' star_named_expressions?")); + D(fprintf(stderr, "%*c+ invalid_comprehension[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "('[' | '{') star_named_expression ',' star_named_expressions? for_if_clauses")); _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "did you forget parentheses around the comprehension target?" ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -15290,7 +15293,7 @@ invalid_comprehension_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s invalid_comprehension[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('[' | '{') star_named_expression ',' star_named_expressions?")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('[' | '{') star_named_expression ',' star_named_expressions? for_if_clauses")); } _res = NULL; done: From webhook-mailer at python.org Wed Feb 3 18:33:03 2021 From: webhook-mailer at python.org (corona10) Date: Wed, 03 Feb 2021 23:33:03 -0000 Subject: [Python-checkins] bpo-43106: Add os.O_EVTONLY/O_FSYNC/O_SYMLINK/O_NOFOLLOW_ANY (GH-24428) Message-ID: https://github.com/python/cpython/commit/f917c243c52d62a787738379fb9b97acbed02c17 commit: f917c243c52d62a787738379fb9b97acbed02c17 branch: master author: Dong-hee Na committer: corona10 date: 2021-02-04T08:32:55+09:00 summary: bpo-43106: Add os.O_EVTONLY/O_FSYNC/O_SYMLINK/O_NOFOLLOW_ANY (GH-24428) files: A Misc/NEWS.d/next/Library/2021-02-03-17-06-38.bpo-43106.SwcSuU.rst M Doc/library/os.rst M Doc/whatsnew/3.10.rst M Modules/posixmodule.c diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 35cf7c0a0ba5c..371d59e9c31a4 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -1090,6 +1090,16 @@ or `the MSDN `_ on Windo The above constants are only available on Windows. +.. data:: O_EVTONLY + O_FSYNC + O_SYMLINK + O_NOFOLLOW_ANY + + The above constants are only available on macOS. + + .. versionchanged:: 3.10 + Add :data:`O_EVTONLY`, :data:`O_FSYNC`, :data:`O_SYMLINK` + and :data:`O_NOFOLLOW_ANY` constants. .. data:: O_ASYNC O_DIRECT diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index d80ceeca85a89..fa8b6aa54fe90 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -411,6 +411,10 @@ descriptors without copying between kernel address space and user address space, where one of the file descriptors must refer to a pipe. (Contributed by Pablo Galindo in :issue:`41625`.) +Added :data:`~os.O_EVTONLY`, :data:`~os.O_FSYNC`, :data:`~os.O_SYMLINK` +and :data:`~os.O_NOFOLLOW_ANY` for macOS. +(Contributed by Dong-hee Na in :issue:`43106`.) + pathlib ------- diff --git a/Misc/NEWS.d/next/Library/2021-02-03-17-06-38.bpo-43106.SwcSuU.rst b/Misc/NEWS.d/next/Library/2021-02-03-17-06-38.bpo-43106.SwcSuU.rst new file mode 100644 index 0000000000000..a85d49437c4e5 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-02-03-17-06-38.bpo-43106.SwcSuU.rst @@ -0,0 +1,2 @@ +Added :data:`~os.O_EVTONLY`, :data:`~os.O_FSYNC`, :data:`~os.O_SYMLINK` +and :data:`~os.O_NOFOLLOW_ANY` for macOS. Patch by Dong-hee Na. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 4468fd08e17a5..b30ae80290535 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -14901,7 +14901,15 @@ all_ins(PyObject *m) #ifdef O_ACCMODE if (PyModule_AddIntMacro(m, O_ACCMODE)) return -1; #endif - +#ifdef O_EVTONLY + if (PyModule_AddIntMacro(m, O_EVTONLY)) return -1; +#endif +#ifdef O_FSYNC + if (PyModule_AddIntMacro(m, O_FSYNC)) return -1; +#endif +#ifdef O_SYMLINK + if (PyModule_AddIntMacro(m, O_SYMLINK)) return -1; +#endif #ifdef SEEK_HOLE if (PyModule_AddIntMacro(m, SEEK_HOLE)) return -1; @@ -14951,6 +14959,9 @@ all_ins(PyObject *m) /* Do not follow links. */ if (PyModule_AddIntMacro(m, O_NOFOLLOW)) return -1; #endif +#ifdef O_NOFOLLOW_ANY + if (PyModule_AddIntMacro(m, O_NOFOLLOW_ANY)) return -1; +#endif #ifdef O_NOLINKS /* Fails if link count of the named file is greater than 1 */ if (PyModule_AddIntMacro(m, O_NOLINKS)) return -1; From webhook-mailer at python.org Wed Feb 3 18:34:25 2021 From: webhook-mailer at python.org (miss-islington) Date: Wed, 03 Feb 2021 23:34:25 -0000 Subject: [Python-checkins] bpo-42773: fix tests not being run on pushes (GH-24004) Message-ID: https://github.com/python/cpython/commit/d29dbb122d8b8ee22b2d826af4d234a2c2cf7ba2 commit: d29dbb122d8b8ee22b2d826af4d234a2c2cf7ba2 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2021-02-03T15:34:21-08:00 summary: bpo-42773: fix tests not being run on pushes (GH-24004) There was a typo, we were checking if the "GITHUB_BASE_REF" string literal was empty instead of the $GITHUB_BASE_REF value. When $GITHUB_BASE_REF is empty, the action that triggered the run was not a pull request, so we always run the full test suite. Signed-off-by: Filipe La?ns (cherry picked from commit 4ac923f2756f835f512339ee181348cc535ab07f) Co-authored-by: Filipe La?ns files: M .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e7426ac8c5469..669c541dd4f49 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,7 +21,7 @@ jobs: - name: Check for source changes id: check run: | - if [ -z "GITHUB_BASE_REF" ]; then + if [ -z "$GITHUB_BASE_REF" ]; then echo '::set-output name=run_tests::true' else git fetch origin $GITHUB_BASE_REF --depth=1 From webhook-mailer at python.org Wed Feb 3 18:39:03 2021 From: webhook-mailer at python.org (miss-islington) Date: Wed, 03 Feb 2021 23:39:03 -0000 Subject: [Python-checkins] bpo-42773: fix tests not being run on pushes (GH-24004) Message-ID: https://github.com/python/cpython/commit/0898dcb3a0400d3c93e27f9feb4c2207eb1a996d commit: 0898dcb3a0400d3c93e27f9feb4c2207eb1a996d branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2021-02-03T15:38:55-08:00 summary: bpo-42773: fix tests not being run on pushes (GH-24004) There was a typo, we were checking if the "GITHUB_BASE_REF" string literal was empty instead of the $GITHUB_BASE_REF value. When $GITHUB_BASE_REF is empty, the action that triggered the run was not a pull request, so we always run the full test suite. Signed-off-by: Filipe La?ns (cherry picked from commit 4ac923f2756f835f512339ee181348cc535ab07f) Co-authored-by: Filipe La?ns files: M .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3d7c9901a8e99..07369ecad27cc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -28,7 +28,7 @@ jobs: - name: Check for source changes id: check run: | - if [ -z "GITHUB_BASE_REF" ]; then + if [ -z "$GITHUB_BASE_REF" ]; then echo '::set-output name=run_tests::true' else git fetch origin $GITHUB_BASE_REF --depth=1 From webhook-mailer at python.org Thu Feb 4 14:15:34 2021 From: webhook-mailer at python.org (miss-islington) Date: Thu, 04 Feb 2021 19:15:34 -0000 Subject: [Python-checkins] build(deps): bump actions/upload-artifact from v2.2.1 to v2.2.2 (GH-24411) Message-ID: https://github.com/python/cpython/commit/c370596a23167749b8127d1d2e20e039865aa695 commit: c370596a23167749b8127d1d2e20e039865aa695 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2021-02-04T11:15:26-08:00 summary: build(deps): bump actions/upload-artifact from v2.2.1 to v2.2.2 (GH-24411) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from v2.2.1 to v2.2.2. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v2.2.1...e448a9b857ee2131e752b06002bf0e093c65e571) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> (cherry picked from commit aa4caf9887944ab280a87712460e2dd49b55fe5e) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> files: M .github/workflows/doc.yml diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml index 2a04d66887015..2b3dc878949df 100644 --- a/.github/workflows/doc.yml +++ b/.github/workflows/doc.yml @@ -34,7 +34,7 @@ jobs: - name: 'Build documentation' run: xvfb-run make -C Doc/ PYTHON=../python SPHINXOPTS="-q -W -j4" doctest suspicious html - name: 'Upload' - uses: actions/upload-artifact at v2.2.1 + uses: actions/upload-artifact at v2.2.2 with: name: doc-html path: Doc/build/html From webhook-mailer at python.org Thu Feb 4 14:21:44 2021 From: webhook-mailer at python.org (miss-islington) Date: Thu, 04 Feb 2021 19:21:44 -0000 Subject: [Python-checkins] build(deps): bump actions/upload-artifact from v2.2.1 to v2.2.2 (GH-24411) Message-ID: https://github.com/python/cpython/commit/48d16b4b0fb0d0558bdbc1aee850650a671ecc77 commit: 48d16b4b0fb0d0558bdbc1aee850650a671ecc77 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2021-02-04T11:21:37-08:00 summary: build(deps): bump actions/upload-artifact from v2.2.1 to v2.2.2 (GH-24411) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from v2.2.1 to v2.2.2. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v2.2.1...e448a9b857ee2131e752b06002bf0e093c65e571) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> (cherry picked from commit aa4caf9887944ab280a87712460e2dd49b55fe5e) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> files: M .github/workflows/doc.yml diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml index 02e7c865cd568..18efd7f328c25 100644 --- a/.github/workflows/doc.yml +++ b/.github/workflows/doc.yml @@ -36,7 +36,7 @@ jobs: - name: 'Build documentation' run: xvfb-run make -C Doc/ PYTHON=../python SPHINXOPTS="-q -W -j4" doctest suspicious html - name: 'Upload' - uses: actions/upload-artifact at v2.2.1 + uses: actions/upload-artifact at v2.2.2 with: name: doc-html path: Doc/build/html From webhook-mailer at python.org Thu Feb 4 14:22:39 2021 From: webhook-mailer at python.org (Mariatta) Date: Thu, 04 Feb 2021 19:22:39 -0000 Subject: [Python-checkins] Fix dependabot.yml file (GH-24443) Message-ID: https://github.com/python/cpython/commit/d30951d4ff89450480c068cf3b7daf5e6fce0c58 commit: d30951d4ff89450480c068cf3b7daf5e6fce0c58 branch: master author: Mariatta Wijaya committer: Mariatta date: 2021-02-04T11:22:34-08:00 summary: Fix dependabot.yml file (GH-24443) The `target-branch` field doesn't seem to support array. Since it defaults to the default branch anyway, we should just remove the `target-branch` field from the config. files: M .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml index d9cbb3c7ec385..e90677b9f775a 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -7,7 +7,3 @@ updates: labels: - "skip issue" - "skip news" - target_branch: - - "master" - - "3.9" - - "3.8" From webhook-mailer at python.org Thu Feb 4 15:57:19 2021 From: webhook-mailer at python.org (Mariatta) Date: Thu, 04 Feb 2021 20:57:19 -0000 Subject: [Python-checkins] build(deps): bump actions/cache from v2.1.3 to v2.1.4 (#24446) Message-ID: https://github.com/python/cpython/commit/497b5649cf4d4201852cf022037dd7b5f897416a commit: 497b5649cf4d4201852cf022037dd7b5f897416a branch: master author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> committer: Mariatta date: 2021-02-04T12:57:10-08:00 summary: build(deps): bump actions/cache from v2.1.3 to v2.1.4 (#24446) Bumps [actions/cache](https://github.com/actions/cache) from v2.1.3 to v2.1.4. - [Release notes](https://github.com/actions/cache/releases) - [Commits](https://github.com/actions/cache/compare/v2.1.3...26968a09c0ea4f3e233fdddbafd1166051a095f6) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> files: M .github/workflows/build.yml M .github/workflows/coverage.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 48b5825db042f..c674c5d606c54 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -140,7 +140,7 @@ jobs: run: sudo ./.github/workflows/posix-deps-apt.sh - name: 'Restore OpenSSL build' id: cache-openssl - uses: actions/cache at v2.1.3 + uses: actions/cache at v2.1.4 with: path: ./multissl/openssl/${{ env.OPENSSL_VER }} key: ${{ runner.os }}-multissl-openssl-${{ env.OPENSSL_VER }} diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 11748f0e44981..788d6ce047b4a 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -32,7 +32,7 @@ jobs: run: sudo ./.github/workflows/posix-deps-apt.sh - name: 'Restore OpenSSL build' id: cache-openssl - uses: actions/cache at v2.1.3 + uses: actions/cache at v2.1.4 with: path: ./multissl/openssl/${{ env.OPENSSL_VER }} key: ${{ runner.os }}-multissl-openssl-${{ env.OPENSSL_VER }} From webhook-mailer at python.org Thu Feb 4 16:38:29 2021 From: webhook-mailer at python.org (zooba) Date: Thu, 04 Feb 2021 21:38:29 -0000 Subject: [Python-checkins] Fix signed/unsigned comparison to avoid compilation warning (GH-24441) Message-ID: https://github.com/python/cpython/commit/28873a70503c9e700fe05c3f9c781dbd6ea19b14 commit: 28873a70503c9e700fe05c3f9c781dbd6ea19b14 branch: master author: Ken Jin <28750310+Fidget-Spinner at users.noreply.github.com> committer: zooba date: 2021-02-04T21:38:18Z summary: Fix signed/unsigned comparison to avoid compilation warning (GH-24441) files: M PC/winreg.c diff --git a/PC/winreg.c b/PC/winreg.c index d62a7be28d3fa..fb488d8eb0296 100644 --- a/PC/winreg.c +++ b/PC/winreg.c @@ -680,7 +680,7 @@ _Py_COMP_DIAG_POP assert(size > 0); len = PyUnicode_AsWideChar(t, P, size); assert(len >= 0); - assert(len < size); + assert((unsigned)len < size); size -= (DWORD)len + 1; P += len + 1; } From webhook-mailer at python.org Thu Feb 4 17:08:12 2021 From: webhook-mailer at python.org (vstinner) Date: Thu, 04 Feb 2021 22:08:12 -0000 Subject: [Python-checkins] bpo-42882: Fix MSVC warnings in pystate.c (GH-24440) Message-ID: https://github.com/python/cpython/commit/196d4deaf4810a0bba75ba537dd40f2d71a5a634 commit: 196d4deaf4810a0bba75ba537dd40f2d71a5a634 branch: master author: Ken Jin <28750310+Fidget-Spinner at users.noreply.github.com> committer: vstinner date: 2021-02-04T23:08:03+01:00 summary: bpo-42882: Fix MSVC warnings in pystate.c (GH-24440) _PyRuntimeState.unicode_ids.next_index type is Py_ssize_t. files: M Python/pystate.c diff --git a/Python/pystate.c b/Python/pystate.c index ebf76a058b640..922e5bee2cbfc 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -56,7 +56,7 @@ _PyRuntimeState_Init_impl(_PyRuntimeState *runtime) _Py_AuditHookEntry *audit_hook_head = runtime->audit_hook_head; // bpo-42882: Preserve next_index value if Py_Initialize()/Py_Finalize() // is called multiple times. - int64_t unicode_next_index = runtime->unicode_ids.next_index; + Py_ssize_t unicode_next_index = runtime->unicode_ids.next_index; memset(runtime, 0, sizeof(*runtime)); From webhook-mailer at python.org Thu Feb 4 18:52:23 2021 From: webhook-mailer at python.org (rhettinger) Date: Thu, 04 Feb 2021 23:52:23 -0000 Subject: [Python-checkins] bpo-43102: Set namedtuple __new__'s internal builtins to a dict. (GH-24439) Message-ID: https://github.com/python/cpython/commit/b6d68aa08baebb753534a26d537ac3c0d2c21c79 commit: b6d68aa08baebb753534a26d537ac3c0d2c21c79 branch: master author: Raymond Hettinger committer: rhettinger date: 2021-02-04T15:52:16-08:00 summary: bpo-43102: Set namedtuple __new__'s internal builtins to a dict. (GH-24439) files: A Misc/NEWS.d/next/Library/2021-02-03-22-55-27.bpo-43102.TSlZ6J.rst M Lib/collections/__init__.py M Lib/test/test_collections.py diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py index 7d338131d6740..6fe3c4c5aa541 100644 --- a/Lib/collections/__init__.py +++ b/Lib/collections/__init__.py @@ -407,7 +407,7 @@ def namedtuple(typename, field_names, *, rename=False, defaults=None, module=Non namespace = { '_tuple_new': tuple_new, - '__builtins__': None, + '__builtins__': {}, '__name__': f'namedtuple_{typename}', } code = f'lambda _cls, {arg_list}: _tuple_new(_cls, ({arg_list}))' diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py index a1ca958257adf..befb7ab436c40 100644 --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -681,6 +681,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 diff --git a/Misc/NEWS.d/next/Library/2021-02-03-22-55-27.bpo-43102.TSlZ6J.rst b/Misc/NEWS.d/next/Library/2021-02-03-22-55-27.bpo-43102.TSlZ6J.rst new file mode 100644 index 0000000000000..985fd68a03a93 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-02-03-22-55-27.bpo-43102.TSlZ6J.rst @@ -0,0 +1,2 @@ +The namedtuple __new__ method had its __builtins__ set to None instead +of an actual dictionary. This created problems for introspection tools. From webhook-mailer at python.org Thu Feb 4 19:12:46 2021 From: webhook-mailer at python.org (rhettinger) Date: Fri, 05 Feb 2021 00:12:46 -0000 Subject: [Python-checkins] bpo-43102: Set namedtuple __new__'s internal builtins to a dict. (GH-24439) (GH-24452) Message-ID: https://github.com/python/cpython/commit/29584aa6acbc70091dc23636db51ee1696e65072 commit: 29584aa6acbc70091dc23636db51ee1696e65072 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: rhettinger date: 2021-02-04T16:12:34-08:00 summary: bpo-43102: Set namedtuple __new__'s internal builtins to a dict. (GH-24439) (GH-24452) files: A Misc/NEWS.d/next/Library/2021-02-03-22-55-27.bpo-43102.TSlZ6J.rst M Lib/collections/__init__.py M Lib/test/test_collections.py diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py index bc69a6757f294..5bdd3b3516d3b 100644 --- a/Lib/collections/__init__.py +++ b/Lib/collections/__init__.py @@ -424,7 +424,7 @@ def namedtuple(typename, field_names, *, rename=False, defaults=None, module=Non namespace = { '_tuple_new': tuple_new, - '__builtins__': None, + '__builtins__': {}, '__name__': f'namedtuple_{typename}', } code = f'lambda _cls, {arg_list}: _tuple_new(_cls, ({arg_list}))' diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py index 057ec92015cf4..3ff660cf7a37b 100644 --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -680,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 diff --git a/Misc/NEWS.d/next/Library/2021-02-03-22-55-27.bpo-43102.TSlZ6J.rst b/Misc/NEWS.d/next/Library/2021-02-03-22-55-27.bpo-43102.TSlZ6J.rst new file mode 100644 index 0000000000000..985fd68a03a93 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-02-03-22-55-27.bpo-43102.TSlZ6J.rst @@ -0,0 +1,2 @@ +The namedtuple __new__ method had its __builtins__ set to None instead +of an actual dictionary. This created problems for introspection tools. From webhook-mailer at python.org Thu Feb 4 23:21:40 2021 From: webhook-mailer at python.org (methane) Date: Fri, 05 Feb 2021 04:21:40 -0000 Subject: [Python-checkins] bpo-35295: Remove outdated comment. (GH-24453) Message-ID: https://github.com/python/cpython/commit/d938816acf71a74f1bd13fdf0534b3d9ea962e44 commit: d938816acf71a74f1bd13fdf0534b3d9ea962e44 branch: master author: Inada Naoki committer: methane date: 2021-02-05T13:21:28+09:00 summary: bpo-35295: Remove outdated comment. (GH-24453) files: M Include/cpython/unicodeobject.h diff --git a/Include/cpython/unicodeobject.h b/Include/cpython/unicodeobject.h index a4057fd2a13ed..30bf994cda35b 100644 --- a/Include/cpython/unicodeobject.h +++ b/Include/cpython/unicodeobject.h @@ -737,13 +737,6 @@ PyAPI_FUNC(int) _PyUnicode_FormatAdvancedWriter( 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); From webhook-mailer at python.org Thu Feb 4 23:44:25 2021 From: webhook-mailer at python.org (miss-islington) Date: Fri, 05 Feb 2021 04:44:25 -0000 Subject: [Python-checkins] bpo-35295: Remove outdated comment. (GH-24453) Message-ID: https://github.com/python/cpython/commit/b0b01811bb28d3d6c70846e47fa2f6ba03ed03f1 commit: b0b01811bb28d3d6c70846e47fa2f6ba03ed03f1 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2021-02-04T20:44:17-08:00 summary: bpo-35295: Remove outdated comment. (GH-24453) (cherry picked from commit d938816acf71a74f1bd13fdf0534b3d9ea962e44) Co-authored-by: Inada Naoki files: M Include/cpython/unicodeobject.h diff --git a/Include/cpython/unicodeobject.h b/Include/cpython/unicodeobject.h index 503b079db275a..17db79cffbc54 100644 --- a/Include/cpython/unicodeobject.h +++ b/Include/cpython/unicodeobject.h @@ -760,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); From webhook-mailer at python.org Fri Feb 5 00:36:11 2021 From: webhook-mailer at python.org (rhettinger) Date: Fri, 05 Feb 2021 05:36:11 -0000 Subject: [Python-checkins] Reduce overhead on random timings (GH-24455) Message-ID: https://github.com/python/cpython/commit/d9dda32040f2c664321e3f9c189154e93726e397 commit: d9dda32040f2c664321e3f9c189154e93726e397 branch: master author: Raymond Hettinger committer: rhettinger date: 2021-02-04T21:36:03-08:00 summary: Reduce overhead on random timings (GH-24455) files: M Lib/random.py diff --git a/Lib/random.py b/Lib/random.py index 187b0a016947a..0df26645d9e19 100644 --- a/Lib/random.py +++ b/Lib/random.py @@ -881,7 +881,7 @@ def _test_generator(n, func, args): from time import perf_counter t0 = perf_counter() - data = [func(*args) for i in range(n)] + data = [func(*args) for i in _repeat(None, n)] t1 = perf_counter() xbar = mean(data) From webhook-mailer at python.org Fri Feb 5 01:05:52 2021 From: webhook-mailer at python.org (rhettinger) Date: Fri, 05 Feb 2021 06:05:52 -0000 Subject: [Python-checkins] Minor readability improvements. Also note performance impact of __slots__. (GH-24456) Message-ID: https://github.com/python/cpython/commit/755c6e637a4f098881953e0c6d269d576fdbdcba commit: 755c6e637a4f098881953e0c6d269d576fdbdcba branch: master author: Raymond Hettinger committer: rhettinger date: 2021-02-04T22:05:42-08:00 summary: Minor readability improvements. Also note performance impact of __slots__. (GH-24456) files: M Doc/howto/descriptor.rst diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst index 5455d914dce79..94a8b4e6b40b9 100644 --- a/Doc/howto/descriptor.rst +++ b/Doc/howto/descriptor.rst @@ -42,8 +42,8 @@ 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: +The :class:`Ten` class is a descriptor whose :meth:`__get__` method always +returns the constant ``10``: .. testcode:: @@ -70,10 +70,10 @@ and descriptor lookup: >>> 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``. +In the ``a.x`` attribute lookup, the dot operator finds ``'x': 5`` +in the class dictionary. In the ``a.y`` lookup, the dot operator +finds a descriptor instance, recognized by its ``__get__`` method. +Calling that method 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. @@ -300,7 +300,7 @@ 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 +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. @@ -1380,7 +1380,10 @@ 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 +4. Improves speed. Reading instance variables is 35% faster with +``__slots__`` (as measured with Python 3.10 on an Apple M1 processor). + +5. Blocks tools like :func:`functools.cached_property` which require an instance dictionary to function correctly: .. testcode:: From webhook-mailer at python.org Fri Feb 5 03:25:46 2021 From: webhook-mailer at python.org (serhiy-storchaka) Date: Fri, 05 Feb 2021 08:25:46 -0000 Subject: [Python-checkins] bpo-43132: Fix incorrect handling of PyObject_RichCompareBool() in _zoneinfo (GH-24450) Message-ID: https://github.com/python/cpython/commit/effaec0bb54f381db8ccfa62514bc26b00946b40 commit: effaec0bb54f381db8ccfa62514bc26b00946b40 branch: master author: Zackery Spytz committer: serhiy-storchaka date: 2021-02-05T10:25:30+02:00 summary: bpo-43132: Fix incorrect handling of PyObject_RichCompareBool() in _zoneinfo (GH-24450) PyObject_RichCompareBool() returns -1 on error, but this case is not handled by the find_in_strong_cache() function. Any exception raised by PyObject_RichCompareBool() should be propagated. files: M Modules/_zoneinfo.c diff --git a/Modules/_zoneinfo.c b/Modules/_zoneinfo.c index d0c462fb86ab5..4726b82b6a42c 100644 --- a/Modules/_zoneinfo.c +++ b/Modules/_zoneinfo.c @@ -164,7 +164,7 @@ is_leap_year(int year); static size_t _bisect(const int64_t value, const int64_t *arr, size_t size); -static void +static int eject_from_strong_cache(const PyTypeObject *const type, PyObject *key); static void clear_strong_cache(const PyTypeObject *const type); @@ -266,7 +266,7 @@ zoneinfo_new(PyTypeObject *type, PyObject *args, PyObject *kw) } PyObject *instance = zone_from_strong_cache(type, key); - if (instance != NULL) { + if (instance != NULL || PyErr_Occurred()) { return instance; } @@ -429,7 +429,10 @@ zoneinfo_clear_cache(PyObject *cls, PyObject *args, PyObject *kwargs) while ((item = PyIter_Next(iter))) { // Remove from strong cache - eject_from_strong_cache(type, item); + if (eject_from_strong_cache(type, item) < 0) { + Py_DECREF(item); + break; + } // Remove from weak cache PyObject *tmp = PyObject_CallMethodObjArgs(weak_cache, pop, item, @@ -2342,7 +2345,11 @@ find_in_strong_cache(const StrongCacheNode *const root, PyObject *const key) { const StrongCacheNode *node = root; while (node != NULL) { - if (PyObject_RichCompareBool(key, node->key, Py_EQ)) { + int rv = PyObject_RichCompareBool(key, node->key, Py_EQ); + if (rv < 0) { + return NULL; + } + if (rv) { return (StrongCacheNode *)node; } @@ -2356,11 +2363,11 @@ find_in_strong_cache(const StrongCacheNode *const root, PyObject *const key) * * This function is used to enable the per-key functionality in clear_cache. */ -static void +static int eject_from_strong_cache(const PyTypeObject *const type, PyObject *key) { if (type != &PyZoneInfo_ZoneInfoType) { - return; + return 0; } StrongCacheNode *node = find_in_strong_cache(ZONEINFO_STRONG_CACHE, key); @@ -2369,6 +2376,10 @@ eject_from_strong_cache(const PyTypeObject *const type, PyObject *key) strong_cache_node_free(node); } + else if (PyErr_Occurred()) { + return -1; + } + return 0; } /* Moves a node to the front of the LRU cache. From webhook-mailer at python.org Fri Feb 5 08:09:45 2021 From: webhook-mailer at python.org (corona10) Date: Fri, 05 Feb 2021 13:09:45 -0000 Subject: [Python-checkins] Fix a typo in a deprecation warning (GH-24423) Message-ID: https://github.com/python/cpython/commit/4bb332cfd1f9740b1e31d2d8b8bf1bedca3439ff commit: 4bb332cfd1f9740b1e31d2d8b8bf1bedca3439ff branch: master author: Zackery Spytz committer: corona10 date: 2021-02-05T22:09:17+09:00 summary: Fix a typo in a deprecation warning (GH-24423) files: M Lib/distutils/__init__.py diff --git a/Lib/distutils/__init__.py b/Lib/distutils/__init__.py index 5ddb95923809c..7b2b059b83dad 100644 --- a/Lib/distutils/__init__.py +++ b/Lib/distutils/__init__.py @@ -13,7 +13,7 @@ __version__ = sys.version[:sys.version.index(' ')] -warnings.warn("The distutils package deprecated and slated for " +warnings.warn("The distutils package is deprecated and slated for " "removal in Python 3.12. Use setuptools or check " "PEP 632 for potential alternatives", DeprecationWarning) From webhook-mailer at python.org Fri Feb 5 12:14:12 2021 From: webhook-mailer at python.org (serhiy-storchaka) Date: Fri, 05 Feb 2021 17:14:12 -0000 Subject: [Python-checkins] bpo-43132: Fix incorrect handling of PyObject_RichCompareBool() in _zoneinfo (GH-24450) (GH-24457) Message-ID: https://github.com/python/cpython/commit/c8b4375fe1aca1188f57ecf482547abd77e3ef91 commit: c8b4375fe1aca1188f57ecf482547abd77e3ef91 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: serhiy-storchaka date: 2021-02-05T19:13:40+02:00 summary: bpo-43132: Fix incorrect handling of PyObject_RichCompareBool() in _zoneinfo (GH-24450) (GH-24457) PyObject_RichCompareBool() returns -1 on error, but this case is not handled by the find_in_strong_cache() function. Any exception raised by PyObject_RichCompareBool() should be propagated. (cherry picked from commit effaec0bb54f381db8ccfa62514bc26b00946b40) Co-authored-by: Zackery Spytz files: M Modules/_zoneinfo.c diff --git a/Modules/_zoneinfo.c b/Modules/_zoneinfo.c index 0a4b38a6dc5ad..f655768496e13 100644 --- a/Modules/_zoneinfo.c +++ b/Modules/_zoneinfo.c @@ -163,7 +163,7 @@ is_leap_year(int year); static size_t _bisect(const int64_t value, const int64_t *arr, size_t size); -static void +static int eject_from_strong_cache(const PyTypeObject *const type, PyObject *key); static void clear_strong_cache(const PyTypeObject *const type); @@ -265,7 +265,7 @@ zoneinfo_new(PyTypeObject *type, PyObject *args, PyObject *kw) } PyObject *instance = zone_from_strong_cache(type, key); - if (instance != NULL) { + if (instance != NULL || PyErr_Occurred()) { return instance; } @@ -428,7 +428,10 @@ zoneinfo_clear_cache(PyObject *cls, PyObject *args, PyObject *kwargs) while ((item = PyIter_Next(iter))) { // Remove from strong cache - eject_from_strong_cache(type, item); + if (eject_from_strong_cache(type, item) < 0) { + Py_DECREF(item); + break; + } // Remove from weak cache PyObject *tmp = PyObject_CallMethodObjArgs(weak_cache, pop, item, @@ -2347,7 +2350,11 @@ find_in_strong_cache(const StrongCacheNode *const root, PyObject *const key) { const StrongCacheNode *node = root; while (node != NULL) { - if (PyObject_RichCompareBool(key, node->key, Py_EQ)) { + int rv = PyObject_RichCompareBool(key, node->key, Py_EQ); + if (rv < 0) { + return NULL; + } + if (rv) { return (StrongCacheNode *)node; } @@ -2361,11 +2368,11 @@ find_in_strong_cache(const StrongCacheNode *const root, PyObject *const key) * * This function is used to enable the per-key functionality in clear_cache. */ -static void +static int eject_from_strong_cache(const PyTypeObject *const type, PyObject *key) { if (type != &PyZoneInfo_ZoneInfoType) { - return; + return 0; } StrongCacheNode *node = find_in_strong_cache(ZONEINFO_STRONG_CACHE, key); @@ -2374,6 +2381,10 @@ eject_from_strong_cache(const PyTypeObject *const type, PyObject *key) strong_cache_node_free(node); } + else if (PyErr_Occurred()) { + return -1; + } + return 0; } /* Moves a node to the front of the LRU cache. From webhook-mailer at python.org Fri Feb 5 13:17:11 2021 From: webhook-mailer at python.org (miss-islington) Date: Fri, 05 Feb 2021 18:17:11 -0000 Subject: [Python-checkins] Simple typo fix (GH-24448) Message-ID: https://github.com/python/cpython/commit/5f18c223391eef8c7d01241b51a7b2429609dd84 commit: 5f18c223391eef8c7d01241b51a7b2429609dd84 branch: master author: Andrew Tennikoff committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2021-02-05T10:17:01-08:00 summary: Simple typo fix (GH-24448) files: M Doc/howto/urllib2.rst diff --git a/Doc/howto/urllib2.rst b/Doc/howto/urllib2.rst index 046a88af62f0b..12d525771ddc2 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. From webhook-mailer at python.org Fri Feb 5 13:44:35 2021 From: webhook-mailer at python.org (miss-islington) Date: Fri, 05 Feb 2021 18:44:35 -0000 Subject: [Python-checkins] Simple typo fix (GH-24448) Message-ID: https://github.com/python/cpython/commit/39aeb9ff9064808b08ec629403edbc36a232369b commit: 39aeb9ff9064808b08ec629403edbc36a232369b branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2021-02-05T10:44:23-08:00 summary: Simple typo fix (GH-24448) (cherry picked from commit 5f18c223391eef8c7d01241b51a7b2429609dd84) Co-authored-by: Andrew Tennikoff files: M Doc/howto/urllib2.rst diff --git a/Doc/howto/urllib2.rst b/Doc/howto/urllib2.rst index 046a88af62f0b..12d525771ddc2 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. From webhook-mailer at python.org Fri Feb 5 13:44:55 2021 From: webhook-mailer at python.org (miss-islington) Date: Fri, 05 Feb 2021 18:44:55 -0000 Subject: [Python-checkins] Simple typo fix (GH-24448) Message-ID: https://github.com/python/cpython/commit/b4796875d598b34f5f21cb13a8d3551574532595 commit: b4796875d598b34f5f21cb13a8d3551574532595 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2021-02-05T10:44:45-08:00 summary: Simple typo fix (GH-24448) (cherry picked from commit 5f18c223391eef8c7d01241b51a7b2429609dd84) Co-authored-by: Andrew Tennikoff files: M Doc/howto/urllib2.rst diff --git a/Doc/howto/urllib2.rst b/Doc/howto/urllib2.rst index 046a88af62f0b..12d525771ddc2 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. From webhook-mailer at python.org Sun Feb 7 00:29:07 2021 From: webhook-mailer at python.org (terryjreedy) Date: Sun, 07 Feb 2021 05:29:07 -0000 Subject: [Python-checkins] bpo-16781: In 'exec' doc, add 'nonlocal' to 'yield' and 'return' (GH-2446) Message-ID: https://github.com/python/cpython/commit/0ec57e25c918b859b9f8d464e34e0ac859c2f8b3 commit: 0ec57e25c918b859b9f8d464e34e0ac859c2f8b3 branch: master author: Terry Jan Reedy committer: terryjreedy date: 2021-02-07T00:28:50-05:00 summary: bpo-16781: In 'exec' doc, add 'nonlocal' to 'yield' and 'return' (GH-2446) These 3 statements cannot be used at module scope -- nor in exec with one namespace. files: M Doc/library/functions.rst diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 55dd3f03f929c..e36a1695c2ad5 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -526,7 +526,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``. From webhook-mailer at python.org Sun Feb 7 00:38:58 2021 From: webhook-mailer at python.org (miss-islington) Date: Sun, 07 Feb 2021 05:38:58 -0000 Subject: [Python-checkins] bpo-16781: In 'exec' doc, add 'nonlocal' to 'yield' and 'return' (GH-2446) Message-ID: https://github.com/python/cpython/commit/920bf6a3a656e329c2bcbb761eb8c13c46c8cd05 commit: 920bf6a3a656e329c2bcbb761eb8c13c46c8cd05 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2021-02-06T21:38:54-08:00 summary: bpo-16781: In 'exec' doc, add 'nonlocal' to 'yield' and 'return' (GH-2446) These 3 statements cannot be used at module scope -- nor in exec with one namespace. (cherry picked from commit 0ec57e25c918b859b9f8d464e34e0ac859c2f8b3) Co-authored-by: Terry Jan Reedy files: M Doc/library/functions.rst diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 5a039f7a9476f..9d67d80789fc9 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -509,7 +509,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``. From webhook-mailer at python.org Sun Feb 7 09:14:24 2021 From: webhook-mailer at python.org (terryjreedy) Date: Sun, 07 Feb 2021 14:14:24 -0000 Subject: [Python-checkins] bpo-16781: In 'exec' doc, add 'nonlocal' to 'yield' and 'return' (GH-2446) Message-ID: https://github.com/python/cpython/commit/863eb7170b3017399fb2b786a1e3feb6457e54c2 commit: 863eb7170b3017399fb2b786a1e3feb6457e54c2 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: terryjreedy date: 2021-02-07T09:14:16-05:00 summary: bpo-16781: In 'exec' doc, add 'nonlocal' to 'yield' and 'return' (GH-2446) These 3 statements cannot be used at module scope -- nor in exec with one namespace. (cherry picked from commit 0ec57e25c918b859b9f8d464e34e0ac859c2f8b3) Co-authored-by: Terry Jan Reedy Co-authored-by: Terry Jan Reedy files: M Doc/library/functions.rst diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 9d13967c04fff..990fc10c8cc97 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -508,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``. From webhook-mailer at python.org Sun Feb 7 13:42:29 2021 From: webhook-mailer at python.org (pablogsal) Date: Sun, 07 Feb 2021 18:42:29 -0000 Subject: [Python-checkins] bpo-43149: Improve error message for exception group without parentheses (GH-24467) Message-ID: https://github.com/python/cpython/commit/206cbdab16cb054e859597a562e2f6ab35e99766 commit: 206cbdab16cb054e859597a562e2f6ab35e99766 branch: master author: Pablo Galindo committer: pablogsal date: 2021-02-07T18:42:21Z summary: bpo-43149: Improve error message for exception group without parentheses (GH-24467) files: A Misc/NEWS.d/next/Core and Builtins/2021-02-07-03-27-14.bpo-43149.0umPKD.rst M Grammar/python.gram M Lib/test/test_syntax.py M Parser/parser.c diff --git a/Grammar/python.gram b/Grammar/python.gram index d1a36f0e4d094..bb70bbb565d32 100644 --- a/Grammar/python.gram +++ b/Grammar/python.gram @@ -201,9 +201,10 @@ try_stmt[stmt_ty]: | 'try' &&':' b=block f=finally_block { _Py_Try(b, NULL, NULL, f, EXTRA) } | 'try' &&':' b=block ex[asdl_excepthandler_seq*]=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 { + | '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) } + | 'except' ':' b=block { _Py_ExceptHandler(NULL, NULL, b, EXTRA) } + | invalid_except_block finally_block[asdl_stmt_seq*]: 'finally' ':' a=block { a } return_stmt[stmt_ty]: @@ -737,3 +738,9 @@ invalid_import_from_targets: invalid_with_stmt: | [ASYNC] 'with' ','.(expression ['as' star_target])+ &&':' | [ASYNC] 'with' '(' ','.(expressions ['as' star_target])+ ','? ')' &&':' + +invalid_except_block: + | 'except' a=expression ',' expressions ['as' NAME ] ':' { + RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "exception group must be parenthesized") } + | 'except' expression ['as' NAME ] &&':' + | 'except' &&':' diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py index 70dd22c62aa21..47df0579f1ea6 100644 --- a/Lib/test/test_syntax.py +++ b/Lib/test/test_syntax.py @@ -835,6 +835,39 @@ ... SyntaxError: invalid syntax +Check that an exception group with missing parentheses +raise a custom exception + + >>> try: + ... pass + ... except A, B: + ... pass + Traceback (most recent call last): + SyntaxError: exception group must be parenthesized + + >>> try: + ... pass + ... except A, B, C: + ... pass + Traceback (most recent call last): + SyntaxError: exception group must be parenthesized + + >>> try: + ... pass + ... except A, B, C as blech: + ... pass + Traceback (most recent call last): + SyntaxError: exception group must be parenthesized + + >>> try: + ... pass + ... except A, B, C as blech: + ... pass + ... finally: + ... pass + Traceback (most recent call last): + SyntaxError: exception group must be parenthesized + >>> f(a=23, a=234) Traceback (most recent call last): diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-02-07-03-27-14.bpo-43149.0umPKD.rst b/Misc/NEWS.d/next/Core and Builtins/2021-02-07-03-27-14.bpo-43149.0umPKD.rst new file mode 100644 index 0000000000000..35ef84cc1e231 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-02-07-03-27-14.bpo-43149.0umPKD.rst @@ -0,0 +1,2 @@ +Improve the error message in the parser for exception groups without +parentheses. Patch by Pablo Galindo. diff --git a/Parser/parser.c b/Parser/parser.c index f4501d3bca094..3f0d06fc833e0 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -232,170 +232,173 @@ static KeywordToken *reserved_keywords[] = { #define invalid_group_type 1163 #define invalid_import_from_targets_type 1164 #define invalid_with_stmt_type 1165 -#define _loop0_1_type 1166 -#define _loop0_2_type 1167 -#define _loop0_4_type 1168 -#define _gather_3_type 1169 -#define _loop0_6_type 1170 -#define _gather_5_type 1171 -#define _loop0_8_type 1172 -#define _gather_7_type 1173 -#define _loop0_10_type 1174 -#define _gather_9_type 1175 -#define _loop1_11_type 1176 -#define _loop0_13_type 1177 -#define _gather_12_type 1178 -#define _tmp_14_type 1179 -#define _tmp_15_type 1180 -#define _tmp_16_type 1181 -#define _tmp_17_type 1182 -#define _tmp_18_type 1183 -#define _tmp_19_type 1184 -#define _tmp_20_type 1185 -#define _tmp_21_type 1186 -#define _loop1_22_type 1187 -#define _tmp_23_type 1188 -#define _tmp_24_type 1189 -#define _loop0_26_type 1190 -#define _gather_25_type 1191 -#define _loop0_28_type 1192 -#define _gather_27_type 1193 -#define _tmp_29_type 1194 -#define _tmp_30_type 1195 -#define _loop0_31_type 1196 -#define _loop1_32_type 1197 -#define _loop0_34_type 1198 -#define _gather_33_type 1199 -#define _tmp_35_type 1200 -#define _loop0_37_type 1201 -#define _gather_36_type 1202 -#define _tmp_38_type 1203 -#define _loop0_40_type 1204 -#define _gather_39_type 1205 -#define _loop0_42_type 1206 -#define _gather_41_type 1207 -#define _loop0_44_type 1208 -#define _gather_43_type 1209 -#define _loop0_46_type 1210 -#define _gather_45_type 1211 -#define _tmp_47_type 1212 -#define _loop1_48_type 1213 -#define _tmp_49_type 1214 -#define _tmp_50_type 1215 -#define _tmp_51_type 1216 -#define _tmp_52_type 1217 -#define _tmp_53_type 1218 -#define _loop0_54_type 1219 -#define _loop0_55_type 1220 -#define _loop0_56_type 1221 -#define _loop1_57_type 1222 -#define _loop0_58_type 1223 -#define _loop1_59_type 1224 -#define _loop1_60_type 1225 -#define _loop1_61_type 1226 -#define _loop0_62_type 1227 -#define _loop1_63_type 1228 -#define _loop0_64_type 1229 -#define _loop1_65_type 1230 -#define _loop0_66_type 1231 -#define _loop1_67_type 1232 -#define _loop1_68_type 1233 -#define _tmp_69_type 1234 -#define _loop1_70_type 1235 -#define _loop0_72_type 1236 -#define _gather_71_type 1237 -#define _loop1_73_type 1238 -#define _loop0_74_type 1239 -#define _loop0_75_type 1240 -#define _loop0_76_type 1241 -#define _loop1_77_type 1242 -#define _loop0_78_type 1243 -#define _loop1_79_type 1244 -#define _loop1_80_type 1245 -#define _loop1_81_type 1246 -#define _loop0_82_type 1247 -#define _loop1_83_type 1248 -#define _loop0_84_type 1249 -#define _loop1_85_type 1250 -#define _loop0_86_type 1251 -#define _loop1_87_type 1252 -#define _loop1_88_type 1253 -#define _loop1_89_type 1254 -#define _loop1_90_type 1255 -#define _tmp_91_type 1256 -#define _loop0_93_type 1257 -#define _gather_92_type 1258 -#define _tmp_94_type 1259 -#define _tmp_95_type 1260 -#define _tmp_96_type 1261 -#define _tmp_97_type 1262 -#define _loop1_98_type 1263 -#define _tmp_99_type 1264 -#define _tmp_100_type 1265 -#define _loop0_102_type 1266 -#define _gather_101_type 1267 -#define _loop1_103_type 1268 -#define _loop0_104_type 1269 -#define _loop0_105_type 1270 -#define _loop0_107_type 1271 -#define _gather_106_type 1272 -#define _tmp_108_type 1273 -#define _loop0_110_type 1274 -#define _gather_109_type 1275 -#define _loop0_112_type 1276 -#define _gather_111_type 1277 -#define _loop0_114_type 1278 -#define _gather_113_type 1279 -#define _loop0_116_type 1280 -#define _gather_115_type 1281 -#define _loop0_117_type 1282 -#define _loop0_119_type 1283 -#define _gather_118_type 1284 -#define _loop1_120_type 1285 -#define _tmp_121_type 1286 -#define _loop0_123_type 1287 -#define _gather_122_type 1288 -#define _loop0_125_type 1289 -#define _gather_124_type 1290 -#define _tmp_126_type 1291 -#define _loop0_127_type 1292 -#define _loop0_128_type 1293 -#define _loop0_129_type 1294 -#define _tmp_130_type 1295 -#define _tmp_131_type 1296 -#define _tmp_132_type 1297 -#define _loop0_133_type 1298 -#define _loop1_134_type 1299 -#define _loop0_135_type 1300 -#define _loop1_136_type 1301 -#define _tmp_137_type 1302 -#define _tmp_138_type 1303 -#define _tmp_139_type 1304 -#define _loop0_141_type 1305 -#define _gather_140_type 1306 -#define _loop0_143_type 1307 -#define _gather_142_type 1308 -#define _tmp_144_type 1309 -#define _tmp_145_type 1310 -#define _tmp_146_type 1311 -#define _tmp_147_type 1312 -#define _tmp_148_type 1313 -#define _tmp_149_type 1314 -#define _tmp_150_type 1315 -#define _tmp_151_type 1316 -#define _tmp_152_type 1317 -#define _tmp_153_type 1318 -#define _tmp_154_type 1319 -#define _tmp_155_type 1320 -#define _tmp_156_type 1321 -#define _tmp_157_type 1322 -#define _tmp_158_type 1323 -#define _tmp_159_type 1324 -#define _tmp_160_type 1325 -#define _tmp_161_type 1326 -#define _tmp_162_type 1327 -#define _tmp_163_type 1328 -#define _tmp_164_type 1329 +#define invalid_except_block_type 1166 +#define _loop0_1_type 1167 +#define _loop0_2_type 1168 +#define _loop0_4_type 1169 +#define _gather_3_type 1170 +#define _loop0_6_type 1171 +#define _gather_5_type 1172 +#define _loop0_8_type 1173 +#define _gather_7_type 1174 +#define _loop0_10_type 1175 +#define _gather_9_type 1176 +#define _loop1_11_type 1177 +#define _loop0_13_type 1178 +#define _gather_12_type 1179 +#define _tmp_14_type 1180 +#define _tmp_15_type 1181 +#define _tmp_16_type 1182 +#define _tmp_17_type 1183 +#define _tmp_18_type 1184 +#define _tmp_19_type 1185 +#define _tmp_20_type 1186 +#define _tmp_21_type 1187 +#define _loop1_22_type 1188 +#define _tmp_23_type 1189 +#define _tmp_24_type 1190 +#define _loop0_26_type 1191 +#define _gather_25_type 1192 +#define _loop0_28_type 1193 +#define _gather_27_type 1194 +#define _tmp_29_type 1195 +#define _tmp_30_type 1196 +#define _loop0_31_type 1197 +#define _loop1_32_type 1198 +#define _loop0_34_type 1199 +#define _gather_33_type 1200 +#define _tmp_35_type 1201 +#define _loop0_37_type 1202 +#define _gather_36_type 1203 +#define _tmp_38_type 1204 +#define _loop0_40_type 1205 +#define _gather_39_type 1206 +#define _loop0_42_type 1207 +#define _gather_41_type 1208 +#define _loop0_44_type 1209 +#define _gather_43_type 1210 +#define _loop0_46_type 1211 +#define _gather_45_type 1212 +#define _tmp_47_type 1213 +#define _loop1_48_type 1214 +#define _tmp_49_type 1215 +#define _tmp_50_type 1216 +#define _tmp_51_type 1217 +#define _tmp_52_type 1218 +#define _tmp_53_type 1219 +#define _loop0_54_type 1220 +#define _loop0_55_type 1221 +#define _loop0_56_type 1222 +#define _loop1_57_type 1223 +#define _loop0_58_type 1224 +#define _loop1_59_type 1225 +#define _loop1_60_type 1226 +#define _loop1_61_type 1227 +#define _loop0_62_type 1228 +#define _loop1_63_type 1229 +#define _loop0_64_type 1230 +#define _loop1_65_type 1231 +#define _loop0_66_type 1232 +#define _loop1_67_type 1233 +#define _loop1_68_type 1234 +#define _tmp_69_type 1235 +#define _loop1_70_type 1236 +#define _loop0_72_type 1237 +#define _gather_71_type 1238 +#define _loop1_73_type 1239 +#define _loop0_74_type 1240 +#define _loop0_75_type 1241 +#define _loop0_76_type 1242 +#define _loop1_77_type 1243 +#define _loop0_78_type 1244 +#define _loop1_79_type 1245 +#define _loop1_80_type 1246 +#define _loop1_81_type 1247 +#define _loop0_82_type 1248 +#define _loop1_83_type 1249 +#define _loop0_84_type 1250 +#define _loop1_85_type 1251 +#define _loop0_86_type 1252 +#define _loop1_87_type 1253 +#define _loop1_88_type 1254 +#define _loop1_89_type 1255 +#define _loop1_90_type 1256 +#define _tmp_91_type 1257 +#define _loop0_93_type 1258 +#define _gather_92_type 1259 +#define _tmp_94_type 1260 +#define _tmp_95_type 1261 +#define _tmp_96_type 1262 +#define _tmp_97_type 1263 +#define _loop1_98_type 1264 +#define _tmp_99_type 1265 +#define _tmp_100_type 1266 +#define _loop0_102_type 1267 +#define _gather_101_type 1268 +#define _loop1_103_type 1269 +#define _loop0_104_type 1270 +#define _loop0_105_type 1271 +#define _loop0_107_type 1272 +#define _gather_106_type 1273 +#define _tmp_108_type 1274 +#define _loop0_110_type 1275 +#define _gather_109_type 1276 +#define _loop0_112_type 1277 +#define _gather_111_type 1278 +#define _loop0_114_type 1279 +#define _gather_113_type 1280 +#define _loop0_116_type 1281 +#define _gather_115_type 1282 +#define _loop0_117_type 1283 +#define _loop0_119_type 1284 +#define _gather_118_type 1285 +#define _loop1_120_type 1286 +#define _tmp_121_type 1287 +#define _loop0_123_type 1288 +#define _gather_122_type 1289 +#define _loop0_125_type 1290 +#define _gather_124_type 1291 +#define _tmp_126_type 1292 +#define _loop0_127_type 1293 +#define _loop0_128_type 1294 +#define _loop0_129_type 1295 +#define _tmp_130_type 1296 +#define _tmp_131_type 1297 +#define _tmp_132_type 1298 +#define _loop0_133_type 1299 +#define _loop1_134_type 1300 +#define _loop0_135_type 1301 +#define _loop1_136_type 1302 +#define _tmp_137_type 1303 +#define _tmp_138_type 1304 +#define _tmp_139_type 1305 +#define _loop0_141_type 1306 +#define _gather_140_type 1307 +#define _loop0_143_type 1308 +#define _gather_142_type 1309 +#define _tmp_144_type 1310 +#define _tmp_145_type 1311 +#define _tmp_146_type 1312 +#define _tmp_147_type 1313 +#define _tmp_148_type 1314 +#define _tmp_149_type 1315 +#define _tmp_150_type 1316 +#define _tmp_151_type 1317 +#define _tmp_152_type 1318 +#define _tmp_153_type 1319 +#define _tmp_154_type 1320 +#define _tmp_155_type 1321 +#define _tmp_156_type 1322 +#define _tmp_157_type 1323 +#define _tmp_158_type 1324 +#define _tmp_159_type 1325 +#define _tmp_160_type 1326 +#define _tmp_161_type 1327 +#define _tmp_162_type 1328 +#define _tmp_163_type 1329 +#define _tmp_164_type 1330 +#define _tmp_165_type 1331 +#define _tmp_166_type 1332 static mod_ty file_rule(Parser *p); static mod_ty interactive_rule(Parser *p); @@ -563,6 +566,7 @@ 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 void *invalid_with_stmt_rule(Parser *p); +static void *invalid_except_block_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); @@ -727,6 +731,8 @@ static void *_tmp_161_rule(Parser *p); static void *_tmp_162_rule(Parser *p); static void *_tmp_163_rule(Parser *p); static void *_tmp_164_rule(Parser *p); +static void *_tmp_165_rule(Parser *p); +static void *_tmp_166_rule(Parser *p); // file: statements? $ @@ -4551,7 +4557,10 @@ try_stmt_rule(Parser *p) return _res; } -// except_block: 'except' expression ['as' NAME] &&':' block | 'except' &&':' block +// except_block: +// | 'except' expression ['as' NAME] ':' block +// | 'except' ':' block +// | invalid_except_block static excepthandler_ty except_block_rule(Parser *p) { @@ -4571,12 +4580,12 @@ except_block_rule(Parser *p) 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 + { // '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")); + 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_stmt_seq* b; @@ -4589,12 +4598,12 @@ except_block_rule(Parser *p) && (t = _tmp_49_rule(p), 1) // ['as' NAME] && - (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' + (_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")); + 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--); @@ -4614,26 +4623,26 @@ except_block_rule(Parser *p) } 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")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'except' expression ['as' NAME] ':' block")); } - { // 'except' &&':' 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")); + D(fprintf(stderr, "%*c> except_block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except' ':' block")); Token * _keyword; Token * _literal; asdl_stmt_seq* b; if ( (_keyword = _PyPegen_expect_token(p, 521)) // token='except' && - (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' + (_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")); + 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--); @@ -4653,7 +4662,26 @@ except_block_rule(Parser *p) } 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")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'except' ':' block")); + } + if (p->call_invalid_rules) { // invalid_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, "invalid_except_block")); + void *invalid_except_block_var; + if ( + (invalid_except_block_var = invalid_except_block_rule(p)) // invalid_except_block + ) + { + D(fprintf(stderr, "%*c+ except_block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_except_block")); + _res = invalid_except_block_var; + 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, "invalid_except_block")); } _res = NULL; done: @@ -16017,6 +16045,117 @@ invalid_with_stmt_rule(Parser *p) return _res; } +// invalid_except_block: +// | 'except' expression ',' expressions ['as' NAME] ':' +// | 'except' expression ['as' NAME] &&':' +// | 'except' &&':' +static void * +invalid_except_block_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'except' expression ',' expressions ['as' NAME] ':' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_except_block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except' expression ',' expressions ['as' NAME] ':'")); + Token * _keyword; + Token * _literal; + Token * _literal_1; + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + expr_ty a; + expr_ty expressions_var; + if ( + (_keyword = _PyPegen_expect_token(p, 521)) // token='except' + && + (a = expression_rule(p)) // expression + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (expressions_var = expressions_rule(p)) // expressions + && + (_opt_var = _tmp_144_rule(p), 1) // ['as' NAME] + && + (_literal_1 = _PyPegen_expect_token(p, 11)) // token=':' + ) + { + D(fprintf(stderr, "%*c+ invalid_except_block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except' expression ',' expressions ['as' NAME] ':'")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "exception group 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_except_block[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'except' expression ',' expressions ['as' NAME] ':'")); + } + { // 'except' expression ['as' NAME] &&':' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_except_block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except' expression ['as' NAME] &&':'")); + Token * _keyword; + Token * _literal; + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + expr_ty expression_var; + if ( + (_keyword = _PyPegen_expect_token(p, 521)) // token='except' + && + (expression_var = expression_rule(p)) // expression + && + (_opt_var = _tmp_145_rule(p), 1) // ['as' NAME] + && + (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' + ) + { + D(fprintf(stderr, "%*c+ invalid_except_block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except' expression ['as' NAME] &&':'")); + _res = _PyPegen_dummy_name(p, _keyword, expression_var, _opt_var, _literal); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_except_block[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'except' expression ['as' NAME] &&':'")); + } + { // 'except' &&':' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_except_block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except' &&':'")); + Token * _keyword; + Token * _literal; + if ( + (_keyword = _PyPegen_expect_token(p, 521)) // token='except' + && + (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' + ) + { + D(fprintf(stderr, "%*c+ invalid_except_block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except' &&':'")); + _res = _PyPegen_dummy_name(p, _keyword, _literal); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_except_block[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'except' &&':'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + // _loop0_1: NEWLINE static asdl_seq * _loop0_1_rule(Parser *p) @@ -17265,12 +17404,12 @@ _loop1_22_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_22[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); - void *_tmp_144_var; + void *_tmp_146_var; while ( - (_tmp_144_var = _tmp_144_rule(p)) // star_targets '=' + (_tmp_146_var = _tmp_146_rule(p)) // star_targets '=' ) { - _res = _tmp_144_var; + _res = _tmp_146_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -17773,12 +17912,12 @@ _loop0_31_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_31[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')")); - void *_tmp_145_var; + void *_tmp_147_var; while ( - (_tmp_145_var = _tmp_145_rule(p)) // '.' | '...' + (_tmp_147_var = _tmp_147_rule(p)) // '.' | '...' ) { - _res = _tmp_145_var; + _res = _tmp_147_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -17839,12 +17978,12 @@ _loop1_32_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_32[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')")); - void *_tmp_146_var; + void *_tmp_148_var; while ( - (_tmp_146_var = _tmp_146_rule(p)) // '.' | '...' + (_tmp_148_var = _tmp_148_rule(p)) // '.' | '...' ) { - _res = _tmp_146_var; + _res = _tmp_148_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -20001,12 +20140,12 @@ _loop1_68_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_68[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('@' named_expression NEWLINE)")); - void *_tmp_147_var; + void *_tmp_149_var; while ( - (_tmp_147_var = _tmp_147_rule(p)) // '@' named_expression NEWLINE + (_tmp_149_var = _tmp_149_rule(p)) // '@' named_expression NEWLINE ) { - _res = _tmp_147_var; + _res = _tmp_149_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -20119,12 +20258,12 @@ _loop1_70_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_70[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_expression)")); - void *_tmp_148_var; + void *_tmp_150_var; while ( - (_tmp_148_var = _tmp_148_rule(p)) // ',' star_expression + (_tmp_150_var = _tmp_150_rule(p)) // ',' star_expression ) { - _res = _tmp_148_var; + _res = _tmp_150_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -20304,12 +20443,12 @@ _loop1_73_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_73[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' expression)")); - void *_tmp_149_var; + void *_tmp_151_var; while ( - (_tmp_149_var = _tmp_149_rule(p)) // ',' expression + (_tmp_151_var = _tmp_151_rule(p)) // ',' expression ) { - _res = _tmp_149_var; + _res = _tmp_151_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -21334,12 +21473,12 @@ _loop1_88_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_88[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('or' conjunction)")); - void *_tmp_150_var; + void *_tmp_152_var; while ( - (_tmp_150_var = _tmp_150_rule(p)) // 'or' conjunction + (_tmp_152_var = _tmp_152_rule(p)) // 'or' conjunction ) { - _res = _tmp_150_var; + _res = _tmp_152_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -21405,12 +21544,12 @@ _loop1_89_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_89[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('and' inversion)")); - void *_tmp_151_var; + void *_tmp_153_var; while ( - (_tmp_151_var = _tmp_151_rule(p)) // 'and' inversion + (_tmp_153_var = _tmp_153_rule(p)) // 'and' inversion ) { - _res = _tmp_151_var; + _res = _tmp_153_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -22326,12 +22465,12 @@ _loop0_104_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_104[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('if' disjunction)")); - void *_tmp_152_var; + void *_tmp_154_var; while ( - (_tmp_152_var = _tmp_152_rule(p)) // 'if' disjunction + (_tmp_154_var = _tmp_154_rule(p)) // 'if' disjunction ) { - _res = _tmp_152_var; + _res = _tmp_154_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -22392,12 +22531,12 @@ _loop0_105_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_105[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('if' disjunction)")); - void *_tmp_153_var; + void *_tmp_155_var; while ( - (_tmp_153_var = _tmp_153_rule(p)) // 'if' disjunction + (_tmp_155_var = _tmp_155_rule(p)) // 'if' disjunction ) { - _res = _tmp_153_var; + _res = _tmp_155_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -22463,7 +22602,7 @@ _loop0_107_rule(Parser *p) while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = _tmp_154_rule(p)) // starred_expression | named_expression !'=' + (elem = _tmp_156_rule(p)) // starred_expression | named_expression !'=' ) { _res = elem; @@ -22526,7 +22665,7 @@ _gather_106_rule(Parser *p) void *elem; asdl_seq * seq; if ( - (elem = _tmp_154_rule(p)) // starred_expression | named_expression !'=' + (elem = _tmp_156_rule(p)) // starred_expression | named_expression !'=' && (seq = _loop0_107_rule(p)) // _loop0_107 ) @@ -23072,12 +23211,12 @@ _loop0_117_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_117[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_target)")); - void *_tmp_155_var; + void *_tmp_157_var; while ( - (_tmp_155_var = _tmp_155_rule(p)) // ',' star_target + (_tmp_157_var = _tmp_157_rule(p)) // ',' star_target ) { - _res = _tmp_155_var; + _res = _tmp_157_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -23252,12 +23391,12 @@ _loop1_120_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop1_120[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_target)")); - void *_tmp_156_var; + void *_tmp_158_var; while ( - (_tmp_156_var = _tmp_156_rule(p)) // ',' star_target + (_tmp_158_var = _tmp_158_rule(p)) // ',' star_target ) { - _res = _tmp_156_var; + _res = _tmp_158_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -23713,12 +23852,12 @@ _loop0_128_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_128[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); - void *_tmp_157_var; + void *_tmp_159_var; while ( - (_tmp_157_var = _tmp_157_rule(p)) // star_targets '=' + (_tmp_159_var = _tmp_159_rule(p)) // star_targets '=' ) { - _res = _tmp_157_var; + _res = _tmp_159_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -23779,12 +23918,12 @@ _loop0_129_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> _loop0_129[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); - void *_tmp_158_var; + void *_tmp_160_var; while ( - (_tmp_158_var = _tmp_158_rule(p)) // star_targets '=' + (_tmp_160_var = _tmp_160_rule(p)) // star_targets '=' ) { - _res = _tmp_158_var; + _res = _tmp_160_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -24313,15 +24452,15 @@ _tmp_137_rule(Parser *p) } D(fprintf(stderr, "%*c> _tmp_137[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); Token * _literal; - void *_tmp_159_var; + void *_tmp_161_var; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (_tmp_159_var = _tmp_159_rule(p)) // ')' | '**' + (_tmp_161_var = _tmp_161_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_159_var); + _res = _PyPegen_dummy_name(p, _literal, _tmp_161_var); goto done; } p->mark = _mark; @@ -24371,15 +24510,15 @@ _tmp_138_rule(Parser *p) } D(fprintf(stderr, "%*c> _tmp_138[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); Token * _literal; - void *_tmp_160_var; + void *_tmp_162_var; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (_tmp_160_var = _tmp_160_rule(p)) // ':' | '**' + (_tmp_162_var = _tmp_162_rule(p)) // ':' | '**' ) { D(fprintf(stderr, "%*c+ _tmp_138[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); - _res = _PyPegen_dummy_name(p, _literal, _tmp_160_var); + _res = _PyPegen_dummy_name(p, _literal, _tmp_162_var); goto done; } p->mark = _mark; @@ -24498,7 +24637,7 @@ _loop0_141_rule(Parser *p) while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = _tmp_161_rule(p)) // expression ['as' star_target] + (elem = _tmp_163_rule(p)) // expression ['as' star_target] ) { _res = elem; @@ -24561,7 +24700,7 @@ _gather_140_rule(Parser *p) void *elem; asdl_seq * seq; if ( - (elem = _tmp_161_rule(p)) // expression ['as' star_target] + (elem = _tmp_163_rule(p)) // expression ['as' star_target] && (seq = _loop0_141_rule(p)) // _loop0_141 ) @@ -24612,7 +24751,7 @@ _loop0_143_rule(Parser *p) while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = _tmp_162_rule(p)) // expressions ['as' star_target] + (elem = _tmp_164_rule(p)) // expressions ['as' star_target] ) { _res = elem; @@ -24675,7 +24814,7 @@ _gather_142_rule(Parser *p) void *elem; asdl_seq * seq; if ( - (elem = _tmp_162_rule(p)) // expressions ['as' star_target] + (elem = _tmp_164_rule(p)) // expressions ['as' star_target] && (seq = _loop0_143_rule(p)) // _loop0_143 ) @@ -24694,9 +24833,87 @@ _gather_142_rule(Parser *p) return _res; } -// _tmp_144: star_targets '=' +// _tmp_144: 'as' NAME 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; + { // 'as' NAME + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_144[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + Token * _keyword; + expr_ty name_var; + if ( + (_keyword = _PyPegen_expect_token(p, 520)) // token='as' + && + (name_var = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ _tmp_144[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + _res = _PyPegen_dummy_name(p, _keyword, name_var); + 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, "'as' NAME")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_145: 'as' NAME +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; + { // 'as' NAME + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_145[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + Token * _keyword; + expr_ty name_var; + if ( + (_keyword = _PyPegen_expect_token(p, 520)) // token='as' + && + (name_var = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ _tmp_145[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + _res = _PyPegen_dummy_name(p, _keyword, name_var); + 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, "'as' NAME")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_146: star_targets '=' +static void * +_tmp_146_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24710,7 +24927,7 @@ _tmp_144_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_144[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c> _tmp_146[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); Token * _literal; expr_ty z; if ( @@ -24719,7 +24936,7 @@ _tmp_144_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_144[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c+ _tmp_146[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24729,7 +24946,7 @@ _tmp_144_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_144[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_146[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); } _res = NULL; @@ -24738,9 +24955,9 @@ _tmp_144_rule(Parser *p) return _res; } -// _tmp_145: '.' | '...' +// _tmp_147: '.' | '...' static void * -_tmp_145_rule(Parser *p) +_tmp_147_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24754,18 +24971,18 @@ _tmp_145_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_145[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c> _tmp_147[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 23)) // token='.' ) { - D(fprintf(stderr, "%*c+ _tmp_145[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c+ _tmp_147[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_145[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_147[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'.'")); } { // '...' @@ -24773,18 +24990,18 @@ _tmp_145_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_145[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c> _tmp_147[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 52)) // token='...' ) { - D(fprintf(stderr, "%*c+ _tmp_145[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c+ _tmp_147[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_145[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_147[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'...'")); } _res = NULL; @@ -24793,9 +25010,9 @@ _tmp_145_rule(Parser *p) return _res; } -// _tmp_146: '.' | '...' +// _tmp_148: '.' | '...' static void * -_tmp_146_rule(Parser *p) +_tmp_148_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24809,18 +25026,18 @@ _tmp_146_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_146[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c> _tmp_148[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 23)) // token='.' ) { - D(fprintf(stderr, "%*c+ _tmp_146[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c+ _tmp_148[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_146[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_148[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'.'")); } { // '...' @@ -24828,18 +25045,18 @@ _tmp_146_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_146[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c> _tmp_148[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 52)) // token='...' ) { - D(fprintf(stderr, "%*c+ _tmp_146[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c+ _tmp_148[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_146[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_148[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'...'")); } _res = NULL; @@ -24848,9 +25065,9 @@ _tmp_146_rule(Parser *p) return _res; } -// _tmp_147: '@' named_expression NEWLINE +// _tmp_149: '@' named_expression NEWLINE static void * -_tmp_147_rule(Parser *p) +_tmp_149_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24864,7 +25081,7 @@ _tmp_147_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_147[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); + D(fprintf(stderr, "%*c> _tmp_149[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); Token * _literal; expr_ty f; Token * newline_var; @@ -24876,7 +25093,7 @@ _tmp_147_rule(Parser *p) (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' ) { - D(fprintf(stderr, "%*c+ _tmp_147[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); + D(fprintf(stderr, "%*c+ _tmp_149[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); _res = f; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24886,7 +25103,7 @@ _tmp_147_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_147[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_149[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'@' named_expression NEWLINE")); } _res = NULL; @@ -24895,9 +25112,9 @@ _tmp_147_rule(Parser *p) return _res; } -// _tmp_148: ',' star_expression +// _tmp_150: ',' star_expression static void * -_tmp_148_rule(Parser *p) +_tmp_150_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24911,7 +25128,7 @@ _tmp_148_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_148[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_expression")); + D(fprintf(stderr, "%*c> _tmp_150[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_expression")); Token * _literal; expr_ty c; if ( @@ -24920,7 +25137,7 @@ _tmp_148_rule(Parser *p) (c = star_expression_rule(p)) // star_expression ) { - D(fprintf(stderr, "%*c+ _tmp_148[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_expression")); + D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_expression")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24930,7 +25147,7 @@ _tmp_148_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_148[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_150[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_expression")); } _res = NULL; @@ -24939,9 +25156,9 @@ _tmp_148_rule(Parser *p) return _res; } -// _tmp_149: ',' expression +// _tmp_151: ',' expression static void * -_tmp_149_rule(Parser *p) +_tmp_151_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24955,7 +25172,7 @@ _tmp_149_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_149[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); + D(fprintf(stderr, "%*c> _tmp_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); Token * _literal; expr_ty c; if ( @@ -24964,7 +25181,7 @@ _tmp_149_rule(Parser *p) (c = expression_rule(p)) // expression ) { - D(fprintf(stderr, "%*c+ _tmp_149[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' expression")); + D(fprintf(stderr, "%*c+ _tmp_151[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' expression")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24974,7 +25191,7 @@ _tmp_149_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_149[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_151[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); } _res = NULL; @@ -24983,9 +25200,9 @@ _tmp_149_rule(Parser *p) return _res; } -// _tmp_150: 'or' conjunction +// _tmp_152: 'or' conjunction static void * -_tmp_150_rule(Parser *p) +_tmp_152_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -24999,7 +25216,7 @@ _tmp_150_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_150[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); + D(fprintf(stderr, "%*c> _tmp_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); Token * _keyword; expr_ty c; if ( @@ -25008,7 +25225,7 @@ _tmp_150_rule(Parser *p) (c = conjunction_rule(p)) // conjunction ) { - D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); + D(fprintf(stderr, "%*c+ _tmp_152[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -25018,7 +25235,7 @@ _tmp_150_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_150[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_152[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'or' conjunction")); } _res = NULL; @@ -25027,9 +25244,9 @@ _tmp_150_rule(Parser *p) return _res; } -// _tmp_151: 'and' inversion +// _tmp_153: 'and' inversion static void * -_tmp_151_rule(Parser *p) +_tmp_153_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -25043,7 +25260,7 @@ _tmp_151_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'and' inversion")); + D(fprintf(stderr, "%*c> _tmp_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'and' inversion")); Token * _keyword; expr_ty c; if ( @@ -25052,7 +25269,7 @@ _tmp_151_rule(Parser *p) (c = inversion_rule(p)) // inversion ) { - D(fprintf(stderr, "%*c+ _tmp_151[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'and' inversion")); + D(fprintf(stderr, "%*c+ _tmp_153[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'and' inversion")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -25062,7 +25279,7 @@ _tmp_151_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_151[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_153[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'and' inversion")); } _res = NULL; @@ -25071,9 +25288,9 @@ _tmp_151_rule(Parser *p) return _res; } -// _tmp_152: 'if' disjunction +// _tmp_154: 'if' disjunction static void * -_tmp_152_rule(Parser *p) +_tmp_154_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -25087,7 +25304,7 @@ _tmp_152_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c> _tmp_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); Token * _keyword; expr_ty z; if ( @@ -25096,7 +25313,7 @@ _tmp_152_rule(Parser *p) (z = disjunction_rule(p)) // disjunction ) { - D(fprintf(stderr, "%*c+ _tmp_152[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c+ _tmp_154[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -25106,7 +25323,7 @@ _tmp_152_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_152[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_154[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' disjunction")); } _res = NULL; @@ -25115,9 +25332,9 @@ _tmp_152_rule(Parser *p) return _res; } -// _tmp_153: 'if' disjunction +// _tmp_155: 'if' disjunction static void * -_tmp_153_rule(Parser *p) +_tmp_155_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -25131,7 +25348,7 @@ _tmp_153_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c> _tmp_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); Token * _keyword; expr_ty z; if ( @@ -25140,7 +25357,7 @@ _tmp_153_rule(Parser *p) (z = disjunction_rule(p)) // disjunction ) { - D(fprintf(stderr, "%*c+ _tmp_153[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c+ _tmp_155[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -25150,7 +25367,7 @@ _tmp_153_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_153[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_155[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' disjunction")); } _res = NULL; @@ -25159,9 +25376,9 @@ _tmp_153_rule(Parser *p) return _res; } -// _tmp_154: starred_expression | named_expression !'=' +// _tmp_156: starred_expression | named_expression !'=' static void * -_tmp_154_rule(Parser *p) +_tmp_156_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -25175,18 +25392,18 @@ _tmp_154_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "starred_expression")); + D(fprintf(stderr, "%*c> _tmp_156[%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_154[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression")); + D(fprintf(stderr, "%*c+ _tmp_156[%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_154[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_156[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "starred_expression")); } { // named_expression !'=' @@ -25194,7 +25411,7 @@ _tmp_154_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "named_expression !'='")); + D(fprintf(stderr, "%*c> _tmp_156[%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 @@ -25202,12 +25419,12 @@ _tmp_154_rule(Parser *p) _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 22) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_154[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "named_expression !'='")); + D(fprintf(stderr, "%*c+ _tmp_156[%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_154[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_156[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "named_expression !'='")); } _res = NULL; @@ -25216,9 +25433,9 @@ _tmp_154_rule(Parser *p) return _res; } -// _tmp_155: ',' star_target +// _tmp_157: ',' star_target static void * -_tmp_155_rule(Parser *p) +_tmp_157_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -25232,7 +25449,7 @@ _tmp_155_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c> _tmp_157[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); Token * _literal; expr_ty c; if ( @@ -25241,7 +25458,7 @@ _tmp_155_rule(Parser *p) (c = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_155[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c+ _tmp_157[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -25251,7 +25468,7 @@ _tmp_155_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_155[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_157[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_target")); } _res = NULL; @@ -25260,9 +25477,9 @@ _tmp_155_rule(Parser *p) return _res; } -// _tmp_156: ',' star_target +// _tmp_158: ',' star_target static void * -_tmp_156_rule(Parser *p) +_tmp_158_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -25276,7 +25493,7 @@ _tmp_156_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_156[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c> _tmp_158[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); Token * _literal; expr_ty c; if ( @@ -25285,7 +25502,7 @@ _tmp_156_rule(Parser *p) (c = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_156[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c+ _tmp_158[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -25295,7 +25512,7 @@ _tmp_156_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_156[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_158[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_target")); } _res = NULL; @@ -25304,9 +25521,9 @@ _tmp_156_rule(Parser *p) return _res; } -// _tmp_157: star_targets '=' +// _tmp_159: star_targets '=' static void * -_tmp_157_rule(Parser *p) +_tmp_159_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -25320,7 +25537,7 @@ _tmp_157_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_157[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c> _tmp_159[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); Token * _literal; expr_ty star_targets_var; if ( @@ -25329,12 +25546,12 @@ _tmp_157_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_157[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c+ _tmp_159[%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_157[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_159[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); } _res = NULL; @@ -25343,9 +25560,9 @@ _tmp_157_rule(Parser *p) return _res; } -// _tmp_158: star_targets '=' +// _tmp_160: star_targets '=' static void * -_tmp_158_rule(Parser *p) +_tmp_160_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -25359,7 +25576,7 @@ _tmp_158_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_158[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c> _tmp_160[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); Token * _literal; expr_ty star_targets_var; if ( @@ -25368,12 +25585,12 @@ _tmp_158_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_158[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c+ _tmp_160[%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_158[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_160[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); } _res = NULL; @@ -25382,9 +25599,9 @@ _tmp_158_rule(Parser *p) return _res; } -// _tmp_159: ')' | '**' +// _tmp_161: ')' | '**' static void * -_tmp_159_rule(Parser *p) +_tmp_161_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -25398,18 +25615,18 @@ _tmp_159_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_159[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c> _tmp_161[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_159[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c+ _tmp_161[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_159[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_161[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); } { // '**' @@ -25417,18 +25634,18 @@ _tmp_159_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_159[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c> _tmp_161[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 35)) // token='**' ) { - D(fprintf(stderr, "%*c+ _tmp_159[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c+ _tmp_161[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_159[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_161[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'")); } _res = NULL; @@ -25437,9 +25654,9 @@ _tmp_159_rule(Parser *p) return _res; } -// _tmp_160: ':' | '**' +// _tmp_162: ':' | '**' static void * -_tmp_160_rule(Parser *p) +_tmp_162_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -25453,18 +25670,18 @@ _tmp_160_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_160[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_162[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_160[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_162[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_160[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_162[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } { // '**' @@ -25472,18 +25689,18 @@ _tmp_160_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_160[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c> _tmp_162[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 35)) // token='**' ) { - D(fprintf(stderr, "%*c+ _tmp_160[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c+ _tmp_162[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_160[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_162[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'")); } _res = NULL; @@ -25492,9 +25709,9 @@ _tmp_160_rule(Parser *p) return _res; } -// _tmp_161: expression ['as' star_target] +// _tmp_163: expression ['as' star_target] static void * -_tmp_161_rule(Parser *p) +_tmp_163_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -25508,22 +25725,22 @@ _tmp_161_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_161[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); + D(fprintf(stderr, "%*c> _tmp_163[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings expr_ty expression_var; if ( (expression_var = expression_rule(p)) // expression && - (_opt_var = _tmp_163_rule(p), 1) // ['as' star_target] + (_opt_var = _tmp_165_rule(p), 1) // ['as' star_target] ) { - D(fprintf(stderr, "%*c+ _tmp_161[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); + D(fprintf(stderr, "%*c+ _tmp_163[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); _res = _PyPegen_dummy_name(p, expression_var, _opt_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_161[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_163[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression ['as' star_target]")); } _res = NULL; @@ -25532,9 +25749,9 @@ _tmp_161_rule(Parser *p) return _res; } -// _tmp_162: expressions ['as' star_target] +// _tmp_164: expressions ['as' star_target] static void * -_tmp_162_rule(Parser *p) +_tmp_164_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -25548,22 +25765,22 @@ _tmp_162_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_162[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); + D(fprintf(stderr, "%*c> _tmp_164[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings expr_ty expressions_var; if ( (expressions_var = expressions_rule(p)) // expressions && - (_opt_var = _tmp_164_rule(p), 1) // ['as' star_target] + (_opt_var = _tmp_166_rule(p), 1) // ['as' star_target] ) { - D(fprintf(stderr, "%*c+ _tmp_162[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); + D(fprintf(stderr, "%*c+ _tmp_164[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); _res = _PyPegen_dummy_name(p, expressions_var, _opt_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_162[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_164[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expressions ['as' star_target]")); } _res = NULL; @@ -25572,9 +25789,9 @@ _tmp_162_rule(Parser *p) return _res; } -// _tmp_163: 'as' star_target +// _tmp_165: 'as' star_target static void * -_tmp_163_rule(Parser *p) +_tmp_165_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -25588,7 +25805,7 @@ _tmp_163_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_163[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + D(fprintf(stderr, "%*c> _tmp_165[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); Token * _keyword; expr_ty star_target_var; if ( @@ -25597,12 +25814,12 @@ _tmp_163_rule(Parser *p) (star_target_var = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_163[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + D(fprintf(stderr, "%*c+ _tmp_165[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); _res = _PyPegen_dummy_name(p, _keyword, star_target_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_163[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_165[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' star_target")); } _res = NULL; @@ -25611,9 +25828,9 @@ _tmp_163_rule(Parser *p) return _res; } -// _tmp_164: 'as' star_target +// _tmp_166: 'as' star_target static void * -_tmp_164_rule(Parser *p) +_tmp_166_rule(Parser *p) { D(p->level++); if (p->error_indicator) { @@ -25627,7 +25844,7 @@ _tmp_164_rule(Parser *p) D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_164[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + D(fprintf(stderr, "%*c> _tmp_166[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); Token * _keyword; expr_ty star_target_var; if ( @@ -25636,12 +25853,12 @@ _tmp_164_rule(Parser *p) (star_target_var = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_164[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + D(fprintf(stderr, "%*c+ _tmp_166[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); _res = _PyPegen_dummy_name(p, _keyword, star_target_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_164[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_166[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' star_target")); } _res = NULL; From webhook-mailer at python.org Sun Feb 7 19:45:06 2021 From: webhook-mailer at python.org (rhettinger) Date: Mon, 08 Feb 2021 00:45:06 -0000 Subject: [Python-checkins] bpo-43147: Remove archaic terminology. (GH-24462) Message-ID: https://github.com/python/cpython/commit/30a8b2839646c849371c7f8411132571cd8bf17c commit: 30a8b2839646c849371c7f8411132571cd8bf17c branch: master author: Raymond Hettinger committer: rhettinger date: 2021-02-07T16:44:42-08:00 summary: bpo-43147: Remove archaic terminology. (GH-24462) files: M Doc/library/statistics.rst M Lib/statistics.py diff --git a/Doc/library/statistics.rst b/Doc/library/statistics.rst index 51b5e9c404c9c..6b6d3154a2881 100644 --- a/Doc/library/statistics.rst +++ b/Doc/library/statistics.rst @@ -162,15 +162,14 @@ However, for reading convenience, most of the examples show sorted sequences. real-valued numbers. If *weights* is omitted or *None*, then equal weighting is assumed. - The harmonic mean, sometimes called the subcontrary mean, is the - reciprocal of the arithmetic :func:`mean` of the reciprocals of the - data. For example, the harmonic mean of three values *a*, *b* and *c* - will be equivalent to ``3/(1/a + 1/b + 1/c)``. If one of the values - is zero, the result will be zero. + The harmonic mean is the reciprocal of the arithmetic :func:`mean` of the + reciprocals of the data. For example, the harmonic mean of three values *a*, + *b* and *c* will be equivalent to ``3/(1/a + 1/b + 1/c)``. If one of the + values is zero, the result will be zero. The harmonic mean is a type of average, a measure of the central location of the data. It is often appropriate when averaging - rates or ratios, for example speeds. + ratios or rates, for example speeds. Suppose a car travels 10 km at 40 km/hr, then another 10 km at 60 km/hr. What is the average speed? diff --git a/Lib/statistics.py b/Lib/statistics.py index 4b054b961141b..2414869a7e6dc 100644 --- a/Lib/statistics.py +++ b/Lib/statistics.py @@ -367,10 +367,9 @@ def geometric_mean(data): def harmonic_mean(data, weights=None): """Return the harmonic mean of data. - The harmonic mean, sometimes called the subcontrary mean, is the - reciprocal of the arithmetic mean of the reciprocals of the data, - and is often appropriate when averaging quantities which are rates - or ratios, for example speeds. + The harmonic mean is the reciprocal of the arithmetic mean of the + reciprocals of the data. It can be used for averaging ratios or + rates, for example speeds. Suppose a car travels 40 km/hr for 5 km and then speeds-up to 60 km/hr for another 5 km. What is the average speed? From webhook-mailer at python.org Sun Feb 7 22:16:04 2021 From: webhook-mailer at python.org (pablogsal) Date: Mon, 08 Feb 2021 03:16:04 -0000 Subject: [Python-checkins] bpo-40692: Run more test_concurrent_futures tests (GH-20239) Message-ID: https://github.com/python/cpython/commit/bf2e7e55d7306b1e2fce7dce767e8df5ff42cf1c commit: bf2e7e55d7306b1e2fce7dce767e8df5ff42cf1c branch: master author: Asheesh Laroia committer: pablogsal date: 2021-02-08T03:15:51Z summary: bpo-40692: Run more test_concurrent_futures tests (GH-20239) In the case of multiprocessing.synchronize() being missing, the test_concurrent_futures test suite now skips only the tests that require multiprocessing.synchronize(). Validate that multiprocessing.synchronize exists as part of _check_system_limits(), allowing ProcessPoolExecutor to raise NotImplementedError during __init__, rather than crashing with ImportError during __init__ when creating a lock imported from multiprocessing.synchronize. Use _check_system_limits() to disable tests of ProcessPoolExecutor on systems without multiprocessing.synchronize. Running the test suite without multiprocessing.synchronize reveals that Lib/compileall.py crashes when it uses a ProcessPoolExecutor. Therefore, change Lib/compileall.py to call _check_system_limits() before creating the ProcessPoolExecutor. Note that both Lib/compileall.py and Lib/test/test_compileall.py were attempting to sanity-check ProcessPoolExecutor by expecting ImportError. In multiprocessing.resource_tracker, sem_unlink() is also absent on platforms where POSIX semaphores aren't available. Avoid using sem_unlink() if it, too, does not exist. Co-authored-by: Pablo Galindo files: A Misc/NEWS.d/next/Core and Builtins/2020-05-19-22-10-05.bpo-40692.ajEhrR.rst M Lib/compileall.py M Lib/concurrent/futures/process.py M Lib/multiprocessing/resource_tracker.py M Lib/test/test_compileall.py M Lib/test/test_concurrent_futures.py diff --git a/Lib/compileall.py b/Lib/compileall.py index fe7f450c55e1c..672cb43971869 100644 --- a/Lib/compileall.py +++ b/Lib/compileall.py @@ -84,12 +84,14 @@ def compile_dir(dir, maxlevels=None, ddir=None, force=False, if workers < 0: raise ValueError('workers must be greater or equal to 0') if workers != 1: + # Check if this is a system where ProcessPoolExecutor can function. + from concurrent.futures.process import _check_system_limits try: - # Only import when needed, as low resource platforms may - # fail to import it - from concurrent.futures import ProcessPoolExecutor - except ImportError: + _check_system_limits() + except NotImplementedError: workers = 1 + else: + from concurrent.futures import ProcessPoolExecutor if maxlevels is None: maxlevels = sys.getrecursionlimit() files = _walk_dir(dir, quiet=quiet, maxlevels=maxlevels) diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py index 90bc98bf2ecd1..764719859f7ce 100644 --- a/Lib/concurrent/futures/process.py +++ b/Lib/concurrent/futures/process.py @@ -532,6 +532,14 @@ def _check_system_limits(): if _system_limited: raise NotImplementedError(_system_limited) _system_limits_checked = True + try: + import multiprocessing.synchronize + except ImportError: + _system_limited = ( + "This Python build lacks multiprocessing.synchronize, usually due " + "to named semaphores being unavailable on this platform." + ) + raise NotImplementedError(_system_limited) try: nsems_max = os.sysconf("SC_SEM_NSEMS_MAX") except (AttributeError, ValueError): diff --git a/Lib/multiprocessing/resource_tracker.py b/Lib/multiprocessing/resource_tracker.py index c9bfa9b82b6e6..cc42dbdda05b9 100644 --- a/Lib/multiprocessing/resource_tracker.py +++ b/Lib/multiprocessing/resource_tracker.py @@ -37,8 +37,16 @@ import _multiprocessing import _posixshmem + # Use sem_unlink() to clean up named semaphores. + # + # sem_unlink() may be missing if the Python build process detected the + # absence of POSIX named semaphores. In that case, no named semaphores were + # ever opened, so no cleanup would be necessary. + if hasattr(_multiprocessing, 'sem_unlink'): + _CLEANUP_FUNCS.update({ + 'semaphore': _multiprocessing.sem_unlink, + }) _CLEANUP_FUNCS.update({ - 'semaphore': _multiprocessing.sem_unlink, 'shared_memory': _posixshmem.shm_unlink, }) diff --git a/Lib/test/test_compileall.py b/Lib/test/test_compileall.py index be1149a87faef..fa24b3c5a11dd 100644 --- a/Lib/test/test_compileall.py +++ b/Lib/test/test_compileall.py @@ -16,10 +16,14 @@ import unittest from unittest import mock, skipUnless +from concurrent.futures import ProcessPoolExecutor try: - from concurrent.futures import ProcessPoolExecutor + # compileall relies on ProcessPoolExecutor if ProcessPoolExecutor exists + # and it can function. + from concurrent.futures.process import _check_system_limits + _check_system_limits() _have_multiprocessing = True -except ImportError: +except NotImplementedError: _have_multiprocessing = False from test import support @@ -188,6 +192,7 @@ def test_compile_dir_pathlike(self): self.assertRegex(line, r'Listing ([^WindowsPath|PosixPath].*)') self.assertTrue(os.path.isfile(self.bc_path)) + @skipUnless(_have_multiprocessing, "requires multiprocessing") @mock.patch('concurrent.futures.ProcessPoolExecutor') def test_compile_pool_called(self, pool_mock): compileall.compile_dir(self.directory, quiet=True, workers=5) @@ -198,11 +203,13 @@ def test_compile_workers_non_positive(self): "workers must be greater or equal to 0"): compileall.compile_dir(self.directory, workers=-1) + @skipUnless(_have_multiprocessing, "requires multiprocessing") @mock.patch('concurrent.futures.ProcessPoolExecutor') def test_compile_workers_cpu_count(self, pool_mock): compileall.compile_dir(self.directory, quiet=True, workers=0) self.assertEqual(pool_mock.call_args[1]['max_workers'], None) + @skipUnless(_have_multiprocessing, "requires multiprocessing") @mock.patch('concurrent.futures.ProcessPoolExecutor') @mock.patch('compileall.compile_file') def test_compile_one_worker(self, compile_file_mock, pool_mock): diff --git a/Lib/test/test_concurrent_futures.py b/Lib/test/test_concurrent_futures.py index a182b14fb9bc0..99651f5f4ed4d 100644 --- a/Lib/test/test_concurrent_futures.py +++ b/Lib/test/test_concurrent_futures.py @@ -4,8 +4,6 @@ # Skip tests if _multiprocessing wasn't built. import_helper.import_module('_multiprocessing') -# Skip tests if sem_open implementation is broken. -support.skip_if_broken_multiprocessing_synchronize() from test.support import hashlib_helper from test.support.script_helper import assert_python_ok @@ -27,7 +25,7 @@ from concurrent.futures._base import ( PENDING, RUNNING, CANCELLED, CANCELLED_AND_NOTIFIED, FINISHED, Future, BrokenExecutor) -from concurrent.futures.process import BrokenProcessPool +from concurrent.futures.process import BrokenProcessPool, _check_system_limits from multiprocessing import get_context import multiprocessing.process @@ -161,6 +159,10 @@ class ProcessPoolForkMixin(ExecutorMixin): ctx = "fork" def get_context(self): + try: + _check_system_limits() + except NotImplementedError: + self.skipTest("ProcessPoolExecutor unavailable on this system") if sys.platform == "win32": self.skipTest("require unix system") return super().get_context() @@ -170,12 +172,23 @@ class ProcessPoolSpawnMixin(ExecutorMixin): executor_type = futures.ProcessPoolExecutor ctx = "spawn" + def get_context(self): + try: + _check_system_limits() + except NotImplementedError: + self.skipTest("ProcessPoolExecutor unavailable on this system") + return super().get_context() + class ProcessPoolForkserverMixin(ExecutorMixin): executor_type = futures.ProcessPoolExecutor ctx = "forkserver" def get_context(self): + try: + _check_system_limits() + except NotImplementedError: + self.skipTest("ProcessPoolExecutor unavailable on this system") if sys.platform == "win32": self.skipTest("require unix system") return super().get_context() diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-05-19-22-10-05.bpo-40692.ajEhrR.rst b/Misc/NEWS.d/next/Core and Builtins/2020-05-19-22-10-05.bpo-40692.ajEhrR.rst new file mode 100644 index 0000000000000..b92dcdd00affc --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-05-19-22-10-05.bpo-40692.ajEhrR.rst @@ -0,0 +1 @@ +In the :class:`concurrent.futures.ProcessPoolExecutor`, validate that :func:`multiprocess.synchronize` is available on a given platform and rely on that check in the :mod:`concurrent.futures` test suite so we can run tests that are unrelated to :class:`ProcessPoolExecutor` on those platforms. From webhook-mailer at python.org Mon Feb 8 20:06:02 2021 From: webhook-mailer at python.org (gpshead) Date: Tue, 09 Feb 2021 01:06:02 -0000 Subject: [Python-checkins] bpo-13501: allow choosing between readline and libedit (GH-24189) Message-ID: https://github.com/python/cpython/commit/e1f77695132e814728cda982f11342a2e3c7272c commit: e1f77695132e814728cda982f11342a2e3c7272c branch: master author: Roland Hieber committer: gpshead date: 2021-02-08T17:05:25-08:00 summary: bpo-13501: allow choosing between readline and libedit (GH-24189) In contrast to macOS, libedit is available as its own include file and library on Linux systems to prevent file name clashes. So if both libraries are available on the system, readline is currently chosen by default; and if only libedit is available, it is not found at all. This patch adds a way to link against libedit by adding the following arguments to configure: --with-readline link against libreadline (the default) --with-readline=editline link against libeditline --with-readline=no disable building the readline module --without-readline (same) The runtime detection of libedit vs. readline was already done in commit 7105319ada2e66365902 (2019-12-04, serge-sans-paille: "bpo-38634: Allow non-apple build to cope with libedit (GH-16986)"). Fixes: GH-12076 ("bpo-13501 Build or disable readline with Editline") Fixes: bpo-13501 ("Make libedit support more generic; port readline / libedit to FreeBSD") Co-authored-by: Enji Cooper (ngie-eign) Co-authored-by: Martin Panter (vadmium) Co-authored-by: Robert Marshall (kellinm) files: A Misc/NEWS.d/next/Build/2021-01-10-22-25-23.bpo-13501.g4L-6R.rst M Modules/readline.c M configure M configure.ac M pyconfig.h.in M setup.py diff --git a/Misc/NEWS.d/next/Build/2021-01-10-22-25-23.bpo-13501.g4L-6R.rst b/Misc/NEWS.d/next/Build/2021-01-10-22-25-23.bpo-13501.g4L-6R.rst new file mode 100644 index 0000000000000..8dc9442725e67 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2021-01-10-22-25-23.bpo-13501.g4L-6R.rst @@ -0,0 +1,2 @@ +The configure script can now use *libedit* instead of *readline* with the +command line option ``--with-readline=editline``. diff --git a/Modules/readline.c b/Modules/readline.c index 6cb3ee5c66a0d..02b2c40e6b900 100644 --- a/Modules/readline.c +++ b/Modules/readline.c @@ -26,10 +26,14 @@ # define RESTORE_LOCALE(sl) #endif +#ifdef WITH_EDITLINE +# include +#else /* GNU readline definitions */ -#undef HAVE_CONFIG_H /* Else readline/chardefs.h includes strings.h */ -#include -#include +# undef HAVE_CONFIG_H /* Else readline/chardefs.h includes strings.h */ +# include +# include +#endif #ifdef HAVE_RL_COMPLETION_MATCHES #define completion_matches(x, y) \ diff --git a/configure b/configure index 39fb15f5c7959..8e0cc71a50480 100755 --- a/configure +++ b/configure @@ -849,6 +849,7 @@ with_libc enable_big_digits with_platlibdir with_wheel_pkg_dir +with_readline with_computed_gotos with_ensurepip with_openssl @@ -1581,6 +1582,8 @@ Optional Packages: --with-wheel-pkg-dir=PATH Directory of wheel packages used by ensurepip (default: none) + --with(out)-readline[=editline] + use Editline for backend or disable readline module --with-computed-gotos enable computed gotos in evaluation loop (enabled by default on supported compilers) --with-ensurepip[=install|upgrade|no] @@ -15602,24 +15605,49 @@ $as_echo "#define HAVE_GETC_UNLOCKED 1" >>confdefs.h fi + +# Check whether --with-readline was given. +if test "${with_readline+set}" = set; then : + withval=$with_readline; +else + with_readline=yes +fi + + # check where readline lives +py_cv_lib_readline=no # save the value of LIBS so we don't actually link Python with readline LIBS_no_readline=$LIBS -# On some systems we need to link readline to a termcap compatible -# library. NOTE: Keep the precedence of listed libraries synchronised -# with setup.py. -py_cv_lib_readline=no -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link readline libs" >&5 +if test "$with_readline" != no; then + case "$with_readline" in + editline|edit) + LIBREADLINE=edit + +$as_echo "#define WITH_EDITLINE 1" >>confdefs.h + + ;; + yes|readline) + LIBREADLINE=readline + ;; + *) + as_fn_error $? "proper usage is --with(out)-readline[=editline]" "$LINENO" 5 + ;; + esac + + # On some systems we need to link readline to a termcap compatible + # library. NOTE: Keep the precedence of listed libraries synchronised + # with setup.py. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link readline libs" >&5 $as_echo_n "checking how to link readline libs... " >&6; } -for py_libtermcap in "" tinfo ncursesw ncurses curses termcap; do - if test -z "$py_libtermcap"; then - READLINE_LIBS="-lreadline" - else - READLINE_LIBS="-lreadline -l$py_libtermcap" - fi - LIBS="$READLINE_LIBS $LIBS_no_readline" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + for py_libtermcap in "" tinfo ncursesw ncurses curses termcap; do + if test -z "$py_libtermcap"; then + READLINE_LIBS="-l$LIBREADLINE" + else + READLINE_LIBS="-l$LIBREADLINE -l$py_libtermcap" + fi + LIBS="$READLINE_LIBS $LIBS_no_readline" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. @@ -15642,73 +15670,67 @@ if ac_fn_c_try_link "$LINENO"; then : fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext - if test $py_cv_lib_readline = yes; then - break - fi -done -# Uncomment this line if you want to use READINE_LIBS in Makefile or scripts -#AC_SUBST([READLINE_LIBS]) -if test $py_cv_lib_readline = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 + if test $py_cv_lib_readline = yes; then + break + fi + done + + # Uncomment this line if you want to use READLINE_LIBS in Makefile or scripts + #AC_SUBST([READLINE_LIBS]) + if test $py_cv_lib_readline = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $READLINE_LIBS" >&5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $READLINE_LIBS" >&5 $as_echo "$READLINE_LIBS" >&6; } $as_echo "#define HAVE_LIBREADLINE 1" >>confdefs.h + fi fi -# check for readline 2.2 -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - have_readline=yes -else - have_readline=no - -fi -rm -f conftest.err conftest.i conftest.$ac_ext -if test $have_readline = yes -then - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include +if test "$py_cv_lib_readline" = yes; then + # check for readline 2.2 + ac_fn_c_check_decl "$LINENO" "rl_completion_append_character" "ac_cv_have_decl_rl_completion_append_character" " +#include /* Must be first for Gnu Readline */ +#ifdef WITH_EDITLINE +# include +#else +# include +#endif -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "extern int rl_completion_append_character;" >/dev/null 2>&1; then : +" +if test "x$ac_cv_have_decl_rl_completion_append_character" = xyes; then : $as_echo "#define HAVE_RL_COMPLETION_APPEND_CHARACTER 1" >>confdefs.h fi -rm -f conftest* - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include + ac_fn_c_check_decl "$LINENO" "rl_completion_suppress_append" "ac_cv_have_decl_rl_completion_suppress_append" " +#include /* Must be first for Gnu Readline */ +#ifdef WITH_EDITLINE +# include +#else +# include +#endif -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "extern int rl_completion_suppress_append;" >/dev/null 2>&1; then : +" +if test "x$ac_cv_have_decl_rl_completion_suppress_append" = xyes; then : $as_echo "#define HAVE_RL_COMPLETION_SUPPRESS_APPEND 1" >>confdefs.h fi -rm -f conftest* -fi -# check for readline 4.0 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_pre_input_hook in -lreadline" >&5 -$as_echo_n "checking for rl_pre_input_hook in -lreadline... " >&6; } -if ${ac_cv_lib_readline_rl_pre_input_hook+:} false; then : + # check for readline 4.0 + as_ac_Lib=`$as_echo "ac_cv_lib_$LIBREADLINE''_rl_pre_input_hook" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_pre_input_hook in -l$LIBREADLINE" >&5 +$as_echo_n "checking for rl_pre_input_hook in -l$LIBREADLINE... " >&6; } +if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS -LIBS="-lreadline $READLINE_LIBS $LIBS" +LIBS="-l$LIBREADLINE $READLINE_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -15728,31 +15750,33 @@ return rl_pre_input_hook (); } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_readline_rl_pre_input_hook=yes + eval "$as_ac_Lib=yes" else - ac_cv_lib_readline_rl_pre_input_hook=no + eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_rl_pre_input_hook" >&5 -$as_echo "$ac_cv_lib_readline_rl_pre_input_hook" >&6; } -if test "x$ac_cv_lib_readline_rl_pre_input_hook" = xyes; then : +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : $as_echo "#define HAVE_RL_PRE_INPUT_HOOK 1" >>confdefs.h fi -# also in 4.0 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_completion_display_matches_hook in -lreadline" >&5 -$as_echo_n "checking for rl_completion_display_matches_hook in -lreadline... " >&6; } -if ${ac_cv_lib_readline_rl_completion_display_matches_hook+:} false; then : + # also in 4.0 + as_ac_Lib=`$as_echo "ac_cv_lib_$LIBREADLINE''_rl_completion_display_matches_hook" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_completion_display_matches_hook in -l$LIBREADLINE" >&5 +$as_echo_n "checking for rl_completion_display_matches_hook in -l$LIBREADLINE... " >&6; } +if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS -LIBS="-lreadline $READLINE_LIBS $LIBS" +LIBS="-l$LIBREADLINE $READLINE_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -15772,31 +15796,33 @@ return rl_completion_display_matches_hook (); } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_readline_rl_completion_display_matches_hook=yes + eval "$as_ac_Lib=yes" else - ac_cv_lib_readline_rl_completion_display_matches_hook=no + eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_rl_completion_display_matches_hook" >&5 -$as_echo "$ac_cv_lib_readline_rl_completion_display_matches_hook" >&6; } -if test "x$ac_cv_lib_readline_rl_completion_display_matches_hook" = xyes; then : +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : $as_echo "#define HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK 1" >>confdefs.h fi -# also in 4.0, but not in editline -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_resize_terminal in -lreadline" >&5 -$as_echo_n "checking for rl_resize_terminal in -lreadline... " >&6; } -if ${ac_cv_lib_readline_rl_resize_terminal+:} false; then : + # also in 4.0, but not in editline + as_ac_Lib=`$as_echo "ac_cv_lib_$LIBREADLINE''_rl_resize_terminal" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_resize_terminal in -l$LIBREADLINE" >&5 +$as_echo_n "checking for rl_resize_terminal in -l$LIBREADLINE... " >&6; } +if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS -LIBS="-lreadline $READLINE_LIBS $LIBS" +LIBS="-l$LIBREADLINE $READLINE_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -15816,31 +15842,33 @@ return rl_resize_terminal (); } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_readline_rl_resize_terminal=yes + eval "$as_ac_Lib=yes" else - ac_cv_lib_readline_rl_resize_terminal=no + eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_rl_resize_terminal" >&5 -$as_echo "$ac_cv_lib_readline_rl_resize_terminal" >&6; } -if test "x$ac_cv_lib_readline_rl_resize_terminal" = xyes; then : +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : $as_echo "#define HAVE_RL_RESIZE_TERMINAL 1" >>confdefs.h fi -# check for readline 4.2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_completion_matches in -lreadline" >&5 -$as_echo_n "checking for rl_completion_matches in -lreadline... " >&6; } -if ${ac_cv_lib_readline_rl_completion_matches+:} false; then : + # check for readline 4.2 + as_ac_Lib=`$as_echo "ac_cv_lib_$LIBREADLINE''_rl_completion_matches" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_completion_matches in -l$LIBREADLINE" >&5 +$as_echo_n "checking for rl_completion_matches in -l$LIBREADLINE... " >&6; } +if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS -LIBS="-lreadline $READLINE_LIBS $LIBS" +LIBS="-l$LIBREADLINE $READLINE_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -15860,59 +15888,49 @@ return rl_completion_matches (); } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_readline_rl_completion_matches=yes + eval "$as_ac_Lib=yes" else - ac_cv_lib_readline_rl_completion_matches=no + eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_rl_completion_matches" >&5 -$as_echo "$ac_cv_lib_readline_rl_completion_matches" >&6; } -if test "x$ac_cv_lib_readline_rl_completion_matches" = xyes; then : +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : $as_echo "#define HAVE_RL_COMPLETION_MATCHES 1" >>confdefs.h fi -# also in readline 4.2 -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - have_readline=yes -else - have_readline=no - -fi -rm -f conftest.err conftest.i conftest.$ac_ext -if test $have_readline = yes -then - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include + # also in readline 4.2 + ac_fn_c_check_decl "$LINENO" "rl_catch_signals" "ac_cv_have_decl_rl_catch_signals" " +#include /* Must be first for Gnu Readline */ +#ifdef WITH_EDITLINE +# include +#else +# include +#endif -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "extern int rl_catch_signals;" >/dev/null 2>&1; then : +" +if test "x$ac_cv_have_decl_rl_catch_signals" = xyes; then : $as_echo "#define HAVE_RL_CATCH_SIGNAL 1" >>confdefs.h fi -rm -f conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for append_history in -lreadline" >&5 -$as_echo_n "checking for append_history in -lreadline... " >&6; } -if ${ac_cv_lib_readline_append_history+:} false; then : + as_ac_Lib=`$as_echo "ac_cv_lib_$LIBREADLINE''_append_history" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for append_history in -l$LIBREADLINE" >&5 +$as_echo_n "checking for append_history in -l$LIBREADLINE... " >&6; } +if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS -LIBS="-lreadline $READLINE_LIBS $LIBS" +LIBS="-l$LIBREADLINE $READLINE_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -15932,22 +15950,24 @@ return append_history (); } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_readline_append_history=yes + eval "$as_ac_Lib=yes" else - ac_cv_lib_readline_append_history=no + eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_append_history" >&5 -$as_echo "$ac_cv_lib_readline_append_history" >&6; } -if test "x$ac_cv_lib_readline_append_history" = xyes; then : +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : $as_echo "#define HAVE_RL_APPEND_HISTORY 1" >>confdefs.h fi +fi # End of readline checks: restore LIBS LIBS=$LIBS_no_readline diff --git a/configure.ac b/configure.ac index 1f5a008388a1e..60c5d8e0b5b03 100644 --- a/configure.ac +++ b/configure.ac @@ -4891,92 +4891,124 @@ then [Define this if you have flockfile(), getc_unlocked(), and funlockfile()]) fi +AC_ARG_WITH([readline], + [AS_HELP_STRING([--with(out)-readline@<:@=editline@:>@], + [use Editline for backend or disable readline module])], + [], + [with_readline=yes]) + # check where readline lives +py_cv_lib_readline=no # save the value of LIBS so we don't actually link Python with readline LIBS_no_readline=$LIBS -# On some systems we need to link readline to a termcap compatible -# library. NOTE: Keep the precedence of listed libraries synchronised -# with setup.py. -py_cv_lib_readline=no -AC_MSG_CHECKING([how to link readline libs]) -for py_libtermcap in "" tinfo ncursesw ncurses curses termcap; do - if test -z "$py_libtermcap"; then - READLINE_LIBS="-lreadline" +if test "$with_readline" != no; then + case "$with_readline" in + editline|edit) + LIBREADLINE=edit + AC_DEFINE(WITH_EDITLINE, 1, + [Define to build the readline module against Editline.]) + ;; + yes|readline) + LIBREADLINE=readline + ;; + *) + AC_MSG_ERROR([proper usage is --with(out)-readline@<:@=editline@:>@]) + ;; + esac + + # On some systems we need to link readline to a termcap compatible + # library. NOTE: Keep the precedence of listed libraries synchronised + # with setup.py. + AC_MSG_CHECKING([how to link readline libs]) + for py_libtermcap in "" tinfo ncursesw ncurses curses termcap; do + if test -z "$py_libtermcap"; then + READLINE_LIBS="-l$LIBREADLINE" + else + READLINE_LIBS="-l$LIBREADLINE -l$py_libtermcap" + fi + LIBS="$READLINE_LIBS $LIBS_no_readline" + AC_LINK_IFELSE( + [AC_LANG_CALL([],[readline])], + [py_cv_lib_readline=yes]) + if test $py_cv_lib_readline = yes; then + break + fi + done + + # Uncomment this line if you want to use READLINE_LIBS in Makefile or scripts + #AC_SUBST([READLINE_LIBS]) + if test $py_cv_lib_readline = no; then + AC_MSG_RESULT([none]) else - READLINE_LIBS="-lreadline -l$py_libtermcap" + AC_MSG_RESULT([$READLINE_LIBS]) + AC_DEFINE(HAVE_LIBREADLINE, 1, + [Define to build the readline module.]) fi - LIBS="$READLINE_LIBS $LIBS_no_readline" - AC_LINK_IFELSE( - [AC_LANG_CALL([],[readline])], - [py_cv_lib_readline=yes]) - if test $py_cv_lib_readline = yes; then - break - fi -done -# Uncomment this line if you want to use READINE_LIBS in Makefile or scripts -#AC_SUBST([READLINE_LIBS]) -if test $py_cv_lib_readline = no; then - AC_MSG_RESULT([none]) -else - AC_MSG_RESULT([$READLINE_LIBS]) - AC_DEFINE(HAVE_LIBREADLINE, 1, - [Define if you have the readline library (-lreadline).]) fi -# check for readline 2.2 -AC_PREPROC_IFELSE([AC_LANG_SOURCE([[#include ]])], - [have_readline=yes], - [have_readline=no] -) -if test $have_readline = yes -then - AC_EGREP_HEADER([extern int rl_completion_append_character;], - [readline/readline.h], - AC_DEFINE(HAVE_RL_COMPLETION_APPEND_CHARACTER, 1, - [Define if you have readline 2.2]), ) - AC_EGREP_HEADER([extern int rl_completion_suppress_append;], - [readline/readline.h], - AC_DEFINE(HAVE_RL_COMPLETION_SUPPRESS_APPEND, 1, - [Define if you have rl_completion_suppress_append]), ) -fi - -# check for readline 4.0 -AC_CHECK_LIB(readline, rl_pre_input_hook, - AC_DEFINE(HAVE_RL_PRE_INPUT_HOOK, 1, - [Define if you have readline 4.0]), ,$READLINE_LIBS) - -# also in 4.0 -AC_CHECK_LIB(readline, rl_completion_display_matches_hook, - AC_DEFINE(HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK, 1, - [Define if you have readline 4.0]), ,$READLINE_LIBS) - -# also in 4.0, but not in editline -AC_CHECK_LIB(readline, rl_resize_terminal, - AC_DEFINE(HAVE_RL_RESIZE_TERMINAL, 1, - [Define if you have readline 4.0]), ,$READLINE_LIBS) - -# check for readline 4.2 -AC_CHECK_LIB(readline, rl_completion_matches, - AC_DEFINE(HAVE_RL_COMPLETION_MATCHES, 1, - [Define if you have readline 4.2]), ,$READLINE_LIBS) - -# also in readline 4.2 -AC_PREPROC_IFELSE([AC_LANG_SOURCE([[#include ]])], - [have_readline=yes], - [have_readline=no] -) -if test $have_readline = yes -then - AC_EGREP_HEADER([extern int rl_catch_signals;], - [readline/readline.h], - AC_DEFINE(HAVE_RL_CATCH_SIGNAL, 1, - [Define if you can turn off readline's signal handling.]), ) -fi +if test "$py_cv_lib_readline" = yes; then + # check for readline 2.2 + AC_CHECK_DECL(rl_completion_append_character, + AC_DEFINE(HAVE_RL_COMPLETION_APPEND_CHARACTER, 1, + [Define if you have readline 2.2]),, + [ +#include /* Must be first for Gnu Readline */ +#ifdef WITH_EDITLINE +# include +#else +# include +#endif + ]) + AC_CHECK_DECL(rl_completion_suppress_append, + AC_DEFINE(HAVE_RL_COMPLETION_SUPPRESS_APPEND, 1, + [Define if you have rl_completion_suppress_append]),, + [ +#include /* Must be first for Gnu Readline */ +#ifdef WITH_EDITLINE +# include +#else +# include +#endif + ]) -AC_CHECK_LIB(readline, append_history, - AC_DEFINE(HAVE_RL_APPEND_HISTORY, 1, - [Define if readline supports append_history]), ,$READLINE_LIBS) + # check for readline 4.0 + AC_CHECK_LIB($LIBREADLINE, rl_pre_input_hook, + AC_DEFINE(HAVE_RL_PRE_INPUT_HOOK, 1, + [Define if you have readline 4.0]),,$READLINE_LIBS) + + # also in 4.0 + AC_CHECK_LIB($LIBREADLINE, rl_completion_display_matches_hook, + AC_DEFINE(HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK, 1, + [Define if you have readline 4.0]),,$READLINE_LIBS) + + # also in 4.0, but not in editline + AC_CHECK_LIB($LIBREADLINE, rl_resize_terminal, + AC_DEFINE(HAVE_RL_RESIZE_TERMINAL, 1, + [Define if you have readline 4.0]),,$READLINE_LIBS) + + # check for readline 4.2 + AC_CHECK_LIB($LIBREADLINE, rl_completion_matches, + AC_DEFINE(HAVE_RL_COMPLETION_MATCHES, 1, + [Define if you have readline 4.2]),,$READLINE_LIBS) + + # also in readline 4.2 + AC_CHECK_DECL(rl_catch_signals, + AC_DEFINE(HAVE_RL_CATCH_SIGNAL, 1, + [Define if you can turn off readline's signal handling.]),, + [ +#include /* Must be first for Gnu Readline */ +#ifdef WITH_EDITLINE +# include +#else +# include +#endif + ]) + + AC_CHECK_LIB($LIBREADLINE, append_history, + AC_DEFINE(HAVE_RL_APPEND_HISTORY, 1, + [Define if readline supports append_history]),,$READLINE_LIBS) +fi # End of readline checks: restore LIBS LIBS=$LIBS_no_readline diff --git a/pyconfig.h.in b/pyconfig.h.in index 045cbd53aee59..b65004ee2e88a 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -610,7 +610,7 @@ /* Define to 1 if you have the header file. */ #undef HAVE_LIBINTL_H -/* Define if you have the readline library (-lreadline). */ +/* Define to build the readline module. */ #undef HAVE_LIBREADLINE /* Define to 1 if you have the `resolv' library (-lresolv). */ @@ -1554,6 +1554,9 @@ Dyld is necessary to support frameworks. */ #undef WITH_DYLD +/* Define to build the readline module against Editline. */ +#undef WITH_EDITLINE + /* Define to 1 if libintl is needed for locale functions. */ #undef WITH_LIBINTL diff --git a/setup.py b/setup.py index c6a4e9bf41506..0c4947fd762ee 100644 --- a/setup.py +++ b/setup.py @@ -1022,7 +1022,6 @@ def detect_test_extensions(self): def detect_readline_curses(self): # readline - do_readline = self.compiler.find_library_file(self.lib_dirs, 'readline') readline_termcap_library = "" curses_library = "" # Cannot use os.popen here in py3k. @@ -1030,7 +1029,13 @@ def detect_readline_curses(self): if not os.path.exists(self.build_temp): os.makedirs(self.build_temp) # Determine if readline is already linked against curses or tinfo. - if do_readline: + if sysconfig.get_config_var('HAVE_LIBREADLINE'): + if sysconfig.get_config_var('WITH_EDITLINE'): + readline_lib = 'edit' + else: + readline_lib = 'readline' + do_readline = self.compiler.find_library_file(self.lib_dirs, + readline_lib) if CROSS_COMPILING: ret = run_command("%s -d %s | grep '(NEEDED)' > %s" % (sysconfig.get_config_var('READELF'), @@ -1053,6 +1058,8 @@ def detect_readline_curses(self): break if os.path.exists(tmpfile): os.unlink(tmpfile) + else: + do_readline = False # Issue 7384: If readline is already linked against curses, # use the same library for the readline and curses modules. if 'curses' in readline_termcap_library: @@ -1092,7 +1099,7 @@ def detect_readline_curses(self): else: readline_extra_link_args = () - readline_libs = ['readline'] + readline_libs = [readline_lib] if readline_termcap_library: pass # Issue 7384: Already linked against curses or tinfo. elif curses_library: From webhook-mailer at python.org Mon Feb 8 20:33:01 2021 From: webhook-mailer at python.org (ethanfurman) Date: Tue, 09 Feb 2021 01:33:01 -0000 Subject: [Python-checkins] bpo-43162: [Enum] deprecate enum member.member access (GH-24486) Message-ID: https://github.com/python/cpython/commit/d65b9033d6d092552775f6f5e41e7647100f9f2c commit: d65b9033d6d092552775f6f5e41e7647100f9f2c branch: master author: Ethan Furman committer: ethanfurman date: 2021-02-08T17:32:38-08:00 summary: bpo-43162: [Enum] deprecate enum member.member access (GH-24486) In 3.5 (?) a speed optimization made it possible to access members as attributes of other members, i.e. ``Color.RED.BLUE``. This was always discouraged in the docs, and other recent optimizations has made that one no longer necessary. Because some may be relying on it anyway, it is being deprecated in 3.10, and will be removed in 3.11. files: A Misc/NEWS.d/next/Library/2021-02-08-16-27-00.bpo-43162.t-W7h3.rst M Lib/enum.py M Lib/test/test_enum.py diff --git a/Lib/enum.py b/Lib/enum.py index d4b11521ab27f..55299c5788244 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -139,12 +139,22 @@ def __get__(self, instance, ownerclass=None): return ownerclass._member_map_[self.name] except KeyError: raise AttributeError( - '%s: no attribute %r' % (ownerclass.__name__, self.name) + '%s: no class attribute %r' % (ownerclass.__name__, self.name) ) else: if self.fget is None: + # check for member + if self.name in ownerclass._member_map_: + import warnings + warnings.warn( + "accessing one member from another is not supported, " + " and will be disabled in 3.11", + DeprecationWarning, + stacklevel=2, + ) + return ownerclass._member_map_[self.name] raise AttributeError( - '%s: no attribute %r' % (ownerclass.__name__, self.name) + '%s: no instance attribute %r' % (ownerclass.__name__, self.name) ) else: return self.fget(instance) @@ -152,7 +162,7 @@ def __get__(self, instance, ownerclass=None): def __set__(self, instance, value): if self.fset is None: raise AttributeError( - "%s: cannot set attribute %r" % (self.clsname, self.name) + "%s: cannot set instance attribute %r" % (self.clsname, self.name) ) else: return self.fset(instance, value) @@ -160,7 +170,7 @@ def __set__(self, instance, value): def __delete__(self, instance): if self.fdel is None: raise AttributeError( - "%s: cannot delete attribute %r" % (self.clsname, self.name) + "%s: cannot delete instance attribute %r" % (self.clsname, self.name) ) else: return self.fdel(instance) diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index 96de878faf72d..3982d1d643043 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -2185,6 +2185,29 @@ class Private(Enum): self.assertEqual(Private._Private__corporal, 'Radar') self.assertEqual(Private._Private__major_, 'Hoolihan') + @unittest.skipUnless( + sys.version_info[:2] == (3, 10), + 'member-member access now raises an exception', + ) + def test_warning_for_member_from_member_access(self): + with self.assertWarns(DeprecationWarning): + class Di(Enum): + YES = 1 + NO = 0 + nope = Di.YES.NO + self.assertIs(Di.NO, nope) + + @unittest.skipUnless( + sys.version_info[:2] > (3, 10), + 'member-member access currently issues a warning', + ) + def test_exception_for_member_from_member_access(self): + with self.assertRaisesRegex(AttributeError, "Di: no instance attribute .NO."): + class Di(Enum): + YES = 1 + NO = 0 + nope = Di.YES.NO + def test_strenum_auto(self): class Strings(StrEnum): ONE = auto() diff --git a/Misc/NEWS.d/next/Library/2021-02-08-16-27-00.bpo-43162.t-W7h3.rst b/Misc/NEWS.d/next/Library/2021-02-08-16-27-00.bpo-43162.t-W7h3.rst new file mode 100644 index 0000000000000..fef5915e762ee --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-02-08-16-27-00.bpo-43162.t-W7h3.rst @@ -0,0 +1,2 @@ +deprecate unsupported ability to access enum members as attributes of other +enum members From webhook-mailer at python.org Mon Feb 8 20:57:42 2021 From: webhook-mailer at python.org (gvanrossum) Date: Tue, 09 Feb 2021 01:57:42 -0000 Subject: [Python-checkins] Improve docs of PEP 604 Union (#24301) Message-ID: https://github.com/python/cpython/commit/5f77dee0560e923935203dc4c49279ddb19f57ed commit: 5f77dee0560e923935203dc4c49279ddb19f57ed branch: master author: Ken Jin <28750310+Fidget-Spinner at users.noreply.github.com> committer: gvanrossum date: 2021-02-08T17:57:11-08:00 summary: Improve docs of PEP 604 Union (#24301) files: M Doc/library/functions.rst M Doc/library/stdtypes.rst M Doc/whatsnew/3.10.rst diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index e36a1695c2ad5..370decc51087f 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -870,19 +870,27 @@ are always available. They are listed here in alphabetical order. class>`) subclass thereof. If *object* is not an object of the given type, the function always returns ``False``. If *classinfo* is a tuple of type objects (or recursively, other such - tuples), return ``True`` if *object* is an instance of any of the types. + tuples) or a :ref:`types-union` of multiple types, return ``True`` if + *object* is an instance of any of the types. If *classinfo* is not a type or tuple of types and such tuples, a :exc:`TypeError` exception is raised. + .. versionchanged:: 3.10 + *classinfo* can be a :ref:`types-union`. + .. function:: issubclass(class, classinfo) Return ``True`` if *class* is a subclass (direct, indirect or :term:`virtual `) of *classinfo*. A class is considered a subclass of itself. *classinfo* may be a tuple of class - objects, in which case every entry in *classinfo* will be checked. In any other + objects or a :ref:`types-union`, in which case every entry in *classinfo* + will be checked. In any other case, a :exc:`TypeError` exception is raised. + .. versionchanged:: 3.10 + *classinfo* can be a :ref:`types-union`. + .. function:: iter(object[, sentinel]) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 2331849c02e98..0929f3271e051 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -5022,8 +5022,10 @@ enables cleaner type hinting syntax compared to :data:`typing.Union`. str | None == typing.Optional[str] .. describe:: isinstance(obj, union_object) +.. describe:: issubclass(obj, union_object) - Calls to :func:`isinstance` are also supported with a union object:: + Calls to :func:`isinstance` and :func:`issubclass` are also supported with a + union object:: >>> isinstance("", int | str) True @@ -5036,21 +5038,6 @@ enables cleaner type hinting syntax compared to :data:`typing.Union`. File "", line 1, in TypeError: isinstance() argument 2 cannot contain a parameterized generic -.. describe:: issubclass(obj, union_object) - - Calls to :func:`issubclass` are also supported with a union object:: - - >>> issubclass(bool, int | str) - True - - However, union objects containing :ref:`parameterized generics - ` cannot be used:: - - >>> issubclass(bool, bool | list[str]) - Traceback (most recent call last): - File "", line 1, in - TypeError: issubclass() argument 2 cannot contain a parameterized generic - The user-exposed type for the union object can be accessed from :data:`types.Union` and used for :func:`isinstance` checks. An object cannot be instantiated from the type:: diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index fa8b6aa54fe90..96892ba3d37e1 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -193,7 +193,13 @@ Type hints can now be written in a more succinct manner:: return number ** 2 -See :pep:`604` for more details. +This new syntax is also accepted as the second argument to :func:`isinstance` +and :func:`issubclass`:: + + >>> isinstance(1, int | str) + True + +See :ref:`types-union` and :pep:`604` for more details. (Contributed by Maggie Moss and Philippe Prados in :issue:`41428`.) From webhook-mailer at python.org Mon Feb 8 20:58:57 2021 From: webhook-mailer at python.org (gvanrossum) Date: Tue, 09 Feb 2021 01:58:57 -0000 Subject: [Python-checkins] bpo-41824: Add versionadded for typing.ForwardRef docs (#24224) Message-ID: https://github.com/python/cpython/commit/da21f7b6e1fd5bd3e78931a06c5eb694f6335233 commit: da21f7b6e1fd5bd3e78931a06c5eb694f6335233 branch: master author: Ken Jin <28750310+Fidget-Spinner at users.noreply.github.com> committer: gvanrossum date: 2021-02-08T17:58:50-08:00 summary: bpo-41824: Add versionadded for typing.ForwardRef docs (#24224) files: M Doc/library/typing.rst diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 3b4dba3e0e0a9..7ef5b3971a91e 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -1950,6 +1950,8 @@ Introspection helpers ``list[ForwardRef("SomeClass")]``. This class should not be instantiated by a user, but may be used by introspection tools. + .. versionadded:: 3.7.4 + Constant -------- From webhook-mailer at python.org Tue Feb 9 11:55:39 2021 From: webhook-mailer at python.org (gvanrossum) Date: Tue, 09 Feb 2021 16:55:39 -0000 Subject: [Python-checkins] bpo-41824: Add versionadded for typing.ForwardRef docs (#24224) (#24493) Message-ID: https://github.com/python/cpython/commit/917eca700aa341f8544ace43b75d41b477e98b72 commit: 917eca700aa341f8544ace43b75d41b477e98b72 branch: 3.9 author: Ken Jin <28750310+Fidget-Spinner at users.noreply.github.com> committer: gvanrossum date: 2021-02-09T08:55:03-08:00 summary: bpo-41824: Add versionadded for typing.ForwardRef docs (#24224) (#24493) files: M Doc/library/typing.rst diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index af2cafb8b9969..688564f1d24f5 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -1714,6 +1714,8 @@ Introspection helpers ``list[ForwardRef("SomeClass")]``. This class should not be instantiated by a user, but may be used by introspection tools. + .. versionadded:: 3.7.4 + Constant -------- From webhook-mailer at python.org Tue Feb 9 11:55:50 2021 From: webhook-mailer at python.org (gvanrossum) Date: Tue, 09 Feb 2021 16:55:50 -0000 Subject: [Python-checkins] [3.8] bpo-41824: Add versionadded for typing.ForwardRef docs (#24224) (#24494) Message-ID: https://github.com/python/cpython/commit/c8a48c6d0417cc8f256a40142962825febdc2e20 commit: c8a48c6d0417cc8f256a40142962825febdc2e20 branch: 3.8 author: Ken Jin <28750310+Fidget-Spinner at users.noreply.github.com> committer: gvanrossum date: 2021-02-09T08:55:45-08:00 summary: [3.8] bpo-41824: Add versionadded for typing.ForwardRef docs (#24224) (#24494) files: M Doc/library/typing.rst diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 8c179ff79d15f..046f5e0f2d9eb 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -1020,6 +1020,8 @@ The module defines the following classes, functions and decorators: ``List[ForwardRef("SomeClass")]``. This class should not be instantiated by a user, but may be used by introspection tools. + .. versionadded:: 3.7.4 + .. function:: NewType(name, tp) A helper function to indicate a distinct type to a typechecker, From webhook-mailer at python.org Tue Feb 9 12:57:54 2021 From: webhook-mailer at python.org (gvanrossum) Date: Tue, 09 Feb 2021 17:57:54 -0000 Subject: [Python-checkins] [3.8] bpo-41824: Fix indentation issue in ForwardRef docs (#24495) Message-ID: https://github.com/python/cpython/commit/822f7c266f886677047338e8b167ba39a6abd91e commit: 822f7c266f886677047338e8b167ba39a6abd91e branch: 3.8 author: Ken Jin <28750310+Fidget-Spinner at users.noreply.github.com> committer: gvanrossum date: 2021-02-09T09:57:20-08:00 summary: [3.8] bpo-41824: Fix indentation issue in ForwardRef docs (#24495) files: M Doc/library/typing.rst diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 046f5e0f2d9eb..9d80a209060c8 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -1020,7 +1020,7 @@ The module defines the following classes, functions and decorators: ``List[ForwardRef("SomeClass")]``. This class should not be instantiated by a user, but may be used by introspection tools. - .. versionadded:: 3.7.4 + .. versionadded:: 3.7.4 .. function:: NewType(name, tp) From webhook-mailer at python.org Tue Feb 9 13:14:20 2021 From: webhook-mailer at python.org (zooba) Date: Tue, 09 Feb 2021 18:14:20 -0000 Subject: [Python-checkins] bpo-43166: Disable ceval.c optimisations for Windows debug builds (GH-24485) Message-ID: https://github.com/python/cpython/commit/b74396c3167cc780f01309148db02709bc37b432 commit: b74396c3167cc780f01309148db02709bc37b432 branch: master author: Steve Dower committer: zooba date: 2021-02-09T18:13:36Z summary: bpo-43166: Disable ceval.c optimisations for Windows debug builds (GH-24485) This ensures that ceval.c can be debugged. Also remove some irrelevant options from the pragma. files: M Include/pyport.h diff --git a/Include/pyport.h b/Include/pyport.h index 6687849d84472..46bbef22d7396 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -180,9 +180,9 @@ typedef int Py_ssize_clean_t; */ #if defined(_MSC_VER) -# if defined(PY_LOCAL_AGGRESSIVE) - /* enable more aggressive optimization for visual studio */ -# pragma optimize("agtw", on) +# if defined(PY_LOCAL_AGGRESSIVE) && !defined(Py_DEBUG) + /* enable more aggressive optimization for MSVC */ +# pragma optimize("gt", on) #endif /* ignore warnings if the compiler decides not to inline a function */ # pragma warning(disable: 4710) From webhook-mailer at python.org Tue Feb 9 15:08:15 2021 From: webhook-mailer at python.org (pablogsal) Date: Tue, 09 Feb 2021 20:08:15 -0000 Subject: [Python-checkins] bpo-43163: Handle unclosed parentheses in codeop (GH-24483) Message-ID: https://github.com/python/cpython/commit/dbb228189b4eb7ab41f326eb79dae669b2c81177 commit: dbb228189b4eb7ab41f326eb79dae669b2c81177 branch: master author: Pablo Galindo committer: pablogsal date: 2021-02-09T20:07:38Z summary: bpo-43163: Handle unclosed parentheses in codeop (GH-24483) files: A Misc/NEWS.d/next/Library/2021-02-08-21-13-51.bpo-43163.E2MgzH.rst M Lib/codeop.py M Lib/test/test_codeop.py diff --git a/Lib/codeop.py b/Lib/codeop.py index 4c10470aee7b7..7a08610239c35 100644 --- a/Lib/codeop.py +++ b/Lib/codeop.py @@ -102,11 +102,20 @@ def _maybe_compile(compiler, source, filename, symbol): try: if code: return code - if not code1 and repr(err1) == repr(err2): + if not code1 and _is_syntax_error(err1, err2): raise err1 finally: err1 = err2 = None +def _is_syntax_error(err1, err2): + rep1 = repr(err1) + rep2 = repr(err2) + if "was never closed" in rep1 and "was never closed" in rep2: + return False + if rep1 == rep2: + return True + return False + def _compile(source, filename, symbol): return compile(source, filename, symbol, PyCF_DONT_IMPLY_DEDENT) diff --git a/Lib/test/test_codeop.py b/Lib/test/test_codeop.py index 1da6ca55c48f7..ecc46affea262 100644 --- a/Lib/test/test_codeop.py +++ b/Lib/test/test_codeop.py @@ -135,6 +135,10 @@ def test_incomplete(self): ai("a = {") ai("b + {") + ai("print([1,\n2,") + ai("print({1:1,\n2:3,") + ai("print((1,\n2,") + ai("if 9==3:\n pass\nelse:") ai("if 9==3:\n pass\nelse:\n") ai("if 9==3:\n pass\nelse:\n pass") diff --git a/Misc/NEWS.d/next/Library/2021-02-08-21-13-51.bpo-43163.E2MgzH.rst b/Misc/NEWS.d/next/Library/2021-02-08-21-13-51.bpo-43163.E2MgzH.rst new file mode 100644 index 0000000000000..ddd60ea385596 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-02-08-21-13-51.bpo-43163.E2MgzH.rst @@ -0,0 +1,2 @@ +Fix a bug in :mod:`codeop` that was causing it to not ask for more input +when multi-line snippets have unclosed parentheses. Patch by Pablo Galindo From webhook-mailer at python.org Tue Feb 9 19:21:19 2021 From: webhook-mailer at python.org (methane) Date: Wed, 10 Feb 2021 00:21:19 -0000 Subject: [Python-checkins] bpo-42217: compiler: merge same co_code and co_linetable objects (GH-23056) Message-ID: https://github.com/python/cpython/commit/bdb941be423bde8b02a5695ccf51c303d6204bed commit: bdb941be423bde8b02a5695ccf51c303d6204bed branch: master author: Inada Naoki committer: methane date: 2021-02-10T09:20:42+09:00 summary: bpo-42217: compiler: merge same co_code and co_linetable objects (GH-23056) files: A Misc/NEWS.d/next/Core and Builtins/2020-10-31-16-54-00.bpo-42217.GdcHe5.rst M Lib/test/test_compile.py M Python/compile.c M Python/importlib.h M Python/importlib_external.h diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index 3e826b9accfb1..1f125242e156f 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -632,6 +632,17 @@ def check_same_constant(const): self.check_constant(f1, frozenset({0})) self.assertTrue(f1(0)) + # Merging equal co_linetable and co_code is not a strict requirement + # for the Python semantics, it's a more an implementation detail. + @support.cpython_only + def test_merge_code_attrs(self): + # See https://bugs.python.org/issue42217 + f1 = lambda x: x.y.z + f2 = lambda a: a.b.c + + self.assertIs(f1.__code__.co_linetable, f2.__code__.co_linetable) + self.assertIs(f1.__code__.co_code, f2.__code__.co_code) + # This is a regression test for a CPython specific peephole optimizer # implementation bug present in a few releases. It's assertion verifies # that peephole optimization was actually done though that isn't an diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-31-16-54-00.bpo-42217.GdcHe5.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-31-16-54-00.bpo-42217.GdcHe5.rst new file mode 100644 index 0000000000000..c50b69d18885a --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-10-31-16-54-00.bpo-42217.GdcHe5.rst @@ -0,0 +1 @@ +Make the compiler merges same co_code and co_linetable objects in a module like already did for co_consts. diff --git a/Python/compile.c b/Python/compile.c index a0a257fa6bafc..386c552cd8d01 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -5806,14 +5806,12 @@ compute_code_flags(struct compiler *c) return flags; } -// Merge *tuple* with constant cache. +// Merge *obj* with constant cache. // Unlike merge_consts_recursive(), this function doesn't work recursively. static int -merge_const_tuple(struct compiler *c, PyObject **tuple) +merge_const_one(struct compiler *c, PyObject **obj) { - assert(PyTuple_CheckExact(*tuple)); - - PyObject *key = _PyCode_ConstantKey(*tuple); + PyObject *key = _PyCode_ConstantKey(*obj); if (key == NULL) { return 0; } @@ -5824,14 +5822,18 @@ merge_const_tuple(struct compiler *c, PyObject **tuple) if (t == NULL) { return 0; } - if (t == key) { // tuple is new constant. + if (t == key) { // obj is new constant. return 1; } - PyObject *u = PyTuple_GET_ITEM(t, 1); - Py_INCREF(u); - Py_DECREF(*tuple); - *tuple = u; + if (PyTuple_CheckExact(t)) { + // t is still borrowed reference + t = PyTuple_GET_ITEM(t, 1); + } + + Py_INCREF(t); + Py_DECREF(*obj); + *obj = t; return 1; } @@ -5861,10 +5863,10 @@ makecode(struct compiler *c, struct assembler *a, PyObject *consts) if (!freevars) goto error; - if (!merge_const_tuple(c, &names) || - !merge_const_tuple(c, &varnames) || - !merge_const_tuple(c, &cellvars) || - !merge_const_tuple(c, &freevars)) + if (!merge_const_one(c, &names) || + !merge_const_one(c, &varnames) || + !merge_const_one(c, &cellvars) || + !merge_const_one(c, &freevars)) { goto error; } @@ -5881,7 +5883,7 @@ makecode(struct compiler *c, struct assembler *a, PyObject *consts) if (consts == NULL) { goto error; } - if (!merge_const_tuple(c, &consts)) { + if (!merge_const_one(c, &consts)) { Py_DECREF(consts); goto error; } @@ -6028,10 +6030,18 @@ assemble(struct compiler *c, int addNone) goto error; } - if (_PyBytes_Resize(&a.a_lnotab, a.a_lnotab_off) < 0) + if (_PyBytes_Resize(&a.a_lnotab, a.a_lnotab_off) < 0) { goto error; - if (_PyBytes_Resize(&a.a_bytecode, a.a_offset * sizeof(_Py_CODEUNIT)) < 0) + } + if (!merge_const_one(c, &a.a_lnotab)) { goto error; + } + if (_PyBytes_Resize(&a.a_bytecode, a.a_offset * sizeof(_Py_CODEUNIT)) < 0) { + goto error; + } + if (!merge_const_one(c, &a.a_bytecode)) { + goto error; + } co = makecode(c, &a, consts); error: diff --git a/Python/importlib.h b/Python/importlib.h index 6a0fc6e5af61a..880343bcda308 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -211,18 +211,18 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 1,10,1,36,128,255,128,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, + 0,67,0,0,0,243,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,20,0,0,0,218,2,105,100,169,1,114,33,0, 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,218,8,95,95,114,101,112,114,95,95,138,0,0,0,115, + 0,218,8,95,95,114,101,112,114,95,95,138,0,0,0,243, 4,0,0,0,18,1,255,128,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,9,0,0,0,114,8,0,0,0,114,1,0,0,0, 114,10,0,0,0,114,34,0,0,0,114,41,0,0,0,114, - 43,0,0,0,114,44,0,0,0,114,52,0,0,0,114,5, + 43,0,0,0,114,44,0,0,0,114,53,0,0,0,114,5, 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, 0,0,114,23,0,0,0,65,0,0,0,115,16,0,0,0, 8,0,4,1,8,5,8,8,8,21,8,25,12,13,255,128, @@ -243,14 +243,14 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 0,95,0,100,1,124,0,95,1,100,0,83,0,114,24,0, 0,0,41,2,114,20,0,0,0,114,30,0,0,0,114,32, 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, - 0,0,114,34,0,0,0,146,0,0,0,115,6,0,0,0, + 0,0,114,34,0,0,0,146,0,0,0,243,6,0,0,0, 6,1,10,1,255,128,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,42,0,0,0,84,41,1,114,30,0,0, - 0,114,51,0,0,0,114,5,0,0,0,114,5,0,0,0, + 0,114,52,0,0,0,114,5,0,0,0,114,5,0,0,0, 114,6,0,0,0,114,43,0,0,0,150,0,0,0,115,6, 0,0,0,14,1,4,1,255,128,122,24,95,68,117,109,109, 121,77,111,100,117,108,101,76,111,99,107,46,97,99,113,117, @@ -260,1601 +260,1593 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 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,25,0,0,0,114,46,0, 0,0,114,42,0,0,0,41,2,114,30,0,0,0,114,47, - 0,0,0,114,51,0,0,0,114,5,0,0,0,114,5,0, + 0,0,0,114,52,0,0,0,114,5,0,0,0,114,5,0, 0,0,114,6,0,0,0,114,44,0,0,0,154,0,0,0, 115,8,0,0,0,10,1,8,1,18,1,255,128,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,48,0,0,0,114,51,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,114,52,0,0,0,159,0,0,0,115,4,0,0,0,18, - 1,255,128,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,9,0,0,0,114,8,0,0,0,114,1,0,0,0, - 114,10,0,0,0,114,34,0,0,0,114,43,0,0,0,114, - 44,0,0,0,114,52,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,114,53,0, - 0,0,142,0,0,0,115,14,0,0,0,8,0,4,1,8, - 3,8,4,8,4,12,5,255,128,114,53,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,0,0,0,0,41,2,218,5,95,110,97, - 109,101,218,5,95,108,111,99,107,114,32,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,114,34,0, - 0,0,165,0,0,0,115,6,0,0,0,6,1,10,1,255, - 128,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,0,0,0,0,41,4,218,16,95, - 103,101,116,95,109,111,100,117,108,101,95,108,111,99,107,114, - 55,0,0,0,114,56,0,0,0,114,43,0,0,0,114,51, - 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, - 0,0,218,9,95,95,101,110,116,101,114,95,95,169,0,0, - 0,115,6,0,0,0,12,1,14,1,255,128,122,28,95,77, + 114,48,0,0,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,49,0,0,0,114,52,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, + 53,0,0,0,159,0,0,0,114,54,0,0,0,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,9,0,0,0, + 114,8,0,0,0,114,1,0,0,0,114,10,0,0,0,114, + 34,0,0,0,114,43,0,0,0,114,44,0,0,0,114,53, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,114,55,0,0,0,142,0,0,0, + 115,14,0,0,0,8,0,4,1,8,3,8,4,8,4,12, + 5,255,128,114,55,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, - 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,0,0,0,0,41,2,114,56,0, - 0,0,114,44,0,0,0,41,3,114,33,0,0,0,218,4, - 97,114,103,115,90,6,107,119,97,114,103,115,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,218,8,95,95,101, - 120,105,116,95,95,173,0,0,0,115,4,0,0,0,14,1, - 255,128,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,9,0,0,0,114,8,0,0,0,114,1,0,0, - 0,114,34,0,0,0,114,58,0,0,0,114,60,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,114,54,0,0,0,163,0,0,0,115,10,0, - 0,0,8,0,8,2,8,4,12,4,255,128,114,54,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,132,0,0,0,116, - 0,160,1,161,0,1,0,122,110,122,14,116,2,124,0,25, - 0,131,0,125,1,87,0,110,18,4,0,116,3,121,130,1, - 0,1,0,1,0,100,1,125,1,89,0,124,1,100,1,117, - 0,114,106,116,4,100,1,117,0,114,70,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,124,1,83,0,116,0,160,9,161,0,1,0,119, - 0,119,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,54,0,0, - 0,116,0,160,1,161,0,1,0,122,34,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,100,0,83,0,116,0,160, - 4,161,0,1,0,119,0,114,0,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,38,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,20,0,0,0, + 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,0, + 0,0,0,41,2,218,5,95,110,97,109,101,218,5,95,108, + 111,99,107,114,32,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,114,34,0,0,0,165,0,0,0, + 114,56,0,0,0,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,0,0,0,0,41, + 4,218,16,95,103,101,116,95,109,111,100,117,108,101,95,108, + 111,99,107,114,58,0,0,0,114,59,0,0,0,114,43,0, + 0,0,114,52,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,218,9,95,95,101,110,116,101,114,95, + 95,169,0,0,0,115,6,0,0,0,12,1,14,1,255,128, + 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,0,0,0,0,41, + 2,114,59,0,0,0,114,44,0,0,0,41,3,114,33,0, + 0,0,218,4,97,114,103,115,90,6,107,119,97,114,103,115, 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,218, - 2,99,98,198,0,0,0,115,14,0,0,0,8,1,2,1, - 14,4,6,1,2,128,22,2,255,128,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,61,0,0,0,114, - 62,0,0,0,114,63,0,0,0,218,8,75,101,121,69,114, - 114,111,114,114,26,0,0,0,114,53,0,0,0,114,23,0, - 0,0,218,8,95,119,101,97,107,114,101,102,114,65,0,0, - 0,114,64,0,0,0,41,3,114,20,0,0,0,114,27,0, - 0,0,114,66,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,6,0,0,0,114,57,0,0,0,179,0,0,0,115, - 36,0,0,0,8,6,2,1,2,1,14,1,12,1,6,1, - 8,2,8,1,10,1,8,2,12,2,16,11,2,128,8,2, - 4,2,10,254,2,234,255,128,114,57,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, - 18,4,0,116,2,121,52,1,0,1,0,1,0,89,0,100, - 1,83,0,124,1,160,3,161,0,1,0,100,1,83,0,119, - 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,57,0,0,0,114,43,0,0,0,114, - 22,0,0,0,114,44,0,0,0,41,2,114,20,0,0,0, - 114,27,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,218,19,95,108,111,99,107,95,117,110,108,111, - 99,107,95,109,111,100,117,108,101,216,0,0,0,115,16,0, - 0,0,8,6,2,1,12,1,12,1,6,3,12,2,2,251, - 255,128,114,69,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,2,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,78,114,5,0,0,0,41,3, - 218,1,102,114,59,0,0,0,90,4,107,119,100,115,114,5, - 0,0,0,114,5,0,0,0,114,6,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,233,0,0,0,115,4,0,0, - 0,14,8,255,128,114,71,0,0,0,114,42,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,58,0,0,0,116,0,106,1,106,2, - 124,1,107,5,114,54,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, - 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,18,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,49,0,0,0,218, - 6,115,116,100,101,114,114,41,3,218,7,109,101,115,115,97, - 103,101,114,72,0,0,0,114,59,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,218,16,95,118,101, - 114,98,111,115,101,95,109,101,115,115,97,103,101,244,0,0, - 0,115,12,0,0,0,12,2,10,1,8,1,24,1,4,253, - 255,128,114,80,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, - 4,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,19,0,0,0,41, - 4,114,18,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,49,0,0,0,169,2, - 114,33,0,0,0,218,8,102,117,108,108,110,97,109,101,169, - 1,218,3,102,120,110,114,5,0,0,0,114,6,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,254,0,0,0,115, - 12,0,0,0,10,1,10,1,2,1,6,255,10,2,255,128, - 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,78,169,1,114,17,0,0,0,41,2, - 114,87,0,0,0,114,88,0,0,0,114,5,0,0,0,114, - 86,0,0,0,114,6,0,0,0,218,17,95,114,101,113,117, - 105,114,101,115,95,98,117,105,108,116,105,110,252,0,0,0, - 115,8,0,0,0,12,2,10,5,4,1,255,128,114,90,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,4,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,19,0,0,0,41,4,114,61,0,0,0,218,9,105, - 115,95,102,114,111,122,101,110,114,83,0,0,0,114,49,0, - 0,0,114,84,0,0,0,114,86,0,0,0,114,5,0,0, - 0,114,6,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, - 9,1,0,0,115,12,0,0,0,10,1,10,1,2,1,6, - 255,10,2,255,128,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,78,114,89,0,0,0,41, - 2,114,87,0,0,0,114,93,0,0,0,114,5,0,0,0, - 114,86,0,0,0,114,6,0,0,0,218,16,95,114,101,113, - 117,105,114,101,115,95,102,114,111,122,101,110,7,1,0,0, - 115,8,0,0,0,12,2,10,5,4,1,255,128,114,94,0, - 0,0,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,74,0,0,0, - 100,1,125,2,116,0,160,1,124,2,116,2,161,2,1,0, - 116,3,124,1,124,0,131,2,125,3,124,1,116,4,106,5, - 118,0,114,66,116,4,106,5,124,1,25,0,125,4,116,6, - 124,3,124,4,131,2,1,0,116,4,106,5,124,1,25,0, - 83,0,116,7,124,3,131,1,83,0,41,3,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,122,103, - 116,104,101,32,108,111,97,100,95,109,111,100,117,108,101,40, - 41,32,109,101,116,104,111,100,32,105,115,32,100,101,112,114, - 101,99,97,116,101,100,32,97,110,100,32,115,108,97,116,101, - 100,32,102,111,114,32,114,101,109,111,118,97,108,32,105,110, - 32,80,121,116,104,111,110,32,51,46,49,50,59,32,117,115, - 101,32,101,120,101,99,95,109,111,100,117,108,101,40,41,32, - 105,110,115,116,101,97,100,78,41,8,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, - 16,115,112,101,99,95,102,114,111,109,95,108,111,97,100,101, - 114,114,18,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,5,114, - 33,0,0,0,114,85,0,0,0,218,3,109,115,103,218,4, - 115,112,101,99,218,6,109,111,100,117,108,101,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,218,17,95,108,111, - 97,100,95,109,111,100,117,108,101,95,115,104,105,109,19,1, - 0,0,115,18,0,0,0,4,6,12,2,10,1,10,1,10, - 1,10,1,10,1,8,2,255,128,114,105,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,206,0,0,0,116,0,124,0, - 100,1,100,0,131,3,125,1,116,1,124,1,100,2,131,2, - 114,50,122,12,124,1,160,2,124,0,161,1,87,0,83,0, - 4,0,116,3,121,204,1,0,1,0,1,0,89,0,122,10, - 124,0,106,4,125,2,87,0,110,16,4,0,116,5,121,202, - 1,0,1,0,1,0,89,0,110,16,124,2,100,0,117,1, - 114,94,116,6,124,2,131,1,83,0,122,10,124,0,106,7, - 125,3,87,0,110,18,4,0,116,5,121,200,1,0,1,0, - 1,0,100,3,125,3,89,0,122,10,124,0,106,8,125,4, - 87,0,110,50,4,0,116,5,121,198,1,0,1,0,1,0, - 124,1,100,0,117,0,114,170,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,100,6,160,9,124,3,124,4,161,2, - 83,0,119,0,119,0,119,0,119,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,13,0,0,0,114,11, - 0,0,0,114,107,0,0,0,218,9,69,120,99,101,112,116, - 105,111,110,218,8,95,95,115,112,101,99,95,95,114,2,0, - 0,0,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,9,0,0,0,218, - 8,95,95,102,105,108,101,95,95,114,49,0,0,0,41,5, - 114,104,0,0,0,218,6,108,111,97,100,101,114,114,103,0, - 0,0,114,20,0,0,0,218,8,102,105,108,101,110,97,109, - 101,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, - 218,12,95,109,111,100,117,108,101,95,114,101,112,114,38,1, - 0,0,115,56,0,0,0,12,2,10,1,2,4,12,1,12, - 1,2,1,2,1,10,1,12,1,4,1,8,2,8,1,2, - 4,10,1,12,1,6,1,2,1,10,1,12,1,8,1,14, - 1,16,2,12,2,2,250,2,252,2,246,2,252,255,128,114, - 118,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, - 41,2,78,70,41,7,114,20,0,0,0,114,116,0,0,0, - 114,120,0,0,0,114,121,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,33,0,0,0,114,20,0,0,0,114,116,0,0,0,114, - 120,0,0,0,114,121,0,0,0,114,122,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,114,34,0, - 0,0,111,1,0,0,115,16,0,0,0,6,2,6,1,6, - 1,6,1,14,1,6,3,10,1,255,128,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,49,0,0,0,114,20, - 0,0,0,114,116,0,0,0,114,120,0,0,0,218,6,97, - 112,112,101,110,100,114,123,0,0,0,218,9,95,95,99,108, - 97,115,115,95,95,114,9,0,0,0,218,4,106,111,105,110, - 41,2,114,33,0,0,0,114,59,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,114,52,0,0,0, - 123,1,0,0,115,22,0,0,0,10,1,10,1,4,255,10, - 2,18,1,10,1,8,1,4,1,6,255,22,2,255,128,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,102,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,119,0,114,0,0,0,0,41,8,114, - 123,0,0,0,114,20,0,0,0,114,116,0,0,0,114,120, - 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,2,0,0,0,218,14, - 78,111,116,73,109,112,108,101,109,101,110,116,101,100,41,3, - 114,33,0,0,0,90,5,111,116,104,101,114,90,4,115,109, - 115,108,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,218,6,95,95,101,113,95,95,133,1,0,0,115,34,0, - 0,0,6,1,2,1,12,1,10,1,2,255,10,2,2,254, - 8,3,2,253,10,4,2,252,10,5,4,251,12,6,8,1, - 2,255,255,128,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, - 0,0,0,0,41,6,114,125,0,0,0,114,120,0,0,0, - 114,124,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,51,0,0, - 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, - 114,129,0,0,0,145,1,0,0,115,14,0,0,0,10,2, - 16,1,8,1,4,1,14,1,6,1,255,128,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,0,0,0,0,41,1,114,125, - 0,0,0,41,2,114,33,0,0,0,114,129,0,0,0,114, - 5,0,0,0,114,5,0,0,0,114,6,0,0,0,114,129, - 0,0,0,154,1,0,0,115,4,0,0,0,10,2,255,128, - 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,32,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,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,25,0,0,0,41,3,114,123,0, - 0,0,114,20,0,0,0,218,10,114,112,97,114,116,105,116, - 105,111,110,114,51,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,6,0,0,0,218,6,112,97,114,101,110,116,158, - 1,0,0,115,8,0,0,0,10,3,16,1,6,2,255,128, - 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,0,0,0,0,41,1,114,124, - 0,0,0,114,51,0,0,0,114,5,0,0,0,114,5,0, - 0,0,114,6,0,0,0,114,130,0,0,0,166,1,0,0, - 115,4,0,0,0,6,2,255,128,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,0, - 0,0,0,41,2,218,4,98,111,111,108,114,124,0,0,0, - 41,2,114,33,0,0,0,218,5,118,97,108,117,101,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,114,130,0, - 0,0,170,1,0,0,115,4,0,0,0,14,2,255,128,41, - 12,114,9,0,0,0,114,8,0,0,0,114,1,0,0,0, - 114,10,0,0,0,114,34,0,0,0,114,52,0,0,0,114, - 132,0,0,0,218,8,112,114,111,112,101,114,116,121,114,129, - 0,0,0,218,6,115,101,116,116,101,114,114,137,0,0,0, - 114,130,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,114,119,0,0,0,74,1, - 0,0,115,36,0,0,0,8,0,4,1,4,36,2,1,12, - 255,8,12,8,10,2,12,10,1,4,8,10,1,2,3,10, - 1,2,7,10,1,4,3,14,1,255,128,114,119,0,0,0, - 169,2,114,120,0,0,0,114,122,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,150,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,132,116,0,124,1, - 100,5,131,2,114,128,122,14,124,1,160,4,124,0,161,1, - 125,3,87,0,110,24,4,0,116,5,121,148,1,0,1,0, - 1,0,100,2,125,3,89,0,110,4,100,6,125,3,116,6, - 124,0,124,1,124,2,124,3,100,7,141,4,83,0,119,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,116,0,0,0,41, - 2,114,116,0,0,0,114,123,0,0,0,114,122,0,0,0, - 70,114,142,0,0,0,41,7,114,11,0,0,0,114,133,0, - 0,0,114,134,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,122,0,0,0,114,83,0,0,0,114,119,0,0,0,41, - 6,114,20,0,0,0,114,116,0,0,0,114,120,0,0,0, - 114,122,0,0,0,114,143,0,0,0,90,6,115,101,97,114, - 99,104,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,114,98,0,0,0,175,1,0,0,115,40,0,0,0,10, - 2,8,1,4,1,6,1,8,2,12,1,12,1,6,1,2, - 1,6,255,8,3,10,1,2,1,14,1,12,1,8,1,4, - 3,16,2,2,250,255,128,114,98,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,44,1,0,0,122,10,124,0,106,0, - 125,3,87,0,110,18,4,0,116,1,144,1,121,42,1,0, - 1,0,1,0,89,0,110,12,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,84,122,10,124,0,106,3,125,1,87,0,110,16,4,0, - 116,1,144,1,121,40,1,0,1,0,1,0,89,0,122,10, - 124,0,106,4,125,5,87,0,110,20,4,0,116,1,144,1, - 121,38,1,0,1,0,1,0,100,0,125,5,89,0,124,2, - 100,0,117,0,114,170,124,5,100,0,117,0,114,166,122,10, - 124,1,106,5,125,2,87,0,110,26,4,0,116,1,144,1, - 121,36,1,0,1,0,1,0,100,0,125,2,89,0,110,4, - 124,5,125,2,122,10,124,0,106,6,125,6,87,0,110,20, - 4,0,116,1,144,1,121,34,1,0,1,0,1,0,100,0, - 125,6,89,0,122,14,116,7,124,0,106,8,131,1,125,7, - 87,0,110,20,4,0,116,1,144,1,121,32,1,0,1,0, - 1,0,100,0,125,7,89,0,116,9,124,4,124,1,124,2, - 100,1,141,3,125,3,124,5,100,0,117,0,144,1,114,10, - 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,119,0,119,0,119,0, - 119,0,119,0,119,0,41,4,78,169,1,114,120,0,0,0, - 70,84,41,13,114,113,0,0,0,114,2,0,0,0,114,9, - 0,0,0,114,106,0,0,0,114,115,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,119,0,0,0,114,124,0,0,0,114,129,0,0, - 0,114,123,0,0,0,41,8,114,104,0,0,0,114,116,0, - 0,0,114,120,0,0,0,114,103,0,0,0,114,20,0,0, - 0,90,8,108,111,99,97,116,105,111,110,114,129,0,0,0, - 114,123,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,218,17,95,115,112,101,99,95,102,114,111,109, - 95,109,111,100,117,108,101,201,1,0,0,115,86,0,0,0, - 2,2,10,1,14,1,4,1,8,2,4,1,6,2,8,1, - 2,1,10,1,14,1,2,2,2,1,10,1,14,1,6,1, - 8,1,8,1,2,1,10,1,14,1,8,1,4,2,2,1, - 10,1,14,1,6,1,2,1,14,1,14,1,6,1,14,2, - 20,1,6,1,6,1,4,1,2,249,2,252,2,250,2,250, - 2,251,2,246,255,128,114,149,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,50,122,12,124,0,106,1, - 124,1,95,2,87,0,110,16,4,0,116,3,144,1,121,208, - 1,0,1,0,1,0,89,0,124,2,115,70,116,0,124,1, - 100,2,100,0,131,3,100,0,117,0,114,170,124,0,106,4, - 125,3,124,3,100,0,117,0,114,142,124,0,106,5,100,0, - 117,1,114,142,116,6,100,0,117,0,114,106,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,16, - 4,0,116,3,144,1,121,206,1,0,1,0,1,0,89,0, - 124,2,115,190,116,0,124,1,100,3,100,0,131,3,100,0, - 117,0,114,220,122,12,124,0,106,13,124,1,95,14,87,0, - 110,16,4,0,116,3,144,1,121,204,1,0,1,0,1,0, - 89,0,122,10,124,0,124,1,95,15,87,0,110,16,4,0, - 116,3,144,1,121,202,1,0,1,0,1,0,89,0,124,2, - 144,1,115,16,116,0,124,1,100,4,100,0,131,3,100,0, - 117,0,144,1,114,58,124,0,106,5,100,0,117,1,144,1, - 114,58,122,12,124,0,106,5,124,1,95,16,87,0,110,16, - 4,0,116,3,144,1,121,200,1,0,1,0,1,0,89,0, - 124,0,106,17,144,1,114,192,124,2,144,1,115,90,116,0, - 124,1,100,5,100,0,131,3,100,0,117,0,144,1,114,120, - 122,12,124,0,106,18,124,1,95,11,87,0,110,16,4,0, - 116,3,144,1,121,198,1,0,1,0,1,0,89,0,124,2, - 144,1,115,144,116,0,124,1,100,6,100,0,131,3,100,0, - 117,0,144,1,114,192,124,0,106,19,100,0,117,1,144,1, - 114,192,122,14,124,0,106,19,124,1,95,20,87,0,124,1, - 83,0,4,0,116,3,144,1,121,196,1,0,1,0,1,0, - 89,0,124,1,83,0,124,1,83,0,119,0,119,0,119,0, - 119,0,119,0,119,0,119,0,41,7,78,114,9,0,0,0, - 114,106,0,0,0,218,11,95,95,112,97,99,107,97,103,101, - 95,95,114,148,0,0,0,114,115,0,0,0,114,146,0,0, - 0,41,21,114,13,0,0,0,114,20,0,0,0,114,9,0, - 0,0,114,2,0,0,0,114,116,0,0,0,114,123,0,0, - 0,114,133,0,0,0,114,134,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,115,0, - 0,0,114,106,0,0,0,114,137,0,0,0,114,152,0,0, - 0,114,113,0,0,0,114,148,0,0,0,114,130,0,0,0, - 114,120,0,0,0,114,129,0,0,0,114,146,0,0,0,41, - 5,114,103,0,0,0,114,104,0,0,0,114,151,0,0,0, - 114,116,0,0,0,114,153,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,218,18,95,105,110,105,116, - 95,109,111,100,117,108,101,95,97,116,116,114,115,246,1,0, - 0,115,114,0,0,0,20,4,2,1,12,1,14,1,2,1, - 20,2,6,1,8,1,10,2,8,1,4,1,6,1,10,2, - 8,1,6,1,6,11,2,1,10,1,14,1,2,1,20,2, - 2,1,12,1,14,1,2,1,2,2,10,1,14,1,2,1, - 24,2,12,1,2,1,12,1,14,1,2,1,8,2,24,1, - 2,1,12,1,14,1,2,1,24,2,12,1,2,1,10,1, - 4,3,14,254,2,1,8,1,2,254,2,249,2,249,2,249, - 2,251,2,250,2,228,255,128,114,155,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, - 11,0,0,0,114,116,0,0,0,114,156,0,0,0,114,83, - 0,0,0,114,21,0,0,0,114,20,0,0,0,114,155,0, - 0,0,169,2,114,103,0,0,0,114,104,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,218,16,109, - 111,100,117,108,101,95,102,114,111,109,95,115,112,101,99,62, - 2,0,0,115,20,0,0,0,4,3,12,1,14,3,12,1, - 8,1,8,2,10,1,10,1,4,1,255,128,114,159,0,0, + 8,95,95,101,120,105,116,95,95,173,0,0,0,115,4,0, + 0,0,14,1,255,128,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,9,0,0,0,114,8,0,0,0, + 114,1,0,0,0,114,34,0,0,0,114,61,0,0,0,114, + 63,0,0,0,114,5,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,114,57,0,0,0,163,0,0, + 0,115,10,0,0,0,8,0,8,2,8,4,12,4,255,128, + 114,57,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,132, + 0,0,0,116,0,160,1,161,0,1,0,122,110,122,14,116, + 2,124,0,25,0,131,0,125,1,87,0,110,18,4,0,116, + 3,121,130,1,0,1,0,1,0,100,1,125,1,89,0,124, + 1,100,1,117,0,114,106,116,4,100,1,117,0,114,70,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,124,1,83,0,116,0,160,9,161, + 0,1,0,119,0,119,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,54,0,0,0,116,0,160,1,161,0,1,0,122,34,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,100,0,83, + 0,116,0,160,4,161,0,1,0,119,0,114,0,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,38,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, + 20,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,218,2,99,98,198,0,0,0,115,14,0,0,0, + 8,1,2,1,14,4,6,1,2,128,22,2,255,128,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,64, + 0,0,0,114,65,0,0,0,114,66,0,0,0,218,8,75, + 101,121,69,114,114,111,114,114,26,0,0,0,114,55,0,0, + 0,114,23,0,0,0,218,8,95,119,101,97,107,114,101,102, + 114,68,0,0,0,114,67,0,0,0,41,3,114,20,0,0, + 0,114,27,0,0,0,114,69,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,6,0,0,0,114,60,0,0,0,179, + 0,0,0,115,36,0,0,0,8,6,2,1,2,1,14,1, + 12,1,6,1,8,2,8,1,10,1,8,2,12,2,16,11, + 2,128,8,2,4,2,10,254,2,234,255,128,114,60,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,100,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,64,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,124, - 0,106,4,114,84,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,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,108, - 0,0,0,114,109,0,0,0,114,110,0,0,0,114,111,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,20,0,0,0,114,120,0, - 0,0,114,116,0,0,0,114,49,0,0,0,114,130,0,0, - 0,41,2,114,103,0,0,0,114,20,0,0,0,114,5,0, - 0,0,114,5,0,0,0,114,6,0,0,0,114,114,0,0, - 0,79,2,0,0,115,18,0,0,0,20,3,10,1,10,1, - 10,1,14,2,6,2,14,1,16,2,255,128,114,114,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,26,1,0,0,124, - 0,106,0,125,2,116,1,124,2,131,1,143,246,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,160,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,80,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,174,116,11,124,0,106,7,131,1,155,0,100,8,157, - 2,125,3,116,12,160,13,124,3,116,14,161,2,1,0,124, - 0,106,7,160,15,124,2,161,1,1,0,110,12,124,0,106, - 7,160,16,124,1,161,1,1,0,87,0,116,2,106,3,160, - 17,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,17,124,0,106, - 0,161,1,125,1,124,1,116,2,106,3,124,0,106,0,60, - 0,119,0,87,0,100,3,4,0,4,0,131,3,1,0,124, - 1,83,0,49,0,144,1,115,12,119,1,1,0,1,0,1, - 0,89,0,1,0,124,1,83,0,41,9,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,19,0,0,0,78,250,14,109,105,115,115,105, - 110,103,32,108,111,97,100,101,114,84,114,150,0,0,0,114, - 157,0,0,0,250,55,46,101,120,101,99,95,109,111,100,117, - 108,101,40,41,32,110,111,116,32,102,111,117,110,100,59,32, - 102,97,108,108,105,110,103,32,98,97,99,107,32,116,111,32, - 108,111,97,100,95,109,111,100,117,108,101,40,41,41,18,114, - 20,0,0,0,114,54,0,0,0,114,18,0,0,0,114,99, - 0,0,0,114,38,0,0,0,114,49,0,0,0,114,83,0, - 0,0,114,116,0,0,0,114,123,0,0,0,114,155,0,0, - 0,114,11,0,0,0,114,7,0,0,0,114,95,0,0,0, - 114,96,0,0,0,218,13,73,109,112,111,114,116,87,97,114, - 110,105,110,103,218,11,108,111,97,100,95,109,111,100,117,108, - 101,114,157,0,0,0,218,3,112,111,112,41,4,114,103,0, - 0,0,114,104,0,0,0,114,20,0,0,0,114,102,0,0, - 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, - 114,100,0,0,0,96,2,0,0,115,50,0,0,0,6,2, - 10,1,16,1,10,1,12,1,2,1,10,1,10,1,14,1, - 16,2,14,2,12,1,16,1,12,2,14,1,12,2,2,128, - 14,4,14,1,14,255,26,1,4,1,18,128,4,0,255,128, - 114,100,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,18, - 1,0,0,122,18,124,0,106,0,160,1,124,0,106,2,161, - 1,1,0,87,0,110,46,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,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,138,122, - 12,124,0,106,0,124,1,95,7,87,0,110,16,4,0,116, - 8,144,1,121,16,1,0,1,0,1,0,89,0,116,6,124, - 1,100,2,100,0,131,3,100,0,117,0,114,212,122,40,124, - 1,106,9,124,1,95,10,116,11,124,1,100,3,131,2,115, - 192,124,0,106,2,160,12,100,4,161,1,100,5,25,0,124, - 1,95,10,87,0,110,16,4,0,116,8,144,1,121,14,1, - 0,1,0,1,0,89,0,116,6,124,1,100,6,100,0,131, - 3,100,0,117,0,144,1,114,8,122,12,124,0,124,1,95, - 13,87,0,124,1,83,0,4,0,116,8,144,1,121,12,1, - 0,1,0,1,0,89,0,124,1,83,0,124,1,83,0,119, - 0,119,0,119,0,41,7,78,114,106,0,0,0,114,152,0, - 0,0,114,148,0,0,0,114,135,0,0,0,114,25,0,0, - 0,114,113,0,0,0,41,14,114,116,0,0,0,114,164,0, - 0,0,114,20,0,0,0,114,18,0,0,0,114,99,0,0, - 0,114,165,0,0,0,114,13,0,0,0,114,106,0,0,0, - 114,2,0,0,0,114,9,0,0,0,114,152,0,0,0,114, - 11,0,0,0,114,136,0,0,0,114,113,0,0,0,114,158, + 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,18,4,0,116,2,121,52,1,0,1,0,1, + 0,89,0,100,1,83,0,124,1,160,3,161,0,1,0,100, + 1,83,0,119,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,60,0,0,0,114,43, + 0,0,0,114,22,0,0,0,114,44,0,0,0,41,2,114, + 20,0,0,0,114,27,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,218,19,95,108,111,99,107,95, + 117,110,108,111,99,107,95,109,111,100,117,108,101,216,0,0, + 0,115,16,0,0,0,8,6,2,1,12,1,12,1,6,3, + 12,2,2,251,255,128,114,72,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,2,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,78,114,5,0, + 0,0,41,3,218,1,102,114,62,0,0,0,90,4,107,119, + 100,115,114,5,0,0,0,114,5,0,0,0,114,6,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,233,0,0,0, + 115,4,0,0,0,14,8,255,128,114,74,0,0,0,114,42, + 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,58,0,0,0,116,0, + 106,1,106,2,124,1,107,5,114,54,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,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,18,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,50, + 0,0,0,218,6,115,116,100,101,114,114,41,3,218,7,109, + 101,115,115,97,103,101,114,75,0,0,0,114,62,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,218, + 16,95,118,101,114,98,111,115,101,95,109,101,115,115,97,103, + 101,244,0,0,0,115,12,0,0,0,12,2,10,1,8,1, + 24,1,4,253,255,128,114,83,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,243,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,4,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,19, + 0,0,0,41,4,114,18,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,50,0, + 0,0,169,2,114,33,0,0,0,218,8,102,117,108,108,110, + 97,109,101,169,1,218,3,102,120,110,114,5,0,0,0,114, + 6,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,254, + 0,0,0,243,12,0,0,0,10,1,10,1,2,1,6,255, + 10,2,255,128,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,78,169,1,114,17,0, + 0,0,41,2,114,91,0,0,0,114,92,0,0,0,114,5, + 0,0,0,114,90,0,0,0,114,6,0,0,0,218,17,95, + 114,101,113,117,105,114,101,115,95,98,117,105,108,116,105,110, + 252,0,0,0,243,8,0,0,0,12,2,10,5,4,1,255, + 128,114,95,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,114, + 84,0,0,0,41,4,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,19,0,0,0, + 41,4,114,64,0,0,0,218,9,105,115,95,102,114,111,122, + 101,110,114,87,0,0,0,114,50,0,0,0,114,88,0,0, + 0,114,90,0,0,0,114,5,0,0,0,114,6,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,9,1,0,0,114,93, + 0,0,0,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,78,114,94,0,0,0,41,2,114, + 91,0,0,0,114,99,0,0,0,114,5,0,0,0,114,90, + 0,0,0,114,6,0,0,0,218,16,95,114,101,113,117,105, + 114,101,115,95,102,114,111,122,101,110,7,1,0,0,114,96, + 0,0,0,114,100,0,0,0,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,74,0,0,0,100,1,125,2,116,0,160,1,124,2, + 116,2,161,2,1,0,116,3,124,1,124,0,131,2,125,3, + 124,1,116,4,106,5,118,0,114,66,116,4,106,5,124,1, + 25,0,125,4,116,6,124,3,124,4,131,2,1,0,116,4, + 106,5,124,1,25,0,83,0,116,7,124,3,131,1,83,0, + 41,3,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,122,103,116,104,101,32,108,111,97,100,95,109, + 111,100,117,108,101,40,41,32,109,101,116,104,111,100,32,105, + 115,32,100,101,112,114,101,99,97,116,101,100,32,97,110,100, + 32,115,108,97,116,101,100,32,102,111,114,32,114,101,109,111, + 118,97,108,32,105,110,32,80,121,116,104,111,110,32,51,46, + 49,50,59,32,117,115,101,32,101,120,101,99,95,109,111,100, + 117,108,101,40,41,32,105,110,115,116,101,97,100,78,41,8, + 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,16,115,112,101,99,95,102,114,111,109, + 95,108,111,97,100,101,114,114,18,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,5,114,33,0,0,0,114,89,0,0,0,218, + 3,109,115,103,218,4,115,112,101,99,218,6,109,111,100,117, + 108,101,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,218,17,95,108,111,97,100,95,109,111,100,117,108,101,95, + 115,104,105,109,19,1,0,0,115,18,0,0,0,4,6,12, + 2,10,1,10,1,10,1,10,1,10,1,8,2,255,128,114, + 111,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,206,0, + 0,0,116,0,124,0,100,1,100,0,131,3,125,1,116,1, + 124,1,100,2,131,2,114,50,122,12,124,1,160,2,124,0, + 161,1,87,0,83,0,4,0,116,3,121,204,1,0,1,0, + 1,0,89,0,122,10,124,0,106,4,125,2,87,0,110,16, + 4,0,116,5,121,202,1,0,1,0,1,0,89,0,110,16, + 124,2,100,0,117,1,114,94,116,6,124,2,131,1,83,0, + 122,10,124,0,106,7,125,3,87,0,110,18,4,0,116,5, + 121,200,1,0,1,0,1,0,100,3,125,3,89,0,122,10, + 124,0,106,8,125,4,87,0,110,50,4,0,116,5,121,198, + 1,0,1,0,1,0,124,1,100,0,117,0,114,170,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,100,6,160,9, + 124,3,124,4,161,2,83,0,119,0,119,0,119,0,119,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, + 13,0,0,0,114,11,0,0,0,114,113,0,0,0,218,9, + 69,120,99,101,112,116,105,111,110,218,8,95,95,115,112,101, + 99,95,95,114,2,0,0,0,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,9,0,0,0,218,8,95,95,102,105,108,101,95,95,114, + 50,0,0,0,41,5,114,110,0,0,0,218,6,108,111,97, + 100,101,114,114,109,0,0,0,114,20,0,0,0,218,8,102, + 105,108,101,110,97,109,101,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,218,12,95,109,111,100,117,108,101,95, + 114,101,112,114,38,1,0,0,115,56,0,0,0,12,2,10, + 1,2,4,12,1,12,1,2,1,2,1,10,1,12,1,4, + 1,8,2,8,1,2,4,10,1,12,1,6,1,2,1,10, + 1,12,1,8,1,14,1,16,2,12,2,2,250,2,252,2, + 246,2,252,255,128,114,124,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,41,2,78,70,41,7,114,20,0,0, + 0,114,122,0,0,0,114,126,0,0,0,114,127,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,33,0,0,0,114,20,0,0,0, + 114,122,0,0,0,114,126,0,0,0,114,127,0,0,0,114, + 128,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,114,34,0,0,0,111,1,0,0,115,16,0,0, + 0,6,2,6,1,6,1,6,1,14,1,6,3,10,1,255, + 128,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, + 50,0,0,0,114,20,0,0,0,114,122,0,0,0,114,126, + 0,0,0,218,6,97,112,112,101,110,100,114,129,0,0,0, + 218,9,95,95,99,108,97,115,115,95,95,114,9,0,0,0, + 218,4,106,111,105,110,41,2,114,33,0,0,0,114,62,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,114,53,0,0,0,123,1,0,0,115,22,0,0,0,10, + 1,10,1,4,255,10,2,18,1,10,1,8,1,4,1,6, + 255,22,2,255,128,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,102,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,119,0,114,0, + 0,0,0,41,8,114,129,0,0,0,114,20,0,0,0,114, + 122,0,0,0,114,126,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, + 2,0,0,0,218,14,78,111,116,73,109,112,108,101,109,101, + 110,116,101,100,41,3,114,33,0,0,0,90,5,111,116,104, + 101,114,90,4,115,109,115,108,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,218,6,95,95,101,113,95,95,133, + 1,0,0,115,34,0,0,0,6,1,2,1,12,1,10,1, + 2,255,10,2,2,254,8,3,2,253,10,4,2,252,10,5, + 4,251,12,6,8,1,2,255,255,128,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,0,0,0,0,41,6,114,131,0,0, + 0,114,126,0,0,0,114,130,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,52,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,114,135,0,0,0,145,1,0,0,115, + 14,0,0,0,10,2,16,1,8,1,4,1,14,1,6,1, + 255,128,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,0,0, + 0,0,41,1,114,131,0,0,0,41,2,114,33,0,0,0, + 114,135,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 6,0,0,0,114,135,0,0,0,154,1,0,0,115,4,0, + 0,0,10,2,255,128,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, + 32,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,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,25,0,0, + 0,41,3,114,129,0,0,0,114,20,0,0,0,218,10,114, + 112,97,114,116,105,116,105,111,110,114,52,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,218,6,112, + 97,114,101,110,116,158,1,0,0,115,8,0,0,0,10,3, + 16,1,6,2,255,128,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,0,0, + 0,0,41,1,114,130,0,0,0,114,52,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,114,136,0, + 0,0,166,1,0,0,115,4,0,0,0,6,2,255,128,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,0,0,0,0,41,2,218,4,98,111,111, + 108,114,130,0,0,0,41,2,114,33,0,0,0,218,5,118, + 97,108,117,101,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,114,136,0,0,0,170,1,0,0,115,4,0,0, + 0,14,2,255,128,41,12,114,9,0,0,0,114,8,0,0, + 0,114,1,0,0,0,114,10,0,0,0,114,34,0,0,0, + 114,53,0,0,0,114,138,0,0,0,218,8,112,114,111,112, + 101,114,116,121,114,135,0,0,0,218,6,115,101,116,116,101, + 114,114,143,0,0,0,114,136,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, + 125,0,0,0,74,1,0,0,115,36,0,0,0,8,0,4, + 1,4,36,2,1,12,255,8,12,8,10,2,12,10,1,4, + 8,10,1,2,3,10,1,2,7,10,1,4,3,14,1,255, + 128,114,125,0,0,0,169,2,114,126,0,0,0,114,128,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,150,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,132,116,0,124,1,100,5,131,2,114,128,122,14,124,1, + 160,4,124,0,161,1,125,3,87,0,110,24,4,0,116,5, + 121,148,1,0,1,0,1,0,100,2,125,3,89,0,110,4, + 100,6,125,3,116,6,124,0,124,1,124,2,124,3,100,7, + 141,4,83,0,119,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,122,0,0,0,41,2,114,122,0,0,0,114,129,0,0, + 0,114,128,0,0,0,70,114,148,0,0,0,41,7,114,11, + 0,0,0,114,139,0,0,0,114,140,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,128,0,0,0,114,87,0,0,0, + 114,125,0,0,0,41,6,114,20,0,0,0,114,122,0,0, + 0,114,126,0,0,0,114,128,0,0,0,114,149,0,0,0, + 90,6,115,101,97,114,99,104,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,114,104,0,0,0,175,1,0,0, + 115,40,0,0,0,10,2,8,1,4,1,6,1,8,2,12, + 1,12,1,6,1,2,1,6,255,8,3,10,1,2,1,14, + 1,12,1,8,1,4,3,16,2,2,250,255,128,114,104,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,44,1,0,0, + 122,10,124,0,106,0,125,3,87,0,110,18,4,0,116,1, + 144,1,121,42,1,0,1,0,1,0,89,0,110,12,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,84,122,10,124,0,106,3,125,1, + 87,0,110,16,4,0,116,1,144,1,121,40,1,0,1,0, + 1,0,89,0,122,10,124,0,106,4,125,5,87,0,110,20, + 4,0,116,1,144,1,121,38,1,0,1,0,1,0,100,0, + 125,5,89,0,124,2,100,0,117,0,114,170,124,5,100,0, + 117,0,114,166,122,10,124,1,106,5,125,2,87,0,110,26, + 4,0,116,1,144,1,121,36,1,0,1,0,1,0,100,0, + 125,2,89,0,110,4,124,5,125,2,122,10,124,0,106,6, + 125,6,87,0,110,20,4,0,116,1,144,1,121,34,1,0, + 1,0,1,0,100,0,125,6,89,0,122,14,116,7,124,0, + 106,8,131,1,125,7,87,0,110,20,4,0,116,1,144,1, + 121,32,1,0,1,0,1,0,100,0,125,7,89,0,116,9, + 124,4,124,1,124,2,100,1,141,3,125,3,124,5,100,0, + 117,0,144,1,114,10,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, + 119,0,119,0,119,0,119,0,119,0,119,0,41,4,78,169, + 1,114,126,0,0,0,70,84,41,13,114,119,0,0,0,114, + 2,0,0,0,114,9,0,0,0,114,112,0,0,0,114,121, + 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,125,0,0,0,114,130,0, + 0,0,114,135,0,0,0,114,129,0,0,0,41,8,114,110, + 0,0,0,114,122,0,0,0,114,126,0,0,0,114,109,0, + 0,0,114,20,0,0,0,90,8,108,111,99,97,116,105,111, + 110,114,135,0,0,0,114,129,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,6,0,0,0,218,17,95,115,112,101, + 99,95,102,114,111,109,95,109,111,100,117,108,101,201,1,0, + 0,115,86,0,0,0,2,2,10,1,14,1,4,1,8,2, + 4,1,6,2,8,1,2,1,10,1,14,1,2,2,2,1, + 10,1,14,1,6,1,8,1,8,1,2,1,10,1,14,1, + 8,1,4,2,2,1,10,1,14,1,6,1,2,1,14,1, + 14,1,6,1,14,2,20,1,6,1,6,1,4,1,2,249, + 2,252,2,250,2,250,2,251,2,246,255,128,114,155,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,50, + 122,12,124,0,106,1,124,1,95,2,87,0,110,16,4,0, + 116,3,144,1,121,208,1,0,1,0,1,0,89,0,124,2, + 115,70,116,0,124,1,100,2,100,0,131,3,100,0,117,0, + 114,170,124,0,106,4,125,3,124,3,100,0,117,0,114,142, + 124,0,106,5,100,0,117,1,114,142,116,6,100,0,117,0, + 114,106,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,16,4,0,116,3,144,1,121,206,1,0, + 1,0,1,0,89,0,124,2,115,190,116,0,124,1,100,3, + 100,0,131,3,100,0,117,0,114,220,122,12,124,0,106,13, + 124,1,95,14,87,0,110,16,4,0,116,3,144,1,121,204, + 1,0,1,0,1,0,89,0,122,10,124,0,124,1,95,15, + 87,0,110,16,4,0,116,3,144,1,121,202,1,0,1,0, + 1,0,89,0,124,2,144,1,115,16,116,0,124,1,100,4, + 100,0,131,3,100,0,117,0,144,1,114,58,124,0,106,5, + 100,0,117,1,144,1,114,58,122,12,124,0,106,5,124,1, + 95,16,87,0,110,16,4,0,116,3,144,1,121,200,1,0, + 1,0,1,0,89,0,124,0,106,17,144,1,114,192,124,2, + 144,1,115,90,116,0,124,1,100,5,100,0,131,3,100,0, + 117,0,144,1,114,120,122,12,124,0,106,18,124,1,95,11, + 87,0,110,16,4,0,116,3,144,1,121,198,1,0,1,0, + 1,0,89,0,124,2,144,1,115,144,116,0,124,1,100,6, + 100,0,131,3,100,0,117,0,144,1,114,192,124,0,106,19, + 100,0,117,1,144,1,114,192,122,14,124,0,106,19,124,1, + 95,20,87,0,124,1,83,0,4,0,116,3,144,1,121,196, + 1,0,1,0,1,0,89,0,124,1,83,0,124,1,83,0, + 119,0,119,0,119,0,119,0,119,0,119,0,119,0,41,7, + 78,114,9,0,0,0,114,112,0,0,0,218,11,95,95,112, + 97,99,107,97,103,101,95,95,114,154,0,0,0,114,121,0, + 0,0,114,152,0,0,0,41,21,114,13,0,0,0,114,20, + 0,0,0,114,9,0,0,0,114,2,0,0,0,114,122,0, + 0,0,114,129,0,0,0,114,139,0,0,0,114,140,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,121,0,0,0,114,112,0,0,0,114,143,0, + 0,0,114,158,0,0,0,114,119,0,0,0,114,154,0,0, + 0,114,136,0,0,0,114,126,0,0,0,114,135,0,0,0, + 114,152,0,0,0,41,5,114,109,0,0,0,114,110,0,0, + 0,114,157,0,0,0,114,122,0,0,0,114,159,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,218, + 18,95,105,110,105,116,95,109,111,100,117,108,101,95,97,116, + 116,114,115,246,1,0,0,115,114,0,0,0,20,4,2,1, + 12,1,14,1,2,1,20,2,6,1,8,1,10,2,8,1, + 4,1,6,1,10,2,8,1,6,1,6,11,2,1,10,1, + 14,1,2,1,20,2,2,1,12,1,14,1,2,1,2,2, + 10,1,14,1,2,1,24,2,12,1,2,1,12,1,14,1, + 2,1,8,2,24,1,2,1,12,1,14,1,2,1,24,2, + 12,1,2,1,10,1,4,3,14,254,2,1,8,1,2,254, + 2,249,2,249,2,249,2,251,2,250,2,228,255,128,114,161, + 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,11,0,0,0,114,122,0,0,0,114, + 162,0,0,0,114,87,0,0,0,114,21,0,0,0,114,20, + 0,0,0,114,161,0,0,0,169,2,114,109,0,0,0,114, + 110,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,218,16,109,111,100,117,108,101,95,102,114,111,109, + 95,115,112,101,99,62,2,0,0,115,20,0,0,0,4,3, + 12,1,14,3,12,1,8,1,8,2,10,1,10,1,4,1, + 255,128,114,165,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,100,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,64,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,124,0,106,4,114,84,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,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,114,0,0,0,114,115,0,0,0,114,116, + 0,0,0,114,117,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,20, + 0,0,0,114,126,0,0,0,114,122,0,0,0,114,50,0, + 0,0,114,136,0,0,0,41,2,114,109,0,0,0,114,20, 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,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,126,2,0, - 0,115,66,0,0,0,2,3,18,1,6,1,12,1,14,1, - 12,1,2,1,14,3,12,1,16,1,2,1,12,1,14,1, - 2,1,16,1,2,1,8,4,10,1,18,1,4,128,14,1, - 2,1,18,1,2,1,8,1,4,3,14,254,2,1,8,1, - 2,254,2,251,2,246,255,128,114,166,0,0,0,99,1,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,11,0, - 0,0,67,0,0,0,115,242,0,0,0,124,0,106,0,100, - 0,117,1,114,58,116,1,124,0,106,0,100,1,131,2,115, - 58,116,2,124,0,106,0,131,1,155,0,100,2,157,2,125, - 1,116,3,160,4,124,1,116,5,161,2,1,0,116,6,124, - 0,131,1,83,0,116,7,124,0,131,1,125,2,100,3,124, - 0,95,8,122,158,124,2,116,9,106,10,124,0,106,11,60, - 0,122,52,124,0,106,0,100,0,117,0,114,124,124,0,106, - 12,100,0,117,0,114,122,116,13,100,4,124,0,106,11,100, - 5,141,2,130,1,110,12,124,0,106,0,160,14,124,2,161, - 1,1,0,87,0,110,38,1,0,1,0,1,0,122,14,116, - 9,106,10,124,0,106,11,61,0,87,0,130,0,4,0,116, - 15,121,240,1,0,1,0,1,0,89,0,130,0,116,9,106, - 10,160,16,124,0,106,11,161,1,125,2,124,2,116,9,106, - 10,124,0,106,11,60,0,116,17,100,6,124,0,106,11,124, - 0,106,0,131,3,1,0,87,0,100,7,124,0,95,8,124, - 2,83,0,100,7,124,0,95,8,119,0,119,0,41,8,78, - 114,157,0,0,0,114,162,0,0,0,84,114,161,0,0,0, - 114,19,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,18,114,116,0,0, - 0,114,11,0,0,0,114,7,0,0,0,114,95,0,0,0, - 114,96,0,0,0,114,163,0,0,0,114,166,0,0,0,114, - 159,0,0,0,90,13,95,105,110,105,116,105,97,108,105,122, - 105,110,103,114,18,0,0,0,114,99,0,0,0,114,20,0, - 0,0,114,123,0,0,0,114,83,0,0,0,114,157,0,0, - 0,114,67,0,0,0,114,165,0,0,0,114,80,0,0,0, - 41,3,114,103,0,0,0,114,102,0,0,0,114,104,0,0, + 0,0,114,120,0,0,0,79,2,0,0,115,18,0,0,0, + 20,3,10,1,10,1,10,1,14,2,6,2,14,1,16,2, + 255,128,114,120,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,26,1,0,0,124,0,106,0,125,2,116,1,124,2,131, + 1,143,246,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,160,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,80,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,174,116,11,124,0,106,7,131, + 1,155,0,100,8,157,2,125,3,116,12,160,13,124,3,116, + 14,161,2,1,0,124,0,106,7,160,15,124,2,161,1,1, + 0,110,12,124,0,106,7,160,16,124,1,161,1,1,0,87, + 0,116,2,106,3,160,17,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,17,124,0,106,0,161,1,125,1,124,1,116,2,106, + 3,124,0,106,0,60,0,119,0,87,0,100,3,4,0,4, + 0,131,3,1,0,124,1,83,0,49,0,144,1,115,12,119, + 1,1,0,1,0,1,0,89,0,1,0,124,1,83,0,41, + 9,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,19,0,0,0,78,250, + 14,109,105,115,115,105,110,103,32,108,111,97,100,101,114,84, + 114,156,0,0,0,114,163,0,0,0,250,55,46,101,120,101, + 99,95,109,111,100,117,108,101,40,41,32,110,111,116,32,102, + 111,117,110,100,59,32,102,97,108,108,105,110,103,32,98,97, + 99,107,32,116,111,32,108,111,97,100,95,109,111,100,117,108, + 101,40,41,41,18,114,20,0,0,0,114,57,0,0,0,114, + 18,0,0,0,114,105,0,0,0,114,38,0,0,0,114,50, + 0,0,0,114,87,0,0,0,114,122,0,0,0,114,129,0, + 0,0,114,161,0,0,0,114,11,0,0,0,114,7,0,0, + 0,114,101,0,0,0,114,102,0,0,0,218,13,73,109,112, + 111,114,116,87,97,114,110,105,110,103,218,11,108,111,97,100, + 95,109,111,100,117,108,101,114,163,0,0,0,218,3,112,111, + 112,41,4,114,109,0,0,0,114,110,0,0,0,114,20,0, + 0,0,114,108,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,114,106,0,0,0,96,2,0,0,115, + 50,0,0,0,6,2,10,1,16,1,10,1,12,1,2,1, + 10,1,10,1,14,1,16,2,14,2,12,1,16,1,12,2, + 14,1,12,2,2,128,14,4,14,1,14,255,26,1,4,1, + 18,128,4,0,255,128,114,106,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,18,1,0,0,122,18,124,0,106,0,160, + 1,124,0,106,2,161,1,1,0,87,0,110,46,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,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,138,122,12,124,0,106,0,124,1,95,7,87, + 0,110,16,4,0,116,8,144,1,121,16,1,0,1,0,1, + 0,89,0,116,6,124,1,100,2,100,0,131,3,100,0,117, + 0,114,212,122,40,124,1,106,9,124,1,95,10,116,11,124, + 1,100,3,131,2,115,192,124,0,106,2,160,12,100,4,161, + 1,100,5,25,0,124,1,95,10,87,0,110,16,4,0,116, + 8,144,1,121,14,1,0,1,0,1,0,89,0,116,6,124, + 1,100,6,100,0,131,3,100,0,117,0,144,1,114,8,122, + 12,124,0,124,1,95,13,87,0,124,1,83,0,4,0,116, + 8,144,1,121,12,1,0,1,0,1,0,89,0,124,1,83, + 0,124,1,83,0,119,0,119,0,119,0,41,7,78,114,112, + 0,0,0,114,158,0,0,0,114,154,0,0,0,114,141,0, + 0,0,114,25,0,0,0,114,119,0,0,0,41,14,114,122, + 0,0,0,114,170,0,0,0,114,20,0,0,0,114,18,0, + 0,0,114,105,0,0,0,114,171,0,0,0,114,13,0,0, + 0,114,112,0,0,0,114,2,0,0,0,114,9,0,0,0, + 114,158,0,0,0,114,11,0,0,0,114,142,0,0,0,114, + 119,0,0,0,114,164,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,6,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,126,2,0,0,115,66,0,0,0,2,3,18,1, + 6,1,12,1,14,1,12,1,2,1,14,3,12,1,16,1, + 2,1,12,1,14,1,2,1,16,1,2,1,8,4,10,1, + 18,1,4,128,14,1,2,1,18,1,2,1,8,1,4,3, + 14,254,2,1,8,1,2,254,2,251,2,246,255,128,114,172, + 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,11,0,0,0,67,0,0,0,115,242,0,0, + 0,124,0,106,0,100,0,117,1,114,58,116,1,124,0,106, + 0,100,1,131,2,115,58,116,2,124,0,106,0,131,1,155, + 0,100,2,157,2,125,1,116,3,160,4,124,1,116,5,161, + 2,1,0,116,6,124,0,131,1,83,0,116,7,124,0,131, + 1,125,2,100,3,124,0,95,8,122,158,124,2,116,9,106, + 10,124,0,106,11,60,0,122,52,124,0,106,0,100,0,117, + 0,114,124,124,0,106,12,100,0,117,0,114,122,116,13,100, + 4,124,0,106,11,100,5,141,2,130,1,110,12,124,0,106, + 0,160,14,124,2,161,1,1,0,87,0,110,38,1,0,1, + 0,1,0,122,14,116,9,106,10,124,0,106,11,61,0,87, + 0,130,0,4,0,116,15,121,240,1,0,1,0,1,0,89, + 0,130,0,116,9,106,10,160,16,124,0,106,11,161,1,125, + 2,124,2,116,9,106,10,124,0,106,11,60,0,116,17,100, + 6,124,0,106,11,124,0,106,0,131,3,1,0,87,0,100, + 7,124,0,95,8,124,2,83,0,100,7,124,0,95,8,119, + 0,119,0,41,8,78,114,163,0,0,0,114,168,0,0,0, + 84,114,167,0,0,0,114,19,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,18,114,122,0,0,0,114,11,0,0,0,114,7,0,0, + 0,114,101,0,0,0,114,102,0,0,0,114,169,0,0,0, + 114,172,0,0,0,114,165,0,0,0,90,13,95,105,110,105, + 116,105,97,108,105,122,105,110,103,114,18,0,0,0,114,105, + 0,0,0,114,20,0,0,0,114,129,0,0,0,114,87,0, + 0,0,114,163,0,0,0,114,70,0,0,0,114,171,0,0, + 0,114,83,0,0,0,41,3,114,109,0,0,0,114,108,0, + 0,0,114,110,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,6,0,0,0,218,14,95,108,111,97,100,95,117,110, + 108,111,99,107,101,100,162,2,0,0,115,62,0,0,0,10, + 2,12,2,16,1,12,2,8,1,8,2,6,5,2,1,12, + 1,2,1,10,1,10,1,14,1,2,255,12,4,4,128,6, + 1,2,1,12,1,2,3,12,254,2,1,2,1,14,5,12, + 1,18,1,6,2,4,2,8,254,2,245,255,128,114,173,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,119,1,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,101,99,39,115,32,108,111,97,100,101, + 114,46,10,10,32,32,32,32,84,104,101,32,109,111,100,117, + 108,101,32,105,115,32,110,111,116,32,97,100,100,101,100,32, + 116,111,32,105,116,115,32,112,97,114,101,110,116,46,10,10, + 32,32,32,32,73,102,32,97,32,109,111,100,117,108,101,32, + 105,115,32,97,108,114,101,97,100,121,32,105,110,32,115,121, + 115,46,109,111,100,117,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,57,0,0, + 0,114,20,0,0,0,114,173,0,0,0,169,1,114,109,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,114,107,0,0,0,207,2,0,0,115,8,0,0,0,12, + 9,22,1,20,128,255,128,114,107,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,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,5,100,10,100,11,132,0,131,1,90,10,101,5, + 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,5,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,78,41,3,114,9,0,0,0,114,175,0,0,0,114, + 151,0,0,0,169,1,114,110,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,6,0,0,0,114,113,0,0,0,233, + 2,0,0,115,4,0,0,0,22,7,255,128,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,42,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,169,2,78,114,150,0,0,0,41,4,114,64,0,0, + 0,90,10,105,115,95,98,117,105,108,116,105,110,114,104,0, + 0,0,114,151,0,0,0,169,4,218,3,99,108,115,114,89, + 0,0,0,218,4,112,97,116,104,218,6,116,97,114,103,101, + 116,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, + 218,9,102,105,110,100,95,115,112,101,99,242,2,0,0,115, + 12,0,0,0,8,2,4,1,10,1,16,1,4,2,255,128, + 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,183,0, + 0,0,114,122,0,0,0,41,4,114,180,0,0,0,114,89, + 0,0,0,114,181,0,0,0,114,109,0,0,0,114,5,0, + 0,0,114,5,0,0,0,114,6,0,0,0,218,11,102,105, + 110,100,95,109,111,100,117,108,101,251,2,0,0,115,6,0, + 0,0,12,9,18,1,255,128,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,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,46, + 0,0,0,124,0,106,0,116,1,106,2,118,1,114,34,116, + 3,100,1,160,4,124,0,106,0,161,1,124,0,106,0,100, + 2,141,2,130,1,116,5,116,6,106,7,124,0,131,2,83, + 0,41,4,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,85,0, + 0,0,114,19,0,0,0,78,41,8,114,20,0,0,0,114, + 18,0,0,0,114,86,0,0,0,114,87,0,0,0,114,50, + 0,0,0,114,74,0,0,0,114,64,0,0,0,90,14,99, + 114,101,97,116,101,95,98,117,105,108,116,105,110,114,174,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,114,162,0,0,0,7,3,0,0,115,12,0,0,0,12, + 3,12,1,4,1,6,255,12,2,255,128,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,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,16,0,0,0,116,0,116,1,106,2,124,0, + 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,74,0,0,0,114,64,0,0,0,90, + 12,101,120,101,99,95,98,117,105,108,116,105,110,114,177,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,114,163,0,0,0,15,3,0,0,115,4,0,0,0,16, + 3,255,128,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,243,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,5,0,0,0,169,2,114,180,0,0,0,114,89,0,0, 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, - 218,14,95,108,111,97,100,95,117,110,108,111,99,107,101,100, - 162,2,0,0,115,62,0,0,0,10,2,12,2,16,1,12, - 2,8,1,8,2,6,5,2,1,12,1,2,1,10,1,10, - 1,14,1,2,255,12,4,4,128,6,1,2,1,12,1,2, - 3,12,254,2,1,2,1,14,5,12,1,18,1,6,2,4, - 2,8,254,2,245,255,128,114,167,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, - 119,1,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, - 101,99,39,115,32,108,111,97,100,101,114,46,10,10,32,32, - 32,32,84,104,101,32,109,111,100,117,108,101,32,105,115,32, - 110,111,116,32,97,100,100,101,100,32,116,111,32,105,116,115, - 32,112,97,114,101,110,116,46,10,10,32,32,32,32,73,102, - 32,97,32,109,111,100,117,108,101,32,105,115,32,97,108,114, - 101,97,100,121,32,105,110,32,115,121,115,46,109,111,100,117, - 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,54,0,0,0,114,20,0,0,0, - 114,167,0,0,0,169,1,114,103,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,114,101,0,0,0, - 207,2,0,0,115,8,0,0,0,12,9,22,1,20,128,255, - 128,114,101,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, - 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,5,100,10, - 100,11,132,0,131,1,90,10,101,5,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,5,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,78,41,3,114, - 9,0,0,0,114,169,0,0,0,114,145,0,0,0,169,1, - 114,104,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,114,107,0,0,0,233,2,0,0,115,4,0, - 0,0,22,7,255,128,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,42,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,169,2,78,114, - 144,0,0,0,41,4,114,61,0,0,0,90,10,105,115,95, - 98,117,105,108,116,105,110,114,98,0,0,0,114,145,0,0, - 0,169,4,218,3,99,108,115,114,85,0,0,0,218,4,112, - 97,116,104,218,6,116,97,114,103,101,116,114,5,0,0,0, - 114,5,0,0,0,114,6,0,0,0,218,9,102,105,110,100, - 95,115,112,101,99,242,2,0,0,115,12,0,0,0,8,2, - 4,1,10,1,16,1,4,2,255,128,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, + 218,8,103,101,116,95,99,111,100,101,20,3,0,0,243,4, + 0,0,0,4,4,255,128,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,114,185,0,0,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,5,0,0, + 0,114,186,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,218,10,103,101,116,95,115,111,117,114,99, + 101,26,3,0,0,114,188,0,0,0,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,114, + 185,0,0,0,41,3,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,78,114,5, + 0,0,0,114,186,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,114,128,0,0,0,32,3,0,0, + 114,188,0,0,0,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,9,0,0,0,114, + 8,0,0,0,114,1,0,0,0,114,10,0,0,0,114,151, + 0,0,0,218,12,115,116,97,116,105,99,109,101,116,104,111, + 100,114,113,0,0,0,218,11,99,108,97,115,115,109,101,116, + 104,111,100,114,183,0,0,0,114,184,0,0,0,114,162,0, + 0,0,114,163,0,0,0,114,95,0,0,0,114,187,0,0, + 0,114,189,0,0,0,114,128,0,0,0,114,111,0,0,0, + 114,170,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,114,175,0,0,0,222,2, + 0,0,115,48,0,0,0,8,0,4,2,4,7,2,2,10, + 1,2,8,12,1,2,8,12,1,2,11,10,1,2,7,10, + 1,2,4,2,1,12,1,2,4,2,1,12,1,2,4,2, + 1,12,1,12,4,255,128,114,175,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,5,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,3,114,176,0,0,0,114,166,0,0,0,78,41, + 4,114,50,0,0,0,114,9,0,0,0,114,192,0,0,0, + 114,151,0,0,0,41,1,218,1,109,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,114,113,0,0,0,52,3, + 0,0,115,4,0,0,0,16,7,255,128,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,30,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,114,178,0,0,0,41,4,114,64,0,0,0, + 114,98,0,0,0,114,104,0,0,0,114,151,0,0,0,114, + 179,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,114,183,0,0,0,61,3,0,0,115,8,0,0, + 0,10,2,16,1,4,2,255,128,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,177,0,0,0,114,116,0,0, - 0,41,4,114,174,0,0,0,114,85,0,0,0,114,175,0, - 0,0,114,103,0,0,0,114,5,0,0,0,114,5,0,0, - 0,114,6,0,0,0,218,11,102,105,110,100,95,109,111,100, - 117,108,101,251,2,0,0,115,6,0,0,0,12,9,18,1, - 255,128,122,27,66,117,105,108,116,105,110,73,109,112,111,114, + 32,32,32,32,78,41,2,114,64,0,0,0,114,98,0,0, + 0,41,3,114,180,0,0,0,114,89,0,0,0,114,181,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, + 0,114,184,0,0,0,68,3,0,0,115,4,0,0,0,18, + 7,255,128,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, 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,46,0,0,0,124,0,106, - 0,116,1,106,2,118,1,114,34,116,3,100,1,160,4,124, - 0,106,0,161,1,124,0,106,0,100,2,141,2,130,1,116, - 5,116,6,106,7,124,0,131,2,83,0,41,4,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,81,0,0,0,114,19,0,0, - 0,78,41,8,114,20,0,0,0,114,18,0,0,0,114,82, - 0,0,0,114,83,0,0,0,114,49,0,0,0,114,71,0, - 0,0,114,61,0,0,0,90,14,99,114,101,97,116,101,95, - 98,117,105,108,116,105,110,114,168,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,114,156,0,0,0, - 7,3,0,0,115,12,0,0,0,12,3,12,1,4,1,6, - 255,12,2,255,128,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,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,16,0, - 0,0,116,0,116,1,106,2,124,0,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, - 71,0,0,0,114,61,0,0,0,90,12,101,120,101,99,95, - 98,117,105,108,116,105,110,114,171,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,114,157,0,0,0, - 15,3,0,0,115,4,0,0,0,16,3,255,128,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,5,0,0,0,169, - 2,114,174,0,0,0,114,85,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,6,0,0,0,218,8,103,101,116,95, - 99,111,100,101,20,3,0,0,115,4,0,0,0,4,4,255, - 128,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,5,0,0,0,114, - 179,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, - 0,0,0,218,10,103,101,116,95,115,111,117,114,99,101,26, - 3,0,0,115,4,0,0,0,4,4,255,128,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,3,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,78,114,5,0,0,0,114,179,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,114,122,0, - 0,0,32,3,0,0,115,4,0,0,0,4,4,255,128,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,9,0,0,0,114,8,0,0,0,114,1, - 0,0,0,114,10,0,0,0,114,145,0,0,0,218,12,115, - 116,97,116,105,99,109,101,116,104,111,100,114,107,0,0,0, - 218,11,99,108,97,115,115,109,101,116,104,111,100,114,177,0, - 0,0,114,178,0,0,0,114,156,0,0,0,114,157,0,0, - 0,114,90,0,0,0,114,180,0,0,0,114,181,0,0,0, - 114,122,0,0,0,114,105,0,0,0,114,164,0,0,0,114, - 5,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, - 0,0,0,114,169,0,0,0,222,2,0,0,115,48,0,0, - 0,8,0,4,2,4,7,2,2,10,1,2,8,12,1,2, - 8,12,1,2,11,10,1,2,7,10,1,2,4,2,1,12, - 1,2,4,2,1,12,1,2,4,2,1,12,1,12,4,255, - 128,114,169,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,5,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,3,114,170, - 0,0,0,114,160,0,0,0,78,41,4,114,49,0,0,0, - 114,9,0,0,0,114,184,0,0,0,114,145,0,0,0,41, - 1,218,1,109,114,5,0,0,0,114,5,0,0,0,114,6, - 0,0,0,114,107,0,0,0,52,3,0,0,115,4,0,0, - 0,16,7,255,128,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,30,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,114,172, - 0,0,0,41,4,114,61,0,0,0,114,92,0,0,0,114, - 98,0,0,0,114,145,0,0,0,114,173,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,114,177,0, - 0,0,61,3,0,0,115,8,0,0,0,10,2,16,1,4, - 2,255,128,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,61,0,0,0,114,92,0,0,0,41,3,114,174,0, - 0,0,114,85,0,0,0,114,175,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,114,178,0,0,0, - 68,3,0,0,115,4,0,0,0,18,7,255,128,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,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,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,5,0,0,0,114, - 168,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, - 0,0,0,114,156,0,0,0,77,3,0,0,115,4,0,0, - 0,4,0,255,128,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,91,0,0,0,41,10,114,113,0,0,0,114,20,0, - 0,0,114,61,0,0,0,114,92,0,0,0,114,83,0,0, - 0,114,49,0,0,0,114,71,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,14,0,0,0,41,3,114,104,0,0,0, - 114,20,0,0,0,218,4,99,111,100,101,114,5,0,0,0, - 114,5,0,0,0,114,6,0,0,0,114,157,0,0,0,81, - 3,0,0,115,16,0,0,0,8,2,10,1,10,1,2,1, - 6,255,12,2,16,1,255,128,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,2,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,78, - 41,1,114,105,0,0,0,114,179,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,114,164,0,0,0, - 90,3,0,0,115,4,0,0,0,10,8,255,128,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,2,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,78,41,2,114,61,0,0,0,114,186,0,0,0,114, - 179,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, - 0,0,0,114,180,0,0,0,100,3,0,0,115,4,0,0, - 0,10,4,255,128,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,5,0,0,0, - 114,179,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,114,181,0,0,0,106,3,0,0,115,4,0, - 0,0,4,4,255,128,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,2,122,46,82,101,116, + 1,0,0,0,67,0,0,0,114,185,0,0,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,5,0,0, + 0,114,174,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,114,162,0,0,0,77,3,0,0,115,4, + 0,0,0,4,0,255,128,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,97,0,0,0,41,10,114,119,0,0,0,114, + 20,0,0,0,114,64,0,0,0,114,98,0,0,0,114,87, + 0,0,0,114,50,0,0,0,114,74,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,14,0,0,0,41,3,114,110,0, + 0,0,114,20,0,0,0,218,4,99,111,100,101,114,5,0, + 0,0,114,5,0,0,0,114,6,0,0,0,114,163,0,0, + 0,81,3,0,0,115,16,0,0,0,8,2,10,1,10,1, + 2,1,6,255,12,2,16,1,255,128,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,2, + 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,78,41,1,114,111,0,0,0,114,186,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,114,170,0, + 0,0,90,3,0,0,115,4,0,0,0,10,8,255,128,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,243,10,0,0,0,116,0,160,1,124,1,161, + 1,83,0,41,2,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,78,41,2,114,64,0,0,0,114,194,0,0, + 0,114,186,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,114,187,0,0,0,100,3,0,0,243,4, + 0,0,0,10,4,255,128,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,114,185,0,0,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,5,0,0,0,114,186, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,6,0, + 0,0,114,189,0,0,0,106,3,0,0,114,188,0,0,0, + 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,114,197,0,0,0,41,2,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,78,41,2,114,61, + 32,97,32,112,97,99,107,97,103,101,46,78,41,2,114,64, 0,0,0,90,17,105,115,95,102,114,111,122,101,110,95,112, - 97,99,107,97,103,101,114,179,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,6,0,0,0,114,122,0,0,0,112, - 3,0,0,115,4,0,0,0,10,4,255,128,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,9,0,0,0,114,8,0,0,0,114,1,0,0,0,114, - 10,0,0,0,114,145,0,0,0,114,182,0,0,0,114,107, - 0,0,0,114,183,0,0,0,114,177,0,0,0,114,178,0, - 0,0,114,156,0,0,0,114,157,0,0,0,114,164,0,0, - 0,114,94,0,0,0,114,180,0,0,0,114,181,0,0,0, - 114,122,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,114,184,0,0,0,41,3, - 0,0,115,50,0,0,0,8,0,4,2,4,7,2,2,10, - 1,2,8,12,1,2,6,12,1,2,8,10,1,2,3,10, - 1,2,8,10,1,2,9,2,1,12,1,2,4,2,1,12, - 1,2,4,2,1,16,1,255,128,114,184,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,61,0,0,0,114,62,0,0,0,114,51,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,114, - 58,0,0,0,125,3,0,0,115,4,0,0,0,12,2,255, - 128,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, + 97,99,107,97,103,101,114,186,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,6,0,0,0,114,128,0,0,0,112, + 3,0,0,114,198,0,0,0,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,9,0,0, + 0,114,8,0,0,0,114,1,0,0,0,114,10,0,0,0, + 114,151,0,0,0,114,190,0,0,0,114,113,0,0,0,114, + 191,0,0,0,114,183,0,0,0,114,184,0,0,0,114,162, + 0,0,0,114,163,0,0,0,114,170,0,0,0,114,100,0, + 0,0,114,187,0,0,0,114,189,0,0,0,114,128,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,114,192,0,0,0,41,3,0,0,115,50, + 0,0,0,8,0,4,2,4,7,2,2,10,1,2,8,12, + 1,2,6,12,1,2,8,10,1,2,3,10,1,2,8,10, + 1,2,9,2,1,12,1,2,4,2,1,12,1,2,4,2, + 1,16,1,255,128,114,192,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,243,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,64,0, + 0,0,114,65,0,0,0,114,52,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,6,0,0,0,114,61,0,0,0, + 125,3,0,0,243,4,0,0,0,12,2,255,128,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,114,200,0,0,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,61,0,0, - 0,114,64,0,0,0,41,4,114,33,0,0,0,218,8,101, + 99,101,112,116,105,111,110,115,46,78,41,2,114,64,0,0, + 0,114,67,0,0,0,41,4,114,33,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,5,0,0,0,114,5,0,0,0,114,6,0,0,0, - 114,60,0,0,0,129,3,0,0,115,4,0,0,0,12,2, - 255,128,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,9,0,0,0,114,8,0,0,0,114,1,0,0, - 0,114,10,0,0,0,114,58,0,0,0,114,60,0,0,0, - 114,5,0,0,0,114,5,0,0,0,114,5,0,0,0,114, - 6,0,0,0,114,189,0,0,0,121,3,0,0,115,10,0, - 0,0,8,0,4,2,8,2,12,4,255,128,114,189,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, - 7,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,135,0,0,0,114,42,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,25,0,0,0,250,5,123,125,46,123,125,78, - 41,4,218,6,114,115,112,108,105,116,218,3,108,101,110,114, - 83,0,0,0,114,49,0,0,0,41,5,114,20,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,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,218,13,95,114,101, - 115,111,108,118,101,95,110,97,109,101,134,3,0,0,115,12, - 0,0,0,16,2,12,1,8,1,8,1,20,1,255,128,114, - 198,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,0,0,0,0,41,2,114,178,0,0,0, - 114,98,0,0,0,41,4,218,6,102,105,110,100,101,114,114, - 20,0,0,0,114,175,0,0,0,114,116,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,218,17,95, - 102,105,110,100,95,115,112,101,99,95,108,101,103,97,99,121, - 143,3,0,0,115,10,0,0,0,12,3,8,1,4,1,10, - 1,255,128,114,200,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,36,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,144,1,121,34,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,126,89,0,87,0,100,1,4,0,4,0,131,3, - 1,0,113,52,89,0,110,12,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,119,1,1,0,1,0,1,0,89,0, - 1,0,124,7,100,1,117,1,144,1,114,26,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,144,1,121,32,1,0,1,0, - 1,0,124,7,6,0,89,0,2,0,1,0,83,0,124,9, - 100,1,117,0,144,1,114,10,124,7,2,0,1,0,83,0, - 124,9,2,0,1,0,83,0,124,7,2,0,1,0,83,0, - 113,52,100,1,83,0,119,0,119,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,18,0,0,0,218,9,109,101,116,97, - 95,112,97,116,104,114,83,0,0,0,114,95,0,0,0,114, - 96,0,0,0,114,163,0,0,0,114,99,0,0,0,114,189, - 0,0,0,114,177,0,0,0,114,2,0,0,0,114,200,0, - 0,0,114,113,0,0,0,41,10,114,20,0,0,0,114,175, - 0,0,0,114,176,0,0,0,114,201,0,0,0,90,9,105, - 115,95,114,101,108,111,97,100,114,199,0,0,0,114,177,0, - 0,0,114,103,0,0,0,114,104,0,0,0,114,113,0,0, + 114,63,0,0,0,129,3,0,0,114,201,0,0,0,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,9, + 0,0,0,114,8,0,0,0,114,1,0,0,0,114,10,0, + 0,0,114,61,0,0,0,114,63,0,0,0,114,5,0,0, 0,114,5,0,0,0,114,5,0,0,0,114,6,0,0,0, - 218,10,95,102,105,110,100,95,115,112,101,99,152,3,0,0, - 115,66,0,0,0,6,2,8,1,8,2,4,3,12,1,10, - 5,8,1,8,1,2,1,10,1,14,1,12,1,8,1,16, - 1,4,255,12,3,30,128,10,1,18,2,10,1,2,1,10, - 1,14,1,12,4,10,2,8,1,8,2,8,2,2,239,4, - 19,2,243,2,244,255,128,114,202,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,110,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,82,116,0, - 124,1,116,1,131,2,115,70,116,2,100,4,131,1,130,1, - 124,1,115,82,116,6,100,5,131,1,130,1,124,0,115,106, - 124,2,100,2,107,2,114,102,116,5,100,6,131,1,130,1, - 100,7,83,0,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,25,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,49,0, - 0,0,114,3,0,0,0,218,10,86,97,108,117,101,69,114, - 114,111,114,114,83,0,0,0,169,3,114,20,0,0,0,114, - 196,0,0,0,114,197,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,6,0,0,0,218,13,95,115,97,110,105,116, - 121,95,99,104,101,99,107,199,3,0,0,115,26,0,0,0, - 10,2,18,1,8,1,8,1,8,1,10,1,8,1,4,1, - 8,1,12,2,8,1,8,255,255,128,114,208,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,128,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,44,4,0,116,5,144,1,121, - 20,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,116,9,124,0,124,2,131,2,125,6,124, - 6,100,0,117,0,114,164,116,8,116,6,160,7,124,0,161, - 1,124,0,100,4,141,2,130,1,116,10,124,6,131,1,125, - 7,124,3,144,1,114,14,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, - 18,116,11,124,4,124,8,124,7,131,3,1,0,87,0,124, - 7,83,0,4,0,116,5,144,1,121,18,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,124, - 7,83,0,124,7,83,0,119,0,119,0,41,8,78,114,135, - 0,0,0,114,25,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,19,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,136, - 0,0,0,114,18,0,0,0,114,99,0,0,0,114,71,0, - 0,0,114,148,0,0,0,114,2,0,0,0,218,8,95,69, - 82,82,95,77,83,71,114,49,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,202,0,0,0,114,167,0,0,0,114,12,0,0,0,114, - 95,0,0,0,114,96,0,0,0,114,163,0,0,0,41,9, - 114,20,0,0,0,218,7,105,109,112,111,114,116,95,114,175, - 0,0,0,114,137,0,0,0,90,13,112,97,114,101,110,116, - 95,109,111,100,117,108,101,114,102,0,0,0,114,103,0,0, - 0,114,104,0,0,0,90,5,99,104,105,108,100,114,5,0, - 0,0,114,5,0,0,0,114,6,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,218,3,0,0,115,60,0,0,0,4,1, - 14,1,4,1,10,1,10,1,10,2,10,1,10,1,2,1, - 10,1,14,1,16,1,14,1,10,1,8,1,18,1,8,2, - 6,1,10,2,14,1,2,1,14,1,4,4,14,253,16,1, - 14,1,8,1,2,253,2,242,255,128,114,213,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,119,1,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,19,0,0,0,41,9,114,54,0,0, - 0,114,18,0,0,0,114,99,0,0,0,114,38,0,0,0, - 218,14,95,78,69,69,68,83,95,76,79,65,68,73,78,71, - 114,213,0,0,0,114,49,0,0,0,114,211,0,0,0,114, - 69,0,0,0,41,4,114,20,0,0,0,114,212,0,0,0, - 114,104,0,0,0,114,79,0,0,0,114,5,0,0,0,114, - 5,0,0,0,114,6,0,0,0,218,14,95,102,105,110,100, - 95,97,110,100,95,108,111,97,100,253,3,0,0,115,28,0, - 0,0,10,2,14,1,8,1,24,1,14,255,16,128,8,3, - 4,1,2,1,4,255,12,2,8,2,4,1,255,128,114,215, - 0,0,0,114,25,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,3,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,25,0,0,0,78,41, - 4,114,208,0,0,0,114,198,0,0,0,114,215,0,0,0, - 218,11,95,103,99,100,95,105,109,112,111,114,116,114,207,0, - 0,0,114,5,0,0,0,114,5,0,0,0,114,6,0,0, - 0,114,216,0,0,0,13,4,0,0,115,10,0,0,0,12, - 9,8,1,12,1,10,1,255,128,114,216,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,218,0,0,0,124,1,68,0,93,206,125, - 4,116,0,124,4,116,1,131,2,115,64,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,124,4,100,5,107,2,114, - 106,124,3,115,104,116,5,124,0,100,6,131,2,114,104,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,210,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, - 216,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,117,1,114,200,87,0,89,0,100,10,125,7,126,7,113, - 4,130,0,100,10,125,7,126,7,119,1,113,4,124,0,83, - 0,119,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,217,0,0,0,114,193, - 0,0,0,78,41,16,114,203,0,0,0,114,204,0,0,0, - 114,9,0,0,0,114,205,0,0,0,114,3,0,0,0,114, - 11,0,0,0,218,16,95,104,97,110,100,108,101,95,102,114, - 111,109,108,105,115,116,114,220,0,0,0,114,49,0,0,0, - 114,71,0,0,0,114,211,0,0,0,114,20,0,0,0,114, - 18,0,0,0,114,99,0,0,0,114,38,0,0,0,114,214, - 0,0,0,41,8,114,104,0,0,0,218,8,102,114,111,109, - 108,105,115,116,114,212,0,0,0,114,218,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,5,0,0,0,114,5,0, - 0,0,114,6,0,0,0,114,221,0,0,0,28,4,0,0, - 115,58,0,0,0,8,10,10,1,4,1,12,1,4,2,10, - 1,8,1,8,255,8,2,14,1,10,1,2,1,6,255,2, - 128,10,2,14,1,2,1,14,1,14,1,10,4,16,1,2, - 255,12,2,2,1,8,128,2,245,4,12,2,248,255,128,114, - 221,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, - 152,0,0,0,114,113,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,9,0,0,0,114,148,0,0,0,114,135,0, - 0,0,114,25,0,0,0,41,6,114,38,0,0,0,114,137, - 0,0,0,114,95,0,0,0,114,96,0,0,0,114,163,0, - 0,0,114,136,0,0,0,41,3,218,7,103,108,111,98,97, - 108,115,114,196,0,0,0,114,103,0,0,0,114,5,0,0, - 0,114,5,0,0,0,114,6,0,0,0,218,17,95,99,97, - 108,99,95,95,95,112,97,99,107,97,103,101,95,95,65,4, - 0,0,115,44,0,0,0,10,7,10,1,8,1,18,1,6, - 1,2,1,4,255,4,1,6,255,4,2,6,254,4,3,8, - 1,6,1,6,2,4,2,6,254,8,3,8,1,14,1,4, - 1,255,128,114,227,0,0,0,114,5,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,174,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,148,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,116, - 7,124,5,100,4,131,2,114,170,116,8,124,5,124,3,116, - 0,131,3,83,0,124,5,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,25,0,0,0,78,114,135,0, - 0,0,114,148,0,0,0,41,9,114,216,0,0,0,114,227, - 0,0,0,218,9,112,97,114,116,105,116,105,111,110,114,195, - 0,0,0,114,18,0,0,0,114,99,0,0,0,114,9,0, - 0,0,114,11,0,0,0,114,221,0,0,0,41,9,114,20, - 0,0,0,114,226,0,0,0,218,6,108,111,99,97,108,115, - 114,222,0,0,0,114,197,0,0,0,114,104,0,0,0,90, - 8,103,108,111,98,97,108,115,95,114,196,0,0,0,90,7, - 99,117,116,95,111,102,102,114,5,0,0,0,114,5,0,0, - 0,114,6,0,0,0,218,10,95,95,105,109,112,111,114,116, - 95,95,92,4,0,0,115,32,0,0,0,8,11,10,1,16, - 2,8,1,12,1,4,1,8,3,18,1,4,1,4,1,26, - 4,30,3,10,1,12,1,4,2,255,128,114,230,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,169,0,0,0,114,177,0,0,0,114,83, - 0,0,0,114,167,0,0,0,41,2,114,20,0,0,0,114, - 103,0,0,0,114,5,0,0,0,114,5,0,0,0,114,6, - 0,0,0,218,18,95,98,117,105,108,116,105,110,95,102,114, - 111,109,95,110,97,109,101,129,4,0,0,115,10,0,0,0, - 10,1,8,1,12,1,8,1,255,128,114,231,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,98,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,76,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,26,0,0,0,114,95,0,0,0,114,68,0, - 0,0,78,41,15,114,61,0,0,0,114,18,0,0,0,114, - 3,0,0,0,114,99,0,0,0,218,5,105,116,101,109,115, - 114,203,0,0,0,114,82,0,0,0,114,169,0,0,0,114, - 92,0,0,0,114,184,0,0,0,114,149,0,0,0,114,155, - 0,0,0,114,9,0,0,0,114,231,0,0,0,114,12,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,20,0,0,0,114, - 104,0,0,0,114,116,0,0,0,114,103,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,5,0,0,0,114,5, - 0,0,0,114,6,0,0,0,218,6,95,115,101,116,117,112, - 136,4,0,0,115,42,0,0,0,4,9,4,1,8,3,18, - 1,10,1,10,1,6,1,10,1,6,1,2,2,10,1,10, - 1,2,128,10,3,8,1,10,1,10,1,10,2,14,1,4, - 251,255,128,114,235,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,235,0,0,0,114,18,0,0,0,114,201,0, - 0,0,114,126,0,0,0,114,169,0,0,0,114,184,0,0, - 0,41,2,114,233,0,0,0,114,234,0,0,0,114,5,0, - 0,0,114,5,0,0,0,114,6,0,0,0,218,8,95,105, - 110,115,116,97,108,108,171,4,0,0,115,8,0,0,0,10, - 2,12,2,16,1,255,128,114,236,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,25,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,133,0,0,0, - 114,236,0,0,0,114,18,0,0,0,114,99,0,0,0,114, - 9,0,0,0,41,1,114,237,0,0,0,114,5,0,0,0, - 114,5,0,0,0,114,6,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,179,4,0,0,115,8,0,0,0, - 8,3,4,1,20,1,255,128,114,238,0,0,0,41,2,78, - 78,41,1,78,41,2,78,114,25,0,0,0,41,4,78,78, - 114,5,0,0,0,114,25,0,0,0,41,54,114,10,0,0, - 0,114,7,0,0,0,114,26,0,0,0,114,95,0,0,0, - 114,68,0,0,0,114,133,0,0,0,114,17,0,0,0,114, - 21,0,0,0,114,63,0,0,0,114,37,0,0,0,114,47, - 0,0,0,114,22,0,0,0,114,23,0,0,0,114,53,0, - 0,0,114,54,0,0,0,114,57,0,0,0,114,69,0,0, - 0,114,71,0,0,0,114,80,0,0,0,114,90,0,0,0, - 114,94,0,0,0,114,105,0,0,0,114,118,0,0,0,114, - 119,0,0,0,114,98,0,0,0,114,149,0,0,0,114,155, - 0,0,0,114,159,0,0,0,114,114,0,0,0,114,100,0, - 0,0,114,166,0,0,0,114,167,0,0,0,114,101,0,0, - 0,114,169,0,0,0,114,184,0,0,0,114,189,0,0,0, - 114,198,0,0,0,114,200,0,0,0,114,202,0,0,0,114, - 208,0,0,0,90,15,95,69,82,82,95,77,83,71,95,80, - 82,69,70,73,88,114,210,0,0,0,114,213,0,0,0,218, - 6,111,98,106,101,99,116,114,214,0,0,0,114,215,0,0, - 0,114,216,0,0,0,114,221,0,0,0,114,227,0,0,0, - 114,230,0,0,0,114,231,0,0,0,114,235,0,0,0,114, - 236,0,0,0,114,238,0,0,0,114,5,0,0,0,114,5, - 0,0,0,114,5,0,0,0,114,6,0,0,0,218,8,60, - 109,111,100,117,108,101,62,1,0,0,0,115,106,0,0,0, - 4,0,8,22,4,9,4,1,4,1,4,3,8,3,8,8, - 4,8,4,2,16,3,14,4,14,77,14,21,8,16,8,37, - 8,17,14,11,8,8,8,11,8,12,8,19,14,36,16,101, - 10,26,14,45,8,72,8,17,8,17,8,30,8,36,8,45, - 14,15,14,75,14,80,8,13,8,9,10,9,8,47,4,16, - 8,1,8,2,6,32,8,3,10,16,14,15,8,37,10,27, - 8,37,8,7,8,35,12,8,255,128, + 114,199,0,0,0,121,3,0,0,115,10,0,0,0,8,0, + 4,2,8,2,12,4,255,128,114,199,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,7,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,141,0,0,0,114,42,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, + 25,0,0,0,250,5,123,125,46,123,125,78,41,4,218,6, + 114,115,112,108,105,116,218,3,108,101,110,114,87,0,0,0, + 114,50,0,0,0,41,5,114,20,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,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,218,13,95,114,101,115,111,108,118, + 101,95,110,97,109,101,134,3,0,0,115,12,0,0,0,16, + 2,12,1,8,1,8,1,20,1,255,128,114,210,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,0,0,0,0,41,2,114,184,0,0,0,114,104,0,0, + 0,41,4,218,6,102,105,110,100,101,114,114,20,0,0,0, + 114,181,0,0,0,114,122,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,218,17,95,102,105,110,100, + 95,115,112,101,99,95,108,101,103,97,99,121,143,3,0,0, + 115,10,0,0,0,12,3,8,1,4,1,10,1,255,128,114, + 212,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,36,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,144,1,121,34,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,126, + 89,0,87,0,100,1,4,0,4,0,131,3,1,0,113,52, + 89,0,110,12,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,119,1,1,0,1,0,1,0,89,0,1,0,124,7, + 100,1,117,1,144,1,114,26,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,144,1,121,32,1,0,1,0,1,0,124,7, + 6,0,89,0,2,0,1,0,83,0,124,9,100,1,117,0, + 144,1,114,10,124,7,2,0,1,0,83,0,124,9,2,0, + 1,0,83,0,124,7,2,0,1,0,83,0,113,52,100,1, + 83,0,119,0,119,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,18,0,0,0,218,9,109,101,116,97,95,112,97,116, + 104,114,87,0,0,0,114,101,0,0,0,114,102,0,0,0, + 114,169,0,0,0,114,105,0,0,0,114,199,0,0,0,114, + 183,0,0,0,114,2,0,0,0,114,212,0,0,0,114,119, + 0,0,0,41,10,114,20,0,0,0,114,181,0,0,0,114, + 182,0,0,0,114,213,0,0,0,90,9,105,115,95,114,101, + 108,111,97,100,114,211,0,0,0,114,183,0,0,0,114,109, + 0,0,0,114,110,0,0,0,114,119,0,0,0,114,5,0, + 0,0,114,5,0,0,0,114,6,0,0,0,218,10,95,102, + 105,110,100,95,115,112,101,99,152,3,0,0,115,66,0,0, + 0,6,2,8,1,8,2,4,3,12,1,10,5,8,1,8, + 1,2,1,10,1,14,1,12,1,8,1,16,1,4,255,12, + 3,30,128,10,1,18,2,10,1,2,1,10,1,14,1,12, + 4,10,2,8,1,8,2,8,2,2,239,4,19,2,243,2, + 244,255,128,114,214,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,110,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,82,116,0,124,1,116,1, + 131,2,115,70,116,2,100,4,131,1,130,1,124,1,115,82, + 116,6,100,5,131,1,130,1,124,0,115,106,124,2,100,2, + 107,2,114,102,116,5,100,6,131,1,130,1,100,7,83,0, + 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,25,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,50,0,0,0,114,3, + 0,0,0,218,10,86,97,108,117,101,69,114,114,111,114,114, + 87,0,0,0,169,3,114,20,0,0,0,114,208,0,0,0, + 114,209,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 6,0,0,0,218,13,95,115,97,110,105,116,121,95,99,104, + 101,99,107,199,3,0,0,115,26,0,0,0,10,2,18,1, + 8,1,8,1,8,1,10,1,8,1,4,1,8,1,12,2, + 8,1,8,255,255,128,114,220,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,128,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,44,4,0,116,5,144,1,121,20,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,116,9,124,0,124,2,131,2,125,6,124,6,100,0,117, + 0,114,164,116,8,116,6,160,7,124,0,161,1,124,0,100, + 4,141,2,130,1,116,10,124,6,131,1,125,7,124,3,144, + 1,114,14,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,18,116,11,124, + 4,124,8,124,7,131,3,1,0,87,0,124,7,83,0,4, + 0,116,5,144,1,121,18,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,124,7,83,0,124, + 7,83,0,119,0,119,0,41,8,78,114,141,0,0,0,114, + 25,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,19,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,142,0,0,0,114, + 18,0,0,0,114,105,0,0,0,114,74,0,0,0,114,154, + 0,0,0,114,2,0,0,0,218,8,95,69,82,82,95,77, + 83,71,114,50,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,214,0,0, + 0,114,173,0,0,0,114,12,0,0,0,114,101,0,0,0, + 114,102,0,0,0,114,169,0,0,0,41,9,114,20,0,0, + 0,218,7,105,109,112,111,114,116,95,114,181,0,0,0,114, + 143,0,0,0,90,13,112,97,114,101,110,116,95,109,111,100, + 117,108,101,114,108,0,0,0,114,109,0,0,0,114,110,0, + 0,0,90,5,99,104,105,108,100,114,5,0,0,0,114,5, + 0,0,0,114,6,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,218,3,0,0,115,60,0,0,0,4,1,14,1,4,1, + 10,1,10,1,10,2,10,1,10,1,2,1,10,1,14,1, + 16,1,14,1,10,1,8,1,18,1,8,2,6,1,10,2, + 14,1,2,1,14,1,4,4,14,253,16,1,14,1,8,1, + 2,253,2,242,255,128,114,225,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,119,1,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,19,0,0,0,41,9,114,57,0,0,0,114,18,0, + 0,0,114,105,0,0,0,114,38,0,0,0,218,14,95,78, + 69,69,68,83,95,76,79,65,68,73,78,71,114,225,0,0, + 0,114,50,0,0,0,114,223,0,0,0,114,72,0,0,0, + 41,4,114,20,0,0,0,114,224,0,0,0,114,110,0,0, + 0,114,82,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,6,0,0,0,218,14,95,102,105,110,100,95,97,110,100, + 95,108,111,97,100,253,3,0,0,115,28,0,0,0,10,2, + 14,1,8,1,24,1,14,255,16,128,8,3,4,1,2,1, + 4,255,12,2,8,2,4,1,255,128,114,227,0,0,0,114, + 25,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,3,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,25,0,0,0,78,41,4,114,220,0, + 0,0,114,210,0,0,0,114,227,0,0,0,218,11,95,103, + 99,100,95,105,109,112,111,114,116,114,219,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,6,0,0,0,114,228,0, + 0,0,13,4,0,0,115,10,0,0,0,12,9,8,1,12, + 1,10,1,255,128,114,228,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,218,0,0,0,124,1,68,0,93,206,125,4,116,0,124, + 4,116,1,131,2,115,64,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,124,4,100,5,107,2,114,106,124,3,115, + 104,116,5,124,0,100,6,131,2,114,104,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,210,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,216,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,117,1,114, + 200,87,0,89,0,100,10,125,7,126,7,113,4,130,0,100, + 10,125,7,126,7,119,1,113,4,124,0,83,0,119,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,229,0,0,0,114,205,0,0,0,78, + 41,16,114,215,0,0,0,114,216,0,0,0,114,9,0,0, + 0,114,217,0,0,0,114,3,0,0,0,114,11,0,0,0, + 218,16,95,104,97,110,100,108,101,95,102,114,111,109,108,105, + 115,116,114,232,0,0,0,114,50,0,0,0,114,74,0,0, + 0,114,223,0,0,0,114,20,0,0,0,114,18,0,0,0, + 114,105,0,0,0,114,38,0,0,0,114,226,0,0,0,41, + 8,114,110,0,0,0,218,8,102,114,111,109,108,105,115,116, + 114,224,0,0,0,114,230,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,5,0,0,0,114,5,0,0,0,114,6, + 0,0,0,114,233,0,0,0,28,4,0,0,115,58,0,0, + 0,8,10,10,1,4,1,12,1,4,2,10,1,8,1,8, + 255,8,2,14,1,10,1,2,1,6,255,2,128,10,2,14, + 1,2,1,14,1,14,1,10,4,16,1,2,255,12,2,2, + 1,8,128,2,245,4,12,2,248,255,128,114,233,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,158,0,0,0, + 114,119,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, + 9,0,0,0,114,154,0,0,0,114,141,0,0,0,114,25, + 0,0,0,41,6,114,38,0,0,0,114,143,0,0,0,114, + 101,0,0,0,114,102,0,0,0,114,169,0,0,0,114,142, + 0,0,0,41,3,218,7,103,108,111,98,97,108,115,114,208, + 0,0,0,114,109,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,6,0,0,0,218,17,95,99,97,108,99,95,95, + 95,112,97,99,107,97,103,101,95,95,65,4,0,0,115,44, + 0,0,0,10,7,10,1,8,1,18,1,6,1,2,1,4, + 255,4,1,6,255,4,2,6,254,4,3,8,1,6,1,6, + 2,4,2,6,254,8,3,8,1,14,1,4,1,255,128,114, + 239,0,0,0,114,5,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,174,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, + 148,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,116,7,124,5,100, + 4,131,2,114,170,116,8,124,5,124,3,116,0,131,3,83, + 0,124,5,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,25,0,0,0,78,114,141,0,0,0,114,154, + 0,0,0,41,9,114,228,0,0,0,114,239,0,0,0,218, + 9,112,97,114,116,105,116,105,111,110,114,207,0,0,0,114, + 18,0,0,0,114,105,0,0,0,114,9,0,0,0,114,11, + 0,0,0,114,233,0,0,0,41,9,114,20,0,0,0,114, + 238,0,0,0,218,6,108,111,99,97,108,115,114,234,0,0, + 0,114,209,0,0,0,114,110,0,0,0,90,8,103,108,111, + 98,97,108,115,95,114,208,0,0,0,90,7,99,117,116,95, + 111,102,102,114,5,0,0,0,114,5,0,0,0,114,6,0, + 0,0,218,10,95,95,105,109,112,111,114,116,95,95,92,4, + 0,0,115,32,0,0,0,8,11,10,1,16,2,8,1,12, + 1,4,1,8,3,18,1,4,1,4,1,26,4,30,3,10, + 1,12,1,4,2,255,128,114,242,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,175,0,0,0,114,183,0,0,0,114,87,0,0,0,114, + 173,0,0,0,41,2,114,20,0,0,0,114,109,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,6,0,0,0,218, + 18,95,98,117,105,108,116,105,110,95,102,114,111,109,95,110, + 97,109,101,129,4,0,0,115,10,0,0,0,10,1,8,1, + 12,1,8,1,255,128,114,243,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,98,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,76,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, + 26,0,0,0,114,101,0,0,0,114,71,0,0,0,78,41, + 15,114,64,0,0,0,114,18,0,0,0,114,3,0,0,0, + 114,105,0,0,0,218,5,105,116,101,109,115,114,215,0,0, + 0,114,86,0,0,0,114,175,0,0,0,114,98,0,0,0, + 114,192,0,0,0,114,155,0,0,0,114,161,0,0,0,114, + 9,0,0,0,114,243,0,0,0,114,12,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,20,0,0,0,114,110,0,0,0, + 114,122,0,0,0,114,109,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,5,0,0,0,114,5,0,0,0,114, + 6,0,0,0,218,6,95,115,101,116,117,112,136,4,0,0, + 115,42,0,0,0,4,9,4,1,8,3,18,1,10,1,10, + 1,6,1,10,1,6,1,2,2,10,1,10,1,2,128,10, + 3,8,1,10,1,10,1,10,2,14,1,4,251,255,128,114, + 247,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, + 247,0,0,0,114,18,0,0,0,114,213,0,0,0,114,132, + 0,0,0,114,175,0,0,0,114,192,0,0,0,41,2,114, + 245,0,0,0,114,246,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,6,0,0,0,218,8,95,105,110,115,116,97, + 108,108,171,4,0,0,115,8,0,0,0,10,2,12,2,16, + 1,255,128,114,248,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,25,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,139,0,0,0,114,248,0,0, + 0,114,18,0,0,0,114,105,0,0,0,114,9,0,0,0, + 41,1,114,249,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,6,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,179,4,0,0,115,8,0,0,0,8,3,4,1, + 20,1,255,128,114,250,0,0,0,41,2,78,78,41,1,78, + 41,2,78,114,25,0,0,0,41,4,78,78,114,5,0,0, + 0,114,25,0,0,0,41,54,114,10,0,0,0,114,7,0, + 0,0,114,26,0,0,0,114,101,0,0,0,114,71,0,0, + 0,114,139,0,0,0,114,17,0,0,0,114,21,0,0,0, + 114,66,0,0,0,114,37,0,0,0,114,47,0,0,0,114, + 22,0,0,0,114,23,0,0,0,114,55,0,0,0,114,57, + 0,0,0,114,60,0,0,0,114,72,0,0,0,114,74,0, + 0,0,114,83,0,0,0,114,95,0,0,0,114,100,0,0, + 0,114,111,0,0,0,114,124,0,0,0,114,125,0,0,0, + 114,104,0,0,0,114,155,0,0,0,114,161,0,0,0,114, + 165,0,0,0,114,120,0,0,0,114,106,0,0,0,114,172, + 0,0,0,114,173,0,0,0,114,107,0,0,0,114,175,0, + 0,0,114,192,0,0,0,114,199,0,0,0,114,210,0,0, + 0,114,212,0,0,0,114,214,0,0,0,114,220,0,0,0, + 90,15,95,69,82,82,95,77,83,71,95,80,82,69,70,73, + 88,114,222,0,0,0,114,225,0,0,0,218,6,111,98,106, + 101,99,116,114,226,0,0,0,114,227,0,0,0,114,228,0, + 0,0,114,233,0,0,0,114,239,0,0,0,114,242,0,0, + 0,114,243,0,0,0,114,247,0,0,0,114,248,0,0,0, + 114,250,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,6,0,0,0,218,8,60,109,111,100,117, + 108,101,62,1,0,0,0,115,106,0,0,0,4,0,8,22, + 4,9,4,1,4,1,4,3,8,3,8,8,4,8,4,2, + 16,3,14,4,14,77,14,21,8,16,8,37,8,17,14,11, + 8,8,8,11,8,12,8,19,14,36,16,101,10,26,14,45, + 8,72,8,17,8,17,8,30,8,36,8,45,14,15,14,75, + 14,80,8,13,8,9,10,9,8,47,4,16,8,1,8,2, + 6,32,8,3,10,16,14,15,8,37,10,27,8,37,8,7, + 8,35,12,8,255,128, }; diff --git a/Python/importlib_external.h b/Python/importlib_external.h index bdfdaa1feb8ef..32ed87dab396e 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -87,7 +87,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 83,0,41,1,250,1,58,114,7,0,0,0,41,2,114,5, 0,0,0,218,1,115,114,7,0,0,0,114,7,0,0,0, 114,8,0,0,0,218,9,60,115,101,116,99,111,109,112,62, - 49,0,0,0,115,4,0,0,0,22,0,255,128,114,13,0, + 49,0,0,0,243,4,0,0,0,22,0,255,128,114,13,0, 0,0,41,1,218,3,119,105,110,41,2,90,6,99,121,103, 119,105,110,90,6,100,97,114,119,105,110,99,0,0,0,0, 0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0, @@ -112,29 +112,29 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 218,3,95,111,115,90,7,101,110,118,105,114,111,110,114,7, 0,0,0,169,1,218,3,107,101,121,114,7,0,0,0,114, 8,0,0,0,218,11,95,114,101,108,97,120,95,99,97,115, - 101,66,0,0,0,115,4,0,0,0,20,2,255,128,122,37, + 101,66,0,0,0,243,4,0,0,0,20,2,255,128,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,0,0,0,1,0,0,0,83,0,0,0,243,4, 0,0,0,100,1,83,0,41,3,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,78,114,7,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,21,0,0,0, - 70,0,0,0,115,4,0,0,0,4,2,255,128,41,5,114, - 15,0,0,0,218,8,112,108,97,116,102,111,114,109,218,10, + 0,114,7,0,0,0,114,8,0,0,0,114,22,0,0,0, + 70,0,0,0,243,4,0,0,0,4,2,255,128,41,5,114, + 16,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,21, - 0,0,0,114,7,0,0,0,114,19,0,0,0,114,8,0, + 79,82,77,83,95,83,84,82,95,75,69,89,41,1,114,22, + 0,0,0,114,7,0,0,0,114,20,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,59,0,0,0,115,18,0,0,0,12,1,12, 1,6,1,4,2,12,2,4,7,8,253,4,3,255,128,114, - 26,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 30,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,5,122,42,67,111,110,118,101,114, @@ -145,1892 +145,1879 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 3,105,110,116,218,8,116,111,95,98,121,116,101,115,41,1, 218,1,120,114,7,0,0,0,114,7,0,0,0,114,8,0, 0,0,218,12,95,112,97,99,107,95,117,105,110,116,51,50, - 78,0,0,0,115,4,0,0,0,20,2,255,128,114,33,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,4,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, - 28,0,0,0,114,29,0,0,0,78,169,3,114,4,0,0, - 0,114,30,0,0,0,218,10,102,114,111,109,95,98,121,116, - 101,115,169,1,218,4,100,97,116,97,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,218,14,95,117,110,112,97, - 99,107,95,117,105,110,116,51,50,83,0,0,0,115,6,0, - 0,0,16,2,12,1,255,128,114,38,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,4,122,47,67,111,110,118,101, + 78,0,0,0,114,23,0,0,0,114,37,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,243,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,4,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,32,0,0,0, + 114,33,0,0,0,78,169,3,114,4,0,0,0,114,34,0, + 0,0,218,10,102,114,111,109,95,98,121,116,101,115,169,1, + 218,4,100,97,116,97,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,218,14,95,117,110,112,97,99,107,95,117, + 105,110,116,51,50,83,0,0,0,243,6,0,0,0,16,2, + 12,1,255,128,114,43,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,114,38,0,0,0,41,4,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, - 29,0,0,0,78,114,34,0,0,0,114,36,0,0,0,114, + 33,0,0,0,78,114,39,0,0,0,114,41,0,0,0,114, 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,14, 95,117,110,112,97,99,107,95,117,105,110,116,49,54,88,0, - 0,0,115,6,0,0,0,16,2,12,1,255,128,114,40,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,4,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, - 7,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,114,5,0,0,0,218,4,112,97,114,116,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,218,10,60,108,105, - 115,116,99,111,109,112,62,96,0,0,0,115,8,0,0,0, - 6,0,6,1,14,255,255,128,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,78,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,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,218,10,95,112,97,116,104,95, - 106,111,105,110,94,0,0,0,115,8,0,0,0,10,2,2, - 1,8,255,255,128,114,48,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,86, - 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,5,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,114,3,0,0, - 0,41,1,90,8,109,97,120,115,112,108,105,116,114,10,0, - 0,0,78,41,6,114,4,0,0,0,114,42,0,0,0,218, - 10,114,112,97,114,116,105,116,105,111,110,114,45,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,32,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,11, - 95,112,97,116,104,95,115,112,108,105,116,100,0,0,0,115, - 20,0,0,0,12,2,16,1,8,1,12,1,8,1,18,1, - 12,1,2,254,8,3,255,128,114,55,0,0,0,99,1,0, + 0,0,114,44,0,0,0,114,46,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,4, + 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,7,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,114,5,0,0,0, + 218,4,112,97,114,116,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,218,10,60,108,105,115,116,99,111,109,112, + 62,96,0,0,0,115,8,0,0,0,6,0,6,1,14,255, + 255,128,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,78,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,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,218,10,95,112,97,116,104,95,106,111,105,110,94,0, + 0,0,115,8,0,0,0,10,2,2,1,8,255,255,128,114, + 54,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,86,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,5,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,114,3,0,0,0,41,1,90,8,109, + 97,120,115,112,108,105,116,114,10,0,0,0,78,41,6,114, + 4,0,0,0,114,48,0,0,0,218,10,114,112,97,114,116, + 105,116,105,111,110,114,51,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,36,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,218,11,95,112,97,116,104,95, + 115,112,108,105,116,100,0,0,0,115,20,0,0,0,12,2, + 16,1,8,1,12,1,8,1,18,1,12,1,2,254,8,3, + 255,128,114,61,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, + 2,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,78,41,2,114,19,0,0,0,90,4,115,116,97,116,169, + 1,114,58,0,0,0,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,218,10,95,112,97,116,104,95,115,116,97, + 116,112,0,0,0,115,4,0,0,0,10,7,255,128,114,63, + 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,18,4, + 0,116,1,121,46,1,0,1,0,1,0,89,0,100,1,83, + 0,124,2,106,2,100,2,64,0,124,1,107,2,83,0,119, + 0,41,4,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,78,41,3,114, + 63,0,0,0,218,7,79,83,69,114,114,111,114,218,7,115, + 116,95,109,111,100,101,41,3,114,58,0,0,0,218,4,109, + 111,100,101,90,9,115,116,97,116,95,105,110,102,111,114,7, + 0,0,0,114,7,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,122,0,0,0,115,14,0,0,0,2,2,12,1,12,1, + 6,1,14,1,2,254,255,128,114,67,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,2,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,78,41,2,114,18,0,0,0,90, - 4,115,116,97,116,169,1,114,52,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,218,10,95,112,97, - 116,104,95,115,116,97,116,112,0,0,0,115,4,0,0,0, - 10,7,255,128,114,57,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,18,4,0,116,1,121,46,1,0,1,0,1, - 0,89,0,100,1,83,0,124,2,106,2,100,2,64,0,124, - 1,107,2,83,0,119,0,41,4,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,78,41,3,114,57,0,0,0,218,7,79,83,69,114, - 114,111,114,218,7,115,116,95,109,111,100,101,41,3,114,52, - 0,0,0,218,4,109,111,100,101,90,9,115,116,97,116,95, - 105,110,102,111,114,7,0,0,0,114,7,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,122,0,0,0,115,14,0,0,0, - 2,2,12,1,12,1,6,1,14,1,2,254,255,128,114,61, - 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,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,105,115,102,105,108,101,46,105,0, - 128,0,0,78,41,1,114,61,0,0,0,114,56,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 12,95,112,97,116,104,95,105,115,102,105,108,101,131,0,0, - 0,115,4,0,0,0,10,2,255,128,114,62,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,3,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,78,41,3,114,18,0, - 0,0,218,6,103,101,116,99,119,100,114,61,0,0,0,114, - 56,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,11,95,112,97,116,104,95,105,115,100,105,114, - 136,0,0,0,115,8,0,0,0,4,2,8,1,10,1,255, - 128,114,64,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,4, - 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,3,0,0,0,233,3,0,0,0,78,41,3,114,23,0, - 0,0,114,42,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,56,0, - 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,218,11,95,112,97,116,104,95,105,115,97,98,115,143,0, - 0,0,115,4,0,0,0,26,6,255,128,114,67,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,170, - 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,72,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,119, - 1,1,0,1,0,1,0,89,0,1,0,116,2,160,10,124, - 3,124,0,161,2,1,0,87,0,100,4,83,0,4,0,116, - 11,121,168,1,0,1,0,1,0,122,14,116,2,160,12,124, - 3,161,1,1,0,87,0,130,0,4,0,116,11,121,166,1, - 0,1,0,1,0,89,0,130,0,119,0,119,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,68,0,0,0,90, - 2,119,98,78,41,13,218,6,102,111,114,109,97,116,218,2, - 105,100,114,18,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,58,0,0,0,90,6,117,110,108,105, - 110,107,41,6,114,52,0,0,0,114,37,0,0,0,114,60, - 0,0,0,90,8,112,97,116,104,95,116,109,112,90,2,102, - 100,218,4,102,105,108,101,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,218,13,95,119,114,105,116,101,95,97, - 116,111,109,105,99,152,0,0,0,115,38,0,0,0,16,5, - 6,1,22,1,4,255,2,2,14,3,24,1,16,128,18,1, - 12,1,2,1,12,1,2,3,12,254,2,1,2,1,2,254, - 2,253,255,128,114,77,0,0,0,105,105,13,0,0,114,39, - 0,0,0,114,29,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,119,122,4,46, - 112,121,99,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,10,0,0,0, - 114,3,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,114,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,114,11,0,0,0,114,39,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,18,0,0,0,218,6,102,115,112,97,116,104,114, - 55,0,0,0,114,49,0,0,0,114,15,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,46, - 0,0,0,114,16,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,70,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,67,0,0,0,114, - 48,0,0,0,114,63,0,0,0,114,42,0,0,0,218,6, - 108,115,116,114,105,112,218,8,95,80,89,67,65,67,72,69, - 41,12,114,52,0,0,0,90,14,100,101,98,117,103,95,111, - 118,101,114,114,105,100,101,114,78,0,0,0,218,7,109,101, - 115,115,97,103,101,218,4,104,101,97,100,114,54,0,0,0, - 90,4,98,97,115,101,114,6,0,0,0,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, + 0,0,67,0,0,0,115,10,0,0,0,116,0,124,0,100, + 1,131,2,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,105,115,102,105,108,101,46,105,0,128,0,0,78,41,1, + 114,67,0,0,0,114,62,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,218,12,95,112,97,116,104, + 95,105,115,102,105,108,101,131,0,0,0,243,4,0,0,0, + 10,2,255,128,114,68,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,3,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,78,41,3,114,19,0,0,0,218,6,103,101, + 116,99,119,100,114,67,0,0,0,114,62,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,218,11,95, + 112,97,116,104,95,105,115,100,105,114,136,0,0,0,115,8, + 0,0,0,4,2,8,1,10,1,255,128,114,71,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,4,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,3,0,0,0,233, + 3,0,0,0,78,41,3,114,27,0,0,0,114,48,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,62,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,218,11,95,112,97, + 116,104,95,105,115,97,98,115,143,0,0,0,115,4,0,0, + 0,26,6,255,128,114,74,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,170,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,72,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,119,1,1,0,1,0,1, + 0,89,0,1,0,116,2,160,10,124,3,124,0,161,2,1, + 0,87,0,100,4,83,0,4,0,116,11,121,168,1,0,1, + 0,1,0,122,14,116,2,160,12,124,3,161,1,1,0,87, + 0,130,0,4,0,116,11,121,166,1,0,1,0,1,0,89, + 0,130,0,119,0,119,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,75,0,0,0,90,2,119,98,78,41,13, + 218,6,102,111,114,109,97,116,218,2,105,100,114,19,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, + 64,0,0,0,90,6,117,110,108,105,110,107,41,6,114,58, + 0,0,0,114,42,0,0,0,114,66,0,0,0,90,8,112, + 97,116,104,95,116,109,112,90,2,102,100,218,4,102,105,108, 101,114,7,0,0,0,114,7,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,85,1,0,0,115,74,0,0,0,8,18,6,1, - 2,1,4,255,8,2,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,1, - 8,2,8,1,8,1,8,1,14,1,14,1,12,1,12,1, - 10,9,14,1,28,5,12,1,2,4,4,1,8,1,2,1, - 4,253,12,5,255,128,114,102,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,44,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,176,116,14,100,8,124, - 2,155,2,157,2,131,1,130,1,124,6,100,9,107,2,144, - 1,114,12,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,226,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,12,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,80,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,79,0,0,0,62,2,0,0,0,114,39,0, - 0,0,114,65,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,65,0,0,0,114,39,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,0,0,0,0,41,22,114,15,0,0,0,114,86,0,0, - 0,114,87,0,0,0,114,88,0,0,0,114,18,0,0,0, - 114,85,0,0,0,114,55,0,0,0,114,95,0,0,0,114, - 41,0,0,0,114,42,0,0,0,114,23,0,0,0,114,45, - 0,0,0,114,4,0,0,0,114,97,0,0,0,114,92,0, - 0,0,218,5,99,111,117,110,116,114,51,0,0,0,114,93, - 0,0,0,114,91,0,0,0,218,9,112,97,114,116,105,116, - 105,111,110,114,48,0,0,0,218,15,83,79,85,82,67,69, - 95,83,85,70,70,73,88,69,83,41,10,114,52,0,0,0, - 114,99,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,78,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,7,0,0,0,114,7,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,156,1,0,0,115,62,0,0,0,12,9,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,1,8,255,10,2,8, - 1,14,1,10,1,16,1,10,1,4,1,2,1,8,255,16, - 2,10,1,16,1,14,2,18,1,255,128,114,107,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,122,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,30,4,0,116,4,116,5,102,2, - 121,120,1,0,1,0,1,0,124,0,100,2,100,5,133,2, - 25,0,125,4,89,0,116,6,124,4,131,1,114,116,124,4, - 83,0,124,0,83,0,119,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,0,0,0,0,78,114,79, - 0,0,0,233,253,255,255,255,233,255,255,255,255,90,2,112, - 121,41,7,114,4,0,0,0,114,49,0,0,0,218,5,108, - 111,119,101,114,114,107,0,0,0,114,88,0,0,0,114,92, - 0,0,0,114,62,0,0,0,41,5,218,13,98,121,116,101, - 99,111,100,101,95,112,97,116,104,114,100,0,0,0,114,53, - 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,7,0,0,0, - 114,7,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,196,1,0,0,115, - 24,0,0,0,12,7,4,1,16,1,24,1,4,1,2,1, - 12,1,16,1,14,1,16,1,2,254,255,128,114,113,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,68,0,0,0,124, - 0,160,0,116,1,116,2,131,1,161,1,114,44,122,10,116, - 3,124,0,131,1,87,0,83,0,4,0,116,4,121,66,1, - 0,1,0,1,0,89,0,100,0,83,0,124,0,160,0,116, - 1,116,5,131,1,161,1,114,62,124,0,83,0,100,0,83, - 0,119,0,169,1,78,41,6,218,8,101,110,100,115,119,105, - 116,104,218,5,116,117,112,108,101,114,106,0,0,0,114,102, - 0,0,0,114,88,0,0,0,114,94,0,0,0,41,1,114, - 101,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,11,95,103,101,116,95,99,97,99,104,101,100, - 215,1,0,0,115,20,0,0,0,14,1,2,1,10,1,12, - 1,6,1,14,1,4,1,4,2,2,251,255,128,114,117,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,48,0,0,0, - 122,14,116,0,124,0,131,1,106,1,125,1,87,0,110,18, - 4,0,116,2,121,46,1,0,1,0,1,0,100,1,125,1, - 89,0,124,1,100,2,79,0,125,1,124,1,83,0,119,0, - 41,4,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,68,0,0,0,233,128,0,0, - 0,78,41,3,114,57,0,0,0,114,59,0,0,0,114,58, - 0,0,0,41,2,114,52,0,0,0,114,60,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,10, - 95,99,97,108,99,95,109,111,100,101,227,1,0,0,115,16, - 0,0,0,2,2,14,1,12,1,6,1,8,3,4,1,2, - 251,255,128,114,119,0,0,0,99,1,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,4,0,0,0,3,0,0, - 0,115,52,0,0,0,100,6,135,0,102,1,100,2,100,3, - 132,9,125,1,116,0,100,1,117,1,114,30,116,0,106,1, - 125,2,110,8,100,4,100,5,132,0,125,2,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,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,121, - 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,121,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,7,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,247,1,0,0,115,20,0,0,0,8,1,8, - 1,10,1,4,1,8,1,2,255,2,1,6,255,24,2,255, - 128,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,36,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,75, - 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,218,5,95,119,114,97,112,4,2,0,0,115,12,0, - 0,0,8,1,10,1,18,1,2,128,18,1,255,128,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,2,218, - 10,95,98,111,111,116,115,116,114,97,112,114,138,0,0,0, - 41,3,114,127,0,0,0,114,128,0,0,0,114,138,0,0, - 0,114,7,0,0,0,114,126,0,0,0,114,8,0,0,0, - 218,11,95,99,104,101,99,107,95,110,97,109,101,239,1,0, - 0,115,14,0,0,0,14,8,8,10,8,1,8,2,10,6, - 4,1,255,128,114,140,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,0,0,0,0,41,6,218,11,102,105,110,100,95,108, - 111,97,100,101,114,114,4,0,0,0,114,81,0,0,0,114, - 82,0,0,0,114,70,0,0,0,218,13,73,109,112,111,114, - 116,87,97,114,110,105,110,103,41,5,114,123,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,7,0,0,0,114,7,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,14,2,0,0,115,12,0,0,0,14,10,16,1,4, - 1,22,1,4,1,255,128,114,147,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,28,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,139, - 0,0,0,218,16,95,118,101,114,98,111,115,101,95,109,101, - 115,115,97,103,101,114,122,0,0,0,114,4,0,0,0,218, - 8,69,79,70,69,114,114,111,114,114,38,0,0,0,41,6, - 114,37,0,0,0,114,121,0,0,0,218,11,101,120,99,95, - 100,101,116,97,105,108,115,90,5,109,97,103,105,99,114,98, - 0,0,0,114,16,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,218,13,95,99,108,97,115,115,105, - 102,121,95,112,121,99,31,2,0,0,115,30,0,0,0,12, - 16,8,1,16,1,12,1,16,1,12,1,10,1,12,1,8, - 1,16,1,8,2,16,1,16,1,4,1,255,128,114,156,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,124,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,120,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,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,150,0,0,0,233, - 12,0,0,0,114,27,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,148,0,0,0,78,114,149,0,0,0,41,4,114,38, - 0,0,0,114,139,0,0,0,114,153,0,0,0,114,122,0, - 0,0,41,6,114,37,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,121,0,0,0,114,155,0,0,0,114,98, - 0,0,0,114,7,0,0,0,114,7,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,64,2,0,0,115, - 20,0,0,0,24,19,10,1,12,1,16,1,8,1,22,1, - 2,255,22,2,8,254,255,128,114,160,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, + 218,13,95,119,114,105,116,101,95,97,116,111,109,105,99,152, + 0,0,0,115,38,0,0,0,16,5,6,1,22,1,4,255, + 2,2,14,3,24,1,16,128,18,1,12,1,2,1,12,1, + 2,3,12,254,2,1,2,1,2,254,2,253,255,128,114,84, + 0,0,0,105,105,13,0,0,114,45,0,0,0,114,33,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,119,122,4,46,112,121,99,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,10,0,0,0,114,3,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,114,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, + 114,11,0,0,0,114,45,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,19,0,0, + 0,218,6,102,115,112,97,116,104,114,61,0,0,0,114,55, + 0,0,0,114,16,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,52,0,0,0,114,17,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,77,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,74,0,0,0,114,54,0,0,0,114,70, + 0,0,0,114,48,0,0,0,218,6,108,115,116,114,105,112, + 218,8,95,80,89,67,65,67,72,69,41,12,114,58,0,0, + 0,90,14,100,101,98,117,103,95,111,118,101,114,114,105,100, + 101,114,85,0,0,0,218,7,109,101,115,115,97,103,101,218, + 4,104,101,97,100,114,60,0,0,0,90,4,98,97,115,101, + 114,6,0,0,0,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,7,0,0,0, + 114,7,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,85,1,0, + 0,115,74,0,0,0,8,18,6,1,2,1,4,255,8,2, + 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,1,8,2,8,1,8,1, + 8,1,14,1,14,1,12,1,12,1,10,9,14,1,28,5, + 12,1,2,4,4,1,8,1,2,1,4,253,12,5,255,128, + 114,109,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,44, + 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,176,116,14,100,8,124,2,155,2,157,2,131, + 1,130,1,124,6,100,9,107,2,144,1,114,12,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,226,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,12,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,87,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,86,0, + 0,0,62,2,0,0,0,114,45,0,0,0,114,72,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,72,0,0,0,114,45,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,0,0,0,0,41, + 22,114,16,0,0,0,114,93,0,0,0,114,94,0,0,0, + 114,95,0,0,0,114,19,0,0,0,114,92,0,0,0,114, + 61,0,0,0,114,102,0,0,0,114,47,0,0,0,114,48, + 0,0,0,114,27,0,0,0,114,51,0,0,0,114,4,0, + 0,0,114,104,0,0,0,114,99,0,0,0,218,5,99,111, + 117,110,116,114,57,0,0,0,114,100,0,0,0,114,98,0, + 0,0,218,9,112,97,114,116,105,116,105,111,110,114,54,0, + 0,0,218,15,83,79,85,82,67,69,95,83,85,70,70,73, + 88,69,83,41,10,114,58,0,0,0,114,106,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,85,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,7,0,0, + 0,114,7,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,156,1, + 0,0,115,62,0,0,0,12,9,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,1,8,255,10,2,8,1,14,1,10,1,16, + 1,10,1,4,1,2,1,8,255,16,2,10,1,16,1,14, + 2,18,1,255,128,114,114,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,122,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,30,4,0,116,4,116,5,102,2,121,120,1,0,1,0, + 1,0,124,0,100,2,100,5,133,2,25,0,125,4,89,0, + 116,6,124,4,131,1,114,116,124,4,83,0,124,0,83,0, + 119,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,0,0,0,0,78,114,86,0,0,0,233,253,255, + 255,255,233,255,255,255,255,90,2,112,121,41,7,114,4,0, + 0,0,114,55,0,0,0,218,5,108,111,119,101,114,114,114, + 0,0,0,114,95,0,0,0,114,99,0,0,0,114,68,0, + 0,0,41,5,218,13,98,121,116,101,99,111,100,101,95,112, + 97,116,104,114,107,0,0,0,114,59,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,7,0,0,0,114,7,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,196,1,0,0,115,24,0,0,0,12,7, + 4,1,16,1,24,1,4,1,2,1,12,1,16,1,14,1, + 16,1,2,254,255,128,114,120,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,68,0,0,0,124,0,160,0,116,1,116, + 2,131,1,161,1,114,44,122,10,116,3,124,0,131,1,87, + 0,83,0,4,0,116,4,121,66,1,0,1,0,1,0,89, + 0,100,0,83,0,124,0,160,0,116,1,116,5,131,1,161, + 1,114,62,124,0,83,0,100,0,83,0,119,0,169,1,78, + 41,6,218,8,101,110,100,115,119,105,116,104,218,5,116,117, + 112,108,101,114,113,0,0,0,114,109,0,0,0,114,95,0, + 0,0,114,101,0,0,0,41,1,114,108,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,218,11,95, + 103,101,116,95,99,97,99,104,101,100,215,1,0,0,115,20, + 0,0,0,14,1,2,1,10,1,12,1,6,1,14,1,4, + 1,4,2,2,251,255,128,114,124,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,48,0,0,0,122,14,116,0,124,0, + 131,1,106,1,125,1,87,0,110,18,4,0,116,2,121,46, + 1,0,1,0,1,0,100,1,125,1,89,0,124,1,100,2, + 79,0,125,1,124,1,83,0,119,0,41,4,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,75,0,0,0,233,128,0,0,0,78,41,3,114,63, + 0,0,0,114,65,0,0,0,114,64,0,0,0,41,2,114, + 58,0,0,0,114,66,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,218,10,95,99,97,108,99,95, + 109,111,100,101,227,1,0,0,115,16,0,0,0,2,2,14, + 1,12,1,6,1,8,3,4,1,2,251,255,128,114,126,0, + 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,4,0,0,0,3,0,0,0,115,52,0,0,0, + 100,6,135,0,102,1,100,2,100,3,132,9,125,1,116,0, + 100,1,117,1,114,30,116,0,106,1,125,2,110,8,100,4, + 100,5,132,0,125,2,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,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,128,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,128,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, + 7,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,247,1, + 0,0,115,20,0,0,0,8,1,8,1,10,1,4,1,8, + 1,2,255,2,1,6,255,24,2,255,128,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,36,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,82,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,218,5,95,119, + 114,97,112,4,2,0,0,115,12,0,0,0,8,1,10,1, + 18,1,2,128,18,1,255,128,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,2,218,10,95,98,111,111,116, + 115,116,114,97,112,114,145,0,0,0,41,3,114,134,0,0, + 0,114,135,0,0,0,114,145,0,0,0,114,7,0,0,0, + 114,133,0,0,0,114,8,0,0,0,218,11,95,99,104,101, + 99,107,95,110,97,109,101,239,1,0,0,115,14,0,0,0, + 14,8,8,10,8,1,8,2,10,6,4,1,255,128,114,147, + 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,0,0,0,0, + 41,6,218,11,102,105,110,100,95,108,111,97,100,101,114,114, + 4,0,0,0,114,88,0,0,0,114,89,0,0,0,114,77, + 0,0,0,218,13,73,109,112,111,114,116,87,97,114,110,105, + 110,103,41,5,114,130,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,7,0,0,0,114, + 7,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,14,2,0,0, + 115,12,0,0,0,14,10,16,1,4,1,22,1,4,1,255, + 128,114,154,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,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, - 150,0,0,0,114,149,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,122,0,0, - 0,41,4,114,37,0,0,0,218,11,115,111,117,114,99,101, - 95,104,97,115,104,114,121,0,0,0,114,155,0,0,0,114, - 7,0,0,0,114,7,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,92,2,0,0,115,16,0,0,0,16,17,2,1,8, - 1,4,255,2,2,6,254,4,255,255,128,114,162,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,76,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,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,121,0,0,0,114,52,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,139,0,0,0,114,153,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,122,0,0,0,114, - 70,0,0,0,41,5,114,37,0,0,0,114,121,0,0,0, - 114,111,0,0,0,114,112,0,0,0,218,4,99,111,100,101, - 114,7,0,0,0,114,7,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,116,2,0,0,115,20,0,0,0,10,2,10,1,12, - 1,8,1,12,1,4,1,10,2,4,1,6,255,255,128,114, - 169,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,3,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,0,0,0,0,78,41,6,218, - 9,98,121,116,101,97,114,114,97,121,114,152,0,0,0,218, - 6,101,120,116,101,110,100,114,33,0,0,0,114,164,0,0, - 0,218,5,100,117,109,112,115,41,4,114,168,0,0,0,218, - 5,109,116,105,109,101,114,159,0,0,0,114,37,0,0,0, - 114,7,0,0,0,114,7,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,129,2,0,0,115,14,0,0,0, - 8,2,14,1,14,1,14,1,16,1,4,1,255,128,114,174, - 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,4,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,3,0,0, - 0,114,150,0,0,0,78,41,7,114,170,0,0,0,114,152, - 0,0,0,114,171,0,0,0,114,33,0,0,0,114,4,0, - 0,0,114,164,0,0,0,114,172,0,0,0,41,5,114,168, - 0,0,0,114,161,0,0,0,90,7,99,104,101,99,107,101, - 100,114,37,0,0,0,114,16,0,0,0,114,7,0,0,0, - 114,7,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,139,2,0, - 0,115,16,0,0,0,8,2,12,1,14,1,16,1,10,1, - 16,1,4,1,255,128,114,175,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,124,2,161,1,125,3,116,1,160,5,100,2,100,3,161, - 2,125,4,124,4,160,6,124,0,160,6,124,3,100,1,25, - 0,161,1,161,1,83,0,41,4,122,121,68,101,99,111,100, - 101,32,98,121,116,101,115,32,114,101,112,114,101,115,101,110, - 116,105,110,103,32,115,111,117,114,99,101,32,99,111,100,101, - 32,97,110,100,32,114,101,116,117,114,110,32,116,104,101,32, - 115,116,114,105,110,103,46,10,10,32,32,32,32,85,110,105, - 118,101,114,115,97,108,32,110,101,119,108,105,110,101,32,115, - 117,112,112,111,114,116,32,105,115,32,117,115,101,100,32,105, - 110,32,116,104,101,32,100,101,99,111,100,105,110,103,46,10, - 32,32,32,32,114,0,0,0,0,78,84,41,7,218,8,116, - 111,107,101,110,105,122,101,114,72,0,0,0,90,7,66,121, - 116,101,115,73,79,90,8,114,101,97,100,108,105,110,101,90, - 15,100,101,116,101,99,116,95,101,110,99,111,100,105,110,103, - 90,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,176,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,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,218,13,100,101,99,111,100, - 101,95,115,111,117,114,99,101,150,2,0,0,115,12,0,0, - 0,8,5,12,1,10,1,12,1,20,1,255,128,114,180,0, - 0,0,169,2,114,144,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,117,0,114,58,100,2,125,1,116, - 0,124,2,100,3,131,2,114,56,122,14,124,2,160,1,124, - 0,161,1,125,1,87,0,110,30,4,0,116,2,144,1,121, - 14,1,0,1,0,1,0,89,0,110,12,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, - 146,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,214,122,14,124, - 2,160,13,124,0,161,1,125,7,87,0,110,18,4,0,116, - 2,144,1,121,12,1,0,1,0,1,0,89,0,110,18,124, - 7,114,214,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,119, - 0,119,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,0,0,0,0,41,17,114, - 133,0,0,0,114,183,0,0,0,114,122,0,0,0,114,18, - 0,0,0,114,85,0,0,0,114,139,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,115,0,0,0,114,116,0,0,0,114, - 144,0,0,0,218,9,95,80,79,80,85,76,65,84,69,114, - 186,0,0,0,114,182,0,0,0,114,55,0,0,0,218,6, - 97,112,112,101,110,100,41,9,114,121,0,0,0,90,8,108, - 111,99,97,116,105,111,110,114,144,0,0,0,114,182,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, - 186,0,0,0,90,7,100,105,114,110,97,109,101,114,7,0, - 0,0,114,7,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,167,2,0,0,115,74,0,0,0,8,12, - 4,4,10,1,2,2,14,1,14,1,4,1,2,251,10,7, - 16,8,6,1,8,3,14,1,14,1,10,1,6,1,4,1, - 2,253,4,5,8,3,10,2,2,1,14,1,14,1,4,1, - 4,2,6,1,2,128,6,2,12,1,6,1,12,1,12,1, - 4,2,2,244,2,226,255,128,114,194,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,88,0,0,0,101,0,90,1,100, - 0,90,2,100,1,90,3,100,2,90,4,100,3,90,5,101, - 6,111,30,100,4,101,7,118,0,90,8,101,9,100,5,100, - 6,132,0,131,1,90,10,101,11,100,7,100,8,132,0,131, - 1,90,12,101,11,100,14,100,10,100,11,132,1,131,1,90, - 13,101,11,100,15,100,12,100,13,132,1,131,1,90,14,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,122,6,95,100, - 46,112,121,100,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,50,0, - 0,0,122,16,116,0,160,1,116,0,106,2,124,0,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,0,161,2,6,0,89,0, - 83,0,119,0,114,114,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, - 58,0,0,0,90,18,72,75,69,89,95,76,79,67,65,76, - 95,77,65,67,72,73,78,69,114,19,0,0,0,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,218,14,95,111, - 112,101,110,95,114,101,103,105,115,116,114,121,247,2,0,0, - 115,12,0,0,0,2,2,16,1,12,1,18,1,2,255,255, - 128,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,130,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,60,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,119,1,1,0,1,0,1,0,89,0,1,0,87,0,124, - 5,83,0,4,0,116,9,121,128,1,0,1,0,1,0,89, - 0,100,0,83,0,119,0,41,5,78,122,5,37,100,46,37, - 100,114,39,0,0,0,41,2,114,143,0,0,0,90,11,115, - 121,115,95,118,101,114,115,105,111,110,114,10,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,70,0,0,0,114,15,0,0,0,218,12,118,101,114,115, - 105,111,110,95,105,110,102,111,114,197,0,0,0,114,196,0, - 0,0,90,10,81,117,101,114,121,86,97,108,117,101,114,58, - 0,0,0,41,6,218,3,99,108,115,114,143,0,0,0,90, - 12,114,101,103,105,115,116,114,121,95,107,101,121,114,20,0, - 0,0,90,4,104,107,101,121,218,8,102,105,108,101,112,97, - 116,104,114,7,0,0,0,114,7,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,254,2,0,0,115,30,0,0,0,6,2,8,1, - 6,2,6,1,16,1,6,255,2,2,12,1,26,1,18,128, - 4,3,12,254,6,1,2,255,255,128,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,18,4,0,116,2,121,118,1,0,1,0,1, - 0,89,0,100,0,83,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,112,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,60,100,0,83,0,119,0,41,2,78,114,184,0,0, - 0,41,8,114,204,0,0,0,114,57,0,0,0,114,58,0, - 0,0,114,188,0,0,0,114,115,0,0,0,114,116,0,0, - 0,114,139,0,0,0,218,16,115,112,101,99,95,102,114,111, - 109,95,108,111,97,100,101,114,41,8,114,202,0,0,0,114, - 143,0,0,0,114,52,0,0,0,218,6,116,97,114,103,101, - 116,114,203,0,0,0,114,144,0,0,0,114,193,0,0,0, - 114,191,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,218,9,102,105,110,100,95,115,112,101,99,13, - 3,0,0,115,36,0,0,0,10,2,8,1,4,1,2,1, - 12,1,12,1,6,1,14,1,14,1,6,1,8,1,2,1, - 6,254,8,3,2,252,4,255,2,254,255,128,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,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,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,207,0,0, - 0,114,144,0,0,0,169,4,114,202,0,0,0,114,143,0, - 0,0,114,52,0,0,0,114,191,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,218,11,102,105,110, - 100,95,109,111,100,117,108,101,29,3,0,0,115,10,0,0, - 0,12,7,8,1,6,1,4,2,255,128,122,33,87,105,110, + 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,32,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,146,0,0,0,218,16,95, + 118,101,114,98,111,115,101,95,109,101,115,115,97,103,101,114, + 129,0,0,0,114,4,0,0,0,218,8,69,79,70,69,114, + 114,111,114,114,43,0,0,0,41,6,114,42,0,0,0,114, + 128,0,0,0,218,11,101,120,99,95,100,101,116,97,105,108, + 115,90,5,109,97,103,105,99,114,105,0,0,0,114,17,0, + 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, + 0,218,13,95,99,108,97,115,115,105,102,121,95,112,121,99, + 31,2,0,0,115,30,0,0,0,12,16,8,1,16,1,12, + 1,16,1,12,1,10,1,12,1,8,1,16,1,8,2,16, + 1,16,1,4,1,255,128,114,163,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,124,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,120, + 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,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,157,0,0,0,233,12,0,0,0,114,31, + 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,155,0,0,0, + 78,114,156,0,0,0,41,4,114,43,0,0,0,114,146,0, + 0,0,114,160,0,0,0,114,129,0,0,0,41,6,114,42, + 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,128, + 0,0,0,114,162,0,0,0,114,105,0,0,0,114,7,0, + 0,0,114,7,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,64,2,0,0,115,20,0,0,0,24,19, + 10,1,12,1,16,1,8,1,22,1,2,255,22,2,8,254, + 255,128,114,167,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,157,0,0,0,114,156, + 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,129,0,0,0,41,4,114,42,0, + 0,0,218,11,115,111,117,114,99,101,95,104,97,115,104,114, + 128,0,0,0,114,162,0,0,0,114,7,0,0,0,114,7, + 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,92,2,0,0, + 115,16,0,0,0,16,17,2,1,8,1,4,255,2,2,6, + 254,4,255,255,128,114,169,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,76,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,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,128, + 0,0,0,114,58,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,146,0,0,0,114,160,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,129,0,0,0,114,77,0,0,0,41,5, + 114,42,0,0,0,114,128,0,0,0,114,118,0,0,0,114, + 119,0,0,0,218,4,99,111,100,101,114,7,0,0,0,114, + 7,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,116,2,0,0, + 115,20,0,0,0,10,2,10,1,12,1,8,1,12,1,4, + 1,10,2,4,1,6,255,255,128,114,176,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,3,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,0,0,0,0,78,41,6,218,9,98,121,116,101,97, + 114,114,97,121,114,159,0,0,0,218,6,101,120,116,101,110, + 100,114,37,0,0,0,114,171,0,0,0,218,5,100,117,109, + 112,115,41,4,114,175,0,0,0,218,5,109,116,105,109,101, + 114,166,0,0,0,114,42,0,0,0,114,7,0,0,0,114, + 7,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,129,2,0,0,115,14,0,0,0,8,2,14,1,14,1, + 14,1,16,1,4,1,255,128,114,181,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,4,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,3,0,0,0,114,157,0,0,0, + 78,41,7,114,177,0,0,0,114,159,0,0,0,114,178,0, + 0,0,114,37,0,0,0,114,4,0,0,0,114,171,0,0, + 0,114,179,0,0,0,41,5,114,175,0,0,0,114,168,0, + 0,0,90,7,99,104,101,99,107,101,100,114,42,0,0,0, + 114,17,0,0,0,114,7,0,0,0,114,7,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,139,2,0,0,115,16,0,0,0, + 8,2,12,1,14,1,16,1,10,1,16,1,4,1,255,128, + 114,182,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,124,2,161,1,125, + 3,116,1,160,5,100,2,100,3,161,2,125,4,124,4,160, + 6,124,0,160,6,124,3,100,1,25,0,161,1,161,1,83, + 0,41,4,122,121,68,101,99,111,100,101,32,98,121,116,101, + 115,32,114,101,112,114,101,115,101,110,116,105,110,103,32,115, + 111,117,114,99,101,32,99,111,100,101,32,97,110,100,32,114, + 101,116,117,114,110,32,116,104,101,32,115,116,114,105,110,103, + 46,10,10,32,32,32,32,85,110,105,118,101,114,115,97,108, + 32,110,101,119,108,105,110,101,32,115,117,112,112,111,114,116, + 32,105,115,32,117,115,101,100,32,105,110,32,116,104,101,32, + 100,101,99,111,100,105,110,103,46,10,32,32,32,32,114,0, + 0,0,0,78,84,41,7,218,8,116,111,107,101,110,105,122, + 101,114,79,0,0,0,90,7,66,121,116,101,115,73,79,90, + 8,114,101,97,100,108,105,110,101,90,15,100,101,116,101,99, + 116,95,101,110,99,111,100,105,110,103,90,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,183,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,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,218,13,100,101,99,111,100,101,95,115,111,117,114, + 99,101,150,2,0,0,115,12,0,0,0,8,5,12,1,10, + 1,12,1,20,1,255,128,114,187,0,0,0,169,2,114,151, + 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,117,0,114,58,100,2,125,1,116,0,124,2,100,3,131, + 2,114,56,122,14,124,2,160,1,124,0,161,1,125,1,87, + 0,110,30,4,0,116,2,144,1,121,14,1,0,1,0,1, + 0,89,0,110,12,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,146,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,214,122,14,124,2,160,13,124,0,161, + 1,125,7,87,0,110,18,4,0,116,2,144,1,121,12,1, + 0,1,0,1,0,89,0,110,18,124,7,114,214,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,119,0,119,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,0,0,0,0,41,17,114,140,0,0,0,114,190, + 0,0,0,114,129,0,0,0,114,19,0,0,0,114,92,0, + 0,0,114,146,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, + 122,0,0,0,114,123,0,0,0,114,151,0,0,0,218,9, + 95,80,79,80,85,76,65,84,69,114,193,0,0,0,114,189, + 0,0,0,114,61,0,0,0,218,6,97,112,112,101,110,100, + 41,9,114,128,0,0,0,90,8,108,111,99,97,116,105,111, + 110,114,151,0,0,0,114,189,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,193,0,0,0,90,7, + 100,105,114,110,97,109,101,114,7,0,0,0,114,7,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,167, + 2,0,0,115,74,0,0,0,8,12,4,4,10,1,2,2, + 14,1,14,1,4,1,2,251,10,7,16,8,6,1,8,3, + 14,1,14,1,10,1,6,1,4,1,2,253,4,5,8,3, + 10,2,2,1,14,1,14,1,4,1,4,2,6,1,2,128, + 6,2,12,1,6,1,12,1,12,1,4,2,2,244,2,226, + 255,128,114,201,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,88,0,0,0,101,0,90,1,100,0,90,2,100,1,90, + 3,100,2,90,4,100,3,90,5,101,6,111,30,100,4,101, + 7,118,0,90,8,101,9,100,5,100,6,132,0,131,1,90, + 10,101,11,100,7,100,8,132,0,131,1,90,12,101,11,100, + 14,100,10,100,11,132,1,131,1,90,13,101,11,100,15,100, + 12,100,13,132,1,131,1,90,14,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,122,6,95,100,46,112,121,100,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,50,0,0,0,122,16,116,0, + 160,1,116,0,106,2,124,0,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,0,161,2,6,0,89,0,83,0,119,0,114,121, + 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,64,0,0,0,90,18, + 72,75,69,89,95,76,79,67,65,76,95,77,65,67,72,73, + 78,69,114,20,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,218,14,95,111,112,101,110,95,114,101, + 103,105,115,116,114,121,247,2,0,0,115,12,0,0,0,2, + 2,16,1,12,1,18,1,2,255,255,128,122,36,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,15,114,130,0,0,0,114,129,0,0, - 0,114,131,0,0,0,114,132,0,0,0,114,200,0,0,0, - 114,199,0,0,0,218,11,95,77,83,95,87,73,78,68,79, - 87,83,218,18,69,88,84,69,78,83,73,79,78,95,83,85, - 70,70,73,88,69,83,114,198,0,0,0,218,12,115,116,97, - 116,105,99,109,101,116,104,111,100,114,197,0,0,0,218,11, - 99,108,97,115,115,109,101,116,104,111,100,114,204,0,0,0, - 114,207,0,0,0,114,210,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,195, - 0,0,0,235,2,0,0,115,32,0,0,0,8,0,4,2, - 2,3,2,255,2,4,2,255,12,3,2,2,10,1,2,6, - 10,1,2,14,12,1,2,15,16,1,255,128,114,195,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,7,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,3,0,0,0,114,79,0,0,0,114,0, - 0,0,0,114,39,0,0,0,218,8,95,95,105,110,105,116, - 95,95,78,41,4,114,55,0,0,0,114,183,0,0,0,114, - 51,0,0,0,114,49,0,0,0,41,5,114,123,0,0,0, - 114,143,0,0,0,114,101,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,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,186,0,0,0,48,3,0,0,115,10,0,0, - 0,18,3,16,1,14,1,16,1,255,128,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,7,0,0,0,169,2,114,123,0, - 0,0,114,191,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,218,13,99,114,101,97,116,101,95,109, - 111,100,117,108,101,56,3,0,0,115,4,0,0,0,4,0, - 255,128,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, - 130,0,0,0,114,122,0,0,0,114,70,0,0,0,114,139, - 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,136,0,0,0,41,3,114,123,0,0,0, - 218,6,109,111,100,117,108,101,114,168,0,0,0,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,218,11,101,120, - 101,99,95,109,111,100,117,108,101,59,3,0,0,115,14,0, - 0,0,12,2,8,1,6,1,4,1,6,255,20,2,255,128, - 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,2,122,26,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,78,41,2,114,139,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,123,0,0,0,114,143,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,218,11,108,111,97,100,95, - 109,111,100,117,108,101,67,3,0,0,115,4,0,0,0,12, - 3,255,128,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,130,0,0,0,114,129,0,0,0,114,131,0,0,0, - 114,132,0,0,0,114,186,0,0,0,114,219,0,0,0,114, - 224,0,0,0,114,227,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,114,215,0, - 0,0,43,3,0,0,115,14,0,0,0,8,0,4,2,8, - 3,8,8,8,3,12,8,255,128,114,215,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, - 4,0,0,0,116,0,130,1,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,58,0,0,0,169,2,114,123,0,0,0, - 114,52,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,218,10,112,97,116,104,95,109,116,105,109,101, - 75,3,0,0,115,4,0,0,0,4,6,255,128,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,3,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, + 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,130,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, + 60,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,119,1,1,0,1, + 0,1,0,89,0,1,0,87,0,124,5,83,0,4,0,116, + 9,121,128,1,0,1,0,1,0,89,0,100,0,83,0,119, + 0,41,5,78,122,5,37,100,46,37,100,114,45,0,0,0, + 41,2,114,150,0,0,0,90,11,115,121,115,95,118,101,114, + 115,105,111,110,114,10,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,77,0,0,0,114, + 16,0,0,0,218,12,118,101,114,115,105,111,110,95,105,110, + 102,111,114,204,0,0,0,114,203,0,0,0,90,10,81,117, + 101,114,121,86,97,108,117,101,114,64,0,0,0,41,6,218, + 3,99,108,115,114,150,0,0,0,90,12,114,101,103,105,115, + 116,114,121,95,107,101,121,114,21,0,0,0,90,4,104,107, + 101,121,218,8,102,105,108,101,112,97,116,104,114,7,0,0, + 0,114,7,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,254,2,0, + 0,115,30,0,0,0,6,2,8,1,6,2,6,1,16,1, + 6,255,2,2,12,1,26,1,18,128,4,3,12,254,6,1, + 2,255,255,128,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,18,4, + 0,116,2,121,118,1,0,1,0,1,0,89,0,100,0,83, + 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,112,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,60,100,0,83, + 0,119,0,41,2,78,114,191,0,0,0,41,8,114,211,0, + 0,0,114,63,0,0,0,114,64,0,0,0,114,195,0,0, + 0,114,122,0,0,0,114,123,0,0,0,114,146,0,0,0, + 218,16,115,112,101,99,95,102,114,111,109,95,108,111,97,100, + 101,114,41,8,114,209,0,0,0,114,150,0,0,0,114,58, + 0,0,0,218,6,116,97,114,103,101,116,114,210,0,0,0, + 114,151,0,0,0,114,200,0,0,0,114,198,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,9, + 102,105,110,100,95,115,112,101,99,13,3,0,0,115,36,0, + 0,0,10,2,8,1,4,1,2,1,12,1,12,1,6,1, + 14,1,14,1,6,1,8,1,2,1,6,254,8,3,2,252, + 4,255,2,254,255,128,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,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,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,214,0,0,0,114,151,0,0,0, + 169,4,114,209,0,0,0,114,150,0,0,0,114,58,0,0, + 0,114,198,0,0,0,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,218,11,102,105,110,100,95,109,111,100,117, + 108,101,29,3,0,0,115,10,0,0,0,12,7,8,1,6, + 1,4,2,255,128,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, + 15,114,137,0,0,0,114,136,0,0,0,114,138,0,0,0, + 114,139,0,0,0,114,207,0,0,0,114,206,0,0,0,218, + 11,95,77,83,95,87,73,78,68,79,87,83,218,18,69,88, + 84,69,78,83,73,79,78,95,83,85,70,70,73,88,69,83, + 114,205,0,0,0,218,12,115,116,97,116,105,99,109,101,116, + 104,111,100,114,204,0,0,0,218,11,99,108,97,115,115,109, + 101,116,104,111,100,114,211,0,0,0,114,214,0,0,0,114, + 217,0,0,0,114,7,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,114,202,0,0,0,235,2,0, + 0,115,32,0,0,0,8,0,4,2,2,3,2,255,2,4, + 2,255,12,3,2,2,10,1,2,6,10,1,2,14,12,1, + 2,15,16,1,255,128,114,202,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,7,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,3, + 0,0,0,114,86,0,0,0,114,0,0,0,0,114,45,0, + 0,0,218,8,95,95,105,110,105,116,95,95,78,41,4,114, + 61,0,0,0,114,190,0,0,0,114,57,0,0,0,114,55, + 0,0,0,41,5,114,130,0,0,0,114,150,0,0,0,114, + 108,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,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,193,0, + 0,0,48,3,0,0,115,10,0,0,0,18,3,16,1,14, + 1,16,1,255,128,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,114,24,0,0,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,7,0,0, + 0,169,2,114,130,0,0,0,114,198,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,218,13,99,114, + 101,97,116,101,95,109,111,100,117,108,101,56,3,0,0,243, + 4,0,0,0,4,0,255,128,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,137,0,0,0,114,129,0,0,0,114, + 77,0,0,0,114,146,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,143,0,0,0,41, + 3,114,130,0,0,0,218,6,109,111,100,117,108,101,114,175, + 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,218,11,101,120,101,99,95,109,111,100,117,108,101,59, + 3,0,0,115,14,0,0,0,12,2,8,1,6,1,4,1, + 6,255,20,2,255,128,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,2,122,26,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,78,41,2,114,146,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,130,0,0,0,114,150,0,0,0, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, + 11,108,111,97,100,95,109,111,100,117,108,101,67,3,0,0, + 115,4,0,0,0,12,3,255,128,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,137,0,0,0,114,136,0,0, + 0,114,138,0,0,0,114,139,0,0,0,114,193,0,0,0, + 114,226,0,0,0,114,232,0,0,0,114,235,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,222,0,0,0,43,3,0,0,115,14,0,0, + 0,8,0,4,2,8,3,8,8,8,3,12,8,255,128,114, + 222,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,4,0,0,0,116,0,130,1,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,114,173,0,0,0,78,41,1,114, - 230,0,0,0,114,229,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,218,10,112,97,116,104,95,115, - 116,97,116,115,83,3,0,0,115,4,0,0,0,14,12,255, - 128,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,2,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,78,41,1,218, - 8,115,101,116,95,100,97,116,97,41,4,114,123,0,0,0, - 114,112,0,0,0,90,10,99,97,99,104,101,95,112,97,116, - 104,114,37,0,0,0,114,7,0,0,0,114,7,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,97,3,0,0,115,4,0,0,0,12, - 8,255,128,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,7, - 0,0,0,41,3,114,123,0,0,0,114,52,0,0,0,114, - 37,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,232,0,0,0,107,3,0,0,115,4,0,0, - 0,4,0,255,128,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,70,0,0,0,124,0,160,0,124,1, - 161,1,125,2,122,20,124,0,160,1,124,2,161,1,125,3, - 87,0,116,4,124,3,131,1,83,0,4,0,116,2,121,68, - 1,0,125,4,1,0,122,14,116,3,100,1,124,1,100,2, - 141,2,124,4,130,2,100,3,125,4,126,4,119,1,119,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,120,0,0,0,78,41,5,114,183,0,0,0,218,8, - 103,101,116,95,100,97,116,97,114,58,0,0,0,114,122,0, - 0,0,114,180,0,0,0,41,5,114,123,0,0,0,114,143, - 0,0,0,114,52,0,0,0,114,178,0,0,0,218,3,101, - 120,99,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,218,10,103,101,116,95,115,111,117,114,99,101,114,3,0, - 0,115,26,0,0,0,10,2,2,1,12,1,8,4,14,253, - 4,1,2,1,4,255,2,1,2,255,8,128,2,255,255,128, - 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,109,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, - 5,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,222,0,0,0,84,41,2,218,12,100, - 111,110,116,95,105,110,104,101,114,105,116,114,89,0,0,0, - 78,41,3,114,139,0,0,0,114,221,0,0,0,218,7,99, - 111,109,112,105,108,101,41,4,114,123,0,0,0,114,37,0, - 0,0,114,52,0,0,0,114,237,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,218,14,115,111,117, - 114,99,101,95,116,111,95,99,111,100,101,124,3,0,0,115, - 8,0,0,0,12,5,4,1,6,255,255,128,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,24,4,0,116,2,144,2,121,32,1,0,1,0,1, - 0,100,1,125,8,89,0,144,1,110,38,122,14,124,0,160, - 3,124,2,161,1,125,9,87,0,110,20,4,0,116,4,144, - 2,121,30,1,0,1,0,1,0,89,0,144,1,110,2,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,144, - 2,121,28,1,0,1,0,1,0,89,0,110,212,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,28,124, - 7,115,248,116,9,106,10,100,11,107,2,144,1,114,28,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,22,4,0,116, - 15,116,16,102,2,144,2,121,26,1,0,1,0,1,0,89, - 0,110,30,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,126,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,218,124, - 5,100,1,117,0,144,1,114,204,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,20,124,0,160,26,124,2,124,8,124,10,161,3,1, - 0,87,0,124,14,83,0,4,0,116,2,144,2,121,24,1, - 0,1,0,1,0,89,0,124,14,83,0,124,14,83,0,119, - 0,119,0,119,0,119,0,119,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,173, - 0,0,0,114,163,0,0,0,114,149,0,0,0,114,3,0, - 0,0,114,0,0,0,0,114,39,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,121,0,0,0,114,111,0,0,0,114,112,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,183,0,0,0,114,102,0, - 0,0,114,88,0,0,0,114,231,0,0,0,114,58,0,0, - 0,114,30,0,0,0,114,234,0,0,0,114,156,0,0,0, - 218,10,109,101,109,111,114,121,118,105,101,119,114,167,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,161,0,0,0,218,17,95, - 82,65,87,95,77,65,71,73,67,95,78,85,77,66,69,82, - 114,162,0,0,0,114,160,0,0,0,114,122,0,0,0,114, - 154,0,0,0,114,139,0,0,0,114,153,0,0,0,114,169, - 0,0,0,114,240,0,0,0,114,15,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,175,0,0,0,114,174,0,0,0,114,4,0,0, - 0,114,233,0,0,0,41,15,114,123,0,0,0,114,143,0, - 0,0,114,112,0,0,0,114,158,0,0,0,114,178,0,0, - 0,114,161,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,111,0,0,0,218,2,115,116,114,37,0,0,0,114,155, - 0,0,0,114,16,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,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,220,0,0,0,132,3,0,0,115,170,0,0,0,10,7, - 4,1,4,1,4,1,4,1,4,1,2,1,12,1,14,1, - 10,1,2,2,14,1,14,1,6,1,12,2,2,1,14,1, - 14,1,4,1,2,3,2,1,6,254,2,4,12,1,16,1, - 12,1,6,1,12,1,12,1,2,1,2,255,8,2,4,254, - 10,3,4,1,2,1,2,1,4,254,8,4,2,1,4,255, - 2,128,2,3,2,1,2,1,6,1,2,1,2,1,4,251, - 4,128,18,7,4,1,8,2,2,1,4,255,6,2,2,1, - 2,1,6,254,10,3,10,1,12,1,12,1,18,1,6,1, - 4,255,6,2,10,1,10,1,14,1,6,2,6,1,4,255, - 2,2,16,1,4,3,14,254,2,1,8,1,2,254,2,233, - 2,225,2,250,2,251,255,128,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,130,0,0,0,114,129,0,0,0,114,131,0,0, - 0,114,230,0,0,0,114,231,0,0,0,114,233,0,0,0, - 114,232,0,0,0,114,236,0,0,0,114,240,0,0,0,114, - 220,0,0,0,114,7,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,228,0,0,0,73,3,0, - 0,115,18,0,0,0,8,0,8,2,8,8,8,14,8,10, - 8,7,14,10,12,8,255,128,114,228,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,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,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,135, - 0,4,0,90,12,83,0,41,16,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,163,0,0, - 0,41,3,114,123,0,0,0,114,143,0,0,0,114,52,0, - 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,216,0,0,0,222,3,0,0,115,6,0,0,0,6, - 3,10,1,255,128,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,114,0,0,0,169,2,218,9,95,95,99,108,97,115,115, - 95,95,114,136,0,0,0,169,2,114,123,0,0,0,90,5, - 111,116,104,101,114,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,218,6,95,95,101,113,95,95,228,3,0,0, - 115,8,0,0,0,12,1,10,1,2,255,255,128,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,114,0,0,0,169,3,218,4,104,97,115,104,114, - 121,0,0,0,114,52,0,0,0,169,1,114,123,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 8,95,95,104,97,115,104,95,95,232,3,0,0,115,4,0, - 0,0,20,1,255,128,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,2,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,78,41,3,218,5,115,117,112,101,114,114,246,0,0,0, - 114,227,0,0,0,114,226,0,0,0,169,1,114,248,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,227,0,0,0, - 235,3,0,0,115,4,0,0,0,16,10,255,128,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,2,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,78,114,56,0,0,0,114,226,0, - 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,183,0,0,0,247,3,0,0,115,4,0,0,0,6, - 3,255,128,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,128,0,0,0,116,0,124,0,116,1, - 116,2,102,2,131,2,114,72,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,119,1,1,0,1,0,1,0,89,0,1,0,100,1, - 83,0,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,114,119,1,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,165,0,0,0, - 114,228,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,72,0,0,0,90, - 9,111,112,101,110,95,99,111,100,101,114,90,0,0,0,90, - 4,114,101,97,100,114,73,0,0,0,41,3,114,123,0,0, - 0,114,52,0,0,0,114,76,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,234,0,0,0,252, - 3,0,0,115,16,0,0,0,14,2,16,1,22,1,20,128, - 14,2,22,1,20,128,255,128,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,3,0,0,0,2,0, - 0,0,67,0,0,0,115,20,0,0,0,100,1,100,2,108, - 0,109,1,125,2,1,0,124,2,124,0,131,1,83,0,41, - 3,78,114,0,0,0,0,41,1,218,10,70,105,108,101,82, - 101,97,100,101,114,41,2,90,17,105,109,112,111,114,116,108, - 105,98,46,114,101,97,100,101,114,115,114,4,1,0,0,41, - 3,114,123,0,0,0,114,223,0,0,0,114,4,1,0,0, + 32,32,32,32,32,32,32,78,41,1,114,64,0,0,0,169, + 2,114,130,0,0,0,114,58,0,0,0,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,218,10,112,97,116,104, + 95,109,116,105,109,101,75,3,0,0,115,4,0,0,0,4, + 6,255,128,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,3,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,180,0, + 0,0,78,41,1,114,238,0,0,0,114,237,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,10, + 112,97,116,104,95,115,116,97,116,115,83,3,0,0,115,4, + 0,0,0,14,12,255,128,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,2,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,78,41,1,218,8,115,101,116,95,100,97,116,97,41, + 4,114,130,0,0,0,114,119,0,0,0,90,10,99,97,99, + 104,101,95,112,97,116,104,114,42,0,0,0,114,7,0,0, + 0,114,7,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,97,3,0,0, + 115,4,0,0,0,12,8,255,128,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, + 114,24,0,0,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,7,0,0,0,41,3,114,130,0,0,0,114,58,0,0, + 0,114,42,0,0,0,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,114,240,0,0,0,107,3,0,0,114,227, + 0,0,0,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,70,0,0,0,124,0,160,0,124,1,161,1, + 125,2,122,20,124,0,160,1,124,2,161,1,125,3,87,0, + 116,4,124,3,131,1,83,0,4,0,116,2,121,68,1,0, + 125,4,1,0,122,14,116,3,100,1,124,1,100,2,141,2, + 124,4,130,2,100,3,125,4,126,4,119,1,119,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, + 127,0,0,0,78,41,5,114,190,0,0,0,218,8,103,101, + 116,95,100,97,116,97,114,64,0,0,0,114,129,0,0,0, + 114,187,0,0,0,41,5,114,130,0,0,0,114,150,0,0, + 0,114,58,0,0,0,114,185,0,0,0,218,3,101,120,99, 114,7,0,0,0,114,7,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,5,4,0,0,115,6,0,0,0,12,2,8, - 1,255,128,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,41,13,114,130,0,0,0,114,129,0,0,0,114, - 131,0,0,0,114,132,0,0,0,114,216,0,0,0,114,250, - 0,0,0,114,254,0,0,0,114,140,0,0,0,114,227,0, - 0,0,114,183,0,0,0,114,234,0,0,0,114,5,1,0, - 0,90,13,95,95,99,108,97,115,115,99,101,108,108,95,95, - 114,7,0,0,0,114,7,0,0,0,114,0,1,0,0,114, - 8,0,0,0,114,246,0,0,0,217,3,0,0,115,26,0, - 0,0,8,0,4,2,8,3,8,6,8,4,2,3,14,1, - 2,11,10,1,8,4,2,9,18,1,255,128,114,246,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,3,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,173,0,0, - 0,114,241,0,0,0,78,41,3,114,57,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,123,0,0,0,114,52,0,0,0,114,245,0, - 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,231,0,0,0,15,4,0,0,115,6,0,0,0,8, - 2,14,1,255,128,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,119,0,0,0,114,232,0,0,0, - 41,5,114,123,0,0,0,114,112,0,0,0,114,111,0,0, - 0,114,37,0,0,0,114,60,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,233,0,0,0,20, - 4,0,0,115,6,0,0,0,8,2,16,1,255,128,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,68,0,0,0,114,8,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,254,0,0,0,116,0,124,1,131,1,92,2, - 125,4,125,5,103,0,125,6,124,4,114,62,116,1,124,4, - 131,1,115,62,116,0,124,4,131,1,92,2,125,4,125,7, - 124,6,160,2,124,7,161,1,1,0,124,4,114,62,116,1, - 124,4,131,1,114,28,116,3,124,6,131,1,68,0,93,96, - 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,70,4,0,116,7, - 121,116,1,0,1,0,1,0,89,0,113,70,4,0,116,8, - 121,252,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,119,1, - 122,30,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,100,2,83,0, - 4,0,116,8,121,250,1,0,125,8,1,0,122,28,116,9, - 160,10,100,1,124,1,124,8,161,3,1,0,87,0,89,0, - 100,2,125,8,126,8,100,2,83,0,100,2,125,8,126,8, - 119,1,119,0,119,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,55,0,0,0,114,64,0,0,0,114,190,0, - 0,0,114,50,0,0,0,114,48,0,0,0,114,18,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,58,0,0,0,114,139, - 0,0,0,114,153,0,0,0,114,77,0,0,0,41,9,114, - 123,0,0,0,114,52,0,0,0,114,37,0,0,0,114,9, - 1,0,0,218,6,112,97,114,101,110,116,114,101,0,0,0, - 114,47,0,0,0,114,43,0,0,0,114,235,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,232, - 0,0,0,25,4,0,0,115,58,0,0,0,12,2,4,1, - 12,2,12,1,10,1,12,254,12,4,10,1,2,1,14,1, - 12,1,4,2,14,1,6,3,4,1,4,255,16,2,8,128, - 2,1,12,1,18,1,14,1,8,2,2,1,18,255,8,128, - 2,254,2,247,255,128,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,130,0,0,0,114,129,0,0,0,114,131, - 0,0,0,114,132,0,0,0,114,231,0,0,0,114,233,0, - 0,0,114,232,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,6,1,0,0, - 11,4,0,0,115,12,0,0,0,8,0,4,2,8,2,8, - 5,18,5,255,128,114,6,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,163,0,0,0,114,149,0,0,0,41,2, - 114,121,0,0,0,114,111,0,0,0,41,5,114,183,0,0, - 0,114,234,0,0,0,114,156,0,0,0,114,169,0,0,0, - 114,242,0,0,0,41,5,114,123,0,0,0,114,143,0,0, - 0,114,52,0,0,0,114,37,0,0,0,114,155,0,0,0, + 10,103,101,116,95,115,111,117,114,99,101,114,3,0,0,115, + 26,0,0,0,10,2,2,1,12,1,8,4,14,253,4,1, + 2,1,4,255,2,1,2,255,8,128,2,255,255,128,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,116,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,5,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,230,0,0,0,84,41,2,218,12,100,111,110, + 116,95,105,110,104,101,114,105,116,114,96,0,0,0,78,41, + 3,114,146,0,0,0,114,229,0,0,0,218,7,99,111,109, + 112,105,108,101,41,4,114,130,0,0,0,114,42,0,0,0, + 114,58,0,0,0,114,245,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,218,14,115,111,117,114,99, + 101,95,116,111,95,99,111,100,101,124,3,0,0,115,8,0, + 0,0,12,5,4,1,6,255,255,128,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, + 24,4,0,116,2,144,2,121,32,1,0,1,0,1,0,100, + 1,125,8,89,0,144,1,110,38,122,14,124,0,160,3,124, + 2,161,1,125,9,87,0,110,20,4,0,116,4,144,2,121, + 30,1,0,1,0,1,0,89,0,144,1,110,2,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,144,2,121, + 28,1,0,1,0,1,0,89,0,110,212,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,28,124,7,115, + 248,116,9,106,10,100,11,107,2,144,1,114,28,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,22,4,0,116,15,116, + 16,102,2,144,2,121,26,1,0,1,0,1,0,89,0,110, + 30,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,126,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,218,124,5,100, + 1,117,0,144,1,114,204,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, + 20,124,0,160,26,124,2,124,8,124,10,161,3,1,0,87, + 0,124,14,83,0,4,0,116,2,144,2,121,24,1,0,1, + 0,1,0,89,0,124,14,83,0,124,14,83,0,119,0,119, + 0,119,0,119,0,119,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,180,0,0, + 0,114,170,0,0,0,114,156,0,0,0,114,3,0,0,0, + 114,0,0,0,0,114,45,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,128,0,0,0,114,118,0,0,0,114,119,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,190,0,0,0,114,109,0,0,0, + 114,95,0,0,0,114,239,0,0,0,114,64,0,0,0,114, + 34,0,0,0,114,242,0,0,0,114,163,0,0,0,218,10, + 109,101,109,111,114,121,118,105,101,119,114,174,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,168,0,0,0,218,17,95,82,65, + 87,95,77,65,71,73,67,95,78,85,77,66,69,82,114,169, + 0,0,0,114,167,0,0,0,114,129,0,0,0,114,161,0, + 0,0,114,146,0,0,0,114,160,0,0,0,114,176,0,0, + 0,114,248,0,0,0,114,16,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,182,0,0,0,114,181,0,0,0,114,4,0,0,0,114, + 241,0,0,0,41,15,114,130,0,0,0,114,150,0,0,0, + 114,119,0,0,0,114,165,0,0,0,114,185,0,0,0,114, + 168,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,118, + 0,0,0,218,2,115,116,114,42,0,0,0,114,162,0,0, + 0,114,17,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, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,228, + 0,0,0,132,3,0,0,115,170,0,0,0,10,7,4,1, + 4,1,4,1,4,1,4,1,2,1,12,1,14,1,10,1, + 2,2,14,1,14,1,6,1,12,2,2,1,14,1,14,1, + 4,1,2,3,2,1,6,254,2,4,12,1,16,1,12,1, + 6,1,12,1,12,1,2,1,2,255,8,2,4,254,10,3, + 4,1,2,1,2,1,4,254,8,4,2,1,4,255,2,128, + 2,3,2,1,2,1,6,1,2,1,2,1,4,251,4,128, + 18,7,4,1,8,2,2,1,4,255,6,2,2,1,2,1, + 6,254,10,3,10,1,12,1,12,1,18,1,6,1,4,255, + 6,2,10,1,10,1,14,1,6,2,6,1,4,255,2,2, + 16,1,4,3,14,254,2,1,8,1,2,254,2,233,2,225, + 2,250,2,251,255,128,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,137,0,0,0,114,136,0,0,0,114,138,0,0,0,114, + 238,0,0,0,114,239,0,0,0,114,241,0,0,0,114,240, + 0,0,0,114,244,0,0,0,114,248,0,0,0,114,228,0, + 0,0,114,7,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,114,236,0,0,0,73,3,0,0,115, + 18,0,0,0,8,0,8,2,8,8,8,14,8,10,8,7, + 14,10,12,8,255,128,114,236,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,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,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,135,0,4, + 0,90,12,83,0,41,16,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,170,0,0,0,41, + 3,114,130,0,0,0,114,150,0,0,0,114,58,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 220,0,0,0,60,4,0,0,115,24,0,0,0,10,1,10, - 1,2,4,2,1,6,254,12,4,2,1,14,1,2,1,2, - 1,6,253,255,128,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,7,0,0,0,114,226,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,236,0,0,0, - 76,4,0,0,115,4,0,0,0,4,2,255,128,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,130,0,0,0,114,129,0,0,0,114,131,0,0,0, - 114,132,0,0,0,114,220,0,0,0,114,236,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,12,1,0,0,56,4,0,0,115,10,0,0, - 0,8,0,4,2,8,2,12,16,255,128,114,12,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,3,1,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,114, - 0,0,0,114,163,0,0,0,41,3,114,123,0,0,0,114, - 121,0,0,0,114,52,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,216,0,0,0,89,4,0, - 0,115,6,0,0,0,6,1,10,1,255,128,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,114,0,0,0,114,247,0,0,0,114,249,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,250, - 0,0,0,93,4,0,0,115,8,0,0,0,12,1,10,1, - 2,255,255,128,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,114,0,0,0,114,251,0,0,0,114,253,0,0, - 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,254,0,0,0,97,4,0,0,115,4,0,0,0,20,1, + 223,0,0,0,222,3,0,0,115,6,0,0,0,6,3,10, + 1,255,128,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,243,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,121, + 0,0,0,169,2,218,9,95,95,99,108,97,115,115,95,95, + 114,143,0,0,0,169,2,114,130,0,0,0,90,5,111,116, + 104,101,114,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,218,6,95,95,101,113,95,95,228,3,0,0,243,8, + 0,0,0,12,1,10,1,2,255,255,128,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,243,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,121,0,0,0,169,3,218,4,104,97,115,104,114,128,0, + 0,0,114,58,0,0,0,169,1,114,130,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,218,8,95, + 95,104,97,115,104,95,95,232,3,0,0,243,4,0,0,0, + 20,1,255,128,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,2,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,78, + 41,3,218,5,115,117,112,101,114,114,254,0,0,0,114,235, + 0,0,0,114,234,0,0,0,169,1,114,1,1,0,0,114, + 7,0,0,0,114,8,0,0,0,114,235,0,0,0,235,3, + 0,0,115,4,0,0,0,16,10,255,128,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,243,6,0,0, + 0,124,0,106,0,83,0,169,2,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,78,114,62,0,0,0,114,234,0,0,0, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, + 190,0,0,0,247,3,0,0,243,4,0,0,0,6,3,255, + 128,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,128,0,0,0,116,0,124,0,116,1,116,2, + 102,2,131,2,114,72,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, + 119,1,1,0,1,0,1,0,89,0,1,0,100,1,83,0, + 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,114,119,1,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,172,0,0,0,114,236, + 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,79,0,0,0,90,9,111, + 112,101,110,95,99,111,100,101,114,97,0,0,0,90,4,114, + 101,97,100,114,80,0,0,0,41,3,114,130,0,0,0,114, + 58,0,0,0,114,83,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,114,242,0,0,0,252,3,0, + 0,115,16,0,0,0,14,2,16,1,22,1,20,128,14,2, + 22,1,20,128,255,128,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,3,0,0,0,2,0,0,0, + 67,0,0,0,115,20,0,0,0,100,1,100,2,108,0,109, + 1,125,2,1,0,124,2,124,0,131,1,83,0,41,3,78, + 114,0,0,0,0,41,1,218,10,70,105,108,101,82,101,97, + 100,101,114,41,2,90,17,105,109,112,111,114,116,108,105,98, + 46,114,101,97,100,101,114,115,114,18,1,0,0,41,3,114, + 130,0,0,0,114,231,0,0,0,114,18,1,0,0,114,7, + 0,0,0,114,7,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,5,4,0,0,115,6,0,0,0,12,2,8,1,255, + 128,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,41,13,114,137,0,0,0,114,136,0,0,0,114,138,0, + 0,0,114,139,0,0,0,114,223,0,0,0,114,3,1,0, + 0,114,9,1,0,0,114,147,0,0,0,114,235,0,0,0, + 114,190,0,0,0,114,242,0,0,0,114,19,1,0,0,90, + 13,95,95,99,108,97,115,115,99,101,108,108,95,95,114,7, + 0,0,0,114,7,0,0,0,114,12,1,0,0,114,8,0, + 0,0,114,254,0,0,0,217,3,0,0,115,26,0,0,0, + 8,0,4,2,8,3,8,6,8,4,2,3,14,1,2,11, + 10,1,8,4,2,9,18,1,255,128,114,254,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,3,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,180,0,0,0,114, + 249,0,0,0,78,41,3,114,63,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,130,0,0,0,114,58,0,0,0,114,253,0,0,0, + 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, + 239,0,0,0,15,4,0,0,115,6,0,0,0,8,2,14, + 1,255,128,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,126,0,0,0,114,240,0,0,0,41,5, + 114,130,0,0,0,114,119,0,0,0,114,118,0,0,0,114, + 42,0,0,0,114,66,0,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,114,241,0,0,0,20,4,0, + 0,115,6,0,0,0,8,2,16,1,255,128,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,75, + 0,0,0,114,22,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,254,0,0,0,116,0,124,1,131,1,92,2,125,4, + 125,5,103,0,125,6,124,4,114,62,116,1,124,4,131,1, + 115,62,116,0,124,4,131,1,92,2,125,4,125,7,124,6, + 160,2,124,7,161,1,1,0,124,4,114,62,116,1,124,4, + 131,1,114,28,116,3,124,6,131,1,68,0,93,96,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,70,4,0,116,7,121,116, + 1,0,1,0,1,0,89,0,113,70,4,0,116,8,121,252, + 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,119,1,122,30, + 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,100,2,83,0,4,0, + 116,8,121,250,1,0,125,8,1,0,122,28,116,9,160,10, + 100,1,124,1,124,8,161,3,1,0,87,0,89,0,100,2, + 125,8,126,8,100,2,83,0,100,2,125,8,126,8,119,1, + 119,0,119,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,61,0,0,0,114,71,0,0,0,114,197,0,0,0, + 114,56,0,0,0,114,54,0,0,0,114,19,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,64,0,0,0,114,146,0,0, + 0,114,160,0,0,0,114,84,0,0,0,41,9,114,130,0, + 0,0,114,58,0,0,0,114,42,0,0,0,114,23,1,0, + 0,218,6,112,97,114,101,110,116,114,108,0,0,0,114,53, + 0,0,0,114,49,0,0,0,114,243,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,114,240,0,0, + 0,25,4,0,0,115,58,0,0,0,12,2,4,1,12,2, + 12,1,10,1,12,254,12,4,10,1,2,1,14,1,12,1, + 4,2,14,1,6,3,4,1,4,255,16,2,8,128,2,1, + 12,1,18,1,14,1,8,2,2,1,18,255,8,128,2,254, + 2,247,255,128,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,137,0,0,0,114,136,0,0,0,114,138,0,0, + 0,114,139,0,0,0,114,239,0,0,0,114,241,0,0,0, + 114,240,0,0,0,114,7,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,20,1,0,0,11,4, + 0,0,115,12,0,0,0,8,0,4,2,8,2,8,5,18, + 5,255,128,114,20,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,170,0,0,0,114,156,0,0,0,41,2,114,128, + 0,0,0,114,118,0,0,0,41,5,114,190,0,0,0,114, + 242,0,0,0,114,163,0,0,0,114,176,0,0,0,114,250, + 0,0,0,41,5,114,130,0,0,0,114,150,0,0,0,114, + 58,0,0,0,114,42,0,0,0,114,162,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,228,0, + 0,0,60,4,0,0,115,24,0,0,0,10,1,10,1,2, + 4,2,1,6,254,12,4,2,1,14,1,2,1,2,1,6, + 253,255,128,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,114,24,0,0,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,7,0,0, + 0,114,234,0,0,0,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,114,244,0,0,0,76,4,0,0,114,25, + 0,0,0,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,137,0,0,0,114,136,0,0, + 0,114,138,0,0,0,114,139,0,0,0,114,228,0,0,0, + 114,244,0,0,0,114,7,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,26,1,0,0,56,4, + 0,0,115,10,0,0,0,8,0,4,2,8,2,12,16,255, + 128,114,26,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,17,1,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,121,0,0,0,114,170,0,0,0,41,3, + 114,130,0,0,0,114,128,0,0,0,114,58,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,223, + 0,0,0,89,4,0,0,115,6,0,0,0,6,1,10,1, 255,128,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,3,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,78,41,7,114,139,0,0,0,114,221,0,0, - 0,114,167,0,0,0,90,14,99,114,101,97,116,101,95,100, - 121,110,97,109,105,99,114,153,0,0,0,114,121,0,0,0, - 114,52,0,0,0,41,3,114,123,0,0,0,114,191,0,0, - 0,114,223,0,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,219,0,0,0,100,4,0,0,115,16, - 0,0,0,4,2,6,1,4,255,6,2,8,1,4,255,4, - 2,255,128,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, + 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,114,255,0,0,0,114,121, + 0,0,0,114,0,1,0,0,114,2,1,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,114,3,1,0, + 0,93,4,0,0,114,4,1,0,0,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,114, + 5,1,0,0,114,121,0,0,0,114,6,1,0,0,114,8, + 1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,114,9,1,0,0,97,4,0,0,114,10,1,0,0, + 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,3,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,101,120,101,99,117,116,101,100,32,102,114,111,109,32, - 123,33,114,125,78,41,7,114,139,0,0,0,114,221,0,0, - 0,114,167,0,0,0,90,12,101,120,101,99,95,100,121,110, - 97,109,105,99,114,153,0,0,0,114,121,0,0,0,114,52, - 0,0,0,169,2,114,123,0,0,0,114,223,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,224, - 0,0,0,108,4,0,0,115,10,0,0,0,14,2,6,1, - 8,1,8,255,255,128,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,5,122,49,82,101,116, - 117,114,110,32,84,114,117,101,32,105,102,32,116,104,101,32, + 125,32,108,111,97,100,101,100,32,102,114,111,109,32,123,33, + 114,125,78,41,7,114,146,0,0,0,114,229,0,0,0,114, + 174,0,0,0,90,14,99,114,101,97,116,101,95,100,121,110, + 97,109,105,99,114,160,0,0,0,114,128,0,0,0,114,58, + 0,0,0,41,3,114,130,0,0,0,114,198,0,0,0,114, + 231,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,226,0,0,0,100,4,0,0,115,16,0,0, + 0,4,2,6,1,4,255,6,2,8,1,4,255,4,2,255, + 128,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,146,0,0,0,114,229,0,0,0,114, + 174,0,0,0,90,12,101,120,101,99,95,100,121,110,97,109, + 105,99,114,160,0,0,0,114,128,0,0,0,114,58,0,0, + 0,169,2,114,130,0,0,0,114,231,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,114,232,0,0, + 0,108,4,0,0,115,10,0,0,0,14,2,6,1,8,1, + 8,255,255,128,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,5,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,3,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,223,0,0,0, + 78,114,7,0,0,0,169,2,114,5,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,7,0,0,0,114,8,0,0,0,114,9,0,0, + 0,117,4,0,0,115,8,0,0,0,4,0,2,1,20,255, + 255,128,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,78,41,4,114,61,0,0,0,114,58,0, + 0,0,218,3,97,110,121,114,219,0,0,0,114,234,0,0, + 0,114,7,0,0,0,114,30,1,0,0,114,8,0,0,0, + 114,193,0,0,0,114,4,0,0,115,10,0,0,0,14,2, + 12,1,2,1,8,255,255,128,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,114,24,0,0,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,7,0,0,0,114, + 234,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,228,0,0,0,120,4,0,0,114,25,0,0, + 0,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,114,24,0,0,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, - 32,105,115,32,97,32,112,97,99,107,97,103,101,46,114,3, - 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,216,0, - 0,0,78,114,7,0,0,0,169,2,114,5,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,7,0,0,0,114,8,0,0,0,114,9, - 0,0,0,117,4,0,0,115,8,0,0,0,4,0,2,1, - 20,255,255,128,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,78,41,4,114,55,0,0,0,114, - 52,0,0,0,218,3,97,110,121,114,212,0,0,0,114,226, - 0,0,0,114,7,0,0,0,114,16,1,0,0,114,8,0, - 0,0,114,186,0,0,0,114,4,0,0,115,10,0,0,0, - 14,2,12,1,2,1,8,255,255,128,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,7,0,0,0,114,226,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,220,0,0,0,120,4, - 0,0,115,4,0,0,0,4,2,255,128,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,7,0,0,0,114,226,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,236, - 0,0,0,124,4,0,0,115,4,0,0,0,4,2,255,128, - 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,1,1,0,0,114,56,0,0,0,114,226, - 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,183,0,0,0,128,4,0,0,115,4,0,0,0, - 6,3,255,128,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,130,0,0,0,114,129, - 0,0,0,114,131,0,0,0,114,132,0,0,0,114,216,0, - 0,0,114,250,0,0,0,114,254,0,0,0,114,219,0,0, - 0,114,224,0,0,0,114,186,0,0,0,114,220,0,0,0, - 114,236,0,0,0,114,140,0,0,0,114,183,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,3,1,0,0,81,4,0,0,115,26,0,0, - 0,8,0,4,2,8,6,8,4,8,4,8,3,8,8,8, - 6,8,6,8,4,2,4,14,1,255,128,114,3,1,0,0, - 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,64,0,0,0,115,104,0,0,0,101,0, - 90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,0, - 90,4,100,4,100,5,132,0,90,5,100,6,100,7,132,0, - 90,6,100,8,100,9,132,0,90,7,100,10,100,11,132,0, - 90,8,100,12,100,13,132,0,90,9,100,14,100,15,132,0, - 90,10,100,16,100,17,132,0,90,11,100,18,100,19,132,0, - 90,12,100,20,100,21,132,0,90,13,100,22,100,23,132,0, - 90,14,100,24,83,0,41,25,218,14,95,78,97,109,101,115, - 112,97,99,101,80,97,116,104,97,38,1,0,0,82,101,112, - 114,101,115,101,110,116,115,32,97,32,110,97,109,101,115,112, - 97,99,101,32,112,97,99,107,97,103,101,39,115,32,112,97, - 116,104,46,32,32,73,116,32,117,115,101,115,32,116,104,101, - 32,109,111,100,117,108,101,32,110,97,109,101,10,32,32,32, - 32,116,111,32,102,105,110,100,32,105,116,115,32,112,97,114, - 101,110,116,32,109,111,100,117,108,101,44,32,97,110,100,32, - 102,114,111,109,32,116,104,101,114,101,32,105,116,32,108,111, - 111,107,115,32,117,112,32,116,104,101,32,112,97,114,101,110, - 116,39,115,10,32,32,32,32,95,95,112,97,116,104,95,95, - 46,32,32,87,104,101,110,32,116,104,105,115,32,99,104,97, - 110,103,101,115,44,32,116,104,101,32,109,111,100,117,108,101, - 39,115,32,111,119,110,32,112,97,116,104,32,105,115,32,114, - 101,99,111,109,112,117,116,101,100,44,10,32,32,32,32,117, - 115,105,110,103,32,112,97,116,104,95,102,105,110,100,101,114, - 46,32,32,70,111,114,32,116,111,112,45,108,101,118,101,108, - 32,109,111,100,117,108,101,115,44,32,116,104,101,32,112,97, - 114,101,110,116,32,109,111,100,117,108,101,39,115,32,112,97, - 116,104,10,32,32,32,32,105,115,32,115,121,115,46,112,97, - 116,104,46,99,4,0,0,0,0,0,0,0,0,0,0,0, - 4,0,0,0,3,0,0,0,67,0,0,0,115,36,0,0, - 0,124,1,124,0,95,0,124,2,124,0,95,1,116,2,124, - 0,160,3,161,0,131,1,124,0,95,4,124,3,124,0,95, - 5,100,0,83,0,114,114,0,0,0,41,6,218,5,95,110, - 97,109,101,218,5,95,112,97,116,104,114,116,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,123,0,0,0,114,121,0,0,0,114,52, - 0,0,0,90,11,112,97,116,104,95,102,105,110,100,101,114, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 216,0,0,0,141,4,0,0,115,10,0,0,0,6,1,6, - 1,14,1,10,1,255,128,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,6,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,79,0,0,0,114,10,0,0,0, - 41,2,114,15,0,0,0,114,52,0,0,0,90,8,95,95, - 112,97,116,104,95,95,78,41,2,114,19,1,0,0,114,49, - 0,0,0,41,4,114,123,0,0,0,114,11,1,0,0,218, - 3,100,111,116,90,2,109,101,114,7,0,0,0,114,7,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, - 147,4,0,0,115,10,0,0,0,18,2,8,1,4,2,8, - 3,255,128,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,114,0,0,0,41,4,114,26,1,0, - 0,114,135,0,0,0,114,15,0,0,0,218,7,109,111,100, - 117,108,101,115,41,3,114,123,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, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,21, - 1,0,0,157,4,0,0,115,6,0,0,0,12,1,16,1, - 255,128,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,114,0,0,0,41,8,114,116,0,0,0,114,21,1, - 0,0,114,22,1,0,0,114,23,1,0,0,114,19,1,0, - 0,114,144,0,0,0,114,182,0,0,0,114,20,1,0,0, - 41,3,114,123,0,0,0,90,11,112,97,114,101,110,116,95, - 112,97,116,104,114,191,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,218,12,95,114,101,99,97,108, - 99,117,108,97,116,101,161,4,0,0,115,18,0,0,0,12, - 2,10,1,14,1,18,3,6,1,8,1,6,1,6,1,255, - 128,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,114,0,0,0,41,2,218, - 4,105,116,101,114,114,28,1,0,0,114,253,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,8, - 95,95,105,116,101,114,95,95,174,4,0,0,115,4,0,0, - 0,12,1,255,128,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,114,0,0,0,169,1,114, - 28,1,0,0,41,2,114,123,0,0,0,218,5,105,110,100, - 101,120,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,218,11,95,95,103,101,116,105,116,101,109,95,95,177,4, - 0,0,115,4,0,0,0,12,1,255,128,122,26,95,78,97, + 115,32,104,97,118,101,32,110,111,32,115,111,117,114,99,101, + 32,99,111,100,101,46,78,114,7,0,0,0,114,234,0,0, + 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 114,244,0,0,0,124,4,0,0,114,25,0,0,0,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,114,13,1,0,0,114,14,1,0, + 0,114,62,0,0,0,114,234,0,0,0,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,114,190,0,0,0,128, + 4,0,0,114,15,1,0,0,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,137,0, + 0,0,114,136,0,0,0,114,138,0,0,0,114,139,0,0, + 0,114,223,0,0,0,114,3,1,0,0,114,9,1,0,0, + 114,226,0,0,0,114,232,0,0,0,114,193,0,0,0,114, + 228,0,0,0,114,244,0,0,0,114,147,0,0,0,114,190, + 0,0,0,114,7,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,114,17,1,0,0,81,4,0,0, + 115,26,0,0,0,8,0,4,2,8,6,8,4,8,4,8, + 3,8,8,8,6,8,6,8,4,2,4,14,1,255,128,114, + 17,1,0,0,99,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,64,0,0,0,115,104,0, + 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2, + 100,3,132,0,90,4,100,4,100,5,132,0,90,5,100,6, + 100,7,132,0,90,6,100,8,100,9,132,0,90,7,100,10, + 100,11,132,0,90,8,100,12,100,13,132,0,90,9,100,14, + 100,15,132,0,90,10,100,16,100,17,132,0,90,11,100,18, + 100,19,132,0,90,12,100,20,100,21,132,0,90,13,100,22, + 100,23,132,0,90,14,100,24,83,0,41,25,218,14,95,78, + 97,109,101,115,112,97,99,101,80,97,116,104,97,38,1,0, + 0,82,101,112,114,101,115,101,110,116,115,32,97,32,110,97, + 109,101,115,112,97,99,101,32,112,97,99,107,97,103,101,39, + 115,32,112,97,116,104,46,32,32,73,116,32,117,115,101,115, + 32,116,104,101,32,109,111,100,117,108,101,32,110,97,109,101, + 10,32,32,32,32,116,111,32,102,105,110,100,32,105,116,115, + 32,112,97,114,101,110,116,32,109,111,100,117,108,101,44,32, + 97,110,100,32,102,114,111,109,32,116,104,101,114,101,32,105, + 116,32,108,111,111,107,115,32,117,112,32,116,104,101,32,112, + 97,114,101,110,116,39,115,10,32,32,32,32,95,95,112,97, + 116,104,95,95,46,32,32,87,104,101,110,32,116,104,105,115, + 32,99,104,97,110,103,101,115,44,32,116,104,101,32,109,111, + 100,117,108,101,39,115,32,111,119,110,32,112,97,116,104,32, + 105,115,32,114,101,99,111,109,112,117,116,101,100,44,10,32, + 32,32,32,117,115,105,110,103,32,112,97,116,104,95,102,105, + 110,100,101,114,46,32,32,70,111,114,32,116,111,112,45,108, + 101,118,101,108,32,109,111,100,117,108,101,115,44,32,116,104, + 101,32,112,97,114,101,110,116,32,109,111,100,117,108,101,39, + 115,32,112,97,116,104,10,32,32,32,32,105,115,32,115,121, + 115,46,112,97,116,104,46,99,4,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,3,0,0,0,67,0,0,0, + 115,36,0,0,0,124,1,124,0,95,0,124,2,124,0,95, + 1,116,2,124,0,160,3,161,0,131,1,124,0,95,4,124, + 3,124,0,95,5,100,0,83,0,114,121,0,0,0,41,6, + 218,5,95,110,97,109,101,218,5,95,112,97,116,104,114,123, + 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,130,0,0,0,114,128,0, + 0,0,114,58,0,0,0,90,11,112,97,116,104,95,102,105, + 110,100,101,114,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,223,0,0,0,141,4,0,0,115,10,0,0, + 0,6,1,6,1,14,1,10,1,255,128,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,6,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,86,0,0,0,114, + 10,0,0,0,41,2,114,16,0,0,0,114,58,0,0,0, + 90,8,95,95,112,97,116,104,95,95,78,41,2,114,33,1, + 0,0,114,55,0,0,0,41,4,114,130,0,0,0,114,25, + 1,0,0,218,3,100,111,116,90,2,109,101,114,7,0,0, + 0,114,7,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,147,4,0,0,115,10,0,0,0,18,2,8, + 1,4,2,8,3,255,128,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,121,0,0,0,41,4, + 114,40,1,0,0,114,142,0,0,0,114,16,0,0,0,218, + 7,109,111,100,117,108,101,115,41,3,114,130,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,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,114,35,1,0,0,157,4,0,0,115,6,0,0,0, + 12,1,16,1,255,128,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,121,0,0,0,41,8,114,123,0,0, + 0,114,35,1,0,0,114,36,1,0,0,114,37,1,0,0, + 114,33,1,0,0,114,151,0,0,0,114,189,0,0,0,114, + 34,1,0,0,41,3,114,130,0,0,0,90,11,112,97,114, + 101,110,116,95,112,97,116,104,114,198,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,218,12,95,114, + 101,99,97,108,99,117,108,97,116,101,161,4,0,0,115,18, + 0,0,0,12,2,10,1,14,1,18,3,6,1,8,1,6, + 1,6,1,255,128,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,243,12,0,0,0, + 116,0,124,0,160,1,161,0,131,1,83,0,114,121,0,0, + 0,41,2,218,4,105,116,101,114,114,42,1,0,0,114,8, + 1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,218,8,95,95,105,116,101,114,95,95,174,4,0,0, + 243,4,0,0,0,12,1,255,128,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,121,0,0, + 0,169,1,114,42,1,0,0,41,2,114,130,0,0,0,218, + 5,105,110,100,101,120,114,7,0,0,0,114,7,0,0,0, + 114,8,0,0,0,218,11,95,95,103,101,116,105,116,101,109, + 95,95,177,4,0,0,114,46,1,0,0,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,114,0,0,0,41,1,114,20,1,0,0,41, - 3,114,123,0,0,0,114,32,1,0,0,114,52,0,0,0, + 0,83,0,114,121,0,0,0,41,1,114,34,1,0,0,41, + 3,114,130,0,0,0,114,48,1,0,0,114,58,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, 11,95,95,115,101,116,105,116,101,109,95,95,180,4,0,0, 115,4,0,0,0,14,1,255,128,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, - 114,0,0,0,41,2,114,4,0,0,0,114,28,1,0,0, - 114,253,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,218,7,95,95,108,101,110,95,95,183,4,0, - 0,115,4,0,0,0,12,1,255,128,122,22,95,78,97,109, + 0,0,1,0,0,0,3,0,0,0,67,0,0,0,114,43, + 1,0,0,114,121,0,0,0,41,2,114,4,0,0,0,114, + 42,1,0,0,114,8,1,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,218,7,95,95,108,101,110,95, + 95,183,4,0,0,114,46,1,0,0,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, + 0,0,0,3,0,0,0,67,0,0,0,243,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,70,0,0,0,114,20,1,0, - 0,114,253,0,0,0,114,7,0,0,0,114,7,0,0,0, + 123,33,114,125,41,41,2,114,77,0,0,0,114,34,1,0, + 0,114,8,1,0,0,114,7,0,0,0,114,7,0,0,0, 114,8,0,0,0,218,8,95,95,114,101,112,114,95,95,186, - 4,0,0,115,4,0,0,0,12,1,255,128,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,118,0,83,0,114, - 114,0,0,0,114,31,1,0,0,169,2,114,123,0,0,0, - 218,4,105,116,101,109,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,218,12,95,95,99,111,110,116,97,105,110, - 115,95,95,189,4,0,0,115,4,0,0,0,12,1,255,128, - 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,114,0,0,0, - 41,2,114,20,1,0,0,114,190,0,0,0,114,37,1,0, - 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,190,0,0,0,192,4,0,0,115,4,0,0,0,16,1, - 255,128,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,130,0,0, - 0,114,129,0,0,0,114,131,0,0,0,114,132,0,0,0, - 114,216,0,0,0,114,26,1,0,0,114,21,1,0,0,114, - 28,1,0,0,114,30,1,0,0,114,33,1,0,0,114,34, - 1,0,0,114,35,1,0,0,114,36,1,0,0,114,39,1, - 0,0,114,190,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,18,1,0,0, - 134,4,0,0,115,28,0,0,0,8,0,4,1,8,6,8, - 6,8,10,8,4,8,13,8,3,8,3,8,3,8,3,8, - 3,12,3,255,128,114,18,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,114,0,0, - 0,41,2,114,18,1,0,0,114,20,1,0,0,114,24,1, - 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,216,0,0,0,198,4,0,0,115,4,0,0,0,18, - 1,255,128,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,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,3,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,78,41,2,114,70,0, - 0,0,114,130,0,0,0,41,1,114,223,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,218,11,109, - 111,100,117,108,101,95,114,101,112,114,201,4,0,0,115,4, - 0,0,0,12,7,255,128,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,7,0,0,0, - 114,226,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,186,0,0,0,210,4,0,0,115,4,0, - 0,0,4,1,255,128,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,10,0,0,0,114,7,0, - 0,0,114,226,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,236,0,0,0,213,4,0,0,115, - 4,0,0,0,4,1,255,128,122,27,95,78,97,109,101,115, + 4,0,0,114,46,1,0,0,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,118,0,83,0,114,121,0,0,0, + 114,47,1,0,0,169,2,114,130,0,0,0,218,4,105,116, + 101,109,114,7,0,0,0,114,7,0,0,0,114,8,0,0, + 0,218,12,95,95,99,111,110,116,97,105,110,115,95,95,189, + 4,0,0,114,46,1,0,0,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,121,0,0,0,41,2,114,34,1,0,0,114, + 197,0,0,0,114,54,1,0,0,114,7,0,0,0,114,7, + 0,0,0,114,8,0,0,0,114,197,0,0,0,192,4,0, + 0,243,4,0,0,0,16,1,255,128,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,137,0,0,0,114,136,0,0,0,114,138, + 0,0,0,114,139,0,0,0,114,223,0,0,0,114,40,1, + 0,0,114,35,1,0,0,114,42,1,0,0,114,45,1,0, + 0,114,49,1,0,0,114,50,1,0,0,114,51,1,0,0, + 114,53,1,0,0,114,56,1,0,0,114,197,0,0,0,114, + 7,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,32,1,0,0,134,4,0,0,115,28,0,0, + 0,8,0,4,1,8,6,8,6,8,10,8,4,8,13,8, + 3,8,3,8,3,8,3,8,3,12,3,255,128,114,32,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,121,0,0,0,41,2,114,32,1,0,0, + 114,34,1,0,0,114,38,1,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,223,0,0,0,198,4, + 0,0,115,4,0,0,0,18,1,255,128,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,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,114, + 52,1,0,0,41,3,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,78,41,2,114,77,0,0,0,114,137, + 0,0,0,41,1,114,231,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,218,11,109,111,100,117,108, + 101,95,114,101,112,114,201,4,0,0,115,4,0,0,0,12, + 7,255,128,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,114,24,0,0,0,41, + 2,78,84,114,7,0,0,0,114,234,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,114,193,0,0, + 0,210,4,0,0,243,4,0,0,0,4,1,255,128,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,114,24,0,0,0,41,2,78,114,10,0,0, + 0,114,7,0,0,0,114,234,0,0,0,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,114,244,0,0,0,213, + 4,0,0,114,60,1,0,0,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,10,0,0,0,122,8,60,115,116, - 114,105,110,103,62,114,222,0,0,0,84,41,1,114,238,0, - 0,0,41,1,114,239,0,0,0,114,226,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,114,220,0, - 0,0,216,4,0,0,115,4,0,0,0,16,1,255,128,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,217,0,0, - 0,114,7,0,0,0,114,218,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,219,0,0,0,219, - 4,0,0,115,4,0,0,0,4,0,255,128,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,114, - 0,0,0,114,7,0,0,0,114,13,1,0,0,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,114,224,0,0, - 0,222,4,0,0,115,4,0,0,0,4,1,255,128,122,28, + 114,105,110,103,62,114,230,0,0,0,84,41,1,114,246,0, + 0,0,41,1,114,247,0,0,0,114,234,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,228,0, + 0,0,216,4,0,0,114,57,1,0,0,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,114, + 24,0,0,0,114,224,0,0,0,114,7,0,0,0,114,225, + 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,114,226,0,0,0,219,4,0,0,114,227,0,0,0, + 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,121,0,0,0,114,7,0,0,0,114,27,1,0, + 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, + 114,232,0,0,0,222,4,0,0,114,60,1,0,0,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, @@ -2045,20 +2032,20 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 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,78,41,4,114,139,0,0,0,114,153,0,0,0,114, - 20,1,0,0,114,225,0,0,0,114,226,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,114,227,0, + 114,125,78,41,4,114,146,0,0,0,114,160,0,0,0,114, + 34,1,0,0,114,233,0,0,0,114,234,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,235,0, 0,0,225,4,0,0,115,10,0,0,0,6,7,4,1,4, 255,12,3,255,128,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,130,0,0,0,114,129,0,0,0, - 114,131,0,0,0,114,216,0,0,0,114,213,0,0,0,114, - 41,1,0,0,114,186,0,0,0,114,236,0,0,0,114,220, - 0,0,0,114,219,0,0,0,114,224,0,0,0,114,227,0, + 117,108,101,78,41,12,114,137,0,0,0,114,136,0,0,0, + 114,138,0,0,0,114,223,0,0,0,114,220,0,0,0,114, + 59,1,0,0,114,193,0,0,0,114,244,0,0,0,114,228, + 0,0,0,114,226,0,0,0,114,232,0,0,0,114,235,0, 0,0,114,7,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,40,1,0,0,197,4,0,0,115, + 0,114,8,0,0,0,114,58,1,0,0,197,4,0,0,115, 22,0,0,0,8,0,8,1,2,3,10,1,8,8,8,3, - 8,3,8,3,8,3,12,3,255,128,114,40,1,0,0,99, + 8,3,8,3,8,3,12,3,255,128,114,58,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, @@ -2088,12 +2075,12 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 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,15,0,0, + 99,104,101,115,41,6,218,4,108,105,115,116,114,16,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,133,0, - 0,0,114,43,1,0,0,41,2,114,121,0,0,0,218,6, + 95,99,97,99,104,101,218,5,105,116,101,109,115,114,140,0, + 0,0,114,62,1,0,0,41,2,114,128,0,0,0,218,6, 102,105,110,100,101,114,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,43,1,0,0,244,4,0,0,115,16, + 114,8,0,0,0,114,62,1,0,0,244,4,0,0,115,16, 0,0,0,22,4,8,1,10,1,10,1,8,1,2,128,4, 252,255,128,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, @@ -2108,10 +2095,10 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 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,15,0,0,0,218,10, - 112,97,116,104,95,104,111,111,107,115,114,81,0,0,0,114, - 82,0,0,0,114,142,0,0,0,114,122,0,0,0,41,2, - 114,52,0,0,0,90,4,104,111,111,107,114,7,0,0,0, + 115,32,101,109,112,116,121,41,6,114,16,0,0,0,218,10, + 112,97,116,104,95,104,111,111,107,115,114,88,0,0,0,114, + 89,0,0,0,114,149,0,0,0,114,129,0,0,0,41,2, + 114,58,0,0,0,90,4,104,111,111,107,114,7,0,0,0, 114,7,0,0,0,114,8,0,0,0,218,11,95,112,97,116, 104,95,104,111,111,107,115,254,4,0,0,115,20,0,0,0, 16,3,12,1,10,1,2,1,14,1,12,1,4,1,4,2, @@ -2138,11 +2125,11 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 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,10,0,0,0,78,41,7,114,18,0,0, - 0,114,63,0,0,0,218,17,70,105,108,101,78,111,116,70, - 111,117,110,100,69,114,114,111,114,114,15,0,0,0,114,45, - 1,0,0,218,8,75,101,121,69,114,114,111,114,114,49,1, - 0,0,41,3,114,202,0,0,0,114,52,0,0,0,114,47, + 32,32,32,32,114,10,0,0,0,78,41,7,114,19,0,0, + 0,114,70,0,0,0,218,17,70,105,108,101,78,111,116,70, + 111,117,110,100,69,114,114,111,114,114,16,0,0,0,114,64, + 1,0,0,218,8,75,101,121,69,114,114,111,114,114,68,1, + 0,0,41,3,114,209,0,0,0,114,58,0,0,0,114,66, 1,0,0,114,7,0,0,0,114,7,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,11,5,0,0,115,30,0,0, @@ -2157,11 +2144,11 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 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,141,0,0,0,41,7,114,133,0,0,0,114, - 141,0,0,0,114,210,0,0,0,114,139,0,0,0,114,205, - 0,0,0,114,187,0,0,0,114,182,0,0,0,41,6,114, - 202,0,0,0,114,143,0,0,0,114,47,1,0,0,114,144, - 0,0,0,114,145,0,0,0,114,191,0,0,0,114,7,0, + 41,2,78,114,148,0,0,0,41,7,114,140,0,0,0,114, + 148,0,0,0,114,217,0,0,0,114,146,0,0,0,114,212, + 0,0,0,114,194,0,0,0,114,189,0,0,0,41,6,114, + 209,0,0,0,114,150,0,0,0,114,66,1,0,0,114,151, + 0,0,0,114,152,0,0,0,114,198,0,0,0,114,7,0, 0,0,114,7,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,33,5, 0,0,115,20,0,0,0,10,4,16,1,10,2,4,1,8, @@ -2184,16 +2171,16 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 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,207,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,165,0, - 0,0,114,90,0,0,0,218,5,98,121,116,101,115,114,52, - 1,0,0,114,133,0,0,0,114,207,0,0,0,114,53,1, - 0,0,114,144,0,0,0,114,182,0,0,0,114,122,0,0, - 0,114,171,0,0,0,114,139,0,0,0,114,187,0,0,0, - 41,9,114,202,0,0,0,114,143,0,0,0,114,52,0,0, - 0,114,206,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,47,1, - 0,0,114,191,0,0,0,114,145,0,0,0,114,7,0,0, + 78,114,214,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,172,0, + 0,0,114,97,0,0,0,218,5,98,121,116,101,115,114,71, + 1,0,0,114,140,0,0,0,114,214,0,0,0,114,72,1, + 0,0,114,151,0,0,0,114,189,0,0,0,114,129,0,0, + 0,114,178,0,0,0,114,146,0,0,0,114,194,0,0,0, + 41,9,114,209,0,0,0,114,150,0,0,0,114,58,0,0, + 0,114,213,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,66,1, + 0,0,114,198,0,0,0,114,152,0,0,0,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,218,9,95,103,101, 116,95,115,112,101,99,48,5,0,0,115,44,0,0,0,4, 5,8,1,14,1,2,1,10,1,8,1,10,1,14,1,12, @@ -2217,12 +2204,12 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 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,15,0,0,0,114,52,0,0,0,114,56,1,0,0, - 114,144,0,0,0,114,182,0,0,0,114,185,0,0,0,114, - 18,1,0,0,41,6,114,202,0,0,0,114,143,0,0,0, - 114,52,0,0,0,114,206,0,0,0,114,191,0,0,0,114, - 55,1,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,207,0,0,0,80,5,0,0,115,28,0,0, + 7,114,16,0,0,0,114,58,0,0,0,114,75,1,0,0, + 114,151,0,0,0,114,189,0,0,0,114,192,0,0,0,114, + 32,1,0,0,41,6,114,209,0,0,0,114,150,0,0,0, + 114,58,0,0,0,114,213,0,0,0,114,198,0,0,0,114, + 74,1,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,214,0,0,0,80,5,0,0,115,28,0,0, 0,8,6,6,1,14,1,8,1,4,1,10,1,6,1,4, 1,6,3,16,1,4,1,4,2,4,2,255,128,122,20,80, 97,116,104,70,105,110,100,101,114,46,102,105,110,100,95,115, @@ -2240,9 +2227,9 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 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,208, - 0,0,0,114,209,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,210,0,0,0,104,5,0,0, + 97,100,46,10,10,32,32,32,32,32,32,32,32,78,114,215, + 0,0,0,114,216,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,114,217,0,0,0,104,5,0,0, 115,10,0,0,0,12,8,8,1,4,1,6,1,255,128,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,0,0,0,0,0,0,0,0, @@ -2270,24 +2257,24 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 32,32,32,32,32,32,32,32,114,0,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,78,41,3,90,18,105,109,112,111,114,116,108,105, - 98,46,109,101,116,97,100,97,116,97,114,57,1,0,0,218, + 98,46,109,101,116,97,100,97,116,97,114,76,1,0,0,218, 18,102,105,110,100,95,100,105,115,116,114,105,98,117,116,105, - 111,110,115,41,3,114,124,0,0,0,114,125,0,0,0,114, - 57,1,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,58,1,0,0,117,5,0,0,115,6,0,0, + 111,110,115,41,3,114,131,0,0,0,114,132,0,0,0,114, + 76,1,0,0,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,114,77,1,0,0,117,5,0,0,115,6,0,0, 0,12,10,16,1,255,128,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,14,114,130,0,0,0,114,129,0,0,0,114,131,0,0, - 0,114,132,0,0,0,114,213,0,0,0,114,43,1,0,0, - 114,49,1,0,0,114,214,0,0,0,114,52,1,0,0,114, - 53,1,0,0,114,56,1,0,0,114,207,0,0,0,114,210, - 0,0,0,114,58,1,0,0,114,7,0,0,0,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,114,42,1,0, + 41,14,114,137,0,0,0,114,136,0,0,0,114,138,0,0, + 0,114,139,0,0,0,114,220,0,0,0,114,62,1,0,0, + 114,68,1,0,0,114,221,0,0,0,114,71,1,0,0,114, + 72,1,0,0,114,75,1,0,0,114,214,0,0,0,114,217, + 0,0,0,114,77,1,0,0,114,7,0,0,0,114,7,0, + 0,0,114,7,0,0,0,114,8,0,0,0,114,61,1,0, 0,240,4,0,0,115,38,0,0,0,8,0,4,2,2,2, 10,1,2,9,10,1,2,12,10,1,2,21,10,1,2,14, 12,1,2,31,12,1,2,23,12,1,2,12,14,1,255,128, - 114,42,1,0,0,99,0,0,0,0,0,0,0,0,0,0, + 114,61,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, @@ -2326,348 +2313,347 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 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,114,0, - 0,0,114,7,0,0,0,114,14,1,0,0,169,1,114,144, + 0,102,2,86,0,1,0,113,2,100,0,83,0,114,121,0, + 0,0,114,7,0,0,0,114,28,1,0,0,169,1,114,151, 0,0,0,114,7,0,0,0,114,8,0,0,0,114,9,0, - 0,0,146,5,0,0,115,4,0,0,0,22,0,255,128,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,79,0,0,0,114,109,0,0, - 0,78,41,7,114,171,0,0,0,218,8,95,108,111,97,100, - 101,114,115,114,52,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,123, - 0,0,0,114,52,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,193,0,0,0,114,7,0,0,0,114,60,1,0,0, - 114,8,0,0,0,114,216,0,0,0,140,5,0,0,115,18, - 0,0,0,4,4,12,1,26,1,6,1,10,2,6,1,8, - 1,12,1,255,128,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,109,0,0,0,78,41,1,114,62,1, - 0,0,114,253,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,43,1,0,0,154,5,0,0,115, - 4,0,0,0,10,2,255,128,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,207,0,0,0,114, - 144,0,0,0,114,182,0,0,0,41,3,114,123,0,0,0, - 114,143,0,0,0,114,191,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,141,0,0,0,160,5, - 0,0,115,10,0,0,0,10,7,8,1,8,1,16,1,255, - 128,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,181,0,0,0,41,1,114,194,0,0,0, - 41,7,114,123,0,0,0,114,192,0,0,0,114,143,0,0, - 0,114,52,0,0,0,90,4,115,109,115,108,114,206,0,0, - 0,114,144,0,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,56,1,0,0,172,5,0,0,115,10, - 0,0,0,10,1,8,1,2,1,6,255,255,128,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,100,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,20,4,0, - 116,6,144,1,121,98,1,0,1,0,1,0,100,4,125,5, - 89,0,124,5,124,0,106,7,107,3,114,88,124,0,160,8, - 161,0,1,0,124,5,124,0,95,7,116,9,131,0,114,110, - 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,214,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,204,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,146, - 116,17,124,8,131,1,125,3,124,0,106,14,68,0,93,86, - 92,2,125,9,125,10,116,13,124,0,106,2,124,4,124,9, - 23,0,131,2,125,12,116,18,106,19,100,6,124,12,100,3, - 100,7,141,3,1,0,124,7,124,9,23,0,124,6,118,0, - 144,1,114,50,116,15,124,12,131,1,144,1,114,50,124,0, - 160,16,124,10,124,1,124,12,100,8,124,2,161,5,2,0, - 1,0,83,0,113,220,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,119,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,79,0,0,0,114, - 39,0,0,0,114,109,0,0,0,114,216,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,49,0,0,0,114,57,0,0,0,114,52, - 0,0,0,114,18,0,0,0,114,63,0,0,0,114,7,1, - 0,0,114,58,0,0,0,114,62,1,0,0,218,11,95,102, - 105,108,108,95,99,97,99,104,101,114,21,0,0,0,114,65, - 1,0,0,114,110,0,0,0,114,64,1,0,0,114,48,0, - 0,0,114,61,1,0,0,114,62,0,0,0,114,56,1,0, - 0,114,64,0,0,0,114,139,0,0,0,114,153,0,0,0, - 114,187,0,0,0,114,182,0,0,0,41,14,114,123,0,0, - 0,114,143,0,0,0,114,206,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,173,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,15,1,0,0, - 114,192,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, - 191,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,207,0,0,0,177,5,0,0,115,80,0,0, - 0,4,5,14,1,2,1,24,1,14,1,6,1,10,1,8, - 1,6,1,6,2,6,1,10,1,6,2,4,1,8,2,12, - 1,14,1,8,1,10,1,8,1,24,1,2,255,8,5,14, - 2,16,1,16,1,14,1,10,1,10,1,4,1,8,255,2, - 128,6,2,12,1,12,1,8,1,4,1,4,1,2,219,255, - 128,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,24,4,0,116,4,116,5,116,6,102,3,121,188,1, - 0,1,0,1,0,103,0,125,2,89,0,116,7,106,8,160, - 9,100,1,161,1,115,78,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,130,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,88,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,100,6,83, - 0,119,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,14,0,0,0, - 114,79,0,0,0,114,69,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,7,0,0, - 0,41,1,114,110,0,0,0,41,2,114,5,0,0,0,90, - 2,102,110,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,13,0,0,0,254,5,0,0,115,4,0,0,0, - 20,0,255,128,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,52,0,0,0,114,18,0,0,0,90,7,108,105, - 115,116,100,105,114,114,63,0,0,0,114,50,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,15,0,0,0,114,22,0,0,0,114,23, - 0,0,0,114,63,1,0,0,114,64,1,0,0,114,105,0, - 0,0,114,70,0,0,0,114,110,0,0,0,218,3,97,100, - 100,114,24,0,0,0,114,65,1,0,0,41,9,114,123,0, - 0,0,114,52,0,0,0,90,8,99,111,110,116,101,110,116, - 115,90,21,108,111,119,101,114,95,115,117,102,102,105,120,95, - 99,111,110,116,101,110,116,115,114,38,1,0,0,114,121,0, - 0,0,114,25,1,0,0,114,15,1,0,0,90,8,110,101, - 119,95,110,97,109,101,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,67,1,0,0,225,5,0,0,115,40, - 0,0,0,6,2,2,1,22,1,18,1,6,3,12,3,12, - 1,6,7,8,1,16,1,4,1,18,1,4,2,12,1,6, - 1,12,1,20,1,4,255,2,233,255,128,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,4,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,4,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,56,0,0,0,78,41,2,114,64,0,0,0,114,122, - 0,0,0,114,56,0,0,0,169,2,114,202,0,0,0,114, - 66,1,0,0,114,7,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,10,6,0,0,115,8,0,0, - 0,8,2,12,1,16,1,255,128,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,78,114,7,0,0,0,41,3,114,202,0,0,0,114,66, - 1,0,0,114,72,1,0,0,114,7,0,0,0,114,71,1, - 0,0,114,8,0,0,0,218,9,112,97,116,104,95,104,111, - 111,107,0,6,0,0,115,6,0,0,0,14,10,4,6,255, - 128,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,70,0,0,0,114,52,0, - 0,0,114,253,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,36,1,0,0,18,6,0,0,115, - 4,0,0,0,12,1,255,128,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,130,0,0,0,114,129,0,0,0,114,131,0,0, - 0,114,132,0,0,0,114,216,0,0,0,114,43,1,0,0, - 114,147,0,0,0,114,210,0,0,0,114,141,0,0,0,114, - 56,1,0,0,114,207,0,0,0,114,67,1,0,0,114,214, - 0,0,0,114,73,1,0,0,114,36,1,0,0,114,7,0, + 0,0,146,5,0,0,114,14,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,86,0,0,0,114,116,0,0,0,78,41,7, + 114,178,0,0,0,218,8,95,108,111,97,100,101,114,115,114, + 58,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,130,0,0,0,114, + 58,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,200,0, + 0,0,114,7,0,0,0,114,79,1,0,0,114,8,0,0, + 0,114,223,0,0,0,140,5,0,0,115,18,0,0,0,4, + 4,12,1,26,1,6,1,10,2,6,1,8,1,12,1,255, + 128,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,116,0,0,0,78,41,1,114,81,1,0,0,114,8, + 1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,114,62,1,0,0,154,5,0,0,114,69,0,0,0, + 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,214,0,0,0,114,151,0,0,0,114,189,0,0, + 0,41,3,114,130,0,0,0,114,150,0,0,0,114,198,0, 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,59,1,0,0,131,5,0,0,115,26,0,0,0,8, - 0,4,2,8,7,8,14,4,4,8,2,8,12,10,5,8, - 48,2,31,10,1,12,17,255,128,114,59,1,0,0,99,4, - 0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,8, - 0,0,0,67,0,0,0,115,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,38,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,100,0,83,0,4,0,116,5,121,142,1,0, - 1,0,1,0,89,0,100,0,83,0,119,0,41,6,78,218, - 10,95,95,108,111,97,100,101,114,95,95,218,8,95,95,115, - 112,101,99,95,95,114,60,1,0,0,90,8,95,95,102,105, - 108,101,95,95,90,10,95,95,99,97,99,104,101,100,95,95, - 41,6,218,3,103,101,116,114,144,0,0,0,114,12,1,0, - 0,114,6,1,0,0,114,194,0,0,0,218,9,69,120,99, - 101,112,116,105,111,110,41,6,90,2,110,115,114,121,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,144,0,0,0,114,191,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 14,95,102,105,120,95,117,112,95,109,111,100,117,108,101,24, - 6,0,0,115,38,0,0,0,10,2,10,1,4,1,4,1, - 8,1,8,1,12,1,10,2,4,1,14,1,2,1,8,1, - 8,1,8,1,14,1,12,1,6,2,2,254,255,128,114,78, - 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,2,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,78,41,7,114,3,1, - 0,0,114,167,0,0,0,218,18,101,120,116,101,110,115,105, - 111,110,95,115,117,102,102,105,120,101,115,114,6,1,0,0, - 114,106,0,0,0,114,12,1,0,0,114,94,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, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,188, - 0,0,0,47,6,0,0,115,10,0,0,0,12,5,8,1, - 8,1,10,1,255,128,114,188,0,0,0,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,8,0,0,0,124,0,97,0,100,0,83, - 0,114,114,0,0,0,41,1,114,139,0,0,0,41,1,218, - 17,95,98,111,111,116,115,116,114,97,112,95,109,111,100,117, - 108,101,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,218,21,95,115,101,116,95,98,111,111,116,115,116,114,97, - 112,95,109,111,100,117,108,101,58,6,0,0,115,4,0,0, - 0,8,2,255,128,114,81,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,81,1,0,0,114, - 188,0,0,0,114,15,0,0,0,114,48,1,0,0,114,171, - 0,0,0,114,59,1,0,0,114,73,1,0,0,218,9,109, - 101,116,97,95,112,97,116,104,114,190,0,0,0,114,42,1, - 0,0,41,2,114,80,1,0,0,90,17,115,117,112,112,111, - 114,116,101,100,95,108,111,97,100,101,114,115,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,218,8,95,105,110, - 115,116,97,108,108,63,6,0,0,115,10,0,0,0,8,2, - 6,1,20,1,16,1,255,128,114,83,1,0,0,41,1,114, - 68,0,0,0,41,1,78,41,3,78,78,78,41,2,114,0, - 0,0,0,114,0,0,0,0,41,1,84,41,1,78,41,1, - 78,41,83,114,132,0,0,0,114,139,0,0,0,114,167,0, - 0,0,114,72,0,0,0,114,15,0,0,0,114,81,0,0, - 0,114,164,0,0,0,114,22,0,0,0,114,211,0,0,0, - 90,2,110,116,114,18,0,0,0,114,196,0,0,0,90,5, - 112,111,115,105,120,114,42,0,0,0,218,3,97,108,108,114, - 45,0,0,0,114,46,0,0,0,114,66,0,0,0,114,25, - 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,24,0,0,0,114, - 26,0,0,0,114,21,0,0,0,114,33,0,0,0,114,38, - 0,0,0,114,40,0,0,0,114,48,0,0,0,114,55,0, - 0,0,114,57,0,0,0,114,61,0,0,0,114,62,0,0, - 0,114,64,0,0,0,114,67,0,0,0,114,77,0,0,0, - 218,4,116,121,112,101,218,8,95,95,99,111,100,101,95,95, - 114,166,0,0,0,114,31,0,0,0,114,152,0,0,0,114, - 30,0,0,0,114,35,0,0,0,114,243,0,0,0,114,97, - 0,0,0,114,93,0,0,0,114,106,0,0,0,114,190,0, - 0,0,114,79,1,0,0,114,212,0,0,0,114,94,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,102,0,0,0,114,107,0,0, - 0,114,113,0,0,0,114,117,0,0,0,114,119,0,0,0, - 114,140,0,0,0,114,147,0,0,0,114,156,0,0,0,114, - 160,0,0,0,114,162,0,0,0,114,169,0,0,0,114,174, - 0,0,0,114,175,0,0,0,114,180,0,0,0,218,6,111, - 98,106,101,99,116,114,189,0,0,0,114,194,0,0,0,114, - 195,0,0,0,114,215,0,0,0,114,228,0,0,0,114,246, - 0,0,0,114,6,1,0,0,114,12,1,0,0,114,3,1, - 0,0,114,18,1,0,0,114,40,1,0,0,114,42,1,0, - 0,114,59,1,0,0,114,78,1,0,0,114,188,0,0,0, - 114,81,1,0,0,114,83,1,0,0,114,7,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,8, - 60,109,111,100,117,108,101,62,1,0,0,0,115,172,0,0, - 0,4,0,4,22,8,3,8,1,8,1,8,1,8,1,10, - 3,4,1,8,1,10,1,8,2,4,3,10,1,6,2,22, - 2,8,1,10,1,14,1,4,4,4,1,2,1,2,1,4, - 255,8,4,6,16,8,3,8,5,8,5,8,6,8,6,8, - 12,8,10,8,9,8,5,8,7,10,9,10,22,0,127,16, - 24,12,1,4,2,4,1,6,2,6,1,10,1,8,2,6, - 2,8,2,16,2,8,71,8,40,8,19,8,12,8,12,8, - 31,8,17,8,33,8,28,10,24,10,13,10,10,8,11,6, - 14,4,3,2,1,12,255,14,68,14,64,16,30,0,127,14, - 17,18,50,18,45,18,25,14,53,14,63,14,43,0,127,14, - 20,0,127,10,22,8,23,8,11,12,5,255,128, + 0,114,148,0,0,0,160,5,0,0,115,10,0,0,0,10, + 7,8,1,8,1,16,1,255,128,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,188,0,0, + 0,41,1,114,201,0,0,0,41,7,114,130,0,0,0,114, + 199,0,0,0,114,150,0,0,0,114,58,0,0,0,90,4, + 115,109,115,108,114,213,0,0,0,114,151,0,0,0,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,75,1, + 0,0,172,5,0,0,115,10,0,0,0,10,1,8,1,2, + 1,6,255,255,128,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,100,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,20,4,0,116,6,144,1,121,98,1,0, + 1,0,1,0,100,4,125,5,89,0,124,5,124,0,106,7, + 107,3,114,88,124,0,160,8,161,0,1,0,124,5,124,0, + 95,7,116,9,131,0,114,110,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,214,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,204,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,146,116,17,124,8,131,1,125,3, + 124,0,106,14,68,0,93,86,92,2,125,9,125,10,116,13, + 124,0,106,2,124,4,124,9,23,0,131,2,125,12,116,18, + 106,19,100,6,124,12,100,3,100,7,141,3,1,0,124,7, + 124,9,23,0,124,6,118,0,144,1,114,50,116,15,124,12, + 131,1,144,1,114,50,124,0,160,16,124,10,124,1,124,12, + 100,8,124,2,161,5,2,0,1,0,83,0,113,220,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,119,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,86,0,0,0,114,45,0,0,0,114,116,0,0, + 0,114,223,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,55,0,0, + 0,114,63,0,0,0,114,58,0,0,0,114,19,0,0,0, + 114,70,0,0,0,114,21,1,0,0,114,64,0,0,0,114, + 81,1,0,0,218,11,95,102,105,108,108,95,99,97,99,104, + 101,114,22,0,0,0,114,84,1,0,0,114,117,0,0,0, + 114,83,1,0,0,114,54,0,0,0,114,80,1,0,0,114, + 68,0,0,0,114,75,1,0,0,114,71,0,0,0,114,146, + 0,0,0,114,160,0,0,0,114,194,0,0,0,114,189,0, + 0,0,41,14,114,130,0,0,0,114,150,0,0,0,114,213, + 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,180, + 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,29,1,0,0,114,199,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,198,0,0,0,114,7,0,0, + 0,114,7,0,0,0,114,8,0,0,0,114,214,0,0,0, + 177,5,0,0,115,80,0,0,0,4,5,14,1,2,1,24, + 1,14,1,6,1,10,1,8,1,6,1,6,2,6,1,10, + 1,6,2,4,1,8,2,12,1,14,1,8,1,10,1,8, + 1,24,1,2,255,8,5,14,2,16,1,16,1,14,1,10, + 1,10,1,4,1,8,255,2,128,6,2,12,1,12,1,8, + 1,4,1,4,1,2,219,255,128,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,24,4,0,116,4,116, + 5,116,6,102,3,121,188,1,0,1,0,1,0,103,0,125, + 2,89,0,116,7,106,8,160,9,100,1,161,1,115,78,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,130,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,88,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,100,6,83,0,119,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,15,0,0,0,114,86,0,0,0,114,76,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,7,0,0,0,41,1,114,117,0,0,0, + 41,2,114,5,0,0,0,90,2,102,110,114,7,0,0,0, + 114,7,0,0,0,114,8,0,0,0,114,13,0,0,0,254, + 5,0,0,115,4,0,0,0,20,0,255,128,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,58,0,0,0,114, + 19,0,0,0,90,7,108,105,115,116,100,105,114,114,70,0, + 0,0,114,69,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,16,0,0, + 0,114,26,0,0,0,114,27,0,0,0,114,82,1,0,0, + 114,83,1,0,0,114,112,0,0,0,114,77,0,0,0,114, + 117,0,0,0,218,3,97,100,100,114,28,0,0,0,114,84, + 1,0,0,41,9,114,130,0,0,0,114,58,0,0,0,90, + 8,99,111,110,116,101,110,116,115,90,21,108,111,119,101,114, + 95,115,117,102,102,105,120,95,99,111,110,116,101,110,116,115, + 114,55,1,0,0,114,128,0,0,0,114,39,1,0,0,114, + 29,1,0,0,90,8,110,101,119,95,110,97,109,101,114,7, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,86,1, + 0,0,225,5,0,0,115,40,0,0,0,6,2,2,1,22, + 1,18,1,6,3,12,3,12,1,6,7,8,1,16,1,4, + 1,18,1,4,2,12,1,6,1,12,1,20,1,4,255,2, + 233,255,128,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,4,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,4,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,62,0,0,0,78,41, + 2,114,71,0,0,0,114,129,0,0,0,114,62,0,0,0, + 169,2,114,209,0,0,0,114,85,1,0,0,114,7,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, + 10,6,0,0,115,8,0,0,0,8,2,12,1,16,1,255, + 128,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,78,114,7,0,0,0,41, + 3,114,209,0,0,0,114,85,1,0,0,114,91,1,0,0, + 114,7,0,0,0,114,90,1,0,0,114,8,0,0,0,218, + 9,112,97,116,104,95,104,111,111,107,0,6,0,0,115,6, + 0,0,0,14,10,4,6,255,128,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,114,52,1,0,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,77,0,0,0,114,58,0,0,0,114,8, + 1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, + 0,0,114,53,1,0,0,18,6,0,0,114,46,1,0,0, + 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,137,0,0,0,114, + 136,0,0,0,114,138,0,0,0,114,139,0,0,0,114,223, + 0,0,0,114,62,1,0,0,114,154,0,0,0,114,217,0, + 0,0,114,148,0,0,0,114,75,1,0,0,114,214,0,0, + 0,114,86,1,0,0,114,221,0,0,0,114,92,1,0,0, + 114,53,1,0,0,114,7,0,0,0,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,114,78,1,0,0,131,5, + 0,0,115,26,0,0,0,8,0,4,2,8,7,8,14,4, + 4,8,2,8,12,10,5,8,48,2,31,10,1,12,17,255, + 128,114,78,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,38,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,100,0,83,0, + 4,0,116,5,121,142,1,0,1,0,1,0,89,0,100,0, + 83,0,119,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,79,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, + 151,0,0,0,114,26,1,0,0,114,20,1,0,0,114,201, + 0,0,0,218,9,69,120,99,101,112,116,105,111,110,41,6, + 90,2,110,115,114,128,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,151, + 0,0,0,114,198,0,0,0,114,7,0,0,0,114,7,0, + 0,0,114,8,0,0,0,218,14,95,102,105,120,95,117,112, + 95,109,111,100,117,108,101,24,6,0,0,115,38,0,0,0, + 10,2,10,1,4,1,4,1,8,1,8,1,12,1,10,2, + 4,1,14,1,2,1,8,1,8,1,8,1,14,1,12,1, + 6,2,2,254,255,128,114,97,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, + 2,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,78,41,7,114,17,1,0,0,114,174,0,0,0,218, + 18,101,120,116,101,110,115,105,111,110,95,115,117,102,102,105, + 120,101,115,114,20,1,0,0,114,113,0,0,0,114,26,1, + 0,0,114,101,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,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,114,195,0,0,0,47,6,0,0,115, + 10,0,0,0,12,5,8,1,8,1,10,1,255,128,114,195, + 0,0,0,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,8,0,0, + 0,124,0,97,0,100,0,83,0,114,121,0,0,0,41,1, + 114,146,0,0,0,41,1,218,17,95,98,111,111,116,115,116, + 114,97,112,95,109,111,100,117,108,101,114,7,0,0,0,114, + 7,0,0,0,114,8,0,0,0,218,21,95,115,101,116,95, + 98,111,111,116,115,116,114,97,112,95,109,111,100,117,108,101, + 58,6,0,0,115,4,0,0,0,8,2,255,128,114,100,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,100,1,0,0,114,195,0,0,0,114,16,0,0, + 0,114,67,1,0,0,114,178,0,0,0,114,78,1,0,0, + 114,92,1,0,0,218,9,109,101,116,97,95,112,97,116,104, + 114,197,0,0,0,114,61,1,0,0,41,2,114,99,1,0, + 0,90,17,115,117,112,112,111,114,116,101,100,95,108,111,97, + 100,101,114,115,114,7,0,0,0,114,7,0,0,0,114,8, + 0,0,0,218,8,95,105,110,115,116,97,108,108,63,6,0, + 0,115,10,0,0,0,8,2,6,1,20,1,16,1,255,128, + 114,102,1,0,0,41,1,114,75,0,0,0,41,1,78,41, + 3,78,78,78,41,2,114,0,0,0,0,114,0,0,0,0, + 41,1,84,41,1,78,41,1,78,41,83,114,139,0,0,0, + 114,146,0,0,0,114,174,0,0,0,114,79,0,0,0,114, + 16,0,0,0,114,88,0,0,0,114,171,0,0,0,114,26, + 0,0,0,114,218,0,0,0,90,2,110,116,114,19,0,0, + 0,114,203,0,0,0,90,5,112,111,115,105,120,114,48,0, + 0,0,218,3,97,108,108,114,51,0,0,0,114,52,0,0, + 0,114,73,0,0,0,114,29,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,28,0,0,0,114,30,0,0,0,114,22,0,0, + 0,114,37,0,0,0,114,43,0,0,0,114,46,0,0,0, + 114,54,0,0,0,114,61,0,0,0,114,63,0,0,0,114, + 67,0,0,0,114,68,0,0,0,114,71,0,0,0,114,74, + 0,0,0,114,84,0,0,0,218,4,116,121,112,101,218,8, + 95,95,99,111,100,101,95,95,114,173,0,0,0,114,35,0, + 0,0,114,159,0,0,0,114,34,0,0,0,114,40,0,0, + 0,114,251,0,0,0,114,104,0,0,0,114,100,0,0,0, + 114,113,0,0,0,114,197,0,0,0,114,98,1,0,0,114, + 219,0,0,0,114,101,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, + 109,0,0,0,114,114,0,0,0,114,120,0,0,0,114,124, + 0,0,0,114,126,0,0,0,114,147,0,0,0,114,154,0, + 0,0,114,163,0,0,0,114,167,0,0,0,114,169,0,0, + 0,114,176,0,0,0,114,181,0,0,0,114,182,0,0,0, + 114,187,0,0,0,218,6,111,98,106,101,99,116,114,196,0, + 0,0,114,201,0,0,0,114,202,0,0,0,114,222,0,0, + 0,114,236,0,0,0,114,254,0,0,0,114,20,1,0,0, + 114,26,1,0,0,114,17,1,0,0,114,32,1,0,0,114, + 58,1,0,0,114,61,1,0,0,114,78,1,0,0,114,97, + 1,0,0,114,195,0,0,0,114,100,1,0,0,114,102,1, + 0,0,114,7,0,0,0,114,7,0,0,0,114,7,0,0, + 0,114,8,0,0,0,218,8,60,109,111,100,117,108,101,62, + 1,0,0,0,115,172,0,0,0,4,0,4,22,8,3,8, + 1,8,1,8,1,8,1,10,3,4,1,8,1,10,1,8, + 2,4,3,10,1,6,2,22,2,8,1,10,1,14,1,4, + 4,4,1,2,1,2,1,4,255,8,4,6,16,8,3,8, + 5,8,5,8,6,8,6,8,12,8,10,8,9,8,5,8, + 7,10,9,10,22,0,127,16,24,12,1,4,2,4,1,6, + 2,6,1,10,1,8,2,6,2,8,2,16,2,8,71,8, + 40,8,19,8,12,8,12,8,31,8,17,8,33,8,28,10, + 24,10,13,10,10,8,11,6,14,4,3,2,1,12,255,14, + 68,14,64,16,30,0,127,14,17,18,50,18,45,18,25,14, + 53,14,63,14,43,0,127,14,20,0,127,10,22,8,23,8, + 11,12,5,255,128, }; From webhook-mailer at python.org Wed Feb 10 12:56:23 2021 From: webhook-mailer at python.org (berkerpeksag) Date: Wed, 10 Feb 2021 17:56:23 -0000 Subject: [Python-checkins] Fix link to sqlite3 enable_shared_cache documentation (GH-24496) Message-ID: https://github.com/python/cpython/commit/749d40a53f8bbb9bb9d4eda345e54e3b3be7b459 commit: 749d40a53f8bbb9bb9d4eda345e54e3b3be7b459 branch: master author: Tom Forbes committer: berkerpeksag date: 2021-02-10T19:56:16+02:00 summary: Fix link to sqlite3 enable_shared_cache documentation (GH-24496) files: M Doc/whatsnew/3.10.rst diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 96892ba3d37e1..ed2fd0eb0dda6 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -644,7 +644,7 @@ Deprecated * The undocumented built-in function ``sqlite3.enable_shared_cache`` is now deprecated, scheduled for removal in Python 3.12. Its use is strongly discouraged by the SQLite3 documentation. See `the SQLite3 docs - `_ for more details. + `_ for more details. If shared cache must be used, open the database in URI mode using the ``cache=shared`` query parameter. (Contributed by Erlend E. Aasland in :issue:`24464`.) From webhook-mailer at python.org Wed Feb 10 18:04:27 2021 From: webhook-mailer at python.org (berkerpeksag) Date: Wed, 10 Feb 2021 23:04:27 -0000 Subject: [Python-checkins] bpo-40956: Fix segfault when Connection.backup is called without target (GH-24503) Message-ID: https://github.com/python/cpython/commit/ea46579067fd2d4e164d6605719ffec690c4d621 commit: ea46579067fd2d4e164d6605719ffec690c4d621 branch: master author: Erlend Egeberg Aasland committer: berkerpeksag date: 2021-02-11T01:04:02+02:00 summary: bpo-40956: Fix segfault when Connection.backup is called without target (GH-24503) files: A Misc/NEWS.d/next/Library/2021-02-10-23-29-50.bpo-40956.LcAbwG.rst M Lib/sqlite3/test/backup.py M Modules/_sqlite/clinic/connection.c.h M Modules/_sqlite/connection.c diff --git a/Lib/sqlite3/test/backup.py b/Lib/sqlite3/test/backup.py index ddff78c7607b2..cbe24df2e9c96 100644 --- a/Lib/sqlite3/test/backup.py +++ b/Lib/sqlite3/test/backup.py @@ -17,9 +17,11 @@ def verify_backup(self, bckcx): self.assertEqual(result[0][0], 3) self.assertEqual(result[1][0], 4) - def test_bad_target_none(self): + def test_bad_target(self): with self.assertRaises(TypeError): self.cx.backup(None) + with self.assertRaises(TypeError): + self.cx.backup() def test_bad_target_filename(self): with self.assertRaises(TypeError): diff --git a/Misc/NEWS.d/next/Library/2021-02-10-23-29-50.bpo-40956.LcAbwG.rst b/Misc/NEWS.d/next/Library/2021-02-10-23-29-50.bpo-40956.LcAbwG.rst new file mode 100644 index 0000000000000..e81922c031567 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-02-10-23-29-50.bpo-40956.LcAbwG.rst @@ -0,0 +1,3 @@ +Fix segfault in :meth:`sqlite3.Connection.backup` if no argument was +provided. The regression was introduced by GH-23838. Patch by +Erlend E. Aasland. diff --git a/Modules/_sqlite/clinic/connection.c.h b/Modules/_sqlite/clinic/connection.c.h index 01b8e37a957fc..f231ecc2ae78b 100644 --- a/Modules/_sqlite/clinic/connection.c.h +++ b/Modules/_sqlite/clinic/connection.c.h @@ -519,8 +519,8 @@ pysqlite_connection_iterdump(pysqlite_Connection *self, PyObject *Py_UNUSED(igno } PyDoc_STRVAR(pysqlite_connection_backup__doc__, -"backup($self, /, target=, *, pages=-1, progress=None,\n" -" name=\'main\', sleep=0.25)\n" +"backup($self, /, target, *, pages=-1, progress=None, name=\'main\',\n" +" sleep=0.25)\n" "--\n" "\n" "Makes a backup of the database. Non-standard."); @@ -541,31 +541,22 @@ pysqlite_connection_backup(pysqlite_Connection *self, PyObject *const *args, Py_ static const char * const _keywords[] = {"target", "pages", "progress", "name", "sleep", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "backup", 0}; PyObject *argsbuf[5]; - Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; - pysqlite_Connection *target = NULL; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; + pysqlite_Connection *target; int pages = -1; PyObject *progress = Py_None; const char *name = "main"; double sleep = 0.25; - args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); if (!args) { goto exit; } - if (!noptargs) { - goto skip_optional_pos; - } - if (args[0]) { - if (!PyObject_TypeCheck(args[0], pysqlite_ConnectionType)) { - _PyArg_BadArgument("backup", "argument 'target'", (pysqlite_ConnectionType)->tp_name, args[0]); - goto exit; - } - target = (pysqlite_Connection *)args[0]; - if (!--noptargs) { - goto skip_optional_pos; - } + if (!PyObject_TypeCheck(args[0], pysqlite_ConnectionType)) { + _PyArg_BadArgument("backup", "argument 'target'", (pysqlite_ConnectionType)->tp_name, args[0]); + goto exit; } -skip_optional_pos: + target = (pysqlite_Connection *)args[0]; if (!noptargs) { goto skip_optional_kwonly; } @@ -719,4 +710,4 @@ pysqlite_connection_exit(pysqlite_Connection *self, PyObject *const *args, Py_ss #ifndef PYSQLITE_CONNECTION_LOAD_EXTENSION_METHODDEF #define PYSQLITE_CONNECTION_LOAD_EXTENSION_METHODDEF #endif /* !defined(PYSQLITE_CONNECTION_LOAD_EXTENSION_METHODDEF) */ -/*[clinic end generated code: output=7cb13d491a5970aa input=a9049054013a1b77]*/ +/*[clinic end generated code: output=c1bf09db3bcd0105 input=a9049054013a1b77]*/ diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index 370dc1a30e46a..63fcb0055de2c 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -1582,7 +1582,7 @@ pysqlite_connection_iterdump_impl(pysqlite_Connection *self) /*[clinic input] _sqlite3.Connection.backup as pysqlite_connection_backup - target: object(type='pysqlite_Connection *', subclass_of='pysqlite_ConnectionType') = NULL + target: object(type='pysqlite_Connection *', subclass_of='pysqlite_ConnectionType') * pages: int = -1 progress: object = None @@ -1597,7 +1597,7 @@ pysqlite_connection_backup_impl(pysqlite_Connection *self, pysqlite_Connection *target, int pages, PyObject *progress, const char *name, double sleep) -/*[clinic end generated code: output=306a3e6a38c36334 input=2f3497ea530144b1]*/ +/*[clinic end generated code: output=306a3e6a38c36334 input=30ae45fc420bfd3b]*/ { int rc; int callback_error = 0; From webhook-mailer at python.org Thu Feb 11 19:06:59 2021 From: webhook-mailer at python.org (methane) Date: Fri, 12 Feb 2021 00:06:59 -0000 Subject: [Python-checkins] bpo-43174: Windows: Use /utf-8 compiler option. (GH-24498) Message-ID: https://github.com/python/cpython/commit/fedd86df2448370cdf62a229fd6f31dc92daf379 commit: fedd86df2448370cdf62a229fd6f31dc92daf379 branch: master author: Inada Naoki committer: methane date: 2021-02-12T09:06:47+09:00 summary: bpo-43174: Windows: Use /utf-8 compiler option. (GH-24498) files: A Misc/NEWS.d/next/Build/2021-02-10-14-11-53.bpo-43174.F9zwXQ.rst M PCbuild/pyproject.props diff --git a/Misc/NEWS.d/next/Build/2021-02-10-14-11-53.bpo-43174.F9zwXQ.rst b/Misc/NEWS.d/next/Build/2021-02-10-14-11-53.bpo-43174.F9zwXQ.rst new file mode 100644 index 0000000000000..64c80188d02f6 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2021-02-10-14-11-53.bpo-43174.F9zwXQ.rst @@ -0,0 +1 @@ +Windows build now uses ``/utf-8`` compiler option. diff --git a/PCbuild/pyproject.props b/PCbuild/pyproject.props index d7762ca1bc685..98e5ab030321d 100644 --- a/PCbuild/pyproject.props +++ b/PCbuild/pyproject.props @@ -46,6 +46,7 @@ true OnlyExplicitInline OnlyExplicitInline + /utf-8 %(AdditionalOptions) Disabled From webhook-mailer at python.org Thu Feb 11 19:31:19 2021 From: webhook-mailer at python.org (terryjreedy) Date: Fri, 12 Feb 2021 00:31:19 -0000 Subject: [Python-checkins] bpo-43202: Immediately return code object in codeop._maybe_compile (GH-24508) Message-ID: https://github.com/python/cpython/commit/2068b261e95e9fe9c4041f0102c9e931692dd5aa commit: 2068b261e95e9fe9c4041f0102c9e931692dd5aa branch: master author: Terry Jan Reedy committer: terryjreedy date: 2021-02-11T19:31:10-05:00 summary: bpo-43202: Immediately return code object in codeop._maybe_compile (GH-24508) The return used to be after code that was ignored when there was a code object. files: M Lib/codeop.py diff --git a/Lib/codeop.py b/Lib/codeop.py index 7a08610239c35..b3af93f1e18f5 100644 --- a/Lib/codeop.py +++ b/Lib/codeop.py @@ -77,10 +77,10 @@ def _maybe_compile(compiler, source, filename, symbol): source = "pass" # Replace it with a 'pass' statement err = err1 = err2 = None - code = code1 = code2 = None + code1 = code2 = None try: - code = compiler(source, filename, symbol) + return compiler(source, filename, symbol) except SyntaxError: pass @@ -100,8 +100,6 @@ def _maybe_compile(compiler, source, filename, symbol): err2 = e try: - if code: - return code if not code1 and _is_syntax_error(err1, err2): raise err1 finally: From webhook-mailer at python.org Thu Feb 11 23:33:44 2021 From: webhook-mailer at python.org (methane) Date: Fri, 12 Feb 2021 04:33:44 -0000 Subject: [Python-checkins] bpo-43174: Windows: Use /utf-8 compiler option. (GH-24498) Message-ID: https://github.com/python/cpython/commit/68d6bc798b34eccabdfbf94e563273759c4cef1f commit: 68d6bc798b34eccabdfbf94e563273759c4cef1f branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: methane date: 2021-02-12T13:33:35+09:00 summary: bpo-43174: Windows: Use /utf-8 compiler option. (GH-24498) (cherry picked from commit fedd86df2448370cdf62a229fd6f31dc92daf379) Co-authored-by: Inada Naoki files: A Misc/NEWS.d/next/Build/2021-02-10-14-11-53.bpo-43174.F9zwXQ.rst M PCbuild/pyproject.props diff --git a/Misc/NEWS.d/next/Build/2021-02-10-14-11-53.bpo-43174.F9zwXQ.rst b/Misc/NEWS.d/next/Build/2021-02-10-14-11-53.bpo-43174.F9zwXQ.rst new file mode 100644 index 0000000000000..64c80188d02f6 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2021-02-10-14-11-53.bpo-43174.F9zwXQ.rst @@ -0,0 +1 @@ +Windows build now uses ``/utf-8`` compiler option. diff --git a/PCbuild/pyproject.props b/PCbuild/pyproject.props index d7762ca1bc685..98e5ab030321d 100644 --- a/PCbuild/pyproject.props +++ b/PCbuild/pyproject.props @@ -46,6 +46,7 @@ true OnlyExplicitInline OnlyExplicitInline + /utf-8 %(AdditionalOptions) Disabled From webhook-mailer at python.org Fri Feb 12 05:34:15 2021 From: webhook-mailer at python.org (miss-islington) Date: Fri, 12 Feb 2021 10:34:15 -0000 Subject: [Python-checkins] bpo-43204: Fix LibTomCrypt URL in md5module.c and sha*module.c comments (GH-24507) Message-ID: https://github.com/python/cpython/commit/5ec7d535581bc99918e032891167a96abd224ed6 commit: 5ec7d535581bc99918e032891167a96abd224ed6 branch: master author: Erlend Egeberg Aasland committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2021-02-12T02:34:11-08:00 summary: bpo-43204: Fix LibTomCrypt URL in md5module.c and sha*module.c comments (GH-24507) Automerge-Triggered-By: GH:tiran files: M Modules/md5module.c M Modules/sha1module.c M Modules/sha256module.c M Modules/sha512module.c diff --git a/Modules/md5module.c b/Modules/md5module.c index 1c401e884389f..b2e65a0a5ffd2 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 at gmail.com, http://libtom.org + * Tom St Denis, tomstdenis at gmail.com, https://www.libtom.net */ /* rotate the hard way (platform optimizations could be done) */ diff --git a/Modules/sha1module.c b/Modules/sha1module.c index 5209857041d90..7126db93b1a3f 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 at gmail.com, http://libtom.org + * Tom St Denis, tomstdenis at gmail.com, https://www.libtom.net */ /* rotate the hard way (platform optimizations could be done) */ diff --git a/Modules/sha256module.c b/Modules/sha256module.c index 6b8bd8f1d27fb..b90e5df782674 100644 --- a/Modules/sha256module.c +++ b/Modules/sha256module.c @@ -106,7 +106,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 at iahu.ca, http://libtom.org + * Tom St Denis, tomstdenis at iahu.ca, https://www.libtom.net */ diff --git a/Modules/sha512module.c b/Modules/sha512module.c index 3fd9fa4c8d16f..062343e71ff14 100644 --- a/Modules/sha512module.c +++ b/Modules/sha512module.c @@ -94,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 at iahu.ca, http://libtom.org + * Tom St Denis, tomstdenis at iahu.ca, https://www.libtom.net */ From webhook-mailer at python.org Fri Feb 12 06:19:17 2021 From: webhook-mailer at python.org (miss-islington) Date: Fri, 12 Feb 2021 11:19:17 -0000 Subject: [Python-checkins] bpo-43204: Fix LibTomCrypt URL in md5module.c and sha*module.c comments (GH-24507) Message-ID: https://github.com/python/cpython/commit/df2197f2ec410817299f671e353c2fb0a3d61cbd commit: df2197f2ec410817299f671e353c2fb0a3d61cbd branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2021-02-12T03:18:38-08:00 summary: bpo-43204: Fix LibTomCrypt URL in md5module.c and sha*module.c comments (GH-24507) Automerge-Triggered-By: GH:tiran (cherry picked from commit 5ec7d535581bc99918e032891167a96abd224ed6) Co-authored-by: Erlend Egeberg Aasland files: M Modules/md5module.c M Modules/sha1module.c M Modules/sha256module.c M Modules/sha512module.c diff --git a/Modules/md5module.c b/Modules/md5module.c index e4d9db40f22df..6ed843376ae78 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 at gmail.com, http://libtom.org + * Tom St Denis, tomstdenis at gmail.com, https://www.libtom.net */ /* rotate the hard way (platform optimizations could be done) */ diff --git a/Modules/sha1module.c b/Modules/sha1module.c index b0656d83b3ae8..9c75cc99dba77 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 at gmail.com, http://libtom.org + * Tom St Denis, tomstdenis at gmail.com, https://www.libtom.net */ /* rotate the hard way (platform optimizations could be done) */ diff --git a/Modules/sha256module.c b/Modules/sha256module.c index 8edb1d5382883..9b885c7255308 100644 --- a/Modules/sha256module.c +++ b/Modules/sha256module.c @@ -93,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 at iahu.ca, http://libtom.org + * Tom St Denis, tomstdenis at iahu.ca, https://www.libtom.net */ diff --git a/Modules/sha512module.c b/Modules/sha512module.c index 561ef8ef0e867..831160c324d55 100644 --- a/Modules/sha512module.c +++ b/Modules/sha512module.c @@ -94,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 at iahu.ca, http://libtom.org + * Tom St Denis, tomstdenis at iahu.ca, https://www.libtom.net */ From webhook-mailer at python.org Fri Feb 12 15:05:01 2021 From: webhook-mailer at python.org (gpshead) Date: Fri, 12 Feb 2021 20:05:01 -0000 Subject: [Python-checkins] bpo-43172: readline now passes its tests when built against libedit (GH-24499) Message-ID: https://github.com/python/cpython/commit/fd053fdd39fbdf114b4218ea4309666bafa95788 commit: fd053fdd39fbdf114b4218ea4309666bafa95788 branch: master author: Gregory P. Smith committer: gpshead date: 2021-02-12T12:04:46-08:00 summary: bpo-43172: readline now passes its tests when built against libedit (GH-24499) bpo-43172: readline now passes its tests when built against libedit. Existing irreconcilable API differences remain in readline.get_begidx and readline.get_endidx behavior based on libreadline vs libedit use. A note about that has been documented. files: A Misc/NEWS.d/next/Library/2021-02-10-06-00-53.bpo-43172.ZMCJni.rst M Doc/library/readline.rst M Lib/test/test_readline.py M Modules/clinic/readline.c.h M Modules/readline.c diff --git a/Doc/library/readline.rst b/Doc/library/readline.rst index eae0a6df45f30..3ff64885f7fce 100644 --- a/Doc/library/readline.rst +++ b/Doc/library/readline.rst @@ -258,7 +258,9 @@ with a custom completer, a different set of word delimiters should be set. Get the beginning or ending index of the completion scope. These indexes are the *start* and *end* arguments passed to the :c:data:`rl_attempted_completion_function` callback of the - underlying library. + underlying library. The values may be different in the same + input editing scenario based on the underlying C readline implemtation. + Ex: libedit is known to behave differently than libreadline. .. function:: set_completer_delims(string) diff --git a/Lib/test/test_readline.py b/Lib/test/test_readline.py index de573bef9f963..f3e404da6f0b8 100644 --- a/Lib/test/test_readline.py +++ b/Lib/test/test_readline.py @@ -102,8 +102,15 @@ def test_write_read_append(self): # test 'no such file' behaviour os.unlink(hfilename) - with self.assertRaises(FileNotFoundError): + try: readline.append_history_file(1, hfilename) + except FileNotFoundError: + pass # Some implementations return this error (libreadline). + else: + os.unlink(hfilename) # Some create it anyways (libedit). + # If the file wasn't created, unlink will fail. + # We're just testing that one of the two expected behaviors happens + # instead of an incorrect error. # write_history_file can create the target readline.write_history_file(hfilename) @@ -228,7 +235,17 @@ def display(substitution, matches, longest_match_length): output = run_pty(script, input) self.assertIn(b"text 't\\xeb'\r\n", output) self.assertIn(b"line '[\\xefnserted]|t\\xeb[after]'\r\n", output) - self.assertIn(b"indexes 11 13\r\n", output) + if sys.platform == "darwin" or not is_editline: + self.assertIn(b"indexes 11 13\r\n", output) + # Non-macOS libedit does not handle non-ASCII bytes + # the same way and generates character indices + # rather than byte indices via get_begidx() and + # get_endidx(). Ex: libedit2 3.1-20191231-2 on Debian + # winds up with "indexes 10 12". Stemming from the + # start and end values calls back into readline.c's + # rl_attempted_completion_function = flex_complete with: + # (11, 13) instead of libreadline's (12, 15). + if not is_editline and hasattr(readline, "set_pre_input_hook"): self.assertIn(b"substitution 't\\xeb'\r\n", output) self.assertIn(b"matches ['t\\xebnt', 't\\xebxt']\r\n", output) diff --git a/Misc/NEWS.d/next/Library/2021-02-10-06-00-53.bpo-43172.ZMCJni.rst b/Misc/NEWS.d/next/Library/2021-02-10-06-00-53.bpo-43172.ZMCJni.rst new file mode 100644 index 0000000000000..dc756606d8bb0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-02-10-06-00-53.bpo-43172.ZMCJni.rst @@ -0,0 +1,4 @@ +The readline module now passes its tests when built directly against +libedit. Existing irreconcilable API differences remain in +:func:`readline.get_begidx` and :func:`readline.get_endidx` behavior based +on libreadline vs libedit use. diff --git a/Modules/clinic/readline.c.h b/Modules/clinic/readline.c.h index 80207caf07110..d1ee8089f73f0 100644 --- a/Modules/clinic/readline.c.h +++ b/Modules/clinic/readline.c.h @@ -384,7 +384,7 @@ PyDoc_STRVAR(readline_remove_history_item__doc__, "remove_history_item($module, pos, /)\n" "--\n" "\n" -"Remove history item given by its position."); +"Remove history item given by its zero-based position."); #define READLINE_REMOVE_HISTORY_ITEM_METHODDEF \ {"remove_history_item", (PyCFunction)readline_remove_history_item, METH_O, readline_remove_history_item__doc__}, @@ -412,7 +412,9 @@ PyDoc_STRVAR(readline_replace_history_item__doc__, "replace_history_item($module, pos, line, /)\n" "--\n" "\n" -"Replaces history item given by its position with contents of line."); +"Replaces history item given by its position with contents of line.\n" +"\n" +"pos is zero-based."); #define READLINE_REPLACE_HISTORY_ITEM_METHODDEF \ {"replace_history_item", (PyCFunction)(void(*)(void))readline_replace_history_item, METH_FASTCALL, readline_replace_history_item__doc__}, @@ -563,7 +565,7 @@ PyDoc_STRVAR(readline_get_history_item__doc__, "get_history_item($module, index, /)\n" "--\n" "\n" -"Return the current contents of history item at index."); +"Return the current contents of history item at one-based index."); #define READLINE_GET_HISTORY_ITEM_METHODDEF \ {"get_history_item", (PyCFunction)readline_get_history_item, METH_O, readline_get_history_item__doc__}, @@ -683,4 +685,4 @@ readline_redisplay(PyObject *module, PyObject *Py_UNUSED(ignored)) #ifndef READLINE_CLEAR_HISTORY_METHODDEF #define READLINE_CLEAR_HISTORY_METHODDEF #endif /* !defined(READLINE_CLEAR_HISTORY_METHODDEF) */ -/*[clinic end generated code: output=cb44f391ccbfb565 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=f7d390113b27989f input=a9049054013a1b77]*/ diff --git a/Modules/readline.c b/Modules/readline.c index 02b2c40e6b900..c900e079543c4 100644 --- a/Modules/readline.c +++ b/Modules/readline.c @@ -67,7 +67,8 @@ extern char **completion_matches(char *, CPFunction *); static int using_libedit_emulation = 0; static const char libedit_version_tag[] = "EditLine wrapper"; -static int libedit_history_start = 0; +static int8_t libedit_history_start = 0; +static int8_t libedit_append_replace_history_offset = 0; #ifdef HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK static void @@ -320,7 +321,8 @@ readline_append_history_file_impl(PyObject *module, int nelements, filename_bytes = NULL; filename = NULL; } - errno = err = append_history(nelements, filename); + errno = err = append_history( + nelements - libedit_append_replace_history_offset, filename); if (!err && _history_length >= 0) history_truncate_file(filename, _history_length); Py_XDECREF(filename_bytes); @@ -592,12 +594,12 @@ readline.remove_history_item pos as entry_number: int / -Remove history item given by its position. +Remove history item given by its zero-based position. [clinic start generated code]*/ static PyObject * readline_remove_history_item_impl(PyObject *module, int entry_number) -/*[clinic end generated code: output=ab114f029208c7e8 input=c8520ac3da50224e]*/ +/*[clinic end generated code: output=ab114f029208c7e8 input=f248beb720ff1838]*/ { HIST_ENTRY *entry; @@ -626,12 +628,14 @@ readline.replace_history_item / Replaces history item given by its position with contents of line. + +pos is zero-based. [clinic start generated code]*/ static PyObject * readline_replace_history_item_impl(PyObject *module, int entry_number, PyObject *line) -/*[clinic end generated code: output=f8cec2770ca125eb input=b7ccef0780ae041b]*/ +/*[clinic end generated code: output=f8cec2770ca125eb input=368bb66fe5ee5222]*/ { PyObject *encoded; HIST_ENTRY *old_entry; @@ -645,7 +649,9 @@ readline_replace_history_item_impl(PyObject *module, int entry_number, if (encoded == NULL) { return NULL; } - old_entry = replace_history_entry(entry_number, PyBytes_AS_STRING(encoded), (void *)NULL); + old_entry = replace_history_entry( + entry_number + libedit_append_replace_history_offset, + PyBytes_AS_STRING(encoded), (void *)NULL); Py_DECREF(encoded); if (!old_entry) { PyErr_Format(PyExc_ValueError, @@ -786,12 +792,12 @@ readline.get_history_item index as idx: int / -Return the current contents of history item at index. +Return the current contents of history item at one-based index. [clinic start generated code]*/ static PyObject * readline_get_history_item_impl(PyObject *module, int idx) -/*[clinic end generated code: output=83d3e53ea5f34b3d input=63fff0c3c4323269]*/ +/*[clinic end generated code: output=83d3e53ea5f34b3d input=8adf5c80e6c7ff2b]*/ { HIST_ENTRY *hist_ent; @@ -1191,6 +1197,22 @@ setup_readline(readlinestate *mod_state) } else { libedit_history_start = 1; } + /* Some libedit implementations use 1 based indexing on + * replace_history_entry where libreadline uses 0 based. + * The API our module presents is supposed to be 0 based. + * It's a mad mad mad mad world. + */ + { + add_history("2"); + HIST_ENTRY *old_entry = replace_history_entry(1, "X", NULL); + _py_free_history_entry(old_entry); + HIST_ENTRY *item = history_get(libedit_history_start); + if (item && item->line && strcmp(item->line, "X")) { + libedit_append_replace_history_offset = 0; + } else { + libedit_append_replace_history_offset = 1; + } + } clear_history(); using_history(); From webhook-mailer at python.org Fri Feb 12 23:57:18 2021 From: webhook-mailer at python.org (terryjreedy) Date: Sat, 13 Feb 2021 04:57:18 -0000 Subject: [Python-checkins] bpo-43200: Fix link to shutil.copy() in the shutil doc (GH-24505) Message-ID: https://github.com/python/cpython/commit/762fe7deed34a1d5294bf82071d318c8427b4893 commit: 762fe7deed34a1d5294bf82071d318c8427b4893 branch: master author: Zackery Spytz committer: terryjreedy date: 2021-02-12T23:57:12-05:00 summary: bpo-43200: Fix link to shutil.copy() in the shutil doc (GH-24505) Co-authored-by: Terry Jan Reedy files: M Doc/library/shutil.rst diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst index 435787c27661d..d5080da15bba4 100644 --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -443,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 From webhook-mailer at python.org Sat Feb 13 00:06:57 2021 From: webhook-mailer at python.org (miss-islington) Date: Sat, 13 Feb 2021 05:06:57 -0000 Subject: [Python-checkins] bpo-43200: Fix link to shutil.copy() in the shutil doc (GH-24505) Message-ID: https://github.com/python/cpython/commit/4230bd52e3f9f289f02e41ab17a95f50ed4db5a6 commit: 4230bd52e3f9f289f02e41ab17a95f50ed4db5a6 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2021-02-12T21:06:50-08:00 summary: bpo-43200: Fix link to shutil.copy() in the shutil doc (GH-24505) Co-authored-by: Terry Jan Reedy (cherry picked from commit 762fe7deed34a1d5294bf82071d318c8427b4893) Co-authored-by: Zackery Spytz files: M Doc/library/shutil.rst diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst index 578fcc6e293d9..cd925a92a53f9 100644 --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -440,8 +440,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 From webhook-mailer at python.org Sat Feb 13 00:20:31 2021 From: webhook-mailer at python.org (terryjreedy) Date: Sat, 13 Feb 2021 05:20:31 -0000 Subject: [Python-checkins] bpo-43200: Fix link to shutil.copy() in the shutil doc (GH-24505) Message-ID: https://github.com/python/cpython/commit/242f6c9ffe3dd8f613942d5364b816cc89c384be commit: 242f6c9ffe3dd8f613942d5364b816cc89c384be branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: terryjreedy date: 2021-02-13T00:20:24-05:00 summary: bpo-43200: Fix link to shutil.copy() in the shutil doc (GH-24505) Co-authored-by: Zackery Spytz Co-authored-by: Terry Jan Reedy (cherry picked from commit 762fe7deed34a1d5294bf82071d318c8427b4893) files: M Doc/library/shutil.rst diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst index 435787c27661d..d5080da15bba4 100644 --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -443,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 From webhook-mailer at python.org Sat Feb 13 01:49:29 2021 From: webhook-mailer at python.org (terryjreedy) Date: Sat, 13 Feb 2021 06:49:29 -0000 Subject: [Python-checkins] bpo-43202: More codeop._maybe_compile clean-ups (GH-24512) Message-ID: https://github.com/python/cpython/commit/b676f5f809007533db3e3fdd01243959dd233d57 commit: b676f5f809007533db3e3fdd01243959dd233d57 branch: master author: Terry Jan Reedy committer: terryjreedy date: 2021-02-13T01:49:18-05:00 summary: bpo-43202: More codeop._maybe_compile clean-ups (GH-24512) Add comment, end others with period, remove unused variables, initialize others only when needed, and add explicit return. files: M Lib/codeop.py diff --git a/Lib/codeop.py b/Lib/codeop.py index b3af93f1e18f5..6b56be488eeb0 100644 --- a/Lib/codeop.py +++ b/Lib/codeop.py @@ -64,24 +64,21 @@ __all__ = ["compile_command", "Compile", "CommandCompiler"] -PyCF_DONT_IMPLY_DEDENT = 0x200 # Matches pythonrun.h +PyCF_DONT_IMPLY_DEDENT = 0x200 # Matches pythonrun.h. def _maybe_compile(compiler, source, filename, symbol): - # Check for source consisting of only blank lines and comments + # Check for source consisting of only blank lines and comments. for line in source.split("\n"): line = line.strip() if line and line[0] != '#': - break # Leave it alone + break # Leave it alone. else: if symbol != "eval": source = "pass" # Replace it with a 'pass' statement - err = err1 = err2 = None - code1 = code2 = None - try: return compiler(source, filename, symbol) - except SyntaxError: + except SyntaxError: # Let other compile() errors propagate. pass # Catch syntax warnings after the first compile @@ -89,6 +86,7 @@ def _maybe_compile(compiler, source, filename, symbol): with warnings.catch_warnings(): warnings.simplefilter("error") + code1 = err1 = err2 = None try: code1 = compiler(source + "\n", filename, symbol) except SyntaxError as e: @@ -102,6 +100,8 @@ def _maybe_compile(compiler, source, filename, symbol): try: if not code1 and _is_syntax_error(err1, err2): raise err1 + else: + return None finally: err1 = err2 = None From webhook-mailer at python.org Sun Feb 14 01:54:57 2021 From: webhook-mailer at python.org (corona10) Date: Sun, 14 Feb 2021 06:54:57 -0000 Subject: [Python-checkins] bpo-43152: Update assert statement to remove unused warning (GH-24473) Message-ID: https://github.com/python/cpython/commit/3cf0833f42ebde24f6435b838785ca4f946b988f commit: 3cf0833f42ebde24f6435b838785ca4f946b988f branch: master author: Dong-hee Na committer: corona10 date: 2021-02-14T15:54:39+09:00 summary: bpo-43152: Update assert statement to remove unused warning (GH-24473) files: M Python/ceval.c diff --git a/Python/ceval.c b/Python/ceval.c index 3b67a6b79bfb7..9e4c2666ac6f7 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -4744,8 +4744,7 @@ PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals, Py_DECREF(defaults); return NULL; } - PyCodeObject *code = (PyCodeObject *)_co; - assert ((code->co_flags & (CO_NEWLOCALS | CO_OPTIMIZED)) == 0); + assert ((((PyCodeObject *)_co)->co_flags & (CO_NEWLOCALS | CO_OPTIMIZED)) == 0); if (locals == NULL) { locals = globals; } From webhook-mailer at python.org Sun Feb 14 09:14:52 2021 From: webhook-mailer at python.org (corona10) Date: Sun, 14 Feb 2021 14:14:52 -0000 Subject: [Python-checkins] bpo-43210: Fix byteswap comment in sha512.module.c (GH-24518) Message-ID: https://github.com/python/cpython/commit/1b57426e3a7842b4e6f9fc13ffb657c78e5443d4 commit: 1b57426e3a7842b4e6f9fc13ffb657c78e5443d4 branch: master author: Erlend Egeberg Aasland committer: corona10 date: 2021-02-14T23:14:26+09:00 summary: bpo-43210: Fix byteswap comment in sha512.module.c (GH-24518) files: M Modules/sha512module.c diff --git a/Modules/sha512module.c b/Modules/sha512module.c index 062343e71ff14..0d8f51e5ae5e0 100644 --- a/Modules/sha512module.c +++ b/Modules/sha512module.c @@ -17,7 +17,7 @@ /* SHA objects */ #include "Python.h" -#include "pycore_bitutils.h" // _Py_bswap32() +#include "pycore_bitutils.h" // _Py_bswap64() #include "structmember.h" // PyMemberDef #include "hashlib.h" #include "pystrhex.h" From webhook-mailer at python.org Sun Feb 14 09:53:17 2021 From: webhook-mailer at python.org (corona10) Date: Sun, 14 Feb 2021 14:53:17 -0000 Subject: [Python-checkins] bpo-43204: Fix LibTomCrypt URL in md5module.c and sha*module.c comments (GH-24507) (GH-24516) Message-ID: https://github.com/python/cpython/commit/7777ae2ff7ba04ad20424db4efcc67246ff27b95 commit: 7777ae2ff7ba04ad20424db4efcc67246ff27b95 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: corona10 date: 2021-02-14T23:53:10+09:00 summary: bpo-43204: Fix LibTomCrypt URL in md5module.c and sha*module.c comments (GH-24507) (GH-24516) Automerge-Triggered-By: GH:tiran (cherry picked from commit 5ec7d535581bc99918e032891167a96abd224ed6) Co-authored-by: Erlend Egeberg Aasland Co-authored-by: Erlend Egeberg Aasland files: M Modules/md5module.c M Modules/sha1module.c M Modules/sha256module.c M Modules/sha512module.c diff --git a/Modules/md5module.c b/Modules/md5module.c index c2ebaaf61f91c..64fab8081b5dc 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 at gmail.com, http://libtom.org + * Tom St Denis, tomstdenis at gmail.com, https://www.libtom.net */ /* rotate the hard way (platform optimizations could be done) */ diff --git a/Modules/sha1module.c b/Modules/sha1module.c index ce2ad267e775b..4a8dbd8539b7a 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 at gmail.com, http://libtom.org + * Tom St Denis, tomstdenis at gmail.com, https://www.libtom.net */ /* rotate the hard way (platform optimizations could be done) */ diff --git a/Modules/sha256module.c b/Modules/sha256module.c index b8d6c4cf8006a..a1c8b1a3dfb5a 100644 --- a/Modules/sha256module.c +++ b/Modules/sha256module.c @@ -102,7 +102,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 at iahu.ca, http://libtom.org + * Tom St Denis, tomstdenis at iahu.ca, https://www.libtom.net */ diff --git a/Modules/sha512module.c b/Modules/sha512module.c index 98b97917f4caf..4167fd391cc4a 100644 --- a/Modules/sha512module.c +++ b/Modules/sha512module.c @@ -111,7 +111,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 at iahu.ca, http://libtom.org + * Tom St Denis, tomstdenis at iahu.ca, https://www.libtom.net */ From webhook-mailer at python.org Sun Feb 14 17:42:11 2021 From: webhook-mailer at python.org (orsenthil) Date: Sun, 14 Feb 2021 22:42:11 -0000 Subject: [Python-checkins] bpo-42967: only use '&' as a query string separator (#24297) Message-ID: https://github.com/python/cpython/commit/fcbe0cb04d35189401c0c880ebfb4311e952d776 commit: fcbe0cb04d35189401c0c880ebfb4311e952d776 branch: master author: Adam Goldschmidt committer: orsenthil date: 2021-02-14T14:41:57-08:00 summary: bpo-42967: only use '&' as a query string separator (#24297) bpo-42967: [security] Address a web cache-poisoning issue reported in urllib.parse.parse_qsl(). urllib.parse will only us "&" as query string separator by default instead of both ";" and "&" as allowed in earlier versions. An optional argument seperator with default value "&" is added to specify the separator. Co-authored-by: ?ric Araujo Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> Co-authored-by: Ken Jin <28750310+Fidget-Spinner at users.noreply.github.com> Co-authored-by: ?ric Araujo files: A Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst M Doc/library/cgi.rst M Doc/library/urllib.parse.rst M Doc/whatsnew/3.10.rst M Doc/whatsnew/3.6.rst M Doc/whatsnew/3.7.rst M Doc/whatsnew/3.8.rst M Doc/whatsnew/3.9.rst M Lib/cgi.py M Lib/test/test_cgi.py M Lib/test/test_urlparse.py M Lib/urllib/parse.py diff --git a/Doc/library/cgi.rst b/Doc/library/cgi.rst index 4048592e7361f..05d9cdf424073 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.10 + Added the *separator* parameter. + .. function:: parse_header(string) diff --git a/Doc/library/urllib.parse.rst b/Doc/library/urllib.parse.rst index f9c8ba7398f66..1a7907823929d 100644 --- a/Doc/library/urllib.parse.rst +++ b/Doc/library/urllib.parse.rst @@ -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,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 (with the ``doseq`` parameter set to ``True``) to convert such dictionaries into query strings. @@ -201,8 +203,12 @@ or on combining URL components into a URL string. .. versionchanged:: 3.8 Added *max_num_fields* parameter. + .. versionchanged:: 3.10 + Added *separator* parameter with the default value of `&`. Python versions earlier than Python 3.10 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 +232,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 +243,10 @@ or on combining URL components into a URL string. .. versionchanged:: 3.8 Added *max_num_fields* parameter. + .. versionchanged:: 3.10 + Added *separator* parameter with the default value of `&`. Python versions earlier than Python 3.10 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) diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index ed2fd0eb0dda6..c282edcc9d8f0 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -546,6 +546,19 @@ Add new method :meth:`~unittest.TestCase.assertNoLogs` to complement the existing :meth:`~unittest.TestCase.assertLogs`. (Contributed by Kit Yan Choi in :issue:`39385`.) +urllib.parse +------------ + +Python versions earlier than Python 3.10 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`.) + xml --- diff --git a/Doc/whatsnew/3.6.rst b/Doc/whatsnew/3.6.rst index 85a6657fdfbda..8a64da1b249d7 100644 --- a/Doc/whatsnew/3.6.rst +++ b/Doc/whatsnew/3.6.rst @@ -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 7590af35e2838..75e1973b3e1b7 100644 --- a/Doc/whatsnew/3.7.rst +++ b/Doc/whatsnew/3.7.rst @@ -2557,3 +2557,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 0b4820f3333e1..d21921d3dd51e 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -2234,3 +2234,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.8.8 +=============================== + +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`.) \ No newline at end of file diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index b94f1bfaddf6f..5f4f8ba211b18 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -1515,4 +1515,17 @@ 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`.) \ No newline at end of file +(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/Lib/cgi.py b/Lib/cgi.py index 6018c3608697a..6c72507c2087d 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/test/test_cgi.py b/Lib/test/test_cgi.py index 6b29759da44d0..239d97589cac2 100644 --- a/Lib/test/test_cgi.py +++ b/Lib/test/test_cgi.py @@ -53,12 +53,9 @@ def do_test(buf, method): ("", ValueError("bad query field: ''")), ("&", ValueError("bad query field: ''")), ("&&", ValueError("bad query field: ''")), - (";", ValueError("bad query field: ''")), - (";&;", ValueError("bad query field: ''")), # Should the next few really be valid? ("=", {}), ("=&=", {}), - ("=;=", {}), # This rest seem to make sense ("=a", {'': ['a']}), ("&=a", ValueError("bad query field: ''")), @@ -73,8 +70,6 @@ def do_test(buf, method): ("a=a+b&b=b+c", {'a': ['a b'], 'b': ['b c']}), ("a=a+b&a=b+a", {'a': ['a b', 'b a']}), ("x=1&y=2.0&z=2-3.%2b0", {'x': ['1'], 'y': ['2.0'], 'z': ['2-3.+0']}), - ("x=1;y=2.0&z=2-3.%2b0", {'x': ['1'], 'y': ['2.0'], 'z': ['2-3.+0']}), - ("x=1;y=2.0;z=2-3.%2b0", {'x': ['1'], 'y': ['2.0'], 'z': ['2-3.+0']}), ("Hbc5161168c542333633315dee1182227:key_store_seqid=400006&cuyer=r&view=bustomer&order_id=0bb2e248638833d48cb7fed300000f1b&expire=964546263&lobale=en-US&kid=130003.300038&ss=env", {'Hbc5161168c542333633315dee1182227:key_store_seqid': ['400006'], 'cuyer': ['r'], @@ -201,6 +196,30 @@ def test_strict(self): else: self.assertEqual(fs.getvalue(key), expect_val[0]) + def test_separator(self): + parse_semicolon = [ + ("x=1;y=2.0", {'x': ['1'], 'y': ['2.0']}), + ("x=1;y=2.0;z=2-3.%2b0", {'x': ['1'], 'y': ['2.0'], 'z': ['2-3.+0']}), + (";", ValueError("bad query field: ''")), + (";;", ValueError("bad query field: ''")), + ("=;a", ValueError("bad query field: 'a'")), + (";b=a", ValueError("bad query field: ''")), + ("b;=a", ValueError("bad query field: 'b'")), + ("a=a+b;b=b+c", {'a': ['a b'], 'b': ['b c']}), + ("a=a+b;a=b+a", {'a': ['a b', 'b a']}), + ] + for orig, expect in parse_semicolon: + env = {'QUERY_STRING': orig} + fs = cgi.FieldStorage(separator=';', environ=env) + if isinstance(expect, dict): + for key in expect.keys(): + expect_val = expect[key] + self.assertIn(key, fs) + if len(expect_val) > 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_urlparse.py b/Lib/test/test_urlparse.py index 762500789f73a..3b1c360625b5a 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): @@ -886,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/urllib/parse.py b/Lib/urllib/parse.py index ea897c3032257..5bd067895bfa3 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -662,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: @@ -686,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) @@ -701,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: @@ -724,19 +727,26 @@ 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) + and not isinstance(separator, 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/Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst b/Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst new file mode 100644 index 0000000000000..f08489b41494e --- /dev/null +++ b/Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst @@ -0,0 +1 @@ +Fix web cache poisoning vulnerability by defaulting the query args separator to ``&``, and allowing the user to choose a custom separator. From webhook-mailer at python.org Mon Feb 15 11:19:32 2021 From: webhook-mailer at python.org (vstinner) Date: Mon, 15 Feb 2021 16:19:32 -0000 Subject: [Python-checkins] bpo-43181: Convert PyObject_TypeCheck to static inline function (GH-24533) Message-ID: https://github.com/python/cpython/commit/4bb2a1ebc569eee6f1b46ecef1965a26ae8cb76d commit: 4bb2a1ebc569eee6f1b46ecef1965a26ae8cb76d branch: master author: Erlend Egeberg Aasland committer: vstinner date: 2021-02-15T17:19:24+01:00 summary: bpo-43181: Convert PyObject_TypeCheck to static inline function (GH-24533) files: A Misc/NEWS.d/next/Core and Builtins/2021-02-11-11-37-14.bpo-43181.ydv33S.rst M Doc/c-api/object.rst M Include/object.h diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst index a387b4a2df134..1100af1df2928 100644 --- a/Doc/c-api/object.rst +++ b/Doc/c-api/object.rst @@ -297,8 +297,8 @@ Object Protocol .. c:function:: int PyObject_TypeCheck(PyObject *o, PyTypeObject *type) - Return true if the object *o* is of type *type* or a subtype of *type*. Both - parameters must be non-``NULL``. + Return non-zero if the object *o* is of type *type* or a subtype of *type*, and + ``0`` otherwise. Both parameters must be non-``NULL``. .. c:function:: Py_ssize_t PyObject_Size(PyObject *o) diff --git a/Include/object.h b/Include/object.h index 8d0039428e73a..0870e4c6f854c 100644 --- a/Include/object.h +++ b/Include/object.h @@ -235,8 +235,11 @@ PyAPI_FUNC(void *) PyType_GetModuleState(struct _typeobject *); /* Generic type check */ PyAPI_FUNC(int) PyType_IsSubtype(PyTypeObject *, PyTypeObject *); -#define PyObject_TypeCheck(ob, tp) \ - (Py_IS_TYPE(ob, tp) || PyType_IsSubtype(Py_TYPE(ob), (tp))) + +static inline int _PyObject_TypeCheck(PyObject *ob, PyTypeObject *type) { + return Py_IS_TYPE(ob, type) || PyType_IsSubtype(Py_TYPE(ob), type); +} +#define PyObject_TypeCheck(ob, type) _PyObject_TypeCheck(_PyObject_CAST(ob), type) PyAPI_DATA(PyTypeObject) PyType_Type; /* built-in 'type' */ PyAPI_DATA(PyTypeObject) PyBaseObject_Type; /* built-in 'object' */ diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-02-11-11-37-14.bpo-43181.ydv33S.rst b/Misc/NEWS.d/next/Core and Builtins/2021-02-11-11-37-14.bpo-43181.ydv33S.rst new file mode 100644 index 0000000000000..0e0a5712930d7 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-02-11-11-37-14.bpo-43181.ydv33S.rst @@ -0,0 +1,2 @@ +Convert :c:func:`PyObject_TypeCheck` macro to a static inline function. Patch by +Erlend E. Aasland. From webhook-mailer at python.org Mon Feb 15 12:00:30 2021 From: webhook-mailer at python.org (orsenthil) Date: Mon, 15 Feb 2021 17:00:30 -0000 Subject: [Python-checkins] bpo-42967: Fix urllib.parse docs and make logic clearer (GH-24536) Message-ID: https://github.com/python/cpython/commit/a2f0654b0a5b4c4f726155620002cc1f5f2d206a commit: a2f0654b0a5b4c4f726155620002cc1f5f2d206a branch: master author: Ken Jin <28750310+Fidget-Spinner at users.noreply.github.com> committer: orsenthil date: 2021-02-15T09:00:20-08:00 summary: bpo-42967: Fix urllib.parse docs and make logic clearer (GH-24536) files: M Doc/library/urllib.parse.rst M Doc/whatsnew/3.6.rst M Doc/whatsnew/3.8.rst M Doc/whatsnew/3.9.rst M Lib/urllib/parse.py diff --git a/Doc/library/urllib.parse.rst b/Doc/library/urllib.parse.rst index 1a7907823929d..67c21208196b8 100644 --- a/Doc/library/urllib.parse.rst +++ b/Doc/library/urllib.parse.rst @@ -190,7 +190,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 `&`. + 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 @@ -204,8 +205,10 @@ or on combining URL components into a URL string. Added *max_num_fields* parameter. .. versionchanged:: 3.10 - Added *separator* parameter with the default value of `&`. Python versions earlier than Python 3.10 allowed using both ";" and "&" as - query parameter separator. This has been changed to allow only a single separator key, with "&" as the default separator. + Added *separator* parameter with the default value of ``&``. Python + versions earlier than Python 3.10 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, separator='&') @@ -232,7 +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 `&`. + 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. @@ -244,8 +248,10 @@ or on combining URL components into a URL string. Added *max_num_fields* parameter. .. versionchanged:: 3.10 - Added *separator* parameter with the default value of `&`. Python versions earlier than Python 3.10 allowed using both ";" and "&" as - query parameter separator. This has been changed to allow only a single separator key, with "&" as the default separator. + Added *separator* parameter with the default value of ``&``. Python + versions earlier than Python 3.10 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) diff --git a/Doc/whatsnew/3.6.rst b/Doc/whatsnew/3.6.rst index 8a64da1b249d7..03a877a3d9178 100644 --- a/Doc/whatsnew/3.6.rst +++ b/Doc/whatsnew/3.6.rst @@ -2447,11 +2447,11 @@ details, see the documentation for ``loop.create_datagram_endpoint()``. Notable changes in Python 3.6.13 ================================ -Earlier Python versions allowed using both ";" and "&" as +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 +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. diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index d21921d3dd51e..91afffb58a7e6 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -2238,11 +2238,11 @@ details, see the documentation for ``loop.create_datagram_endpoint()``. Notable changes in Python 3.8.8 =============================== -Earlier Python versions allowed using both ";" and "&" as +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 +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. diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 5f4f8ba211b18..3086930569dc9 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -1520,11 +1520,11 @@ become a :exc:`TypeError` in Python 3.10. urllib.parse ------------ -Earlier Python versions allowed using both ";" and "&" as +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 +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. diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py index 5bd067895bfa3..335e183498d8b 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -734,8 +734,7 @@ def parse_qsl(qs, keep_blank_values=False, strict_parsing=False, """ qs, _coerce_result = _coerce_args(qs) - if not separator or (not isinstance(separator, str) - and not isinstance(separator, bytes)): + 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 From webhook-mailer at python.org Mon Feb 15 13:03:44 2021 From: webhook-mailer at python.org (orsenthil) Date: Mon, 15 Feb 2021 18:03:44 -0000 Subject: [Python-checkins] [3.9] bpo-42967: only use '&' as a query string separator (GH-24297) (#24528) Message-ID: https://github.com/python/cpython/commit/c9f07813ab8e664d8c34413c4fc2d4f86c061a92 commit: c9f07813ab8e664d8c34413c4fc2d4f86c061a92 branch: 3.9 author: Senthil Kumaran committer: orsenthil date: 2021-02-15T10:03:31-08:00 summary: [3.9] bpo-42967: only use '&' as a query string separator (GH-24297) (#24528) (cherry picked from commit fcbe0cb04d35189401c0c880ebfb4311e952d776) * [3.9] bpo-42967: only use '&' as a query string separator (GH-24297) bpo-42967: [security] Address a web cache-poisoning issue reported in urllib.parse.parse_qsl(). urllib.parse will only us "&" as query string separator by default instead of both ";" and "&" as allowed in earlier versions. An optional argument seperator with default value "&" is added to specify the separator. Co-authored-by: ?ric Araujo Co-authored-by: Ken Jin <28750310+Fidget-Spinner at users.noreply.github.com> Co-authored-by: Adam Goldschmidt files: A Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst M Doc/library/cgi.rst M Doc/library/urllib.parse.rst M Doc/whatsnew/3.6.rst M Doc/whatsnew/3.7.rst M Doc/whatsnew/3.8.rst M Doc/whatsnew/3.9.rst M Lib/cgi.py M Lib/test/test_cgi.py M Lib/test/test_urlparse.py M Lib/urllib/parse.py diff --git a/Doc/library/cgi.rst b/Doc/library/cgi.rst index 4048592e7361f..e60a3f13595cf 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/urllib.parse.rst b/Doc/library/urllib.parse.rst index 536cf952bda43..38e2986334c80 100644 --- a/Doc/library/urllib.parse.rst +++ b/Doc/library/urllib.parse.rst @@ -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) diff --git a/Doc/whatsnew/3.6.rst b/Doc/whatsnew/3.6.rst index 85a6657fdfbda..03a877a3d9178 100644 --- a/Doc/whatsnew/3.6.rst +++ b/Doc/whatsnew/3.6.rst @@ -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 25b1e1e33e325..9204cc7fbf8c4 100644 --- a/Doc/whatsnew/3.7.rst +++ b/Doc/whatsnew/3.7.rst @@ -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 0b4820f3333e1..dbc3875aae61b 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -2234,3 +2234,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.8.8 +=============================== + +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 index 68b1e504da89e..3086930569dc9 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -1516,3 +1516,16 @@ 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/Lib/cgi.py b/Lib/cgi.py index 77ab703cc0360..1e880e51848af 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/test/test_cgi.py b/Lib/test/test_cgi.py index 101942de947fb..4e1506a6468b9 100644 --- a/Lib/test/test_cgi.py +++ b/Lib/test/test_cgi.py @@ -53,12 +53,9 @@ def do_test(buf, method): ("", ValueError("bad query field: ''")), ("&", ValueError("bad query field: ''")), ("&&", ValueError("bad query field: ''")), - (";", ValueError("bad query field: ''")), - (";&;", ValueError("bad query field: ''")), # Should the next few really be valid? ("=", {}), ("=&=", {}), - ("=;=", {}), # This rest seem to make sense ("=a", {'': ['a']}), ("&=a", ValueError("bad query field: ''")), @@ -73,8 +70,6 @@ def do_test(buf, method): ("a=a+b&b=b+c", {'a': ['a b'], 'b': ['b c']}), ("a=a+b&a=b+a", {'a': ['a b', 'b a']}), ("x=1&y=2.0&z=2-3.%2b0", {'x': ['1'], 'y': ['2.0'], 'z': ['2-3.+0']}), - ("x=1;y=2.0&z=2-3.%2b0", {'x': ['1'], 'y': ['2.0'], 'z': ['2-3.+0']}), - ("x=1;y=2.0;z=2-3.%2b0", {'x': ['1'], 'y': ['2.0'], 'z': ['2-3.+0']}), ("Hbc5161168c542333633315dee1182227:key_store_seqid=400006&cuyer=r&view=bustomer&order_id=0bb2e248638833d48cb7fed300000f1b&expire=964546263&lobale=en-US&kid=130003.300038&ss=env", {'Hbc5161168c542333633315dee1182227:key_store_seqid': ['400006'], 'cuyer': ['r'], @@ -201,6 +196,30 @@ def test_strict(self): else: self.assertEqual(fs.getvalue(key), expect_val[0]) + def test_separator(self): + parse_semicolon = [ + ("x=1;y=2.0", {'x': ['1'], 'y': ['2.0']}), + ("x=1;y=2.0;z=2-3.%2b0", {'x': ['1'], 'y': ['2.0'], 'z': ['2-3.+0']}), + (";", ValueError("bad query field: ''")), + (";;", ValueError("bad query field: ''")), + ("=;a", ValueError("bad query field: 'a'")), + (";b=a", ValueError("bad query field: ''")), + ("b;=a", ValueError("bad query field: 'b'")), + ("a=a+b;b=b+c", {'a': ['a b'], 'b': ['b c']}), + ("a=a+b;a=b+a", {'a': ['a b', 'b a']}), + ] + for orig, expect in parse_semicolon: + env = {'QUERY_STRING': orig} + fs = cgi.FieldStorage(separator=';', environ=env) + if isinstance(expect, dict): + for key in expect.keys(): + expect_val = expect[key] + self.assertIn(key, fs) + if len(expect_val) > 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_urlparse.py b/Lib/test/test_urlparse.py index 762500789f73a..3b1c360625b5a 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): @@ -886,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/urllib/parse.py b/Lib/urllib/parse.py index ea897c3032257..335e183498d8b 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -662,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: @@ -686,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) @@ -701,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: @@ -724,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/Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst b/Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst new file mode 100644 index 0000000000000..f08489b41494e --- /dev/null +++ b/Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst @@ -0,0 +1 @@ +Fix web cache poisoning vulnerability by defaulting the query args separator to ``&``, and allowing the user to choose a custom separator. From webhook-mailer at python.org Mon Feb 15 13:15:12 2021 From: webhook-mailer at python.org (ambv) Date: Mon, 15 Feb 2021 18:15:12 -0000 Subject: [Python-checkins] [3.8] bpo-42967: only use '&' as a query string separator (GH-24297) (#24529) Message-ID: https://github.com/python/cpython/commit/e3110c3cfbb7daa690d54d0eff6c264c870a71bf commit: e3110c3cfbb7daa690d54d0eff6c264c870a71bf branch: 3.8 author: Senthil Kumaran committer: ambv date: 2021-02-15T19:15:02+01:00 summary: [3.8] bpo-42967: only use '&' as a query string separator (GH-24297) (#24529) * bpo-42967: only use '&' as a query string separator (#24297) bpo-42967: [security] Address a web cache-poisoning issue reported in urllib.parse.parse_qsl(). urllib.parse will only us "&" as query string separator by default instead of both ";" and "&" as allowed in earlier versions. An optional argument seperator with default value "&" is added to specify the separator. Co-authored-by: ?ric Araujo Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> Co-authored-by: Ken Jin <28750310+Fidget-Spinner at users.noreply.github.com> Co-authored-by: ?ric Araujo (cherry picked from commit fcbe0cb04d35189401c0c880ebfb4311e952d776) * [3.8] bpo-42967: only use '&' as a query string separator (GH-24297) bpo-42967: [security] Address a web cache-poisoning issue reported in urllib.parse.parse_qsl(). urllib.parse will only us "&" as query string separator by default instead of both ";" and "&" as allowed in earlier versions. An optional argument seperator with default value "&" is added to specify the separator. Co-authored-by: ?ric Araujo Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> Co-authored-by: Ken Jin <28750310+Fidget-Spinner at users.noreply.github.com> Co-authored-by: ?ric Araujo . (cherry picked from commit fcbe0cb04d35189401c0c880ebfb4311e952d776) Co-authored-by: Adam Goldschmidt * Update correct version information. * fix docs and make logic clearer Co-authored-by: Adam Goldschmidt Co-authored-by: Fidget-Spinner <28750310+Fidget-Spinner at users.noreply.github.com> files: A Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst M Doc/library/cgi.rst M Doc/library/urllib.parse.rst M Doc/whatsnew/3.6.rst M Doc/whatsnew/3.7.rst M Doc/whatsnew/3.8.rst M Lib/cgi.py M Lib/test/test_cgi.py M Lib/test/test_urlparse.py M Lib/urllib/parse.py diff --git a/Doc/library/cgi.rst b/Doc/library/cgi.rst index 4048592e7361f..880074bed6026 100644 --- a/Doc/library/cgi.rst +++ b/Doc/library/cgi.rst @@ -277,14 +277,16 @@ 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. + .. versionchanged:: 3.8.8 + Added the *separator* parameter. -.. 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 +305,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.8.8 + Added the *separator* parameter. + .. function:: parse_header(string) diff --git a/Doc/library/urllib.parse.rst b/Doc/library/urllib.parse.rst index 25e5cc1a6ce0b..fcad7076e6c77 100644 --- a/Doc/library/urllib.parse.rst +++ b/Doc/library/urllib.parse.rst @@ -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.8.8 + Added *separator* parameter with the default value of ``&``. Python + versions earlier than Python 3.8.8 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,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 to convert such lists of pairs into query strings. @@ -235,6 +247,12 @@ or on combining URL components into a URL string. .. versionchanged:: 3.8 Added *max_num_fields* parameter. + .. versionchanged:: 3.8.8 + Added *separator* parameter with the default value of ``&``. Python + versions earlier than Python 3.8.8 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) diff --git a/Doc/whatsnew/3.6.rst b/Doc/whatsnew/3.6.rst index 85a6657fdfbda..03a877a3d9178 100644 --- a/Doc/whatsnew/3.6.rst +++ b/Doc/whatsnew/3.6.rst @@ -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 4933cba3990b1..824dc13e0c6fd 100644 --- a/Doc/whatsnew/3.7.rst +++ b/Doc/whatsnew/3.7.rst @@ -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 1a192800b2f02..632ccc1f2c40a 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -2251,3 +2251,16 @@ 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`) + +Notable changes in Python 3.8.8 +=============================== + +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/Lib/cgi.py b/Lib/cgi.py index 77ab703cc0360..1e880e51848af 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/test/test_cgi.py b/Lib/test/test_cgi.py index 101942de947fb..4e1506a6468b9 100644 --- a/Lib/test/test_cgi.py +++ b/Lib/test/test_cgi.py @@ -53,12 +53,9 @@ def do_test(buf, method): ("", ValueError("bad query field: ''")), ("&", ValueError("bad query field: ''")), ("&&", ValueError("bad query field: ''")), - (";", ValueError("bad query field: ''")), - (";&;", ValueError("bad query field: ''")), # Should the next few really be valid? ("=", {}), ("=&=", {}), - ("=;=", {}), # This rest seem to make sense ("=a", {'': ['a']}), ("&=a", ValueError("bad query field: ''")), @@ -73,8 +70,6 @@ def do_test(buf, method): ("a=a+b&b=b+c", {'a': ['a b'], 'b': ['b c']}), ("a=a+b&a=b+a", {'a': ['a b', 'b a']}), ("x=1&y=2.0&z=2-3.%2b0", {'x': ['1'], 'y': ['2.0'], 'z': ['2-3.+0']}), - ("x=1;y=2.0&z=2-3.%2b0", {'x': ['1'], 'y': ['2.0'], 'z': ['2-3.+0']}), - ("x=1;y=2.0;z=2-3.%2b0", {'x': ['1'], 'y': ['2.0'], 'z': ['2-3.+0']}), ("Hbc5161168c542333633315dee1182227:key_store_seqid=400006&cuyer=r&view=bustomer&order_id=0bb2e248638833d48cb7fed300000f1b&expire=964546263&lobale=en-US&kid=130003.300038&ss=env", {'Hbc5161168c542333633315dee1182227:key_store_seqid': ['400006'], 'cuyer': ['r'], @@ -201,6 +196,30 @@ def test_strict(self): else: self.assertEqual(fs.getvalue(key), expect_val[0]) + def test_separator(self): + parse_semicolon = [ + ("x=1;y=2.0", {'x': ['1'], 'y': ['2.0']}), + ("x=1;y=2.0;z=2-3.%2b0", {'x': ['1'], 'y': ['2.0'], 'z': ['2-3.+0']}), + (";", ValueError("bad query field: ''")), + (";;", ValueError("bad query field: ''")), + ("=;a", ValueError("bad query field: 'a'")), + (";b=a", ValueError("bad query field: ''")), + ("b;=a", ValueError("bad query field: 'b'")), + ("a=a+b;b=b+c", {'a': ['a b'], 'b': ['b c']}), + ("a=a+b;a=b+a", {'a': ['a b', 'b a']}), + ] + for orig, expect in parse_semicolon: + env = {'QUERY_STRING': orig} + fs = cgi.FieldStorage(separator=';', environ=env) + if isinstance(expect, dict): + for key in expect.keys(): + expect_val = expect[key] + self.assertIn(key, fs) + if len(expect_val) > 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_urlparse.py b/Lib/test/test_urlparse.py index 4ae6ed33858ce..90c8d6922629e 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): @@ -884,10 +872,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/urllib/parse.py b/Lib/urllib/parse.py index 95be7181133b4..0c1c94f5fc986 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -650,7 +650,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: @@ -674,12 +674,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) @@ -689,7 +692,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: @@ -712,19 +715,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/Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst b/Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst new file mode 100644 index 0000000000000..f08489b41494e --- /dev/null +++ b/Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst @@ -0,0 +1 @@ +Fix web cache poisoning vulnerability by defaulting the query args separator to ``&``, and allowing the user to choose a custom separator. From webhook-mailer at python.org Mon Feb 15 13:34:22 2021 From: webhook-mailer at python.org (ned-deily) Date: Mon, 15 Feb 2021 18:34:22 -0000 Subject: [Python-checkins] [3.7] bpo-42967: only use '&' as a query string separator (GH-24297) (GH-24531) Message-ID: https://github.com/python/cpython/commit/d0d4d30882fe3ab9b1badbecf5d15d94326fd13e commit: d0d4d30882fe3ab9b1badbecf5d15d94326fd13e branch: 3.7 author: Senthil Kumaran committer: ned-deily date: 2021-02-15T13:34:14-05:00 summary: [3.7] bpo-42967: only use '&' as a query string separator (GH-24297) (GH-24531) bpo-42967: [security] Address a web cache-poisoning issue reported in urllib.parse.parse_qsl(). urllib.parse will only us "&" as query string separator by default instead of both ";" and "&" as allowed in earlier versions. An optional argument seperator with default value "&" is added to specify the separator. Co-authored-by: ?ric Araujo Co-authored-by: Ken Jin <28750310+Fidget-Spinner at users.noreply.github.com> Co-authored-by: Adam Goldschmidt (cherry picked from commit fcbe0cb04d35189401c0c880ebfb4311e952d776) files: A Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst M Doc/library/cgi.rst M Doc/library/urllib.parse.rst M Doc/whatsnew/3.6.rst M Doc/whatsnew/3.7.rst M Lib/cgi.py M Lib/test/test_cgi.py M Lib/test/test_urlparse.py M Lib/urllib/parse.py diff --git a/Doc/library/cgi.rst b/Doc/library/cgi.rst index 0b1aead9ddf1f..f0ec7e8cc6d04 100644 --- a/Doc/library/cgi.rst +++ b/Doc/library/cgi.rst @@ -277,10 +277,10 @@ 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. @@ -296,7 +296,7 @@ algorithms implemented in this module in other circumstances. instead. It is maintained here only for backward compatibility. -.. 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 @@ -315,6 +315,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.7.10 + Added the *separator* parameter. + .. function:: parse_header(string) diff --git a/Doc/library/urllib.parse.rst b/Doc/library/urllib.parse.rst index f499412144008..e79faf035b06b 100644 --- a/Doc/library/urllib.parse.rst +++ b/Doc/library/urllib.parse.rst @@ -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. @@ -200,8 +203,14 @@ or on combining URL components into a URL string. .. versionchanged:: 3.7.2 Added *max_num_fields* parameter. + .. versionchanged:: 3.7.10 + Added *separator* parameter with the default value of ``&``. Python + versions earlier than Python 3.7.10 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 @@ -225,6 +234,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 to convert such lists of pairs into query strings. @@ -234,6 +246,13 @@ or on combining URL components into a URL string. .. versionchanged:: 3.7.2 Added *max_num_fields* parameter. + .. versionchanged:: 3.7.10 + Added *separator* parameter with the default value of ``&``. Python + versions earlier than Python 3.7.10 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) Construct a URL from a tuple as returned by ``urlparse()``. The *parts* diff --git a/Doc/whatsnew/3.6.rst b/Doc/whatsnew/3.6.rst index 04c1f7e71db32..4409a3a596267 100644 --- a/Doc/whatsnew/3.6.rst +++ b/Doc/whatsnew/3.6.rst @@ -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 6dcb006924e77..25e231dcc7dfa 100644 --- a/Doc/whatsnew/3.7.rst +++ b/Doc/whatsnew/3.7.rst @@ -2572,3 +2572,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/Lib/cgi.py b/Lib/cgi.py index 5a001667efca8..51afead1b3136 100755 --- a/Lib/cgi.py +++ b/Lib/cgi.py @@ -117,7 +117,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: @@ -136,6 +137,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 @@ -156,7 +160,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: @@ -180,7 +184,7 @@ 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) # parse query string function called from urlparse, @@ -198,7 +202,7 @@ def parse_qsl(qs, keep_blank_values=0, strict_parsing=0): DeprecationWarning, 2) return urllib.parse.parse_qsl(qs, keep_blank_values, strict_parsing) -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: @@ -222,7 +226,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): @@ -332,7 +336,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: @@ -380,6 +384,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 @@ -606,7 +611,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() @@ -622,7 +627,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__ @@ -666,7 +671,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/test/test_cgi.py b/Lib/test/test_cgi.py index 220268e14f032..c2a00a2e45d79 100644 --- a/Lib/test/test_cgi.py +++ b/Lib/test/test_cgi.py @@ -55,12 +55,9 @@ def do_test(buf, method): ("", ValueError("bad query field: ''")), ("&", ValueError("bad query field: ''")), ("&&", ValueError("bad query field: ''")), - (";", ValueError("bad query field: ''")), - (";&;", ValueError("bad query field: ''")), # Should the next few really be valid? ("=", {}), ("=&=", {}), - ("=;=", {}), # This rest seem to make sense ("=a", {'': ['a']}), ("&=a", ValueError("bad query field: ''")), @@ -75,8 +72,6 @@ def do_test(buf, method): ("a=a+b&b=b+c", {'a': ['a b'], 'b': ['b c']}), ("a=a+b&a=b+a", {'a': ['a b', 'b a']}), ("x=1&y=2.0&z=2-3.%2b0", {'x': ['1'], 'y': ['2.0'], 'z': ['2-3.+0']}), - ("x=1;y=2.0&z=2-3.%2b0", {'x': ['1'], 'y': ['2.0'], 'z': ['2-3.+0']}), - ("x=1;y=2.0;z=2-3.%2b0", {'x': ['1'], 'y': ['2.0'], 'z': ['2-3.+0']}), ("Hbc5161168c542333633315dee1182227:key_store_seqid=400006&cuyer=r&view=bustomer&order_id=0bb2e248638833d48cb7fed300000f1b&expire=964546263&lobale=en-US&kid=130003.300038&ss=env", {'Hbc5161168c542333633315dee1182227:key_store_seqid': ['400006'], 'cuyer': ['r'], @@ -212,6 +207,30 @@ def test_strict(self): else: self.assertEqual(fs.getvalue(key), expect_val[0]) + def test_separator(self): + parse_semicolon = [ + ("x=1;y=2.0", {'x': ['1'], 'y': ['2.0']}), + ("x=1;y=2.0;z=2-3.%2b0", {'x': ['1'], 'y': ['2.0'], 'z': ['2-3.+0']}), + (";", ValueError("bad query field: ''")), + (";;", ValueError("bad query field: ''")), + ("=;a", ValueError("bad query field: 'a'")), + (";b=a", ValueError("bad query field: ''")), + ("b;=a", ValueError("bad query field: 'b'")), + ("a=a+b;b=b+c", {'a': ['a b'], 'b': ['b c']}), + ("a=a+b;a=b+a", {'a': ['a b', 'b a']}), + ] + for orig, expect in parse_semicolon: + env = {'QUERY_STRING': orig} + fs = cgi.FieldStorage(separator=';', environ=env) + if isinstance(expect, dict): + for key in expect.keys(): + expect_val = expect[key] + self.assertIn(key, fs) + if len(expect_val) > 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_urlparse.py b/Lib/test/test_urlparse.py index 68f633ca3a7db..e3088b2f39bd7 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): @@ -884,10 +872,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/urllib/parse.py b/Lib/urllib/parse.py index 94df275c4677e..e67d69db3614b 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -643,7 +643,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: @@ -667,12 +667,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) @@ -682,7 +685,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: @@ -705,19 +708,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/Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst b/Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst new file mode 100644 index 0000000000000..f08489b41494e --- /dev/null +++ b/Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst @@ -0,0 +1 @@ +Fix web cache poisoning vulnerability by defaulting the query args separator to ``&``, and allowing the user to choose a custom separator. From webhook-mailer at python.org Mon Feb 15 13:44:01 2021 From: webhook-mailer at python.org (pablogsal) Date: Mon, 15 Feb 2021 18:44:01 -0000 Subject: [Python-checkins] bpo-43108: Fix a reference leak in the curses module (GH-24420) (GH-24429) Message-ID: https://github.com/python/cpython/commit/ede1ff226c9ef4efd053109c69b4e33f75b2b17b commit: ede1ff226c9ef4efd053109c69b4e33f75b2b17b branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: pablogsal date: 2021-02-15T18:43:52Z summary: bpo-43108: Fix a reference leak in the curses module (GH-24420) (GH-24429) (cherry picked from commit bb739ec922c6992a2be38f9fd3c544c2cc322dde) Co-authored-by: Pablo Galindo Co-authored-by: Pablo Galindo files: A Misc/NEWS.d/next/Library/2021-02-02-20-23-31.bpo-43108.lqcCZ6.rst M Modules/_cursesmodule.c diff --git a/Misc/NEWS.d/next/Library/2021-02-02-20-23-31.bpo-43108.lqcCZ6.rst b/Misc/NEWS.d/next/Library/2021-02-02-20-23-31.bpo-43108.lqcCZ6.rst new file mode 100644 index 0000000000000..8e45640bceae1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-02-02-20-23-31.bpo-43108.lqcCZ6.rst @@ -0,0 +1 @@ +Fixed a reference leak in the :mod:`curses` module. Patch by Pablo Galindo diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c index 0f35cdd286121..35070d94e0c56 100644 --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -365,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; @@ -679,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); From webhook-mailer at python.org Mon Feb 15 14:16:52 2021 From: webhook-mailer at python.org (ned-deily) Date: Mon, 15 Feb 2021 19:16:52 -0000 Subject: [Python-checkins] [3.6] bpo-42967: only use '&' as a query string separator (GH-24297) (GH-24532) Message-ID: https://github.com/python/cpython/commit/5c17dfc5d70ce88be99bc5769b91ce79d7a90d61 commit: 5c17dfc5d70ce88be99bc5769b91ce79d7a90d61 branch: 3.6 author: Senthil Kumaran committer: ned-deily date: 2021-02-15T14:16:43-05:00 summary: [3.6] bpo-42967: only use '&' as a query string separator (GH-24297) (GH-24532) bpo-42967: [security] Address a web cache-poisoning issue reported in urllib.parse.parse_qsl(). urllib.parse will only us "&" as query string separator by default instead of both ";" and "&" as allowed in earlier versions. An optional argument seperator with default value "&" is added to specify the separator. Co-authored-by: ?ric Araujo Co-authored-by: Ken Jin <28750310+Fidget-Spinner at users.noreply.github.com> Co-authored-by: Adam Goldschmidt files: A Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst M Doc/library/cgi.rst M Doc/library/urllib.parse.rst M Doc/whatsnew/3.6.rst M Lib/cgi.py M Lib/test/test_cgi.py M Lib/test/test_urlparse.py M Lib/urllib/parse.py diff --git a/Doc/library/cgi.rst b/Doc/library/cgi.rst index 41219eeaabae0..a3dad1b8b0318 100644 --- a/Doc/library/cgi.rst +++ b/Doc/library/cgi.rst @@ -277,13 +277,12 @@ 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_qs(qs, keep_blank_values=False, strict_parsing=False) This function is deprecated in this module. Use :func:`urllib.parse.parse_qs` @@ -308,6 +307,9 @@ algorithms implemented in this module in other circumstances. Note that this does not parse nested multipart parts --- use :class:`FieldStorage` for that. + .. versionchanged:: 3.6.13 + Added the *separator* parameter. + .. function:: parse_header(string) diff --git a/Doc/library/urllib.parse.rst b/Doc/library/urllib.parse.rst index 647af613a3157..3c2e37ef2093a 100644 --- a/Doc/library/urllib.parse.rst +++ b/Doc/library/urllib.parse.rst @@ -143,7 +143,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 @@ -168,6 +168,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. @@ -179,8 +182,14 @@ or on combining URL components into a URL string. .. versionchanged:: 3.6.8 Added *max_num_fields* parameter. + .. versionchanged:: 3.6.13 + Added *separator* parameter with the default value of ``&``. Python + versions earlier than Python 3.6.13 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 @@ -204,6 +213,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 to convert such lists of pairs into query strings. @@ -213,6 +225,12 @@ or on combining URL components into a URL string. .. versionchanged:: 3.6.8 Added *max_num_fields* parameter. + .. versionchanged:: 3.6.13 + Added *separator* parameter with the default value of ``&``. Python + versions earlier than Python 3.6.13 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) diff --git a/Doc/whatsnew/3.6.rst b/Doc/whatsnew/3.6.rst index 90250e46b687f..296935adadd0c 100644 --- a/Doc/whatsnew/3.6.rst +++ b/Doc/whatsnew/3.6.rst @@ -2459,3 +2459,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/Lib/cgi.py b/Lib/cgi.py index 56f243e09f0f3..1483bedbd55e1 100755 --- a/Lib/cgi.py +++ b/Lib/cgi.py @@ -117,7 +117,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: @@ -136,6 +137,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 @@ -180,7 +184,7 @@ 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) # parse query string function called from urlparse, @@ -405,7 +409,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: @@ -453,6 +457,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 @@ -678,7 +683,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() @@ -694,7 +699,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__ @@ -736,7 +741,7 @@ def read_multi(self, environ, keep_blank_values, strict_parsing): part = klass(self.fp, headers, ib, environ, keep_blank_values, strict_parsing,self.limit-self.bytes_read, - 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/test/test_cgi.py b/Lib/test/test_cgi.py index b3e2d4cce8e2f..b4d5a12eef90e 100644 --- a/Lib/test/test_cgi.py +++ b/Lib/test/test_cgi.py @@ -55,12 +55,9 @@ def do_test(buf, method): ("", ValueError("bad query field: ''")), ("&", ValueError("bad query field: ''")), ("&&", ValueError("bad query field: ''")), - (";", ValueError("bad query field: ''")), - (";&;", ValueError("bad query field: ''")), # Should the next few really be valid? ("=", {}), ("=&=", {}), - ("=;=", {}), # This rest seem to make sense ("=a", {'': ['a']}), ("&=a", ValueError("bad query field: ''")), @@ -75,8 +72,6 @@ def do_test(buf, method): ("a=a+b&b=b+c", {'a': ['a b'], 'b': ['b c']}), ("a=a+b&a=b+a", {'a': ['a b', 'b a']}), ("x=1&y=2.0&z=2-3.%2b0", {'x': ['1'], 'y': ['2.0'], 'z': ['2-3.+0']}), - ("x=1;y=2.0&z=2-3.%2b0", {'x': ['1'], 'y': ['2.0'], 'z': ['2-3.+0']}), - ("x=1;y=2.0;z=2-3.%2b0", {'x': ['1'], 'y': ['2.0'], 'z': ['2-3.+0']}), ("Hbc5161168c542333633315dee1182227:key_store_seqid=400006&cuyer=r&view=bustomer&order_id=0bb2e248638833d48cb7fed300000f1b&expire=964546263&lobale=en-US&kid=130003.300038&ss=env", {'Hbc5161168c542333633315dee1182227:key_store_seqid': ['400006'], 'cuyer': ['r'], @@ -180,6 +175,30 @@ def test_strict(self): else: self.assertEqual(fs.getvalue(key), expect_val[0]) + def test_separator(self): + parse_semicolon = [ + ("x=1;y=2.0", {'x': ['1'], 'y': ['2.0']}), + ("x=1;y=2.0;z=2-3.%2b0", {'x': ['1'], 'y': ['2.0'], 'z': ['2-3.+0']}), + (";", ValueError("bad query field: ''")), + (";;", ValueError("bad query field: ''")), + ("=;a", ValueError("bad query field: 'a'")), + (";b=a", ValueError("bad query field: ''")), + ("b;=a", ValueError("bad query field: 'b'")), + ("a=a+b;b=b+c", {'a': ['a b'], 'b': ['b c']}), + ("a=a+b;a=b+a", {'a': ['a b', 'b a']}), + ] + for orig, expect in parse_semicolon: + env = {'QUERY_STRING': orig} + fs = cgi.FieldStorage(separator=';', environ=env) + if isinstance(expect, dict): + for key in expect.keys(): + expect_val = expect[key] + self.assertIn(key, fs) + if len(expect_val) > 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_urlparse.py b/Lib/test/test_urlparse.py index 68f633ca3a7db..e3088b2f39bd7 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): @@ -884,10 +872,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/urllib/parse.py b/Lib/urllib/parse.py index fa8827a9fa790..66056bf589bf6 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -644,7 +644,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: @@ -668,12 +668,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) @@ -683,7 +686,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: @@ -706,19 +709,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/Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst b/Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst new file mode 100644 index 0000000000000..f08489b41494e --- /dev/null +++ b/Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst @@ -0,0 +1 @@ +Fix web cache poisoning vulnerability by defaulting the query args separator to ``&``, and allowing the user to choose a custom separator. From webhook-mailer at python.org Mon Feb 15 16:36:05 2021 From: webhook-mailer at python.org (ambv) Date: Mon, 15 Feb 2021 21:36:05 -0000 Subject: [Python-checkins] bpo-43231: Fix test.test_curses.TestCurses.test_init_pair when running under -R (GH-24539) Message-ID: https://github.com/python/cpython/commit/ab2d48163901c9635401db0f6d784c45482d17ec commit: ab2d48163901c9635401db0f6d784c45482d17ec branch: master author: Pablo Galindo committer: ambv date: 2021-02-15T22:35:48+01:00 summary: bpo-43231: Fix test.test_curses.TestCurses.test_init_pair when running under -R (GH-24539) files: M Lib/test/test_curses.py diff --git a/Lib/test/test_curses.py b/Lib/test/test_curses.py index a9f7001d39f08..f6bd27d02e431 100644 --- a/Lib/test/test_curses.py +++ b/Lib/test/test_curses.py @@ -926,6 +926,13 @@ def get_pair_limit(self): if (not curses.has_extended_color_support() or (6, 1) <= curses.ncurses_version < (6, 2)): pair_limit = min(pair_limit, SHORT_MAX) + # If use_default_colors() is called, the upper limit of the extended + # range may be restricted, so we need to check if the limit is still + # correct + try: + curses.init_pair(pair_limit, 0, 0) + except ValueError: + pair_limit = curses.COLOR_PAIRS return pair_limit @requires_colors From webhook-mailer at python.org Mon Feb 15 17:16:12 2021 From: webhook-mailer at python.org (pablogsal) Date: Mon, 15 Feb 2021 22:16:12 -0000 Subject: [Python-checkins] bpo-43231: Correctly calculate the curses color pair limit when checking for it (GH-24541) Message-ID: https://github.com/python/cpython/commit/d0204963ec87beb9732e924e464b8a6a1ef4d341 commit: d0204963ec87beb9732e924e464b8a6a1ef4d341 branch: master author: Pablo Galindo committer: pablogsal date: 2021-02-15T22:15:49Z summary: bpo-43231: Correctly calculate the curses color pair limit when checking for it (GH-24541) files: M Lib/test/test_curses.py diff --git a/Lib/test/test_curses.py b/Lib/test/test_curses.py index f6bd27d02e431..0833c86115ebd 100644 --- a/Lib/test/test_curses.py +++ b/Lib/test/test_curses.py @@ -930,7 +930,7 @@ def get_pair_limit(self): # range may be restricted, so we need to check if the limit is still # correct try: - curses.init_pair(pair_limit, 0, 0) + curses.init_pair(pair_limit - 1, 0, 0) except ValueError: pair_limit = curses.COLOR_PAIRS return pair_limit From webhook-mailer at python.org Mon Feb 15 18:02:47 2021 From: webhook-mailer at python.org (pablogsal) Date: Mon, 15 Feb 2021 23:02:47 -0000 Subject: [Python-checkins] [3.9] Minor improvements to the convolve() recipe (GH-24520) Message-ID: https://github.com/python/cpython/commit/9cc70bc22040932d257f6ba04bab812134110a74 commit: 9cc70bc22040932d257f6ba04bab812134110a74 branch: 3.9 author: Pablo Galindo committer: pablogsal date: 2021-02-15T23:02:41Z summary: [3.9] Minor improvements to the convolve() recipe (GH-24520) files: M Doc/library/itertools.rst M Doc/tools/susp-ignored.csv diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index ff5b60d70ff4e..6da55f8a3f49c 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -774,9 +774,9 @@ which incur interpreter overhead. # 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 = list(reversed(kernel)) + kernel = tuple(kernel)[::-1] n = len(kernel) - window = collections.deque([0] * n, maxlen=n) + 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)) diff --git a/Doc/tools/susp-ignored.csv b/Doc/tools/susp-ignored.csv index c9777c6be9334..9f0c42a9bb5ab 100644 --- a/Doc/tools/susp-ignored.csv +++ b/Doc/tools/susp-ignored.csv @@ -171,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()` From webhook-mailer at python.org Mon Feb 15 18:03:41 2021 From: webhook-mailer at python.org (pablogsal) Date: Mon, 15 Feb 2021 23:03:41 -0000 Subject: [Python-checkins] Add a warning block around the get_referrers() documentation (GH-24511) Message-ID: https://github.com/python/cpython/commit/813db24f7c2c536d587d1832c3c52b44fa9e242e commit: 813db24f7c2c536d587d1832c3c52b44fa9e242e branch: master author: Pablo Galindo committer: pablogsal date: 2021-02-15T23:03:38Z summary: Add a warning block around the get_referrers() documentation (GH-24511) files: M Doc/library/gc.rst diff --git a/Doc/library/gc.rst b/Doc/library/gc.rst index 2d85cd3431711..a3d201d5055c8 100644 --- a/Doc/library/gc.rst +++ b/Doc/library/gc.rst @@ -135,10 +135,11 @@ The :mod:`gc` module provides the following functions: resulting referrers. To get only currently live objects, call :func:`collect` before calling :func:`get_referrers`. - Care must be taken when using objects returned by :func:`get_referrers` because - some of them could still be under construction and hence in a temporarily - invalid state. Avoid using :func:`get_referrers` for any purpose other than - debugging. + .. warning:: + Care must be taken when using objects returned by :func:`get_referrers` because + some of them could still be under construction and hence in a temporarily + invalid state. Avoid using :func:`get_referrers` for any purpose other than + debugging. .. function:: get_referents(*objs) From webhook-mailer at python.org Mon Feb 15 18:12:41 2021 From: webhook-mailer at python.org (miss-islington) Date: Mon, 15 Feb 2021 23:12:41 -0000 Subject: [Python-checkins] Add a warning block around the get_referrers() documentation (GH-24511) Message-ID: https://github.com/python/cpython/commit/f30aa3c44f807da5db9b053fba96578a8210a3c2 commit: f30aa3c44f807da5db9b053fba96578a8210a3c2 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2021-02-15T15:12:34-08:00 summary: Add a warning block around the get_referrers() documentation (GH-24511) (cherry picked from commit 813db24f7c2c536d587d1832c3c52b44fa9e242e) Co-authored-by: Pablo Galindo files: M Doc/library/gc.rst diff --git a/Doc/library/gc.rst b/Doc/library/gc.rst index adaa30295b5e8..073391d9058bf 100644 --- a/Doc/library/gc.rst +++ b/Doc/library/gc.rst @@ -135,10 +135,11 @@ The :mod:`gc` module provides the following functions: resulting referrers. To get only currently live objects, call :func:`collect` before calling :func:`get_referrers`. - Care must be taken when using objects returned by :func:`get_referrers` because - some of them could still be under construction and hence in a temporarily - invalid state. Avoid using :func:`get_referrers` for any purpose other than - debugging. + .. warning:: + Care must be taken when using objects returned by :func:`get_referrers` because + some of them could still be under construction and hence in a temporarily + invalid state. Avoid using :func:`get_referrers` for any purpose other than + debugging. .. function:: get_referents(*objs) From webhook-mailer at python.org Mon Feb 15 18:28:44 2021 From: webhook-mailer at python.org (vstinner) Date: Mon, 15 Feb 2021 23:28:44 -0000 Subject: [Python-checkins] bpo-42819, readline: Disable bracketed paste (GH-24108) Message-ID: https://github.com/python/cpython/commit/755f3c1521b422bc2177013d289f5439975fdc4f commit: 755f3c1521b422bc2177013d289f5439975fdc4f branch: master author: Dustin Rodrigues committer: vstinner date: 2021-02-16T00:28:24+01:00 summary: bpo-42819, readline: Disable bracketed paste (GH-24108) files: A Misc/NEWS.d/next/Core and Builtins/2021-01-04-23-54-34.bpo-42819.4KO6wU.rst M Misc/ACKS M Modules/readline.c diff --git a/Misc/ACKS b/Misc/ACKS index 29ef9864f9827..ca222e4371f5e 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1461,6 +1461,7 @@ Mark Roddy Kevin Rodgers Sean Rodman Giampaolo Rodola +Dustin Rodrigues Mauro S. M. Rodrigues Elson Rodriguez Adi Roiban diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-04-23-54-34.bpo-42819.4KO6wU.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-04-23-54-34.bpo-42819.4KO6wU.rst new file mode 100644 index 0000000000000..d067f0bfa7644 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-01-04-23-54-34.bpo-42819.4KO6wU.rst @@ -0,0 +1,8 @@ +: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. diff --git a/Modules/readline.c b/Modules/readline.c index c900e079543c4..c79d22f85f84e 100644 --- a/Modules/readline.c +++ b/Modules/readline.c @@ -156,6 +156,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 */ /*[clinic input] @@ -217,6 +237,7 @@ readline_read_init_file_impl(PyObject *module, PyObject *filename_obj) errno = rl_read_init_file(NULL); if (errno) return PyErr_SetFromErrno(PyExc_OSError); + disable_bracketed_paste(); Py_RETURN_NONE; } @@ -1267,6 +1288,8 @@ setup_readline(readlinestate *mod_state) else rl_initialize(); + disable_bracketed_paste(); + RESTORE_LOCALE(saved_locale) return 0; } From webhook-mailer at python.org Mon Feb 15 18:48:00 2021 From: webhook-mailer at python.org (miss-islington) Date: Mon, 15 Feb 2021 23:48:00 -0000 Subject: [Python-checkins] bpo-42819, readline: Disable bracketed paste (GH-24108) Message-ID: https://github.com/python/cpython/commit/f9d7c12b6c7ab978cb6c61a666bc06dd3fec9b3e commit: f9d7c12b6c7ab978cb6c61a666bc06dd3fec9b3e branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2021-02-15T15:47:52-08:00 summary: bpo-42819, readline: Disable bracketed paste (GH-24108) (cherry picked from commit 755f3c1521b422bc2177013d289f5439975fdc4f) Co-authored-by: Dustin Rodrigues files: A Misc/NEWS.d/next/Core and Builtins/2021-01-04-23-54-34.bpo-42819.4KO6wU.rst M Misc/ACKS M Modules/readline.c diff --git a/Misc/ACKS b/Misc/ACKS index 8ca1f64c9f5f6..e181c6171169e 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1415,6 +1415,7 @@ Mark Roddy Kevin Rodgers Sean Rodman Giampaolo Rodola +Dustin Rodrigues Mauro S. M. Rodrigues Elson Rodriguez Adi Roiban diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-04-23-54-34.bpo-42819.4KO6wU.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-04-23-54-34.bpo-42819.4KO6wU.rst new file mode 100644 index 0000000000000..d067f0bfa7644 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-01-04-23-54-34.bpo-42819.4KO6wU.rst @@ -0,0 +1,8 @@ +: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. diff --git a/Modules/readline.c b/Modules/readline.c index 081657fb23699..9b30d597c8481 100644 --- a/Modules/readline.c +++ b/Modules/readline.c @@ -141,6 +141,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 +207,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; } @@ -1146,6 +1167,8 @@ setup_readline(readlinestate *mod_state) else rl_initialize(); + disable_bracketed_paste(); + RESTORE_LOCALE(saved_locale) } From webhook-mailer at python.org Mon Feb 15 19:14:34 2021 From: webhook-mailer at python.org (vstinner) Date: Tue, 16 Feb 2021 00:14:34 -0000 Subject: [Python-checkins] bpo-43155: Add PyCMethod_New to PC/python3dll.c (GH-24500) Message-ID: https://github.com/python/cpython/commit/8a8b5df93f379f561aab4f2fc5b2ad54f5009f7a commit: 8a8b5df93f379f561aab4f2fc5b2ad54f5009f7a branch: master author: Zackery Spytz committer: vstinner date: 2021-02-16T01:14:13+01:00 summary: bpo-43155: Add PyCMethod_New to PC/python3dll.c (GH-24500) files: A Misc/NEWS.d/next/Windows/2021-02-10-04-16-51.bpo-43155.O1tURk.rst M PC/python3dll.c diff --git a/Misc/NEWS.d/next/Windows/2021-02-10-04-16-51.bpo-43155.O1tURk.rst b/Misc/NEWS.d/next/Windows/2021-02-10-04-16-51.bpo-43155.O1tURk.rst new file mode 100644 index 0000000000000..2eeef2b0ea27a --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2021-02-10-04-16-51.bpo-43155.O1tURk.rst @@ -0,0 +1 @@ +:c:func:`PyCMethod_New` is now present in ``python3.lib``. diff --git a/PC/python3dll.c b/PC/python3dll.c index 542853abc894d..3f87b70b44848 100644 --- a/PC/python3dll.c +++ b/PC/python3dll.c @@ -128,6 +128,7 @@ EXPORT_FUNC(PyCFunction_GetFunction) EXPORT_FUNC(PyCFunction_GetSelf) EXPORT_FUNC(PyCFunction_New) EXPORT_FUNC(PyCFunction_NewEx) +EXPORT_FUNC(PyCMethod_New) EXPORT_FUNC(PyCodec_BackslashReplaceErrors) EXPORT_FUNC(PyCodec_Decode) EXPORT_FUNC(PyCodec_Decoder) From webhook-mailer at python.org Mon Feb 15 19:18:11 2021 From: webhook-mailer at python.org (vstinner) Date: Tue, 16 Feb 2021 00:18:11 -0000 Subject: [Python-checkins] bpo-42819, readline: Disable bracketed paste (GH-24108) (GH-24545) Message-ID: https://github.com/python/cpython/commit/85fd9f4e45ee95e2608dbc8cc6d4fe28e4d2abc4 commit: 85fd9f4e45ee95e2608dbc8cc6d4fe28e4d2abc4 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: vstinner date: 2021-02-16T01:18:07+01:00 summary: bpo-42819, readline: Disable bracketed paste (GH-24108) (GH-24545) (cherry picked from commit 755f3c1521b422bc2177013d289f5439975fdc4f) Co-authored-by: Dustin Rodrigues Co-authored-by: Dustin Rodrigues files: A Misc/NEWS.d/next/Core and Builtins/2021-01-04-23-54-34.bpo-42819.4KO6wU.rst M Misc/ACKS M Modules/readline.c diff --git a/Misc/ACKS b/Misc/ACKS index 58a4accd13451..73d35c2d86bdc 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1444,6 +1444,7 @@ Mark Roddy Kevin Rodgers Sean Rodman Giampaolo Rodola +Dustin Rodrigues Mauro S. M. Rodrigues Elson Rodriguez Adi Roiban diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-04-23-54-34.bpo-42819.4KO6wU.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-04-23-54-34.bpo-42819.4KO6wU.rst new file mode 100644 index 0000000000000..d067f0bfa7644 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-01-04-23-54-34.bpo-42819.4KO6wU.rst @@ -0,0 +1,8 @@ +: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. diff --git a/Modules/readline.c b/Modules/readline.c index 12d6cc78e38a7..1e74f997b0711 100644 --- a/Modules/readline.c +++ b/Modules/readline.c @@ -146,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 * @@ -192,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; } @@ -1152,6 +1173,8 @@ setup_readline(readlinestate *mod_state) else rl_initialize(); + disable_bracketed_paste(); + RESTORE_LOCALE(saved_locale) return 0; } From webhook-mailer at python.org Mon Feb 15 19:58:13 2021 From: webhook-mailer at python.org (ned-deily) Date: Tue, 16 Feb 2021 00:58:13 -0000 Subject: [Python-checkins] Add a warning block around the get_referrers() documentation (GH-24511) (GH-24544) Message-ID: https://github.com/python/cpython/commit/b61b20dba554a74a2f9f0936b16dd669f93a561c commit: b61b20dba554a74a2f9f0936b16dd669f93a561c branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ned-deily date: 2021-02-15T19:58:05-05:00 summary: Add a warning block around the get_referrers() documentation (GH-24511) (GH-24544) (cherry picked from commit 813db24f7c2c536d587d1832c3c52b44fa9e242e) Co-authored-by: Pablo Galindo files: M Doc/library/gc.rst diff --git a/Doc/library/gc.rst b/Doc/library/gc.rst index 1f09ed52ce867..7ee71dc446271 100644 --- a/Doc/library/gc.rst +++ b/Doc/library/gc.rst @@ -132,10 +132,11 @@ The :mod:`gc` module provides the following functions: resulting referrers. To get only currently live objects, call :func:`collect` before calling :func:`get_referrers`. - Care must be taken when using objects returned by :func:`get_referrers` because - some of them could still be under construction and hence in a temporarily - invalid state. Avoid using :func:`get_referrers` for any purpose other than - debugging. + .. warning:: + Care must be taken when using objects returned by :func:`get_referrers` because + some of them could still be under construction and hence in a temporarily + invalid state. Avoid using :func:`get_referrers` for any purpose other than + debugging. .. function:: get_referents(*objs) From webhook-mailer at python.org Tue Feb 16 00:06:01 2021 From: webhook-mailer at python.org (ned-deily) Date: Tue, 16 Feb 2021 05:06:01 -0000 Subject: [Python-checkins] 3.6.13 Message-ID: https://github.com/python/cpython/commit/aa73e1722eb9835dc99fd8983885a141112ee4ab commit: aa73e1722eb9835dc99fd8983885a141112ee4ab branch: 3.6 author: Ned Deily committer: ned-deily date: 2021-02-15T20:30:33-05:00 summary: 3.6.13 files: A Misc/NEWS.d/3.6.13.rst D Misc/NEWS.d/next/Core and Builtins/2018-12-22-22-19-51.bpo-35560.9vMWSP.rst D Misc/NEWS.d/next/Library/2020-10-23-19-20-14.bpo-42103.C5obK2.rst D Misc/NEWS.d/next/Security/2020-05-28-06-06-47.bpo-40791.QGZClX.rst D Misc/NEWS.d/next/Security/2020-10-19-10-56-27.bpo-42051.EU_B7u.rst D Misc/NEWS.d/next/Security/2020-10-23-19-19-30.bpo-42103.cILT66.rst D Misc/NEWS.d/next/Security/2021-01-18-09-27-31.bpo-42938.4Zn4Mp.rst D Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst D Misc/NEWS.d/next/Tests/2020-10-05-17-43-46.bpo-41944.rf1dYb.rst D Misc/NEWS.d/next/Tests/2021-01-01-08-52-36.bpo-42794.-7-XGz.rst M Include/patchlevel.h M Lib/pydoc_data/topics.py M README.rst diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 88d308c4f0a50..4b45ac010435b 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -18,12 +18,12 @@ /*--start constants--*/ #define PY_MAJOR_VERSION 3 #define PY_MINOR_VERSION 6 -#define PY_MICRO_VERSION 12 +#define PY_MICRO_VERSION 13 #define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL #define PY_RELEASE_SERIAL 0 /* Version as a string */ -#define PY_VERSION "3.6.12+" +#define PY_VERSION "3.6.13" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py index 4b53f76969f8a..b34cbbc2dc605 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Autogenerated by Sphinx on Sat Aug 15 02:33:47 2020 +# Autogenerated by Sphinx on Mon Feb 15 20:10:09 2021 topics = {'assert': 'The "assert" statement\n' '**********************\n' '\n' diff --git a/Misc/NEWS.d/3.6.13.rst b/Misc/NEWS.d/3.6.13.rst new file mode 100644 index 0000000000000..2689897ebf9a6 --- /dev/null +++ b/Misc/NEWS.d/3.6.13.rst @@ -0,0 +1,90 @@ +.. bpo: 42967 +.. date: 2021-02-14-15-59-16 +.. nonce: YApqDS +.. release date: 2021-02-15 +.. section: Security + +Fix web cache poisoning vulnerability by defaulting the query args separator +to ``&``, and allowing the user to choose a custom separator. + +.. + +.. bpo: 42938 +.. date: 2021-01-18-09-27-31 +.. nonce: 4Zn4Mp +.. section: Security + +Avoid static buffers when computing the repr of :class:`ctypes.c_double` and +:class:`ctypes.c_longdouble` values. + +.. + +.. bpo: 42103 +.. date: 2020-10-23-19-19-30 +.. nonce: cILT66 +.. section: Security + +Prevented potential DoS attack via CPU and RAM exhaustion when processing +malformed Apple Property List files in binary format. + +.. + +.. bpo: 42051 +.. date: 2020-10-19-10-56-27 +.. nonce: EU_B7u +.. section: Security + +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 +.. date: 2020-05-28-06-06-47 +.. nonce: QGZClX +.. section: Security + +Add ``volatile`` to the accumulator variable in ``hmac.compare_digest``, +making constant-time-defeating optimizations less likely. + +.. + +.. 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: 42103 +.. date: 2020-10-23-19-20-14 +.. nonce: C5obK2 +.. section: Library + +: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: 42794 +.. date: 2021-01-01-08-52-36 +.. nonce: -7-XGz +.. section: Tests + +Update test_nntplib to use offical group name of news.aioe.org for testing. +Patch by Dong-hee Na. + +.. + +.. bpo: 41944 +.. date: 2020-10-05-17-43-46 +.. nonce: rf1dYb +.. section: Tests + +Tests for CJK codecs no longer call ``eval()`` on content received via HTTP. diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-12-22-22-19-51.bpo-35560.9vMWSP.rst b/Misc/NEWS.d/next/Core and Builtins/2018-12-22-22-19-51.bpo-35560.9vMWSP.rst deleted file mode 100644 index 01458f11088e3..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2018-12-22-22-19-51.bpo-35560.9vMWSP.rst +++ /dev/null @@ -1,3 +0,0 @@ -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. diff --git a/Misc/NEWS.d/next/Library/2020-10-23-19-20-14.bpo-42103.C5obK2.rst b/Misc/NEWS.d/next/Library/2020-10-23-19-20-14.bpo-42103.C5obK2.rst deleted file mode 100644 index 4eb694c16a063..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-23-19-20-14.bpo-42103.C5obK2.rst +++ /dev/null @@ -1,3 +0,0 @@ -: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). diff --git a/Misc/NEWS.d/next/Security/2020-05-28-06-06-47.bpo-40791.QGZClX.rst b/Misc/NEWS.d/next/Security/2020-05-28-06-06-47.bpo-40791.QGZClX.rst deleted file mode 100644 index 69b9de1beae0d..0000000000000 --- a/Misc/NEWS.d/next/Security/2020-05-28-06-06-47.bpo-40791.QGZClX.rst +++ /dev/null @@ -1 +0,0 @@ -Add ``volatile`` to the accumulator variable in ``hmac.compare_digest``, making constant-time-defeating optimizations less likely. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Security/2020-10-19-10-56-27.bpo-42051.EU_B7u.rst b/Misc/NEWS.d/next/Security/2020-10-19-10-56-27.bpo-42051.EU_B7u.rst deleted file mode 100644 index e865ed12a0387..0000000000000 --- a/Misc/NEWS.d/next/Security/2020-10-19-10-56-27.bpo-42051.EU_B7u.rst +++ /dev/null @@ -1,3 +0,0 @@ -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. diff --git a/Misc/NEWS.d/next/Security/2020-10-23-19-19-30.bpo-42103.cILT66.rst b/Misc/NEWS.d/next/Security/2020-10-23-19-19-30.bpo-42103.cILT66.rst deleted file mode 100644 index 15d7b6549ed46..0000000000000 --- a/Misc/NEWS.d/next/Security/2020-10-23-19-19-30.bpo-42103.cILT66.rst +++ /dev/null @@ -1,2 +0,0 @@ -Prevented potential DoS attack via CPU and RAM exhaustion when processing -malformed Apple Property List files in binary format. 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 7df65a156feab..0000000000000 --- 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/2021-02-14-15-59-16.bpo-42967.YApqDS.rst b/Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst deleted file mode 100644 index f08489b41494e..0000000000000 --- a/Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst +++ /dev/null @@ -1 +0,0 @@ -Fix web cache poisoning vulnerability by defaulting the query args separator to ``&``, and allowing the user to choose a custom separator. diff --git a/Misc/NEWS.d/next/Tests/2020-10-05-17-43-46.bpo-41944.rf1dYb.rst b/Misc/NEWS.d/next/Tests/2020-10-05-17-43-46.bpo-41944.rf1dYb.rst deleted file mode 100644 index 4f9782f1c85af..0000000000000 --- a/Misc/NEWS.d/next/Tests/2020-10-05-17-43-46.bpo-41944.rf1dYb.rst +++ /dev/null @@ -1 +0,0 @@ -Tests for CJK codecs no longer call ``eval()`` on content received via HTTP. diff --git a/Misc/NEWS.d/next/Tests/2021-01-01-08-52-36.bpo-42794.-7-XGz.rst b/Misc/NEWS.d/next/Tests/2021-01-01-08-52-36.bpo-42794.-7-XGz.rst deleted file mode 100644 index 577f2259e1f00..0000000000000 --- a/Misc/NEWS.d/next/Tests/2021-01-01-08-52-36.bpo-42794.-7-XGz.rst +++ /dev/null @@ -1,2 +0,0 @@ -Update test_nntplib to use offical group name of news.aioe.org for testing. -Patch by Dong-hee Na. diff --git a/README.rst b/README.rst index 4bed1d47ce427..3551a17b7fcdf 100644 --- a/README.rst +++ b/README.rst @@ -1,5 +1,5 @@ -This is Python version 3.6.12+ -============================== +This is Python version 3.6.13 +============================= .. image:: https://travis-ci.org/python/cpython.svg?branch=3.6 :alt: CPython build status on Travis CI From webhook-mailer at python.org Tue Feb 16 00:06:49 2021 From: webhook-mailer at python.org (ned-deily) Date: Tue, 16 Feb 2021 05:06:49 -0000 Subject: [Python-checkins] 3.7.10 Message-ID: https://github.com/python/cpython/commit/9b2dd1fc6c9913dbeee623e724b6baa598038f97 commit: 9b2dd1fc6c9913dbeee623e724b6baa598038f97 branch: 3.7 author: Ned Deily committer: ned-deily date: 2021-02-15T20:29:22-05:00 summary: 3.7.10 files: A Misc/NEWS.d/3.7.10.rst D Misc/NEWS.d/next/Documentation/2020-12-16-21-06-16.bpo-17140.1leSEg.rst D Misc/NEWS.d/next/Library/2020-10-08-18-22-28.bpo-41976.Svm0wb.rst D Misc/NEWS.d/next/Library/2020-10-23-19-20-14.bpo-42103.C5obK2.rst D Misc/NEWS.d/next/Security/2020-05-28-06-06-47.bpo-40791.QGZClX.rst D Misc/NEWS.d/next/Security/2020-10-19-10-56-27.bpo-42051.EU_B7u.rst D Misc/NEWS.d/next/Security/2020-10-23-19-19-30.bpo-42103.cILT66.rst D Misc/NEWS.d/next/Security/2021-01-18-09-27-31.bpo-42938.4Zn4Mp.rst D Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst D Misc/NEWS.d/next/Tests/2020-10-05-17-43-46.bpo-41944.rf1dYb.rst D Misc/NEWS.d/next/Tests/2021-01-01-08-52-36.bpo-42794.-7-XGz.rst M Include/patchlevel.h M Lib/pydoc_data/topics.py M README.rst diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 44b2a348b3f39..059ab2b977064 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -18,12 +18,12 @@ /*--start constants--*/ #define PY_MAJOR_VERSION 3 #define PY_MINOR_VERSION 7 -#define PY_MICRO_VERSION 9 +#define PY_MICRO_VERSION 10 #define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL #define PY_RELEASE_SERIAL 0 /* Version as a string */ -#define PY_VERSION "3.7.9+" +#define PY_VERSION "3.7.10" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py index d42bb995f999a..98c9efd942b4e 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Autogenerated by Sphinx on Sat Aug 15 01:12:49 2020 +# Autogenerated by Sphinx on Mon Feb 15 20:10:03 2021 topics = {'assert': 'The "assert" statement\n' '**********************\n' '\n' diff --git a/Misc/NEWS.d/3.7.10.rst b/Misc/NEWS.d/3.7.10.rst new file mode 100644 index 0000000000000..033b5d388b82f --- /dev/null +++ b/Misc/NEWS.d/3.7.10.rst @@ -0,0 +1,99 @@ +.. bpo: 42967 +.. date: 2021-02-14-15-59-16 +.. nonce: YApqDS +.. release date: 2021-02-15 +.. section: Security + +Fix web cache poisoning vulnerability by defaulting the query args separator +to ``&``, and allowing the user to choose a custom separator. + +.. + +.. bpo: 42938 +.. date: 2021-01-18-09-27-31 +.. nonce: 4Zn4Mp +.. section: Security + +Avoid static buffers when computing the repr of :class:`ctypes.c_double` and +:class:`ctypes.c_longdouble` values. + +.. + +.. bpo: 42103 +.. date: 2020-10-23-19-19-30 +.. nonce: cILT66 +.. section: Security + +Prevented potential DoS attack via CPU and RAM exhaustion when processing +malformed Apple Property List files in binary format. + +.. + +.. bpo: 42051 +.. date: 2020-10-19-10-56-27 +.. nonce: EU_B7u +.. section: Security + +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 +.. date: 2020-05-28-06-06-47 +.. nonce: QGZClX +.. section: Security + +Add ``volatile`` to the accumulator variable in ``hmac.compare_digest``, +making constant-time-defeating optimizations less likely. + +.. + +.. bpo: 42103 +.. date: 2020-10-23-19-20-14 +.. nonce: C5obK2 +.. section: Library + +: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: 41976 +.. date: 2020-10-08-18-22-28 +.. nonce: Svm0wb +.. section: Library + +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: 17140 +.. date: 2020-12-16-21-06-16 +.. nonce: 1leSEg +.. section: Documentation + +Add documentation for the :class:`multiprocessing.pool.ThreadPool` class. + +.. + +.. bpo: 42794 +.. date: 2021-01-01-08-52-36 +.. nonce: -7-XGz +.. section: Tests + +Update test_nntplib to use offical group name of news.aioe.org for testing. +Patch by Dong-hee Na. + +.. + +.. bpo: 41944 +.. date: 2020-10-05-17-43-46 +.. nonce: rf1dYb +.. section: Tests + +Tests for CJK codecs no longer call ``eval()`` on content received via HTTP. diff --git a/Misc/NEWS.d/next/Documentation/2020-12-16-21-06-16.bpo-17140.1leSEg.rst b/Misc/NEWS.d/next/Documentation/2020-12-16-21-06-16.bpo-17140.1leSEg.rst deleted file mode 100644 index cb1fd23a56e63..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2020-12-16-21-06-16.bpo-17140.1leSEg.rst +++ /dev/null @@ -1 +0,0 @@ -Add documentation for the :class:`multiprocessing.pool.ThreadPool` class. diff --git a/Misc/NEWS.d/next/Library/2020-10-08-18-22-28.bpo-41976.Svm0wb.rst b/Misc/NEWS.d/next/Library/2020-10-08-18-22-28.bpo-41976.Svm0wb.rst deleted file mode 100644 index c8b3fc771845e..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-08-18-22-28.bpo-41976.Svm0wb.rst +++ /dev/null @@ -1,3 +0,0 @@ -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 diff --git a/Misc/NEWS.d/next/Library/2020-10-23-19-20-14.bpo-42103.C5obK2.rst b/Misc/NEWS.d/next/Library/2020-10-23-19-20-14.bpo-42103.C5obK2.rst deleted file mode 100644 index 4eb694c16a063..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-23-19-20-14.bpo-42103.C5obK2.rst +++ /dev/null @@ -1,3 +0,0 @@ -: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). diff --git a/Misc/NEWS.d/next/Security/2020-05-28-06-06-47.bpo-40791.QGZClX.rst b/Misc/NEWS.d/next/Security/2020-05-28-06-06-47.bpo-40791.QGZClX.rst deleted file mode 100644 index 69b9de1beae0d..0000000000000 --- a/Misc/NEWS.d/next/Security/2020-05-28-06-06-47.bpo-40791.QGZClX.rst +++ /dev/null @@ -1 +0,0 @@ -Add ``volatile`` to the accumulator variable in ``hmac.compare_digest``, making constant-time-defeating optimizations less likely. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Security/2020-10-19-10-56-27.bpo-42051.EU_B7u.rst b/Misc/NEWS.d/next/Security/2020-10-19-10-56-27.bpo-42051.EU_B7u.rst deleted file mode 100644 index e865ed12a0387..0000000000000 --- a/Misc/NEWS.d/next/Security/2020-10-19-10-56-27.bpo-42051.EU_B7u.rst +++ /dev/null @@ -1,3 +0,0 @@ -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. diff --git a/Misc/NEWS.d/next/Security/2020-10-23-19-19-30.bpo-42103.cILT66.rst b/Misc/NEWS.d/next/Security/2020-10-23-19-19-30.bpo-42103.cILT66.rst deleted file mode 100644 index 15d7b6549ed46..0000000000000 --- a/Misc/NEWS.d/next/Security/2020-10-23-19-19-30.bpo-42103.cILT66.rst +++ /dev/null @@ -1,2 +0,0 @@ -Prevented potential DoS attack via CPU and RAM exhaustion when processing -malformed Apple Property List files in binary format. 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 7df65a156feab..0000000000000 --- 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/2021-02-14-15-59-16.bpo-42967.YApqDS.rst b/Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst deleted file mode 100644 index f08489b41494e..0000000000000 --- a/Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst +++ /dev/null @@ -1 +0,0 @@ -Fix web cache poisoning vulnerability by defaulting the query args separator to ``&``, and allowing the user to choose a custom separator. diff --git a/Misc/NEWS.d/next/Tests/2020-10-05-17-43-46.bpo-41944.rf1dYb.rst b/Misc/NEWS.d/next/Tests/2020-10-05-17-43-46.bpo-41944.rf1dYb.rst deleted file mode 100644 index 4f9782f1c85af..0000000000000 --- a/Misc/NEWS.d/next/Tests/2020-10-05-17-43-46.bpo-41944.rf1dYb.rst +++ /dev/null @@ -1 +0,0 @@ -Tests for CJK codecs no longer call ``eval()`` on content received via HTTP. diff --git a/Misc/NEWS.d/next/Tests/2021-01-01-08-52-36.bpo-42794.-7-XGz.rst b/Misc/NEWS.d/next/Tests/2021-01-01-08-52-36.bpo-42794.-7-XGz.rst deleted file mode 100644 index 577f2259e1f00..0000000000000 --- a/Misc/NEWS.d/next/Tests/2021-01-01-08-52-36.bpo-42794.-7-XGz.rst +++ /dev/null @@ -1,2 +0,0 @@ -Update test_nntplib to use offical group name of news.aioe.org for testing. -Patch by Dong-hee Na. diff --git a/README.rst b/README.rst index 92ef6675ca50e..5ba5185b19287 100644 --- a/README.rst +++ b/README.rst @@ -1,4 +1,4 @@ -This is Python version 3.7.9+ +This is Python version 3.7.10 ============================= .. image:: https://travis-ci.org/python/cpython.svg?branch=3.7 From webhook-mailer at python.org Tue Feb 16 02:50:12 2021 From: webhook-mailer at python.org (vstinner) Date: Tue, 16 Feb 2021 07:50:12 -0000 Subject: [Python-checkins] bpo-40170: Convert PyDescr_IsData() to static inline function (GH-24535) Message-ID: https://github.com/python/cpython/commit/871eb4237b9be95263ca13ba8856e78344eb9eba commit: 871eb4237b9be95263ca13ba8856e78344eb9eba branch: master author: Erlend Egeberg Aasland committer: vstinner date: 2021-02-16T08:50:00+01:00 summary: bpo-40170: Convert PyDescr_IsData() to static inline function (GH-24535) files: A Misc/NEWS.d/next/Core and Builtins/2021-02-15-13-41-14.bpo-40170.r2FAtl.rst M Doc/c-api/descriptor.rst M Include/descrobject.h M Objects/descrobject.c diff --git a/Doc/c-api/descriptor.rst b/Doc/c-api/descriptor.rst index 1005140c7acb3..b32c113e5f045 100644 --- a/Doc/c-api/descriptor.rst +++ b/Doc/c-api/descriptor.rst @@ -32,8 +32,8 @@ found in the dictionary of type objects. .. c:function:: int PyDescr_IsData(PyObject *descr) - Return true if the descriptor objects *descr* describes a data attribute, or - false if it describes a method. *descr* must be a descriptor object; there is + Return non-zero if the descriptor objects *descr* describes a data attribute, or + ``0`` if it describes a method. *descr* must be a descriptor object; there is no error checking. diff --git a/Include/descrobject.h b/Include/descrobject.h index ead269d1d2f79..703bc8fd6df21 100644 --- a/Include/descrobject.h +++ b/Include/descrobject.h @@ -93,7 +93,7 @@ PyAPI_FUNC(PyObject *) PyDescr_NewGetSet(PyTypeObject *, #ifndef Py_LIMITED_API PyAPI_FUNC(PyObject *) PyDescr_NewWrapper(PyTypeObject *, struct wrapperbase *, void *); -#define PyDescr_IsData(d) (Py_TYPE(d)->tp_descr_set != NULL) +PyAPI_FUNC(int) PyDescr_IsData(PyObject *); #endif PyAPI_FUNC(PyObject *) PyDictProxy_New(PyObject *); diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-02-15-13-41-14.bpo-40170.r2FAtl.rst b/Misc/NEWS.d/next/Core and Builtins/2021-02-15-13-41-14.bpo-40170.r2FAtl.rst new file mode 100644 index 0000000000000..82e844bc28409 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-02-15-13-41-14.bpo-40170.r2FAtl.rst @@ -0,0 +1,3 @@ +Convert :c:func:`PyDescr_IsData` macro to a function to hide implementation +details: The macro accessed :c:member:`PyTypeObject.tp_descr_set` directly. +Patch by Erlend E. Aasland. diff --git a/Objects/descrobject.c b/Objects/descrobject.c index 16c695a08f47d..35fbffd914a94 100644 --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -995,6 +995,11 @@ PyDescr_NewWrapper(PyTypeObject *type, struct wrapperbase *base, void *wrapped) return (PyObject *)descr; } +int +PyDescr_IsData(PyObject *ob) +{ + return Py_TYPE(ob)->tp_descr_set != NULL; +} /* --- mappingproxy: read-only proxy for mappings --- */ From webhook-mailer at python.org Tue Feb 16 07:05:07 2021 From: webhook-mailer at python.org (vstinner) Date: Tue, 16 Feb 2021 12:05:07 -0000 Subject: [Python-checkins] bpo-35134, Include: Move pytime.h to cpython/pytime.h (GH-23988) Message-ID: https://github.com/python/cpython/commit/17dbd4078b68db8954df6b5cdc40b786bc4ad7af commit: 17dbd4078b68db8954df6b5cdc40b786bc4ad7af branch: master author: Nicholas Sim committer: vstinner date: 2021-02-16T13:04:38+01:00 summary: bpo-35134, Include: Move pytime.h to cpython/pytime.h (GH-23988) This change is backward compatible since C extension modules must not include "pytime.h" directly, but only include "Python.h". files: A Include/cpython/pytime.h D Include/pytime.h M Include/Python.h M Makefile.pre.in M Modules/gcmodule.c M PCbuild/pythoncore.vcxproj M PCbuild/pythoncore.vcxproj.filters diff --git a/Include/Python.h b/Include/Python.h index 57f71d41d8d47..76ead9e5765ec 100644 --- a/Include/Python.h +++ b/Include/Python.h @@ -82,7 +82,6 @@ #error "PYMALLOC_DEBUG requires WITH_PYMALLOC" #endif #include "pymath.h" -#include "pytime.h" #include "pymem.h" #include "object.h" @@ -128,6 +127,7 @@ #include "structseq.h" #include "namespaceobject.h" #include "picklebufobject.h" +#include "cpython/pytime.h" #include "codecs.h" #include "pyerrors.h" diff --git a/Include/pytime.h b/Include/cpython/pytime.h similarity index 99% rename from Include/pytime.h rename to Include/cpython/pytime.h index 944170f7d0c4c..56607d199ed54 100644 --- a/Include/pytime.h +++ b/Include/cpython/pytime.h @@ -2,9 +2,6 @@ #ifndef Py_PYTIME_H #define Py_PYTIME_H -#include "pyconfig.h" /* include for defines */ -#include "object.h" - /************************************************************************** Symbols and macros to supply platform-independent interfaces to time related functions and constants diff --git a/Makefile.pre.in b/Makefile.pre.in index 0b22bdd5591b9..0d9fdc713406c 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1075,7 +1075,6 @@ PYTHON_HEADERS= \ $(srcdir)/Include/pystrtod.h \ $(srcdir)/Include/pythonrun.h \ $(srcdir)/Include/pythread.h \ - $(srcdir)/Include/pytime.h \ $(srcdir)/Include/rangeobject.h \ $(srcdir)/Include/setobject.h \ $(srcdir)/Include/sliceobject.h \ @@ -1116,6 +1115,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/cpython/pymem.h \ $(srcdir)/Include/cpython/pystate.h \ $(srcdir)/Include/cpython/pythonrun.h \ + $(srcdir)/Include/cpython/pytime.h \ $(srcdir)/Include/cpython/sysmodule.h \ $(srcdir)/Include/cpython/traceback.h \ $(srcdir)/Include/cpython/tupleobject.h \ diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index fdbba6a7afc29..f0d5699490823 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -31,7 +31,6 @@ #include "pycore_pyerrors.h" #include "pycore_pystate.h" // _PyThreadState_GET() #include "pydtrace.h" -#include "pytime.h" // _PyTime_GetMonotonicClock() typedef struct _gc_runtime_state GCState; diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index f172f2a5786c6..711a68fcc5c7a 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -147,6 +147,7 @@ + @@ -245,7 +246,6 @@ - diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index 3bafdb8d29711..ab826427acc68 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -204,9 +204,6 @@ Include - - Include - Include @@ -450,6 +447,9 @@ Include\cpython + + Include\cpython + Include\cpython From webhook-mailer at python.org Tue Feb 16 10:06:03 2021 From: webhook-mailer at python.org (vstinner) Date: Tue, 16 Feb 2021 15:06:03 -0000 Subject: [Python-checkins] bpo-40170: Always define PyIter_Check() as a function (GH-24548) Message-ID: https://github.com/python/cpython/commit/cc54001c2eb3b14320c1667b22602d69c90d5865 commit: cc54001c2eb3b14320c1667b22602d69c90d5865 branch: master author: Erlend Egeberg Aasland committer: vstinner date: 2021-02-16T16:05:58+01:00 summary: bpo-40170: Always define PyIter_Check() as a function (GH-24548) files: A Misc/NEWS.d/next/Core and Builtins/2021-02-15-15-06-43.bpo-40170.ZYeSii.rst M Doc/c-api/iter.rst M Include/abstract.h M Include/cpython/abstract.h M Objects/abstract.c diff --git a/Doc/c-api/iter.rst b/Doc/c-api/iter.rst index 74fb5578abd6e..5706777c41db4 100644 --- a/Doc/c-api/iter.rst +++ b/Doc/c-api/iter.rst @@ -9,8 +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. This - function always succeeds. + Return non-zero if the object *o* supports the iterator protocol, and ``0`` + otherwise. This function always succeeds. .. c:function:: PyObject* PyIter_Next(PyObject *o) diff --git a/Include/abstract.h b/Include/abstract.h index 0bd1ca936846f..a47c944060d3d 100644 --- a/Include/abstract.h +++ b/Include/abstract.h @@ -324,7 +324,7 @@ PyAPI_FUNC(PyObject *) PyObject_Format(PyObject *obj, returns itself. */ PyAPI_FUNC(PyObject *) PyObject_GetIter(PyObject *); -/* Returns 1 if the object 'obj' provides iterator protocols, and 0 otherwise. +/* Returns non-zero if the object 'obj' provides iterator protocols, and 0 otherwise. This function always succeeds. */ PyAPI_FUNC(int) PyIter_Check(PyObject *); diff --git a/Include/cpython/abstract.h b/Include/cpython/abstract.h index 7a4219c8b338b..db5055d201107 100644 --- a/Include/cpython/abstract.h +++ b/Include/cpython/abstract.h @@ -325,12 +325,6 @@ PyAPI_FUNC(int) PyBuffer_FillInfo(Py_buffer *view, PyObject *o, void *buf, /* Releases a Py_buffer obtained from getbuffer ParseTuple's "s*". */ PyAPI_FUNC(void) PyBuffer_Release(Py_buffer *view); -/* ==== Iterators ================================================ */ - -#define PyIter_Check(obj) \ - (Py_TYPE(obj)->tp_iternext != NULL && \ - Py_TYPE(obj)->tp_iternext != &_PyObject_NextNotImplemented) - /* === Sequence protocol ================================================ */ /* Assume tp_as_sequence and sq_item exist and that 'i' does not diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-02-15-15-06-43.bpo-40170.ZYeSii.rst b/Misc/NEWS.d/next/Core and Builtins/2021-02-15-15-06-43.bpo-40170.ZYeSii.rst new file mode 100644 index 0000000000000..df6f3dcfc14b6 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-02-15-15-06-43.bpo-40170.ZYeSii.rst @@ -0,0 +1,3 @@ +:c:func:`PyIter_Check` is now always declared as a function, in order to hide implementation +details. The macro accessed :c:member:`PyTypeObject.tp_iternext` directly. +Patch by Erlend E. Aasland. diff --git a/Objects/abstract.c b/Objects/abstract.c index 74a73ee469866..c93309b352774 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -2732,12 +2732,12 @@ PyObject_GetIter(PyObject *o) } } -#undef PyIter_Check - -int PyIter_Check(PyObject *obj) +int +PyIter_Check(PyObject *obj) { - return Py_TYPE(obj)->tp_iternext != NULL && - Py_TYPE(obj)->tp_iternext != &_PyObject_NextNotImplemented; + PyTypeObject *tp = Py_TYPE(obj); + return (tp->tp_iternext != NULL && + tp->tp_iternext != &_PyObject_NextNotImplemented); } /* Return next item. From webhook-mailer at python.org Tue Feb 16 14:09:04 2021 From: webhook-mailer at python.org (ambv) Date: Tue, 16 Feb 2021 19:09:04 -0000 Subject: [Python-checkins] Python 3.8.8rc1 Message-ID: https://github.com/python/cpython/commit/dfd7d6893b57d79b7bfd819d28380a0429b5615f commit: dfd7d6893b57d79b7bfd819d28380a0429b5615f branch: 3.8 author: ?ukasz Langa committer: ambv date: 2021-02-16T19:12:03+01:00 summary: Python 3.8.8rc1 files: A Misc/NEWS.d/3.8.8rc1.rst D Misc/NEWS.d/next/Build/2020-02-28-14-33-15.bpo-29076.Gtixi5.rst D Misc/NEWS.d/next/C API/2020-03-24-09-27-10.bpo-40052.27P2KG.rst D Misc/NEWS.d/next/C API/2021-01-27-10-27-47.bpo-43030.loDcD_.rst D Misc/NEWS.d/next/Core and Builtins/2021-01-04-23-54-34.bpo-42819.4KO6wU.rst D Misc/NEWS.d/next/Documentation/2021-01-04-22-14-22.bpo-42811.HY2beA.rst D Misc/NEWS.d/next/Documentation/2021-01-20-23-03-49.bpo-40304.-LK7Ps.rst D Misc/NEWS.d/next/IDLE/2019-06-30-20-31-09.bpo-32631.e7_4BG.rst D Misc/NEWS.d/next/IDLE/2019-11-14-23-41-07.bpo-23544.3etemb.rst D Misc/NEWS.d/next/IDLE/2020-11-30-19-46-05.bpo-42508.fE7w4M.rst D Misc/NEWS.d/next/IDLE/2021-01-10-01-25-43.bpo-33065.zmyHYJ.rst D Misc/NEWS.d/next/IDLE/2021-01-26-18-12-17.bpo-43008.mbQUc7.rst D Misc/NEWS.d/next/Library/2018-04-23-13-44-10.bpo-33289.anBnUr.rst D Misc/NEWS.d/next/Library/2019-11-16-22-56-51.bpo-36589.0Io76D.rst D Misc/NEWS.d/next/Library/2019-12-16-17-55-31.bpo-39068.Ti3f9P.rst D Misc/NEWS.d/next/Library/2020-05-30-14-19-47.bpo-26407.MjWLO1.rst D Misc/NEWS.d/next/Library/2020-08-21-15-24-14.bpo-41604.rTXleO.rst D Misc/NEWS.d/next/Library/2020-10-11-13-48-03.bpo-42005.Jq6Az-.rst D Misc/NEWS.d/next/Library/2020-11-14-13-46-27.bpo-42318.wYAcBD.rst D Misc/NEWS.d/next/Library/2020-11-17-14-30-12.bpo-42383.ubl0Y_.rst D Misc/NEWS.d/next/Library/2020-11-17-14-32-39.bpo-42384.1ZnQSn.rst D Misc/NEWS.d/next/Library/2020-11-22-11-22-28.bpo-42388.LMgM6B.rst D Misc/NEWS.d/next/Library/2020-12-02-16-28-04.bpo-42531.2sLlFW.rst D Misc/NEWS.d/next/Library/2020-12-20-22-50-15.bpo-42681.lDO6jb.rst D Misc/NEWS.d/next/Library/2020-12-27-18-47-01.bpo-23328._xqepZ.rst D Misc/NEWS.d/next/Library/2020-12-27-22-19-26.bpo-42759.lGi_03.rst D Misc/NEWS.d/next/Library/2021-01-05-21-26-29.bpo-41748.KdC0w3.rst D Misc/NEWS.d/next/Library/2021-01-08-15-49-20.bpo-42780.rtqi6B.rst D Misc/NEWS.d/next/Library/2021-02-02-20-23-31.bpo-43108.lqcCZ6.rst D Misc/NEWS.d/next/Security/2021-01-18-09-27-31.bpo-42938.4Zn4Mp.rst D Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst D Misc/NEWS.d/next/Tests/2020-05-30-10-56-38.bpo-40810.LPqDLQ.rst D Misc/NEWS.d/next/Tests/2021-01-01-08-52-36.bpo-42794.-7-XGz.rst D Misc/NEWS.d/next/Tools-Demos/2020-12-23-19-42-11.bpo-42726.a5EkTv.rst D Misc/NEWS.d/next/Windows/2020-12-07-11-40-52.bpo-42584.AsYnVX.rst D Misc/NEWS.d/next/Windows/2021-01-05-20-36-40.bpo-41837.bmS7vB.rst D Misc/NEWS.d/next/macOS/2020-12-07-11-37-35.bpo-42584.LygmqQ.rst D Misc/NEWS.d/next/macOS/2021-01-04-00-48-08.bpo-41837.dX-unJ.rst M Include/patchlevel.h M Lib/pydoc_data/topics.py M README.rst diff --git a/Include/patchlevel.h b/Include/patchlevel.h index e73cadbc6fef6..d35bbfb1cc454 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -18,12 +18,12 @@ /*--start constants--*/ #define PY_MAJOR_VERSION 3 #define PY_MINOR_VERSION 8 -#define PY_MICRO_VERSION 7 -#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL -#define PY_RELEASE_SERIAL 0 +#define PY_MICRO_VERSION 8 +#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_GAMMA +#define PY_RELEASE_SERIAL 1 /* Version as a string */ -#define PY_VERSION "3.8.7+" +#define PY_VERSION "3.8.8rc1" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py index 723a9b8ac57bc..ebdab5733b86a 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 Dec 21 17:22:46 2020 +# Autogenerated by Sphinx on Tue Feb 16 19:10:16 2021 topics = {'assert': 'The "assert" statement\n' '**********************\n' '\n' @@ -11387,7 +11387,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' diff --git a/Misc/NEWS.d/3.8.8rc1.rst b/Misc/NEWS.d/3.8.8rc1.rst new file mode 100644 index 0000000000000..df1b7da090ec3 --- /dev/null +++ b/Misc/NEWS.d/3.8.8rc1.rst @@ -0,0 +1,367 @@ +.. bpo: 42967 +.. date: 2021-02-14-15-59-16 +.. nonce: YApqDS +.. release date: 2021-02-16 +.. section: Security + +Fix web cache poisoning vulnerability by defaulting the query args separator +to ``&``, and allowing the user to choose a custom separator. + +.. + +.. bpo: 42938 +.. date: 2021-01-18-09-27-31 +.. nonce: 4Zn4Mp +.. section: Security + +Avoid static buffers when computing the repr of :class:`ctypes.c_double` and +:class:`ctypes.c_longdouble` values. + +.. + +.. bpo: 42819 +.. date: 2021-01-04-23-54-34 +.. nonce: 4KO6wU +.. section: Core and Builtins + +: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: 43108 +.. date: 2021-02-02-20-23-31 +.. nonce: lqcCZ6 +.. section: Library + +Fixed a reference leak in the :mod:`curses` module. Patch by Pablo Galindo + +.. + +.. bpo: 42780 +.. date: 2021-01-08-15-49-20 +.. nonce: rtqi6B +.. section: Library + +Fix os.set_inheritable() for O_PATH file descriptors on Linux. + +.. + +.. bpo: 41748 +.. date: 2021-01-05-21-26-29 +.. nonce: KdC0w3 +.. section: Library + +Fix HTMLParser parsing rules for element attributes containing commas with +spaces. Patch by Karl Dubost. + +.. + +.. bpo: 42759 +.. date: 2020-12-27-22-19-26 +.. nonce: lGi_03 +.. section: Library + +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: 23328 +.. date: 2020-12-27-18-47-01 +.. nonce: _xqepZ +.. section: Library + +Allow / character in username, password fields on _PROXY envars. + +.. + +.. bpo: 42681 +.. date: 2020-12-20-22-50-15 +.. nonce: lDO6jb +.. section: Library + +Fixed range checks for color and pair numbers in :mod:`curses`. + +.. + +.. bpo: 42531 +.. date: 2020-12-02-16-28-04 +.. nonce: 2sLlFW +.. section: Library + +:func:`importlib.resources.path` now works for :term:`package`\ s missing +the optional :attr:`__file__` attribute (more specifically, packages whose +:attr:`__spec__`\ ``.``\ :attr:`~importlib.machinery.ModuleSpec.origin` +:keyword:`is` :data:`None`). + +.. + +.. bpo: 42388 +.. date: 2020-11-22-11-22-28 +.. nonce: LMgM6B +.. section: Library + +Fix subprocess.check_output(..., input=None) behavior when text=True to be +consistent with that of the documentation and universal_newlines=True. + +.. + +.. bpo: 42384 +.. date: 2020-11-17-14-32-39 +.. nonce: 1ZnQSn +.. section: Library + +Make pdb populate sys.path[0] exactly the same as regular python execution. + +.. + +.. bpo: 42383 +.. date: 2020-11-17-14-30-12 +.. nonce: ubl0Y_ +.. section: Library + +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 +.. date: 2020-11-14-13-46-27 +.. nonce: wYAcBD +.. section: Library + +Fixed support of non-BMP characters in :mod:`tkinter` on macOS. + +.. + +.. bpo: 42005 +.. date: 2020-10-11-13-48-03 +.. nonce: Jq6Az- +.. section: Library + +Fix CLI of :mod:`cProfile` and :mod:`profile` to catch +:exc:`BrokenPipeError`. + +.. + +.. bpo: 41604 +.. date: 2020-08-21-15-24-14 +.. nonce: rTXleO +.. section: Library + +Don't decrement the reference count of the previous user_ptr when +set_panel_userptr fails. + +.. + +.. bpo: 26407 +.. date: 2020-05-30-14-19-47 +.. nonce: MjWLO1 +.. section: Library + +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: 39068 +.. date: 2019-12-16-17-55-31 +.. nonce: Ti3f9P +.. section: Library + +Fix initialization race condition in :func:`a85encode` and :func:`b85encode` +in :mod:`base64`. Patch by Brandon Stansbury. + +.. + +.. bpo: 36589 +.. date: 2019-11-16-22-56-51 +.. nonce: 0Io76D +.. section: Library + +The :func:`curses.update_lines_cols` function now returns ``None`` instead +of ``1`` on success. + +.. + +.. bpo: 33289 +.. date: 2018-04-23-13-44-10 +.. nonce: anBnUr +.. section: Library + +Correct call to :mod:`tkinter.colorchooser` to return RGB triplet of ints +instead of floats. Patch by Cheryl Sabella. + +.. + +.. bpo: 40304 +.. date: 2021-01-20-23-03-49 +.. nonce: -LK7Ps +.. section: Documentation + +Fix doc for type(name, bases, dict). Patch by Boris Verkhovskiy and ?ric +Araujo. + +.. + +.. bpo: 42811 +.. date: 2021-01-04-22-14-22 +.. nonce: HY2beA +.. section: Documentation + +Updated importlib.utils.resolve_name() doc to use __spec__.parent instead of +__package__. (Thanks Yair Frid.) + +.. + +.. bpo: 42794 +.. date: 2021-01-01-08-52-36 +.. nonce: -7-XGz +.. section: Tests + +Update test_nntplib to use offical group name of news.aioe.org for testing. +Patch by Dong-hee Na. + +.. + +.. bpo: 40810 +.. date: 2020-05-30-10-56-38 +.. nonce: LPqDLQ +.. section: Tests + +In :mod:`sqlite3`, fix ``CheckTraceCallbackContent`` for SQLite pre 3.7.15. + +.. + +.. bpo: 29076 +.. date: 2020-02-28-14-33-15 +.. nonce: Gtixi5 +.. section: Build + +Add fish shell support to macOS installer. + +.. + +.. bpo: 41837 +.. date: 2021-01-05-20-36-40 +.. nonce: bmS7vB +.. section: Windows + +Updated Windows installer to include OpenSSL 1.1.1i + +.. + +.. bpo: 42584 +.. date: 2020-12-07-11-40-52 +.. nonce: AsYnVX +.. section: Windows + +Upgrade Windows installer to use SQLite 3.34.0. + +.. + +.. bpo: 41837 +.. date: 2021-01-04-00-48-08 +.. nonce: dX-unJ +.. section: macOS + +Update macOS installer build to use OpenSSL 1.1.1i. + +.. + +.. bpo: 42584 +.. date: 2020-12-07-11-37-35 +.. nonce: LygmqQ +.. section: macOS + +Update macOS installer to use SQLite 3.34.0. + +.. + +.. bpo: 43008 +.. date: 2021-01-26-18-12-17 +.. nonce: mbQUc7 +.. section: IDLE + +Make IDLE invoke :func:`sys.excepthook` in normal, 2-process mode. Patch by +Ken Hilton. + +.. + +.. bpo: 33065 +.. date: 2021-01-10-01-25-43 +.. nonce: zmyHYJ +.. section: IDLE + +Fix problem debugging user classes with __repr__ method. + +.. + +.. bpo: 42508 +.. date: 2020-11-30-19-46-05 +.. nonce: fE7w4M +.. section: IDLE + +Keep IDLE running on macOS. Remove obsolete workaround that prevented +running files with shortcuts when using new universal2 installers built on +macOS 11. + +.. + +.. bpo: 23544 +.. date: 2019-11-14-23-41-07 +.. nonce: 3etemb +.. section: IDLE + +Disable Debug=>Stack Viewer when user code is running or Debugger is active, +to prevent hang or crash. Patch by Zackery Spytz. + +.. + +.. bpo: 32631 +.. date: 2019-06-30-20-31-09 +.. nonce: e7_4BG +.. section: IDLE + +Finish zzdummy example extension module: make menu entries work; add +docstrings and tests with 100% coverage. + +.. + +.. bpo: 42726 +.. date: 2020-12-23-19-42-11 +.. nonce: a5EkTv +.. section: Tools/Demos + +Fixed Python 3 compatibility issue with gdb/libpython.py handling of +attribute dictionaries. + +.. + +.. bpo: 43030 +.. date: 2021-01-27-10-27-47 +.. nonce: loDcD_ +.. section: C API + +Fixed a compiler warning in :c:func:`Py_UNICODE_ISSPACE()` on platforms with +signed ``wchar_t``. + +.. + +.. bpo: 40052 +.. date: 2020-03-24-09-27-10 +.. nonce: 27P2KG +.. section: C API + +Fix an alignment build warning/error in function +``PyVectorcall_Function()``. Patch by Andreas Schneider, Antoine Pitrou and +Petr Viktorin. diff --git a/Misc/NEWS.d/next/Build/2020-02-28-14-33-15.bpo-29076.Gtixi5.rst b/Misc/NEWS.d/next/Build/2020-02-28-14-33-15.bpo-29076.Gtixi5.rst deleted file mode 100644 index b38beb0586951..0000000000000 --- a/Misc/NEWS.d/next/Build/2020-02-28-14-33-15.bpo-29076.Gtixi5.rst +++ /dev/null @@ -1 +0,0 @@ -Add fish shell support to macOS installer. diff --git a/Misc/NEWS.d/next/C API/2020-03-24-09-27-10.bpo-40052.27P2KG.rst b/Misc/NEWS.d/next/C API/2020-03-24-09-27-10.bpo-40052.27P2KG.rst deleted file mode 100644 index 538488e2fbacc..0000000000000 --- a/Misc/NEWS.d/next/C API/2020-03-24-09-27-10.bpo-40052.27P2KG.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix an alignment build warning/error in function ``PyVectorcall_Function()``. -Patch by Andreas Schneider, Antoine Pitrou and Petr Viktorin. diff --git a/Misc/NEWS.d/next/C API/2021-01-27-10-27-47.bpo-43030.loDcD_.rst b/Misc/NEWS.d/next/C API/2021-01-27-10-27-47.bpo-43030.loDcD_.rst deleted file mode 100644 index 7a432522db8a1..0000000000000 --- a/Misc/NEWS.d/next/C API/2021-01-27-10-27-47.bpo-43030.loDcD_.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed a compiler warning in :c:func:`Py_UNICODE_ISSPACE()` on platforms with -signed ``wchar_t``. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-04-23-54-34.bpo-42819.4KO6wU.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-04-23-54-34.bpo-42819.4KO6wU.rst deleted file mode 100644 index d067f0bfa7644..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-01-04-23-54-34.bpo-42819.4KO6wU.rst +++ /dev/null @@ -1,8 +0,0 @@ -: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. diff --git a/Misc/NEWS.d/next/Documentation/2021-01-04-22-14-22.bpo-42811.HY2beA.rst b/Misc/NEWS.d/next/Documentation/2021-01-04-22-14-22.bpo-42811.HY2beA.rst deleted file mode 100644 index 768508e0ce1c1..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-01-04-22-14-22.bpo-42811.HY2beA.rst +++ /dev/null @@ -1,2 +0,0 @@ -Updated importlib.utils.resolve_name() doc to use __spec__.parent -instead of __package__. (Thanks Yair Frid.) diff --git a/Misc/NEWS.d/next/Documentation/2021-01-20-23-03-49.bpo-40304.-LK7Ps.rst b/Misc/NEWS.d/next/Documentation/2021-01-20-23-03-49.bpo-40304.-LK7Ps.rst deleted file mode 100644 index 3f2f14c2d7b89..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-01-20-23-03-49.bpo-40304.-LK7Ps.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix doc for type(name, bases, dict). Patch by Boris Verkhovskiy and -?ric Araujo. diff --git a/Misc/NEWS.d/next/IDLE/2019-06-30-20-31-09.bpo-32631.e7_4BG.rst b/Misc/NEWS.d/next/IDLE/2019-06-30-20-31-09.bpo-32631.e7_4BG.rst deleted file mode 100644 index c422f43b6d6dd..0000000000000 --- a/Misc/NEWS.d/next/IDLE/2019-06-30-20-31-09.bpo-32631.e7_4BG.rst +++ /dev/null @@ -1,2 +0,0 @@ -Finish zzdummy example extension module: make menu entries work; -add docstrings and tests with 100% coverage. diff --git a/Misc/NEWS.d/next/IDLE/2019-11-14-23-41-07.bpo-23544.3etemb.rst b/Misc/NEWS.d/next/IDLE/2019-11-14-23-41-07.bpo-23544.3etemb.rst deleted file mode 100644 index eb4a56bf100b5..0000000000000 --- a/Misc/NEWS.d/next/IDLE/2019-11-14-23-41-07.bpo-23544.3etemb.rst +++ /dev/null @@ -1,2 +0,0 @@ -Disable Debug=>Stack Viewer when user code is running or Debugger -is active, to prevent hang or crash. Patch by Zackery Spytz. diff --git a/Misc/NEWS.d/next/IDLE/2020-11-30-19-46-05.bpo-42508.fE7w4M.rst b/Misc/NEWS.d/next/IDLE/2020-11-30-19-46-05.bpo-42508.fE7w4M.rst deleted file mode 100644 index b449351f7f458..0000000000000 --- a/Misc/NEWS.d/next/IDLE/2020-11-30-19-46-05.bpo-42508.fE7w4M.rst +++ /dev/null @@ -1,3 +0,0 @@ -Keep IDLE running on macOS. Remove obsolete workaround that prevented -running files with shortcuts when using new universal2 installers built -on macOS 11. diff --git a/Misc/NEWS.d/next/IDLE/2021-01-10-01-25-43.bpo-33065.zmyHYJ.rst b/Misc/NEWS.d/next/IDLE/2021-01-10-01-25-43.bpo-33065.zmyHYJ.rst deleted file mode 100644 index 87948f3cd1baa..0000000000000 --- a/Misc/NEWS.d/next/IDLE/2021-01-10-01-25-43.bpo-33065.zmyHYJ.rst +++ /dev/null @@ -1 +0,0 @@ -Fix problem debugging user classes with __repr__ method. diff --git a/Misc/NEWS.d/next/IDLE/2021-01-26-18-12-17.bpo-43008.mbQUc7.rst b/Misc/NEWS.d/next/IDLE/2021-01-26-18-12-17.bpo-43008.mbQUc7.rst deleted file mode 100644 index 55ab67ca94959..0000000000000 --- a/Misc/NEWS.d/next/IDLE/2021-01-26-18-12-17.bpo-43008.mbQUc7.rst +++ /dev/null @@ -1,2 +0,0 @@ -Make IDLE invoke :func:`sys.excepthook` in normal, 2-process mode. -Patch by Ken Hilton. diff --git a/Misc/NEWS.d/next/Library/2018-04-23-13-44-10.bpo-33289.anBnUr.rst b/Misc/NEWS.d/next/Library/2018-04-23-13-44-10.bpo-33289.anBnUr.rst deleted file mode 100644 index 52d9ac9dd902c..0000000000000 --- a/Misc/NEWS.d/next/Library/2018-04-23-13-44-10.bpo-33289.anBnUr.rst +++ /dev/null @@ -1,2 +0,0 @@ -Correct call to :mod:`tkinter.colorchooser` to return RGB triplet of ints -instead of floats. Patch by Cheryl Sabella. diff --git a/Misc/NEWS.d/next/Library/2019-11-16-22-56-51.bpo-36589.0Io76D.rst b/Misc/NEWS.d/next/Library/2019-11-16-22-56-51.bpo-36589.0Io76D.rst deleted file mode 100644 index 3c1221b203494..0000000000000 --- a/Misc/NEWS.d/next/Library/2019-11-16-22-56-51.bpo-36589.0Io76D.rst +++ /dev/null @@ -1,2 +0,0 @@ -The :func:`curses.update_lines_cols` function now returns ``None`` instead -of ``1`` on success. diff --git a/Misc/NEWS.d/next/Library/2019-12-16-17-55-31.bpo-39068.Ti3f9P.rst b/Misc/NEWS.d/next/Library/2019-12-16-17-55-31.bpo-39068.Ti3f9P.rst deleted file mode 100644 index fe6503fdce6b6..0000000000000 --- a/Misc/NEWS.d/next/Library/2019-12-16-17-55-31.bpo-39068.Ti3f9P.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix initialization race condition in :func:`a85encode` and :func:`b85encode` -in :mod:`base64`. Patch by Brandon Stansbury. diff --git a/Misc/NEWS.d/next/Library/2020-05-30-14-19-47.bpo-26407.MjWLO1.rst b/Misc/NEWS.d/next/Library/2020-05-30-14-19-47.bpo-26407.MjWLO1.rst deleted file mode 100644 index d0e45cf1b1f2f..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-30-14-19-47.bpo-26407.MjWLO1.rst +++ /dev/null @@ -1,3 +0,0 @@ -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`. diff --git a/Misc/NEWS.d/next/Library/2020-08-21-15-24-14.bpo-41604.rTXleO.rst b/Misc/NEWS.d/next/Library/2020-08-21-15-24-14.bpo-41604.rTXleO.rst deleted file mode 100644 index 0f9794cbdb321..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-08-21-15-24-14.bpo-41604.rTXleO.rst +++ /dev/null @@ -1,2 +0,0 @@ -Don't decrement the reference count of the previous user_ptr when -set_panel_userptr fails. diff --git a/Misc/NEWS.d/next/Library/2020-10-11-13-48-03.bpo-42005.Jq6Az-.rst b/Misc/NEWS.d/next/Library/2020-10-11-13-48-03.bpo-42005.Jq6Az-.rst deleted file mode 100644 index be4ed7f55ffde..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-11-13-48-03.bpo-42005.Jq6Az-.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix CLI of :mod:`cProfile` and :mod:`profile` to catch -:exc:`BrokenPipeError`. diff --git a/Misc/NEWS.d/next/Library/2020-11-14-13-46-27.bpo-42318.wYAcBD.rst b/Misc/NEWS.d/next/Library/2020-11-14-13-46-27.bpo-42318.wYAcBD.rst deleted file mode 100644 index e72daebb2f152..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-14-13-46-27.bpo-42318.wYAcBD.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed support of non-BMP characters in :mod:`tkinter` on macOS. diff --git a/Misc/NEWS.d/next/Library/2020-11-17-14-30-12.bpo-42383.ubl0Y_.rst b/Misc/NEWS.d/next/Library/2020-11-17-14-30-12.bpo-42383.ubl0Y_.rst deleted file mode 100644 index ccf2106f28a93..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-17-14-30-12.bpo-42383.ubl0Y_.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix pdb: previously pdb would fail to restart the debugging target if it was -specified using a relative path and the current directory changed. diff --git a/Misc/NEWS.d/next/Library/2020-11-17-14-32-39.bpo-42384.1ZnQSn.rst b/Misc/NEWS.d/next/Library/2020-11-17-14-32-39.bpo-42384.1ZnQSn.rst deleted file mode 100644 index ae990162fbab7..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-17-14-32-39.bpo-42384.1ZnQSn.rst +++ /dev/null @@ -1 +0,0 @@ -Make pdb populate sys.path[0] exactly the same as regular python execution. diff --git a/Misc/NEWS.d/next/Library/2020-11-22-11-22-28.bpo-42388.LMgM6B.rst b/Misc/NEWS.d/next/Library/2020-11-22-11-22-28.bpo-42388.LMgM6B.rst deleted file mode 100644 index 1b19247e84148..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-22-11-22-28.bpo-42388.LMgM6B.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix subprocess.check_output(..., input=None) behavior when text=True to be -consistent with that of the documentation and universal_newlines=True. diff --git a/Misc/NEWS.d/next/Library/2020-12-02-16-28-04.bpo-42531.2sLlFW.rst b/Misc/NEWS.d/next/Library/2020-12-02-16-28-04.bpo-42531.2sLlFW.rst deleted file mode 100644 index 7927078acda43..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-12-02-16-28-04.bpo-42531.2sLlFW.rst +++ /dev/null @@ -1 +0,0 @@ -:func:`importlib.resources.path` now works for :term:`package`\ s missing the optional :attr:`__file__` attribute (more specifically, packages whose :attr:`__spec__`\ ``.``\ :attr:`~importlib.machinery.ModuleSpec.origin` :keyword:`is` :data:`None`). \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-12-20-22-50-15.bpo-42681.lDO6jb.rst b/Misc/NEWS.d/next/Library/2020-12-20-22-50-15.bpo-42681.lDO6jb.rst deleted file mode 100644 index 34ea74a5a323d..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-12-20-22-50-15.bpo-42681.lDO6jb.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed range checks for color and pair numbers in :mod:`curses`. diff --git a/Misc/NEWS.d/next/Library/2020-12-27-18-47-01.bpo-23328._xqepZ.rst b/Misc/NEWS.d/next/Library/2020-12-27-18-47-01.bpo-23328._xqepZ.rst deleted file mode 100644 index 07b15d34e8d56..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-12-27-18-47-01.bpo-23328._xqepZ.rst +++ /dev/null @@ -1 +0,0 @@ -Allow / character in username, password fields on _PROXY envars. diff --git a/Misc/NEWS.d/next/Library/2020-12-27-22-19-26.bpo-42759.lGi_03.rst b/Misc/NEWS.d/next/Library/2020-12-27-22-19-26.bpo-42759.lGi_03.rst deleted file mode 100644 index a5ec7d5820336..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-12-27-22-19-26.bpo-42759.lGi_03.rst +++ /dev/null @@ -1,3 +0,0 @@ -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. diff --git a/Misc/NEWS.d/next/Library/2021-01-05-21-26-29.bpo-41748.KdC0w3.rst b/Misc/NEWS.d/next/Library/2021-01-05-21-26-29.bpo-41748.KdC0w3.rst deleted file mode 100644 index 52efa3ac3d40e..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-05-21-26-29.bpo-41748.KdC0w3.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix HTMLParser parsing rules for element attributes containing -commas with spaces. Patch by Karl Dubost. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2021-01-08-15-49-20.bpo-42780.rtqi6B.rst b/Misc/NEWS.d/next/Library/2021-01-08-15-49-20.bpo-42780.rtqi6B.rst deleted file mode 100644 index a491690507129..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-08-15-49-20.bpo-42780.rtqi6B.rst +++ /dev/null @@ -1 +0,0 @@ -Fix os.set_inheritable() for O_PATH file descriptors on Linux. diff --git a/Misc/NEWS.d/next/Library/2021-02-02-20-23-31.bpo-43108.lqcCZ6.rst b/Misc/NEWS.d/next/Library/2021-02-02-20-23-31.bpo-43108.lqcCZ6.rst deleted file mode 100644 index 8e45640bceae1..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-02-02-20-23-31.bpo-43108.lqcCZ6.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed a reference leak in the :mod:`curses` module. Patch by Pablo Galindo 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 7df65a156feab..0000000000000 --- 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/2021-02-14-15-59-16.bpo-42967.YApqDS.rst b/Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst deleted file mode 100644 index f08489b41494e..0000000000000 --- a/Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst +++ /dev/null @@ -1 +0,0 @@ -Fix web cache poisoning vulnerability by defaulting the query args separator to ``&``, and allowing the user to choose a custom separator. diff --git a/Misc/NEWS.d/next/Tests/2020-05-30-10-56-38.bpo-40810.LPqDLQ.rst b/Misc/NEWS.d/next/Tests/2020-05-30-10-56-38.bpo-40810.LPqDLQ.rst deleted file mode 100644 index eafd94cabede9..0000000000000 --- a/Misc/NEWS.d/next/Tests/2020-05-30-10-56-38.bpo-40810.LPqDLQ.rst +++ /dev/null @@ -1 +0,0 @@ -In :mod:`sqlite3`, fix ``CheckTraceCallbackContent`` for SQLite pre 3.7.15. diff --git a/Misc/NEWS.d/next/Tests/2021-01-01-08-52-36.bpo-42794.-7-XGz.rst b/Misc/NEWS.d/next/Tests/2021-01-01-08-52-36.bpo-42794.-7-XGz.rst deleted file mode 100644 index 577f2259e1f00..0000000000000 --- a/Misc/NEWS.d/next/Tests/2021-01-01-08-52-36.bpo-42794.-7-XGz.rst +++ /dev/null @@ -1,2 +0,0 @@ -Update test_nntplib to use offical group name of news.aioe.org for testing. -Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/Tools-Demos/2020-12-23-19-42-11.bpo-42726.a5EkTv.rst b/Misc/NEWS.d/next/Tools-Demos/2020-12-23-19-42-11.bpo-42726.a5EkTv.rst deleted file mode 100644 index 01a6e7fe55f5b..0000000000000 --- a/Misc/NEWS.d/next/Tools-Demos/2020-12-23-19-42-11.bpo-42726.a5EkTv.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed Python 3 compatibility issue with gdb/libpython.py handling of attribute -dictionaries. diff --git a/Misc/NEWS.d/next/Windows/2020-12-07-11-40-52.bpo-42584.AsYnVX.rst b/Misc/NEWS.d/next/Windows/2020-12-07-11-40-52.bpo-42584.AsYnVX.rst deleted file mode 100644 index afb6530c8f66d..0000000000000 --- a/Misc/NEWS.d/next/Windows/2020-12-07-11-40-52.bpo-42584.AsYnVX.rst +++ /dev/null @@ -1 +0,0 @@ -Upgrade Windows installer to use SQLite 3.34.0. diff --git a/Misc/NEWS.d/next/Windows/2021-01-05-20-36-40.bpo-41837.bmS7vB.rst b/Misc/NEWS.d/next/Windows/2021-01-05-20-36-40.bpo-41837.bmS7vB.rst deleted file mode 100644 index 8d4bb34ff909c..0000000000000 --- a/Misc/NEWS.d/next/Windows/2021-01-05-20-36-40.bpo-41837.bmS7vB.rst +++ /dev/null @@ -1 +0,0 @@ -Updated Windows installer to include OpenSSL 1.1.1i diff --git a/Misc/NEWS.d/next/macOS/2020-12-07-11-37-35.bpo-42584.LygmqQ.rst b/Misc/NEWS.d/next/macOS/2020-12-07-11-37-35.bpo-42584.LygmqQ.rst deleted file mode 100644 index 2a625f98e9078..0000000000000 --- a/Misc/NEWS.d/next/macOS/2020-12-07-11-37-35.bpo-42584.LygmqQ.rst +++ /dev/null @@ -1 +0,0 @@ -Update macOS installer to use SQLite 3.34.0. diff --git a/Misc/NEWS.d/next/macOS/2021-01-04-00-48-08.bpo-41837.dX-unJ.rst b/Misc/NEWS.d/next/macOS/2021-01-04-00-48-08.bpo-41837.dX-unJ.rst deleted file mode 100644 index 3f9415f4a3606..0000000000000 --- a/Misc/NEWS.d/next/macOS/2021-01-04-00-48-08.bpo-41837.dX-unJ.rst +++ /dev/null @@ -1 +0,0 @@ -Update macOS installer build to use OpenSSL 1.1.1i. diff --git a/README.rst b/README.rst index 4907629a0f69d..d6d9c5b2b1bef 100644 --- a/README.rst +++ b/README.rst @@ -1,5 +1,5 @@ -This is Python version 3.8.7 -============================ +This is Python version 3.8.8rc1 +=============================== .. image:: https://travis-ci.org/python/cpython.svg?branch=3.8 :alt: CPython build status on Travis CI From webhook-mailer at python.org Tue Feb 16 16:35:26 2021 From: webhook-mailer at python.org (ambv) Date: Tue, 16 Feb 2021 21:35:26 -0000 Subject: [Python-checkins] Python 3.9.2rc1 Message-ID: https://github.com/python/cpython/commit/4064156d62622c1009d32bb87ba17a5e9ecb9d37 commit: 4064156d62622c1009d32bb87ba17a5e9ecb9d37 branch: 3.9 author: ?ukasz Langa committer: ambv date: 2021-02-16T21:10:19+01:00 summary: Python 3.9.2rc1 files: A Misc/NEWS.d/3.9.2rc1.rst D Misc/NEWS.d/next/Build/2020-02-28-14-33-15.bpo-29076.Gtixi5.rst D Misc/NEWS.d/next/Build/2020-12-13-14-43-10.bpo-42598.7ipr5H.rst D Misc/NEWS.d/next/Build/2020-12-20-02-35-28.bpo-42604.gRd89w.rst D Misc/NEWS.d/next/Build/2021-01-04-05-07-30.bpo-42692.OO11SN.rst D Misc/NEWS.d/next/Build/2021-02-10-14-11-53.bpo-43174.F9zwXQ.rst D Misc/NEWS.d/next/C API/2020-03-24-09-27-10.bpo-40052.27P2KG.rst D Misc/NEWS.d/next/C API/2020-12-10-10-43-03.bpo-42591.CXNY8G.rst D Misc/NEWS.d/next/C API/2021-01-27-10-27-47.bpo-43030.loDcD_.rst D Misc/NEWS.d/next/Core and Builtins/2020-11-20-00-57-47.bpo-42195.HeqcpS.rst D Misc/NEWS.d/next/Core and Builtins/2020-12-02-20-23-31.bpo-42536.Kx3ZOu.rst D Misc/NEWS.d/next/Core and Builtins/2020-12-04-17-17-44.bpo-32381.NY5t2S.rst D Misc/NEWS.d/next/Core and Builtins/2020-12-31-20-58-22.bpo-40631.deRMCx.rst D Misc/NEWS.d/next/Core and Builtins/2021-01-03-00-20-38.bpo-42806.mLAobJ.rst D Misc/NEWS.d/next/Core and Builtins/2021-01-04-23-54-34.bpo-42819.4KO6wU.rst D Misc/NEWS.d/next/Documentation/2020-12-16-21-06-16.bpo-17140.1leSEg.rst D Misc/NEWS.d/next/Documentation/2021-01-07-12-08-59.bpo-42811.ePF7EC.rst D Misc/NEWS.d/next/Documentation/2021-01-20-23-03-49.bpo-40304.-LK7Ps.rst D Misc/NEWS.d/next/IDLE/2019-06-30-20-31-09.bpo-32631.e7_4BG.rst D Misc/NEWS.d/next/IDLE/2019-11-14-23-41-07.bpo-23544.3etemb.rst D Misc/NEWS.d/next/IDLE/2021-01-10-01-25-43.bpo-33065.zmyHYJ.rst D Misc/NEWS.d/next/IDLE/2021-01-26-18-12-17.bpo-43008.mbQUc7.rst D Misc/NEWS.d/next/Library/2018-04-23-13-44-10.bpo-33289.anBnUr.rst D Misc/NEWS.d/next/Library/2019-12-16-17-55-31.bpo-39068.Ti3f9P.rst D Misc/NEWS.d/next/Library/2020-03-29-21-32-00.bpo-40084.MCYwcv.rst D Misc/NEWS.d/next/Library/2020-07-13-19-43-11.bpo-40219.MUoJEP.rst D Misc/NEWS.d/next/Library/2020-08-21-15-24-14.bpo-41604.rTXleO.rst D Misc/NEWS.d/next/Library/2020-09-30-13-35-29.bpo-41891.pNAeYI.rst D Misc/NEWS.d/next/Library/2020-10-01-16-17-11.bpo-41889.qLkNh8.rst D Misc/NEWS.d/next/Library/2020-10-02-10-19-49.bpo-41907.wiIEsz.rst D Misc/NEWS.d/next/Library/2020-10-11-13-48-03.bpo-42005.Jq6Az-.rst D Misc/NEWS.d/next/Library/2020-10-11-21-43-03.bpo-39101.-I49Pm.rst D Misc/NEWS.d/next/Library/2020-10-17-12-42-08.bpo-42059.ZGMZ3D.rst D Misc/NEWS.d/next/Library/2020-10-20-08-28-26.bpo-39825.n6KnG0.rst D Misc/NEWS.d/next/Library/2020-10-29-09-22-56.bpo-42163.O4VcCY.rst D Misc/NEWS.d/next/Library/2020-11-14-13-46-27.bpo-42318.wYAcBD.rst D Misc/NEWS.d/next/Library/2020-11-17-14-30-12.bpo-42383.ubl0Y_.rst D Misc/NEWS.d/next/Library/2020-11-17-14-32-39.bpo-42384.1ZnQSn.rst D Misc/NEWS.d/next/Library/2020-11-19-04-13-53.bpo-42375.U8bp4s.rst D Misc/NEWS.d/next/Library/2020-11-20-19-00-27.bpo-34463.aJcm56.rst D Misc/NEWS.d/next/Library/2020-11-22-11-22-28.bpo-42388.LMgM6B.rst D Misc/NEWS.d/next/Library/2020-12-02-07-37-59.bpo-42532.ObNep_.rst D Misc/NEWS.d/next/Library/2020-12-08-22-43-35.bpo-42678.ba9ktU.rst D Misc/NEWS.d/next/Library/2020-12-09-10-59-16.bpo-42517.FKEVcZ.rst D Misc/NEWS.d/next/Library/2020-12-14-08-23-57.bpo-36541.qdEtZv.rst D Misc/NEWS.d/next/Library/2020-12-15-10-00-04.bpo-42644.XgLCNx.rst D Misc/NEWS.d/next/Library/2020-12-15-17-51-27.bpo-42630.jf4jBl.rst D Misc/NEWS.d/next/Library/2020-12-16-16-16-33.bpo-37961.jrESEq.rst D Misc/NEWS.d/next/Library/2020-12-20-22-50-15.bpo-42681.lDO6jb.rst D Misc/NEWS.d/next/Library/2020-12-23-19-43-06.bpo-42727.WH3ODh.rst D Misc/NEWS.d/next/Library/2020-12-25-12-32-47.bpo-42655.W5ytpV.rst D Misc/NEWS.d/next/Library/2020-12-27-18-47-01.bpo-23328._xqepZ.rst D Misc/NEWS.d/next/Library/2020-12-27-21-22-01.bpo-42756.dHMPJ9.rst D Misc/NEWS.d/next/Library/2020-12-27-22-19-26.bpo-42759.lGi_03.rst D Misc/NEWS.d/next/Library/2021-01-05-21-26-29.bpo-41748.KdC0w3.rst D Misc/NEWS.d/next/Library/2021-01-07-11-44-22.bpo-42851.uyQFyd.rst D Misc/NEWS.d/next/Library/2021-01-08-15-49-20.bpo-42780.rtqi6B.rst D Misc/NEWS.d/next/Library/2021-01-15-00-23-50.bpo-42931.QD6U2B.rst D Misc/NEWS.d/next/Library/2021-01-18-10-41-44.bpo-42944.RrONvy.rst D Misc/NEWS.d/next/Library/2021-02-02-20-23-31.bpo-43108.lqcCZ6.rst D Misc/NEWS.d/next/Library/2021-02-03-22-55-27.bpo-43102.TSlZ6J.rst D Misc/NEWS.d/next/Security/2021-01-18-09-27-31.bpo-42938.4Zn4Mp.rst D Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst D Misc/NEWS.d/next/Tests/2020-05-30-10-56-38.bpo-40810.LPqDLQ.rst D Misc/NEWS.d/next/Tests/2021-01-01-08-52-36.bpo-42794.-7-XGz.rst D Misc/NEWS.d/next/Tools-Demos/2020-12-16-09-10-32.bpo-42613.J-jnm5.rst D Misc/NEWS.d/next/Tools-Demos/2020-12-23-19-42-11.bpo-42726.a5EkTv.rst D Misc/NEWS.d/next/Windows/2020-12-07-11-40-52.bpo-42584.AsYnVX.rst D Misc/NEWS.d/next/Windows/2021-01-05-20-36-40.bpo-41837.bmS7vB.rst D Misc/NEWS.d/next/macOS/2020-12-07-11-37-35.bpo-42584.LygmqQ.rst D Misc/NEWS.d/next/macOS/2021-01-04-00-48-08.bpo-41837.dX-unJ.rst D Misc/NEWS.d/next/macOS/2021-01-04-01-17-17.bpo-42361.eolZAi.rst D Misc/NEWS.d/next/macOS/2021-01-26-14-36-11.bpo-42504.ZxWt71.rst M Include/patchlevel.h M Lib/pydoc_data/topics.py M README.rst diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 253421378be4a..ef02372f8b22c 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -18,12 +18,12 @@ /*--start constants--*/ #define PY_MAJOR_VERSION 3 #define PY_MINOR_VERSION 9 -#define PY_MICRO_VERSION 1 -#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL -#define PY_RELEASE_SERIAL 0 +#define PY_MICRO_VERSION 2 +#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_GAMMA +#define PY_RELEASE_SERIAL 1 /* Version as a string */ -#define PY_VERSION "3.9.1+" +#define PY_VERSION "3.9.2rc1" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py index d8dd8c536aa70..acaae371aeb22 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 Dec 7 15:00:07 2020 +# Autogenerated by Sphinx on Tue Feb 16 21:03:59 2021 topics = {'assert': 'The "assert" statement\n' '**********************\n' '\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' @@ -2381,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' @@ -2991,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' @@ -5530,44 +5529,51 @@ ' | | formats the result in either fixed-point ' 'format or in |\n' ' | | scientific notation, depending on its ' - 'magnitude. The |\n' - ' | | precise rules are as follows: suppose that ' - 'the result |\n' + 'magnitude. A |\n' + ' | | precision of "0" is treated as equivalent ' + 'to a precision |\n' + ' | | of "1". The precise rules are as follows: ' + 'suppose that |\n' + ' | | the result formatted with presentation ' + 'type "\'e\'" and |\n' + ' | | precision "p-1" would have exponent ' + '"exp". Then, if "m <= |\n' + ' | | exp < p", where "m" is -4 for floats and ' + '-6 for |\n' + ' | | "Decimals", the number is formatted with ' + 'presentation type |\n' + ' | | "\'f\'" and precision "p-1-exp". ' + 'Otherwise, the number is |\n' ' | | formatted with presentation type "\'e\'" ' - 'and precision "p-1" |\n' - ' | | would have exponent "exp". Then, if "m <= ' - 'exp < p", where |\n' - ' | | "m" is -4 for floats and -6 for ' - '"Decimals", the number is |\n' - ' | | formatted with presentation type "\'f\'" ' 'and precision |\n' - ' | | "p-1-exp". Otherwise, the number is ' - 'formatted with |\n' - ' | | presentation type "\'e\'" and precision ' - '"p-1". In both cases |\n' - ' | | insignificant trailing zeros are removed ' - 'from the |\n' - ' | | significand, and the decimal point is also ' - 'removed if |\n' - ' | | there are no remaining digits following ' - 'it, unless the |\n' - ' | | "\'#\'" option is used. Positive and ' - 'negative infinity, |\n' - ' | | positive and negative zero, and nans, are ' - 'formatted as |\n' - ' | | "inf", "-inf", "0", "-0" and "nan" ' - 'respectively, |\n' - ' | | regardless of the precision. A precision ' - 'of "0" is |\n' - ' | | treated as equivalent to a precision of ' - '"1". With no |\n' - ' | | precision given, uses a precision of "6" ' - 'significant |\n' - ' | | digits for "float", and shows all ' - 'coefficient digits for |\n' - ' | | ' - '"Decimal". ' - '|\n' + ' | | "p-1". In both cases insignificant ' + 'trailing zeros are |\n' + ' | | removed from the significand, and the ' + 'decimal point is |\n' + ' | | also removed if there are no remaining ' + 'digits following |\n' + ' | | it, unless the "\'#\'" option is used. ' + 'With no precision |\n' + ' | | given, uses a precision of "6" significant ' + 'digits for |\n' + ' | | "float". For "Decimal", the coefficient of ' + 'the result is |\n' + ' | | formed from the coefficient digits of the ' + 'value; |\n' + ' | | scientific notation is used for values ' + 'smaller than "1e-6" |\n' + ' | | in absolute value and values where the ' + 'place value of the |\n' + ' | | least significant digit is larger than 1, ' + 'and fixed-point |\n' + ' | | notation is used otherwise. Positive and ' + 'negative |\n' + ' | | infinity, positive and negative zero, and ' + 'nans, are |\n' + ' | | formatted as "inf", "-inf", "0", "-0" and ' + '"nan" |\n' + ' | | respectively, regardless of the ' + 'precision. |\n' ' ' '+-----------+------------------------------------------------------------+\n' ' | "\'G\'" | General format. Same as "\'g\'" except ' @@ -5592,19 +5598,24 @@ 'percent sign. |\n' ' ' '+-----------+------------------------------------------------------------+\n' - ' | None | Similar to "\'g\'", except that ' - 'fixed-point notation, when |\n' - ' | | used, has at least one digit past the ' - 'decimal point. The |\n' - ' | | default precision is as high as needed to ' - 'represent the |\n' - ' | | particular value. The overall effect is to ' - 'match the |\n' - ' | | output of "str()" as altered by the other ' - 'format |\n' - ' | | ' - 'modifiers. ' - '|\n' + ' | None | For "float" this is the same as "\'g\'", ' + 'except that when |\n' + ' | | fixed-point notation is used to format the ' + 'result, it |\n' + ' | | always includes at least one digit past ' + 'the decimal point. |\n' + ' | | The precision used is as large as needed ' + 'to represent the |\n' + ' | | given value faithfully. For "Decimal", ' + 'this is the same |\n' + ' | | as either "\'g\'" or "\'G\'" depending on ' + 'the value of |\n' + ' | | "context.capitals" for the current decimal ' + 'context. The |\n' + ' | | overall effect is to match the output of ' + '"str()" as |\n' + ' | | altered by the other format ' + 'modifiers. |\n' ' ' '+-----------+------------------------------------------------------------+\n' '\n' @@ -7950,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" @@ -11259,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' @@ -11480,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' diff --git a/Misc/NEWS.d/3.9.2rc1.rst b/Misc/NEWS.d/3.9.2rc1.rst new file mode 100644 index 0000000000000..ba40d92281a1a --- /dev/null +++ b/Misc/NEWS.d/3.9.2rc1.rst @@ -0,0 +1,746 @@ +.. bpo: 42967 +.. date: 2021-02-14-15-59-16 +.. nonce: YApqDS +.. release date: 2021-02-16 +.. section: Security + +Fix web cache poisoning vulnerability by defaulting the query args separator +to ``&``, and allowing the user to choose a custom separator. + +.. + +.. bpo: 42938 +.. date: 2021-01-18-09-27-31 +.. nonce: 4Zn4Mp +.. section: Security + +Avoid static buffers when computing the repr of :class:`ctypes.c_double` and +:class:`ctypes.c_longdouble` values. + +.. + +.. bpo: 42819 +.. date: 2021-01-04-23-54-34 +.. nonce: 4KO6wU +.. section: Core and Builtins + +: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 +.. date: 2021-01-03-00-20-38 +.. nonce: mLAobJ +.. section: Core and Builtins + +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 +.. date: 2020-12-31-20-58-22 +.. nonce: deRMCx +.. section: Core and Builtins + +Fix regression where a single parenthesized starred expression was a valid +assignment target. + +.. + +.. bpo: 32381 +.. date: 2020-12-04-17-17-44 +.. nonce: NY5t2S +.. section: Core and Builtins + +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 +.. date: 2020-12-02-20-23-31 +.. nonce: Kx3ZOu +.. section: Core and Builtins + +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 +.. date: 2020-11-20-00-57-47 +.. nonce: HeqcpS +.. section: Core and Builtins + +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. + +.. + +.. bpo: 43102 +.. date: 2021-02-03-22-55-27 +.. nonce: TSlZ6J +.. section: Library + +The namedtuple __new__ method had its __builtins__ set to None instead of an +actual dictionary. This created problems for introspection tools. + +.. + +.. bpo: 43108 +.. date: 2021-02-02-20-23-31 +.. nonce: lqcCZ6 +.. section: Library + +Fixed a reference leak in the :mod:`curses` module. Patch by Pablo Galindo + +.. + +.. bpo: 42944 +.. date: 2021-01-18-10-41-44 +.. nonce: RrONvy +.. section: Library + +Fix ``random.Random.sample`` when ``counts`` argument is not ``None``. + +.. + +.. bpo: 42931 +.. date: 2021-01-15-00-23-50 +.. nonce: QD6U2B +.. section: Library + +Add :func:`randbytes` to ``random.__all__``. + +.. + +.. bpo: 42780 +.. date: 2021-01-08-15-49-20 +.. nonce: rtqi6B +.. section: Library + +Fix os.set_inheritable() for O_PATH file descriptors on Linux. + +.. + +.. bpo: 42851 +.. date: 2021-01-07-11-44-22 +.. nonce: uyQFyd +.. section: Library + +remove __init_subclass__ support for Enum members + +.. + +.. bpo: 41748 +.. date: 2021-01-05-21-26-29 +.. nonce: KdC0w3 +.. section: Library + +Fix HTMLParser parsing rules for element attributes containing commas with +spaces. Patch by Karl Dubost. + +.. + +.. bpo: 42759 +.. date: 2020-12-27-22-19-26 +.. nonce: lGi_03 +.. section: Library + +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 +.. date: 2020-12-27-21-22-01 +.. nonce: dHMPJ9 +.. section: Library + +Configure LMTP Unix-domain socket to use socket global default timeout when +a timeout is not explicitly provided. + +.. + +.. bpo: 23328 +.. date: 2020-12-27-18-47-01 +.. nonce: _xqepZ +.. section: Library + +Allow / character in username, password fields on _PROXY envars. + +.. + +.. bpo: 42655 +.. date: 2020-12-25-12-32-47 +.. nonce: W5ytpV +.. section: Library + +:mod:`subprocess` *extra_groups* is now correctly passed into setgroups() +system call. + +.. + +.. bpo: 42727 +.. date: 2020-12-23-19-43-06 +.. nonce: WH3ODh +.. section: Library + +``EnumMeta.__prepare__`` now accepts ``**kwds`` to properly support +``__init_subclass__`` + +.. + +.. bpo: 42681 +.. date: 2020-12-20-22-50-15 +.. nonce: lDO6jb +.. section: Library + +Fixed range checks for color and pair numbers in :mod:`curses`. + +.. + +.. bpo: 37961 +.. date: 2020-12-16-16-16-33 +.. nonce: jrESEq +.. section: Library + +Fix crash in :func:`tracemalloc.Traceback.__repr__` (regressed in Python +3.9). + +.. + +.. bpo: 42630 +.. date: 2020-12-15-17-51-27 +.. nonce: jf4jBl +.. section: Library + +: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 +.. date: 2020-12-15-10-00-04 +.. nonce: XgLCNx +.. section: Library + +`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 +.. date: 2020-12-14-08-23-57 +.. nonce: qdEtZv +.. section: Library + +Fixed lib2to3.pgen2 to be able to parse PEP-570 positional only argument +syntax. + +.. + +.. bpo: 42517 +.. date: 2020-12-09-10-59-16 +.. nonce: FKEVcZ +.. section: Library + +Enum: private names will raise a DeprecationWarning; in 3.10 they will +become normal attributes + +.. + +.. bpo: 42678 +.. date: 2020-12-08-22-43-35 +.. nonce: ba9ktU +.. section: Library + +`Enum`: call `__init_subclass__` after members have been added + +.. + +.. bpo: 42532 +.. date: 2020-12-02-07-37-59 +.. nonce: ObNep_ +.. section: Library + +Remove unexpected call of ``__bool__`` when passing a ``spec_arg`` argument +to a Mock. + +.. + +.. bpo: 42388 +.. date: 2020-11-22-11-22-28 +.. nonce: LMgM6B +.. section: Library + +Fix subprocess.check_output(..., input=None) behavior when text=True to be +consistent with that of the documentation and universal_newlines=True. + +.. + +.. bpo: 34463 +.. date: 2020-11-20-19-00-27 +.. nonce: aJcm56 +.. section: Library + +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 +.. date: 2020-11-19-04-13-53 +.. nonce: U8bp4s +.. section: Library + +subprocess module update for DragonFlyBSD support. + +.. + +.. bpo: 42384 +.. date: 2020-11-17-14-32-39 +.. nonce: 1ZnQSn +.. section: Library + +Make pdb populate sys.path[0] exactly the same as regular python execution. + +.. + +.. bpo: 42383 +.. date: 2020-11-17-14-30-12 +.. nonce: ubl0Y_ +.. section: Library + +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 +.. date: 2020-11-14-13-46-27 +.. nonce: wYAcBD +.. section: Library + +Fixed support of non-BMP characters in :mod:`tkinter` on macOS. + +.. + +.. bpo: 42163 +.. date: 2020-10-29-09-22-56 +.. nonce: O4VcCY +.. section: Library + +Restore compatibility for ``uname_result`` around deepcopy and _replace. + +.. + +.. bpo: 39825 +.. date: 2020-10-20-08-28-26 +.. nonce: n6KnG0 +.. section: Library + +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 +.. date: 2020-10-17-12-42-08 +.. nonce: ZGMZ3D +.. section: Library + +: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 +.. date: 2020-10-11-21-43-03 +.. nonce: -I49Pm +.. section: Library + +Fixed tests using IsolatedAsyncioTestCase from hanging on BaseExceptions. + +.. + +.. bpo: 42005 +.. date: 2020-10-11-13-48-03 +.. nonce: Jq6Az- +.. section: Library + +Fix CLI of :mod:`cProfile` and :mod:`profile` to catch +:exc:`BrokenPipeError`. + +.. + +.. bpo: 41907 +.. date: 2020-10-02-10-19-49 +.. nonce: wiIEsz +.. section: Library + +fix `format()` behavior for `IntFlag` + +.. + +.. bpo: 41889 +.. date: 2020-10-01-16-17-11 +.. nonce: qLkNh8 +.. section: Library + +Enum: fix regression involving inheriting a multiply-inherited enum + +.. + +.. bpo: 41891 +.. date: 2020-09-30-13-35-29 +.. nonce: pNAeYI +.. section: Library + +Ensure asyncio.wait_for waits for task completion + +.. + +.. bpo: 41604 +.. date: 2020-08-21-15-24-14 +.. nonce: rTXleO +.. section: Library + +Don't decrement the reference count of the previous user_ptr when +set_panel_userptr fails. + +.. + +.. bpo: 40219 +.. date: 2020-07-13-19-43-11 +.. nonce: MUoJEP +.. section: Library + +Lowered :class:`tkinter.ttk.LabeledScale` dummy widget to prevent hiding +part of the content label. + +.. + +.. bpo: 40084 +.. date: 2020-03-29-21-32-00 +.. nonce: MCYwcv +.. section: Library + +Fix ``Enum.__dir__``: dir(Enum.member) now includes attributes as well as +methods. + +.. + +.. bpo: 39068 +.. date: 2019-12-16-17-55-31 +.. nonce: Ti3f9P +.. section: Library + +Fix initialization race condition in :func:`a85encode` and :func:`b85encode` +in :mod:`base64`. Patch by Brandon Stansbury. + +.. + +.. bpo: 33289 +.. date: 2018-04-23-13-44-10 +.. nonce: anBnUr +.. section: Library + +Correct call to :mod:`tkinter.colorchooser` to return RGB triplet of ints +instead of floats. Patch by Cheryl Sabella. + +.. + +.. bpo: 40304 +.. date: 2021-01-20-23-03-49 +.. nonce: -LK7Ps +.. section: Documentation + +Fix doc for type(name, bases, dict). Patch by Boris Verkhovskiy and ?ric +Araujo. + +.. + +.. bpo: 42811 +.. date: 2021-01-07-12-08-59 +.. nonce: ePF7EC +.. section: Documentation + +Updated importlib.utils.resolve_name() doc to use __spec__.parent instead of +__package__. (Thanks Yair Frid.) + +.. + +.. bpo: 17140 +.. date: 2020-12-16-21-06-16 +.. nonce: 1leSEg +.. section: Documentation + +Add documentation for the :class:`multiprocessing.pool.ThreadPool` class. + +.. + +.. bpo: 42794 +.. date: 2021-01-01-08-52-36 +.. nonce: -7-XGz +.. section: Tests + +Update test_nntplib to use offical group name of news.aioe.org for testing. +Patch by Dong-hee Na. + +.. + +.. bpo: 40810 +.. date: 2020-05-30-10-56-38 +.. nonce: LPqDLQ +.. section: Tests + +In :mod:`sqlite3`, fix ``CheckTraceCallbackContent`` for SQLite pre 3.7.15. + +.. + +.. bpo: 43174 +.. date: 2021-02-10-14-11-53 +.. nonce: F9zwXQ +.. section: Build + +Windows build now uses ``/utf-8`` compiler option. + +.. + +.. bpo: 42692 +.. date: 2021-01-04-05-07-30 +.. nonce: OO11SN +.. section: Build + +Fix __builtin_available check on older compilers. Patch by Joshua Root. + +.. + +.. bpo: 42604 +.. date: 2020-12-20-02-35-28 +.. nonce: gRd89w +.. section: Build + +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 +.. date: 2020-12-13-14-43-10 +.. nonce: 7ipr5H +.. section: Build + +Fix implicit function declarations in configure which could have resulted in +incorrect configuration checks. Patch contributed by Joshua Root. + +.. + +.. bpo: 29076 +.. date: 2020-02-28-14-33-15 +.. nonce: Gtixi5 +.. section: Build + +Add fish shell support to macOS installer. + +.. + +.. bpo: 41837 +.. date: 2021-01-05-20-36-40 +.. nonce: bmS7vB +.. section: Windows + +Updated Windows installer to include OpenSSL 1.1.1i + +.. + +.. bpo: 42584 +.. date: 2020-12-07-11-40-52 +.. nonce: AsYnVX +.. section: Windows + +Upgrade Windows installer to use SQLite 3.34.0. + +.. + +.. bpo: 42504 +.. date: 2021-01-26-14-36-11 +.. nonce: ZxWt71 +.. section: macOS + +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 +.. date: 2021-01-04-01-17-17 +.. nonce: eolZAi +.. section: macOS + +Update macOS installer build to use Tcl/Tk 8.6.11 (rc2, expected to be final +release). + +.. + +.. bpo: 41837 +.. date: 2021-01-04-00-48-08 +.. nonce: dX-unJ +.. section: macOS + +Update macOS installer build to use OpenSSL 1.1.1i. + +.. + +.. bpo: 42584 +.. date: 2020-12-07-11-37-35 +.. nonce: LygmqQ +.. section: macOS + +Update macOS installer to use SQLite 3.34.0. + +.. + +.. bpo: 43008 +.. date: 2021-01-26-18-12-17 +.. nonce: mbQUc7 +.. section: IDLE + +Make IDLE invoke :func:`sys.excepthook` in normal, 2-process mode. Patch by +Ken Hilton. + +.. + +.. bpo: 33065 +.. date: 2021-01-10-01-25-43 +.. nonce: zmyHYJ +.. section: IDLE + +Fix problem debugging user classes with __repr__ method. + +.. + +.. bpo: 23544 +.. date: 2019-11-14-23-41-07 +.. nonce: 3etemb +.. section: IDLE + +Disable Debug=>Stack Viewer when user code is running or Debugger is active, +to prevent hang or crash. Patch by Zackery Spytz. + +.. + +.. bpo: 32631 +.. date: 2019-06-30-20-31-09 +.. nonce: e7_4BG +.. section: IDLE + +Finish zzdummy example extension module: make menu entries work; add +docstrings and tests with 100% coverage. + +.. + +.. bpo: 42726 +.. date: 2020-12-23-19-42-11 +.. nonce: a5EkTv +.. section: Tools/Demos + +Fixed Python 3 compatibility issue with gdb/libpython.py handling of +attribute dictionaries. + +.. + +.. bpo: 42613 +.. date: 2020-12-16-09-10-32 +.. nonce: J-jnm5 +.. section: Tools/Demos + +Fix ``freeze.py`` tool to use the prope config and library directories. +Patch by Victor Stinner. + +.. + +.. bpo: 43030 +.. date: 2021-01-27-10-27-47 +.. nonce: loDcD_ +.. section: C API + +Fixed a compiler warning in :c:func:`Py_UNICODE_ISSPACE()` on platforms with +signed ``wchar_t``. + +.. + +.. bpo: 42591 +.. date: 2020-12-10-10-43-03 +.. nonce: CXNY8G +.. section: C API + +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 +.. date: 2020-03-24-09-27-10 +.. nonce: 27P2KG +.. section: C API + +Fix an alignment build warning/error in function +``PyVectorcall_Function()``. Patch by Andreas Schneider, Antoine Pitrou and +Petr Viktorin. diff --git a/Misc/NEWS.d/next/Build/2020-02-28-14-33-15.bpo-29076.Gtixi5.rst b/Misc/NEWS.d/next/Build/2020-02-28-14-33-15.bpo-29076.Gtixi5.rst deleted file mode 100644 index b38beb0586951..0000000000000 --- a/Misc/NEWS.d/next/Build/2020-02-28-14-33-15.bpo-29076.Gtixi5.rst +++ /dev/null @@ -1 +0,0 @@ -Add fish shell support to macOS installer. diff --git a/Misc/NEWS.d/next/Build/2020-12-13-14-43-10.bpo-42598.7ipr5H.rst b/Misc/NEWS.d/next/Build/2020-12-13-14-43-10.bpo-42598.7ipr5H.rst deleted file mode 100644 index 7dafc105c45ea..0000000000000 --- a/Misc/NEWS.d/next/Build/2020-12-13-14-43-10.bpo-42598.7ipr5H.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix implicit function declarations in configure which could have resulted in -incorrect configuration checks. Patch contributed by Joshua Root. diff --git a/Misc/NEWS.d/next/Build/2020-12-20-02-35-28.bpo-42604.gRd89w.rst b/Misc/NEWS.d/next/Build/2020-12-20-02-35-28.bpo-42604.gRd89w.rst deleted file mode 100644 index caaada41cf9ba..0000000000000 --- a/Misc/NEWS.d/next/Build/2020-12-20-02-35-28.bpo-42604.gRd89w.rst +++ /dev/null @@ -1,4 +0,0 @@ -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". diff --git a/Misc/NEWS.d/next/Build/2021-01-04-05-07-30.bpo-42692.OO11SN.rst b/Misc/NEWS.d/next/Build/2021-01-04-05-07-30.bpo-42692.OO11SN.rst deleted file mode 100644 index 91582b945b803..0000000000000 --- a/Misc/NEWS.d/next/Build/2021-01-04-05-07-30.bpo-42692.OO11SN.rst +++ /dev/null @@ -1 +0,0 @@ -Fix __builtin_available check on older compilers. Patch by Joshua Root. diff --git a/Misc/NEWS.d/next/Build/2021-02-10-14-11-53.bpo-43174.F9zwXQ.rst b/Misc/NEWS.d/next/Build/2021-02-10-14-11-53.bpo-43174.F9zwXQ.rst deleted file mode 100644 index 64c80188d02f6..0000000000000 --- a/Misc/NEWS.d/next/Build/2021-02-10-14-11-53.bpo-43174.F9zwXQ.rst +++ /dev/null @@ -1 +0,0 @@ -Windows build now uses ``/utf-8`` compiler option. diff --git a/Misc/NEWS.d/next/C API/2020-03-24-09-27-10.bpo-40052.27P2KG.rst b/Misc/NEWS.d/next/C API/2020-03-24-09-27-10.bpo-40052.27P2KG.rst deleted file mode 100644 index 538488e2fbacc..0000000000000 --- a/Misc/NEWS.d/next/C API/2020-03-24-09-27-10.bpo-40052.27P2KG.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix an alignment build warning/error in function ``PyVectorcall_Function()``. -Patch by Andreas Schneider, Antoine Pitrou and Petr Viktorin. diff --git a/Misc/NEWS.d/next/C API/2020-12-10-10-43-03.bpo-42591.CXNY8G.rst b/Misc/NEWS.d/next/C API/2020-12-10-10-43-03.bpo-42591.CXNY8G.rst deleted file mode 100644 index 3519859f7be89..0000000000000 --- a/Misc/NEWS.d/next/C API/2020-12-10-10-43-03.bpo-42591.CXNY8G.rst +++ /dev/null @@ -1,3 +0,0 @@ -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. diff --git a/Misc/NEWS.d/next/C API/2021-01-27-10-27-47.bpo-43030.loDcD_.rst b/Misc/NEWS.d/next/C API/2021-01-27-10-27-47.bpo-43030.loDcD_.rst deleted file mode 100644 index 7a432522db8a1..0000000000000 --- a/Misc/NEWS.d/next/C API/2021-01-27-10-27-47.bpo-43030.loDcD_.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed a compiler warning in :c:func:`Py_UNICODE_ISSPACE()` on platforms with -signed ``wchar_t``. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-11-20-00-57-47.bpo-42195.HeqcpS.rst b/Misc/NEWS.d/next/Core and Builtins/2020-11-20-00-57-47.bpo-42195.HeqcpS.rst deleted file mode 100644 index 636d4165a6389..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-11-20-00-57-47.bpo-42195.HeqcpS.rst +++ /dev/null @@ -1,11 +0,0 @@ -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. - diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-12-02-20-23-31.bpo-42536.Kx3ZOu.rst b/Misc/NEWS.d/next/Core and Builtins/2020-12-02-20-23-31.bpo-42536.Kx3ZOu.rst deleted file mode 100644 index 6ccacab1f64f6..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-12-02-20-23-31.bpo-42536.Kx3ZOu.rst +++ /dev/null @@ -1,26 +0,0 @@ -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. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-12-04-17-17-44.bpo-32381.NY5t2S.rst b/Misc/NEWS.d/next/Core and Builtins/2020-12-04-17-17-44.bpo-32381.NY5t2S.rst deleted file mode 100644 index f4d84f9d848d4..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-12-04-17-17-44.bpo-32381.NY5t2S.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix encoding name when running a ``.pyc`` file on Windows: -:c:func:`PyRun_SimpleFileExFlags()` now uses the correct encoding to decode -the filename. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-12-31-20-58-22.bpo-40631.deRMCx.rst b/Misc/NEWS.d/next/Core and Builtins/2020-12-31-20-58-22.bpo-40631.deRMCx.rst deleted file mode 100644 index ac2db2938237f..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-12-31-20-58-22.bpo-40631.deRMCx.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix regression where a single parenthesized starred expression was a valid -assignment target. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-03-00-20-38.bpo-42806.mLAobJ.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-03-00-20-38.bpo-42806.mLAobJ.rst deleted file mode 100644 index 10314fd650fa6..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-01-03-00-20-38.bpo-42806.mLAobJ.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix the column offsets for f-strings :mod:`ast` nodes surrounded by -parentheses and for nodes that spawn multiple lines. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-04-23-54-34.bpo-42819.4KO6wU.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-04-23-54-34.bpo-42819.4KO6wU.rst deleted file mode 100644 index d067f0bfa7644..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-01-04-23-54-34.bpo-42819.4KO6wU.rst +++ /dev/null @@ -1,8 +0,0 @@ -: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. diff --git a/Misc/NEWS.d/next/Documentation/2020-12-16-21-06-16.bpo-17140.1leSEg.rst b/Misc/NEWS.d/next/Documentation/2020-12-16-21-06-16.bpo-17140.1leSEg.rst deleted file mode 100644 index cb1fd23a56e63..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2020-12-16-21-06-16.bpo-17140.1leSEg.rst +++ /dev/null @@ -1 +0,0 @@ -Add documentation for the :class:`multiprocessing.pool.ThreadPool` class. diff --git a/Misc/NEWS.d/next/Documentation/2021-01-07-12-08-59.bpo-42811.ePF7EC.rst b/Misc/NEWS.d/next/Documentation/2021-01-07-12-08-59.bpo-42811.ePF7EC.rst deleted file mode 100644 index 179c0655c7068..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-01-07-12-08-59.bpo-42811.ePF7EC.rst +++ /dev/null @@ -1,2 +0,0 @@ -Updated importlib.utils.resolve_name() doc to use __spec__.parent instead of -__package__. (Thanks Yair Frid.) diff --git a/Misc/NEWS.d/next/Documentation/2021-01-20-23-03-49.bpo-40304.-LK7Ps.rst b/Misc/NEWS.d/next/Documentation/2021-01-20-23-03-49.bpo-40304.-LK7Ps.rst deleted file mode 100644 index 3f2f14c2d7b89..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-01-20-23-03-49.bpo-40304.-LK7Ps.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix doc for type(name, bases, dict). Patch by Boris Verkhovskiy and -?ric Araujo. diff --git a/Misc/NEWS.d/next/IDLE/2019-06-30-20-31-09.bpo-32631.e7_4BG.rst b/Misc/NEWS.d/next/IDLE/2019-06-30-20-31-09.bpo-32631.e7_4BG.rst deleted file mode 100644 index c422f43b6d6dd..0000000000000 --- a/Misc/NEWS.d/next/IDLE/2019-06-30-20-31-09.bpo-32631.e7_4BG.rst +++ /dev/null @@ -1,2 +0,0 @@ -Finish zzdummy example extension module: make menu entries work; -add docstrings and tests with 100% coverage. diff --git a/Misc/NEWS.d/next/IDLE/2019-11-14-23-41-07.bpo-23544.3etemb.rst b/Misc/NEWS.d/next/IDLE/2019-11-14-23-41-07.bpo-23544.3etemb.rst deleted file mode 100644 index eb4a56bf100b5..0000000000000 --- a/Misc/NEWS.d/next/IDLE/2019-11-14-23-41-07.bpo-23544.3etemb.rst +++ /dev/null @@ -1,2 +0,0 @@ -Disable Debug=>Stack Viewer when user code is running or Debugger -is active, to prevent hang or crash. Patch by Zackery Spytz. diff --git a/Misc/NEWS.d/next/IDLE/2021-01-10-01-25-43.bpo-33065.zmyHYJ.rst b/Misc/NEWS.d/next/IDLE/2021-01-10-01-25-43.bpo-33065.zmyHYJ.rst deleted file mode 100644 index 87948f3cd1baa..0000000000000 --- a/Misc/NEWS.d/next/IDLE/2021-01-10-01-25-43.bpo-33065.zmyHYJ.rst +++ /dev/null @@ -1 +0,0 @@ -Fix problem debugging user classes with __repr__ method. diff --git a/Misc/NEWS.d/next/IDLE/2021-01-26-18-12-17.bpo-43008.mbQUc7.rst b/Misc/NEWS.d/next/IDLE/2021-01-26-18-12-17.bpo-43008.mbQUc7.rst deleted file mode 100644 index 55ab67ca94959..0000000000000 --- a/Misc/NEWS.d/next/IDLE/2021-01-26-18-12-17.bpo-43008.mbQUc7.rst +++ /dev/null @@ -1,2 +0,0 @@ -Make IDLE invoke :func:`sys.excepthook` in normal, 2-process mode. -Patch by Ken Hilton. diff --git a/Misc/NEWS.d/next/Library/2018-04-23-13-44-10.bpo-33289.anBnUr.rst b/Misc/NEWS.d/next/Library/2018-04-23-13-44-10.bpo-33289.anBnUr.rst deleted file mode 100644 index 52d9ac9dd902c..0000000000000 --- a/Misc/NEWS.d/next/Library/2018-04-23-13-44-10.bpo-33289.anBnUr.rst +++ /dev/null @@ -1,2 +0,0 @@ -Correct call to :mod:`tkinter.colorchooser` to return RGB triplet of ints -instead of floats. Patch by Cheryl Sabella. diff --git a/Misc/NEWS.d/next/Library/2019-12-16-17-55-31.bpo-39068.Ti3f9P.rst b/Misc/NEWS.d/next/Library/2019-12-16-17-55-31.bpo-39068.Ti3f9P.rst deleted file mode 100644 index fe6503fdce6b6..0000000000000 --- a/Misc/NEWS.d/next/Library/2019-12-16-17-55-31.bpo-39068.Ti3f9P.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix initialization race condition in :func:`a85encode` and :func:`b85encode` -in :mod:`base64`. Patch by Brandon Stansbury. diff --git a/Misc/NEWS.d/next/Library/2020-03-29-21-32-00.bpo-40084.MCYwcv.rst b/Misc/NEWS.d/next/Library/2020-03-29-21-32-00.bpo-40084.MCYwcv.rst deleted file mode 100644 index 65ff4ce36e82e..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-03-29-21-32-00.bpo-40084.MCYwcv.rst +++ /dev/null @@ -1 +0,0 @@ -Fix ``Enum.__dir__``: dir(Enum.member) now includes attributes as well as methods. diff --git a/Misc/NEWS.d/next/Library/2020-07-13-19-43-11.bpo-40219.MUoJEP.rst b/Misc/NEWS.d/next/Library/2020-07-13-19-43-11.bpo-40219.MUoJEP.rst deleted file mode 100644 index aedc5c49b4087..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-07-13-19-43-11.bpo-40219.MUoJEP.rst +++ /dev/null @@ -1 +0,0 @@ -Lowered :class:`tkinter.ttk.LabeledScale` dummy widget to prevent hiding part of the content label. diff --git a/Misc/NEWS.d/next/Library/2020-08-21-15-24-14.bpo-41604.rTXleO.rst b/Misc/NEWS.d/next/Library/2020-08-21-15-24-14.bpo-41604.rTXleO.rst deleted file mode 100644 index 0f9794cbdb321..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-08-21-15-24-14.bpo-41604.rTXleO.rst +++ /dev/null @@ -1,2 +0,0 @@ -Don't decrement the reference count of the previous user_ptr when -set_panel_userptr fails. diff --git a/Misc/NEWS.d/next/Library/2020-09-30-13-35-29.bpo-41891.pNAeYI.rst b/Misc/NEWS.d/next/Library/2020-09-30-13-35-29.bpo-41891.pNAeYI.rst deleted file mode 100644 index 75c2512780315..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-09-30-13-35-29.bpo-41891.pNAeYI.rst +++ /dev/null @@ -1 +0,0 @@ -Ensure asyncio.wait_for waits for task completion diff --git a/Misc/NEWS.d/next/Library/2020-10-01-16-17-11.bpo-41889.qLkNh8.rst b/Misc/NEWS.d/next/Library/2020-10-01-16-17-11.bpo-41889.qLkNh8.rst deleted file mode 100644 index 768865ae62116..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-01-16-17-11.bpo-41889.qLkNh8.rst +++ /dev/null @@ -1 +0,0 @@ -Enum: fix regression involving inheriting a multiply-inherited enum diff --git a/Misc/NEWS.d/next/Library/2020-10-02-10-19-49.bpo-41907.wiIEsz.rst b/Misc/NEWS.d/next/Library/2020-10-02-10-19-49.bpo-41907.wiIEsz.rst deleted file mode 100644 index aa337b38046e6..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-02-10-19-49.bpo-41907.wiIEsz.rst +++ /dev/null @@ -1 +0,0 @@ -fix `format()` behavior for `IntFlag` diff --git a/Misc/NEWS.d/next/Library/2020-10-11-13-48-03.bpo-42005.Jq6Az-.rst b/Misc/NEWS.d/next/Library/2020-10-11-13-48-03.bpo-42005.Jq6Az-.rst deleted file mode 100644 index be4ed7f55ffde..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-11-13-48-03.bpo-42005.Jq6Az-.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix CLI of :mod:`cProfile` and :mod:`profile` to catch -:exc:`BrokenPipeError`. diff --git a/Misc/NEWS.d/next/Library/2020-10-11-21-43-03.bpo-39101.-I49Pm.rst b/Misc/NEWS.d/next/Library/2020-10-11-21-43-03.bpo-39101.-I49Pm.rst deleted file mode 100644 index a571e8343cde1..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-11-21-43-03.bpo-39101.-I49Pm.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed tests using IsolatedAsyncioTestCase from hanging on BaseExceptions. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-10-17-12-42-08.bpo-42059.ZGMZ3D.rst b/Misc/NEWS.d/next/Library/2020-10-17-12-42-08.bpo-42059.ZGMZ3D.rst deleted file mode 100644 index 3f18824fe6598..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-17-12-42-08.bpo-42059.ZGMZ3D.rst +++ /dev/null @@ -1 +0,0 @@ -: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. diff --git a/Misc/NEWS.d/next/Library/2020-10-20-08-28-26.bpo-39825.n6KnG0.rst b/Misc/NEWS.d/next/Library/2020-10-20-08-28-26.bpo-39825.n6KnG0.rst deleted file mode 100644 index c337731f43584..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-20-08-28-26.bpo-39825.n6KnG0.rst +++ /dev/null @@ -1,5 +0,0 @@ -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. diff --git a/Misc/NEWS.d/next/Library/2020-10-29-09-22-56.bpo-42163.O4VcCY.rst b/Misc/NEWS.d/next/Library/2020-10-29-09-22-56.bpo-42163.O4VcCY.rst deleted file mode 100644 index 0c357eb4ac1da..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-29-09-22-56.bpo-42163.O4VcCY.rst +++ /dev/null @@ -1 +0,0 @@ -Restore compatibility for ``uname_result`` around deepcopy and _replace. diff --git a/Misc/NEWS.d/next/Library/2020-11-14-13-46-27.bpo-42318.wYAcBD.rst b/Misc/NEWS.d/next/Library/2020-11-14-13-46-27.bpo-42318.wYAcBD.rst deleted file mode 100644 index e72daebb2f152..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-14-13-46-27.bpo-42318.wYAcBD.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed support of non-BMP characters in :mod:`tkinter` on macOS. diff --git a/Misc/NEWS.d/next/Library/2020-11-17-14-30-12.bpo-42383.ubl0Y_.rst b/Misc/NEWS.d/next/Library/2020-11-17-14-30-12.bpo-42383.ubl0Y_.rst deleted file mode 100644 index ccf2106f28a93..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-17-14-30-12.bpo-42383.ubl0Y_.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix pdb: previously pdb would fail to restart the debugging target if it was -specified using a relative path and the current directory changed. diff --git a/Misc/NEWS.d/next/Library/2020-11-17-14-32-39.bpo-42384.1ZnQSn.rst b/Misc/NEWS.d/next/Library/2020-11-17-14-32-39.bpo-42384.1ZnQSn.rst deleted file mode 100644 index ae990162fbab7..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-17-14-32-39.bpo-42384.1ZnQSn.rst +++ /dev/null @@ -1 +0,0 @@ -Make pdb populate sys.path[0] exactly the same as regular python execution. diff --git a/Misc/NEWS.d/next/Library/2020-11-19-04-13-53.bpo-42375.U8bp4s.rst b/Misc/NEWS.d/next/Library/2020-11-19-04-13-53.bpo-42375.U8bp4s.rst deleted file mode 100644 index 6d8c80c2f2c0a..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-19-04-13-53.bpo-42375.U8bp4s.rst +++ /dev/null @@ -1 +0,0 @@ -subprocess module update for DragonFlyBSD support. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-11-20-19-00-27.bpo-34463.aJcm56.rst b/Misc/NEWS.d/next/Library/2020-11-20-19-00-27.bpo-34463.aJcm56.rst deleted file mode 100644 index df183548236af..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-20-19-00-27.bpo-34463.aJcm56.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed discrepancy between :mod:`traceback` and the interpreter in formatting of SyntaxError with lineno not set (:mod:`traceback` was changed to match interpreter). diff --git a/Misc/NEWS.d/next/Library/2020-11-22-11-22-28.bpo-42388.LMgM6B.rst b/Misc/NEWS.d/next/Library/2020-11-22-11-22-28.bpo-42388.LMgM6B.rst deleted file mode 100644 index 1b19247e84148..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-11-22-11-22-28.bpo-42388.LMgM6B.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix subprocess.check_output(..., input=None) behavior when text=True to be -consistent with that of the documentation and universal_newlines=True. diff --git a/Misc/NEWS.d/next/Library/2020-12-02-07-37-59.bpo-42532.ObNep_.rst b/Misc/NEWS.d/next/Library/2020-12-02-07-37-59.bpo-42532.ObNep_.rst deleted file mode 100644 index 7465cb8e2e3d7..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-12-02-07-37-59.bpo-42532.ObNep_.rst +++ /dev/null @@ -1 +0,0 @@ -Remove unexpected call of ``__bool__`` when passing a ``spec_arg`` argument to a Mock. diff --git a/Misc/NEWS.d/next/Library/2020-12-08-22-43-35.bpo-42678.ba9ktU.rst b/Misc/NEWS.d/next/Library/2020-12-08-22-43-35.bpo-42678.ba9ktU.rst deleted file mode 100644 index 7c94cdf40dd4c..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-12-08-22-43-35.bpo-42678.ba9ktU.rst +++ /dev/null @@ -1 +0,0 @@ -`Enum`: call `__init_subclass__` after members have been added diff --git a/Misc/NEWS.d/next/Library/2020-12-09-10-59-16.bpo-42517.FKEVcZ.rst b/Misc/NEWS.d/next/Library/2020-12-09-10-59-16.bpo-42517.FKEVcZ.rst deleted file mode 100644 index e99294d9430d1..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-12-09-10-59-16.bpo-42517.FKEVcZ.rst +++ /dev/null @@ -1,2 +0,0 @@ -Enum: private names will raise a DeprecationWarning; in 3.10 they will -become normal attributes diff --git a/Misc/NEWS.d/next/Library/2020-12-14-08-23-57.bpo-36541.qdEtZv.rst b/Misc/NEWS.d/next/Library/2020-12-14-08-23-57.bpo-36541.qdEtZv.rst deleted file mode 100644 index 5678d8c595ca0..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-12-14-08-23-57.bpo-36541.qdEtZv.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed lib2to3.pgen2 to be able to parse PEP-570 positional only argument -syntax. diff --git a/Misc/NEWS.d/next/Library/2020-12-15-10-00-04.bpo-42644.XgLCNx.rst b/Misc/NEWS.d/next/Library/2020-12-15-10-00-04.bpo-42644.XgLCNx.rst deleted file mode 100644 index f58b58e4002ad..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-12-15-10-00-04.bpo-42644.XgLCNx.rst +++ /dev/null @@ -1,3 +0,0 @@ -`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. diff --git a/Misc/NEWS.d/next/Library/2020-12-15-17-51-27.bpo-42630.jf4jBl.rst b/Misc/NEWS.d/next/Library/2020-12-15-17-51-27.bpo-42630.jf4jBl.rst deleted file mode 100644 index 4b4a520931fda..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-12-15-17-51-27.bpo-42630.jf4jBl.rst +++ /dev/null @@ -1,4 +0,0 @@ -: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. diff --git a/Misc/NEWS.d/next/Library/2020-12-16-16-16-33.bpo-37961.jrESEq.rst b/Misc/NEWS.d/next/Library/2020-12-16-16-16-33.bpo-37961.jrESEq.rst deleted file mode 100644 index 5b363ad22d6e3..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-12-16-16-16-33.bpo-37961.jrESEq.rst +++ /dev/null @@ -1 +0,0 @@ -Fix crash in :func:`tracemalloc.Traceback.__repr__` (regressed in Python 3.9). \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-12-20-22-50-15.bpo-42681.lDO6jb.rst b/Misc/NEWS.d/next/Library/2020-12-20-22-50-15.bpo-42681.lDO6jb.rst deleted file mode 100644 index 34ea74a5a323d..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-12-20-22-50-15.bpo-42681.lDO6jb.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed range checks for color and pair numbers in :mod:`curses`. diff --git a/Misc/NEWS.d/next/Library/2020-12-23-19-43-06.bpo-42727.WH3ODh.rst b/Misc/NEWS.d/next/Library/2020-12-23-19-43-06.bpo-42727.WH3ODh.rst deleted file mode 100644 index c2ef8eecb85e1..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-12-23-19-43-06.bpo-42727.WH3ODh.rst +++ /dev/null @@ -1,2 +0,0 @@ -``EnumMeta.__prepare__`` now accepts ``**kwds`` to properly support -``__init_subclass__`` diff --git a/Misc/NEWS.d/next/Library/2020-12-25-12-32-47.bpo-42655.W5ytpV.rst b/Misc/NEWS.d/next/Library/2020-12-25-12-32-47.bpo-42655.W5ytpV.rst deleted file mode 100644 index 57c9a666e395a..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-12-25-12-32-47.bpo-42655.W5ytpV.rst +++ /dev/null @@ -1,2 +0,0 @@ -:mod:`subprocess` *extra_groups* is now correctly passed into setgroups() -system call. diff --git a/Misc/NEWS.d/next/Library/2020-12-27-18-47-01.bpo-23328._xqepZ.rst b/Misc/NEWS.d/next/Library/2020-12-27-18-47-01.bpo-23328._xqepZ.rst deleted file mode 100644 index 07b15d34e8d56..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-12-27-18-47-01.bpo-23328._xqepZ.rst +++ /dev/null @@ -1 +0,0 @@ -Allow / character in username, password fields on _PROXY envars. diff --git a/Misc/NEWS.d/next/Library/2020-12-27-21-22-01.bpo-42756.dHMPJ9.rst b/Misc/NEWS.d/next/Library/2020-12-27-21-22-01.bpo-42756.dHMPJ9.rst deleted file mode 100644 index 93a0bb010df2b..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-12-27-21-22-01.bpo-42756.dHMPJ9.rst +++ /dev/null @@ -1,2 +0,0 @@ -Configure LMTP Unix-domain socket to use socket global default timeout when -a timeout is not explicitly provided. diff --git a/Misc/NEWS.d/next/Library/2020-12-27-22-19-26.bpo-42759.lGi_03.rst b/Misc/NEWS.d/next/Library/2020-12-27-22-19-26.bpo-42759.lGi_03.rst deleted file mode 100644 index a5ec7d5820336..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-12-27-22-19-26.bpo-42759.lGi_03.rst +++ /dev/null @@ -1,3 +0,0 @@ -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. diff --git a/Misc/NEWS.d/next/Library/2021-01-05-21-26-29.bpo-41748.KdC0w3.rst b/Misc/NEWS.d/next/Library/2021-01-05-21-26-29.bpo-41748.KdC0w3.rst deleted file mode 100644 index 52efa3ac3d40e..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-05-21-26-29.bpo-41748.KdC0w3.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix HTMLParser parsing rules for element attributes containing -commas with spaces. Patch by Karl Dubost. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2021-01-07-11-44-22.bpo-42851.uyQFyd.rst b/Misc/NEWS.d/next/Library/2021-01-07-11-44-22.bpo-42851.uyQFyd.rst deleted file mode 100644 index 927283521e80e..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-07-11-44-22.bpo-42851.uyQFyd.rst +++ /dev/null @@ -1 +0,0 @@ -remove __init_subclass__ support for Enum members diff --git a/Misc/NEWS.d/next/Library/2021-01-08-15-49-20.bpo-42780.rtqi6B.rst b/Misc/NEWS.d/next/Library/2021-01-08-15-49-20.bpo-42780.rtqi6B.rst deleted file mode 100644 index a491690507129..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-08-15-49-20.bpo-42780.rtqi6B.rst +++ /dev/null @@ -1 +0,0 @@ -Fix os.set_inheritable() for O_PATH file descriptors on Linux. diff --git a/Misc/NEWS.d/next/Library/2021-01-15-00-23-50.bpo-42931.QD6U2B.rst b/Misc/NEWS.d/next/Library/2021-01-15-00-23-50.bpo-42931.QD6U2B.rst deleted file mode 100644 index 01f8094944f70..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-15-00-23-50.bpo-42931.QD6U2B.rst +++ /dev/null @@ -1 +0,0 @@ -Add :func:`randbytes` to ``random.__all__``. diff --git a/Misc/NEWS.d/next/Library/2021-01-18-10-41-44.bpo-42944.RrONvy.rst b/Misc/NEWS.d/next/Library/2021-01-18-10-41-44.bpo-42944.RrONvy.rst deleted file mode 100644 index b78d10aa25545..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-01-18-10-41-44.bpo-42944.RrONvy.rst +++ /dev/null @@ -1 +0,0 @@ -Fix ``random.Random.sample`` when ``counts`` argument is not ``None``. diff --git a/Misc/NEWS.d/next/Library/2021-02-02-20-23-31.bpo-43108.lqcCZ6.rst b/Misc/NEWS.d/next/Library/2021-02-02-20-23-31.bpo-43108.lqcCZ6.rst deleted file mode 100644 index 8e45640bceae1..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-02-02-20-23-31.bpo-43108.lqcCZ6.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed a reference leak in the :mod:`curses` module. Patch by Pablo Galindo diff --git a/Misc/NEWS.d/next/Library/2021-02-03-22-55-27.bpo-43102.TSlZ6J.rst b/Misc/NEWS.d/next/Library/2021-02-03-22-55-27.bpo-43102.TSlZ6J.rst deleted file mode 100644 index 985fd68a03a93..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-02-03-22-55-27.bpo-43102.TSlZ6J.rst +++ /dev/null @@ -1,2 +0,0 @@ -The namedtuple __new__ method had its __builtins__ set to None instead -of an actual dictionary. This created problems for introspection tools. 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 7df65a156feab..0000000000000 --- 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/2021-02-14-15-59-16.bpo-42967.YApqDS.rst b/Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst deleted file mode 100644 index f08489b41494e..0000000000000 --- a/Misc/NEWS.d/next/Security/2021-02-14-15-59-16.bpo-42967.YApqDS.rst +++ /dev/null @@ -1 +0,0 @@ -Fix web cache poisoning vulnerability by defaulting the query args separator to ``&``, and allowing the user to choose a custom separator. diff --git a/Misc/NEWS.d/next/Tests/2020-05-30-10-56-38.bpo-40810.LPqDLQ.rst b/Misc/NEWS.d/next/Tests/2020-05-30-10-56-38.bpo-40810.LPqDLQ.rst deleted file mode 100644 index eafd94cabede9..0000000000000 --- a/Misc/NEWS.d/next/Tests/2020-05-30-10-56-38.bpo-40810.LPqDLQ.rst +++ /dev/null @@ -1 +0,0 @@ -In :mod:`sqlite3`, fix ``CheckTraceCallbackContent`` for SQLite pre 3.7.15. diff --git a/Misc/NEWS.d/next/Tests/2021-01-01-08-52-36.bpo-42794.-7-XGz.rst b/Misc/NEWS.d/next/Tests/2021-01-01-08-52-36.bpo-42794.-7-XGz.rst deleted file mode 100644 index 577f2259e1f00..0000000000000 --- a/Misc/NEWS.d/next/Tests/2021-01-01-08-52-36.bpo-42794.-7-XGz.rst +++ /dev/null @@ -1,2 +0,0 @@ -Update test_nntplib to use offical group name of news.aioe.org for testing. -Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/Tools-Demos/2020-12-16-09-10-32.bpo-42613.J-jnm5.rst b/Misc/NEWS.d/next/Tools-Demos/2020-12-16-09-10-32.bpo-42613.J-jnm5.rst deleted file mode 100644 index 140ff8255b96b..0000000000000 --- a/Misc/NEWS.d/next/Tools-Demos/2020-12-16-09-10-32.bpo-42613.J-jnm5.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix ``freeze.py`` tool to use the prope config and library directories. -Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Tools-Demos/2020-12-23-19-42-11.bpo-42726.a5EkTv.rst b/Misc/NEWS.d/next/Tools-Demos/2020-12-23-19-42-11.bpo-42726.a5EkTv.rst deleted file mode 100644 index 01a6e7fe55f5b..0000000000000 --- a/Misc/NEWS.d/next/Tools-Demos/2020-12-23-19-42-11.bpo-42726.a5EkTv.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed Python 3 compatibility issue with gdb/libpython.py handling of attribute -dictionaries. diff --git a/Misc/NEWS.d/next/Windows/2020-12-07-11-40-52.bpo-42584.AsYnVX.rst b/Misc/NEWS.d/next/Windows/2020-12-07-11-40-52.bpo-42584.AsYnVX.rst deleted file mode 100644 index afb6530c8f66d..0000000000000 --- a/Misc/NEWS.d/next/Windows/2020-12-07-11-40-52.bpo-42584.AsYnVX.rst +++ /dev/null @@ -1 +0,0 @@ -Upgrade Windows installer to use SQLite 3.34.0. diff --git a/Misc/NEWS.d/next/Windows/2021-01-05-20-36-40.bpo-41837.bmS7vB.rst b/Misc/NEWS.d/next/Windows/2021-01-05-20-36-40.bpo-41837.bmS7vB.rst deleted file mode 100644 index 8d4bb34ff909c..0000000000000 --- a/Misc/NEWS.d/next/Windows/2021-01-05-20-36-40.bpo-41837.bmS7vB.rst +++ /dev/null @@ -1 +0,0 @@ -Updated Windows installer to include OpenSSL 1.1.1i diff --git a/Misc/NEWS.d/next/macOS/2020-12-07-11-37-35.bpo-42584.LygmqQ.rst b/Misc/NEWS.d/next/macOS/2020-12-07-11-37-35.bpo-42584.LygmqQ.rst deleted file mode 100644 index 2a625f98e9078..0000000000000 --- a/Misc/NEWS.d/next/macOS/2020-12-07-11-37-35.bpo-42584.LygmqQ.rst +++ /dev/null @@ -1 +0,0 @@ -Update macOS installer to use SQLite 3.34.0. diff --git a/Misc/NEWS.d/next/macOS/2021-01-04-00-48-08.bpo-41837.dX-unJ.rst b/Misc/NEWS.d/next/macOS/2021-01-04-00-48-08.bpo-41837.dX-unJ.rst deleted file mode 100644 index 3f9415f4a3606..0000000000000 --- a/Misc/NEWS.d/next/macOS/2021-01-04-00-48-08.bpo-41837.dX-unJ.rst +++ /dev/null @@ -1 +0,0 @@ -Update macOS installer build to use OpenSSL 1.1.1i. diff --git a/Misc/NEWS.d/next/macOS/2021-01-04-01-17-17.bpo-42361.eolZAi.rst b/Misc/NEWS.d/next/macOS/2021-01-04-01-17-17.bpo-42361.eolZAi.rst deleted file mode 100644 index 39526b32935b8..0000000000000 --- a/Misc/NEWS.d/next/macOS/2021-01-04-01-17-17.bpo-42361.eolZAi.rst +++ /dev/null @@ -1,2 +0,0 @@ -Update macOS installer build to use Tcl/Tk 8.6.11 (rc2, expected to be final -release). diff --git a/Misc/NEWS.d/next/macOS/2021-01-26-14-36-11.bpo-42504.ZxWt71.rst b/Misc/NEWS.d/next/macOS/2021-01-26-14-36-11.bpo-42504.ZxWt71.rst deleted file mode 100644 index a47776effe905..0000000000000 --- a/Misc/NEWS.d/next/macOS/2021-01-26-14-36-11.bpo-42504.ZxWt71.rst +++ /dev/null @@ -1,3 +0,0 @@ -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. diff --git a/README.rst b/README.rst index bb43311ad2f95..a2d2b83180687 100644 --- a/README.rst +++ b/README.rst @@ -1,5 +1,5 @@ -This is Python version 3.9.1 -============================ +This is Python version 3.9.2rc1 +=============================== .. image:: https://travis-ci.org/python/cpython.svg?branch=3.9 :alt: CPython build status on Travis CI From webhook-mailer at python.org Tue Feb 16 19:47:10 2021 From: webhook-mailer at python.org (Mariatta) Date: Wed, 17 Feb 2021 00:47:10 -0000 Subject: [Python-checkins] Update urllib2.rst (GH-24236) Message-ID: https://github.com/python/cpython/commit/6a4177516b4473bd0b5ed041d29db2af3d996b9d commit: 6a4177516b4473bd0b5ed041d29db2af3d996b9d branch: master author: Christian Reich committer: Mariatta date: 2021-02-16T16:47:02-08:00 summary: Update urllib2.rst (GH-24236) fixed a minor glitch in the order of two words. files: From webhook-mailer at python.org Wed Feb 17 05:15:15 2021 From: webhook-mailer at python.org (vstinner) Date: Wed, 17 Feb 2021 10:15:15 -0000 Subject: [Python-checkins] bpo-43103: Add configure --without-static-libpython (GH-24418) Message-ID: https://github.com/python/cpython/commit/801bb0b5035f8eeafe389dc082c02dfafaa07f6a commit: 801bb0b5035f8eeafe389dc082c02dfafaa07f6a branch: master author: Victor Stinner committer: vstinner date: 2021-02-17T11:14:42+01:00 summary: bpo-43103: Add configure --without-static-libpython (GH-24418) Add a new configure --without-static-libpython option to not build the libpythonMAJOR.MINOR.a static library and not install the python.o object file. Fix smelly.py and stable_abi.py tools when libpython3.10.a is missing. files: A Misc/NEWS.d/next/Build/2021-02-02-16-26-44.bpo-43103.VWeyP_.rst M Doc/whatsnew/3.10.rst M Makefile.pre.in M Tools/scripts/smelly.py M Tools/scripts/stable_abi.py M configure M configure.ac diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index c282edcc9d8f0..0fba27c7d5845 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -820,6 +820,12 @@ Build Changes (Contributed by Victor Stinner in :issue:`42856`.) +* Add a new configure ``--without-static-libpython`` option to not build the + ``libpythonMAJOR.MINOR.a`` static library and not install the ``python.o`` + object file. + + (Contributed by Victor Stinner in :issue:`43103`.) + C API Changes ============= diff --git a/Makefile.pre.in b/Makefile.pre.in index 0d9fdc713406c..d3ac2dab893f0 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -236,6 +236,9 @@ PY3LIBRARY= @PY3LIBRARY@ DLLLIBRARY= @DLLLIBRARY@ LDLIBRARYDIR= @LDLIBRARYDIR@ INSTSONAME= @INSTSONAME@ +LIBRARY_DEPS= @LIBRARY_DEPS@ +PY_ENABLE_SHARED= @PY_ENABLE_SHARED@ +STATIC_LIBPYTHON= @STATIC_LIBPYTHON@ LIBS= @LIBS@ @@ -578,7 +581,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) $(EXPORTSYMS) +$(BUILDPYTHON): Programs/python.o $(LIBRARY_DEPS) $(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) platform: $(BUILDPYTHON) pybuilddir.txt @@ -713,7 +716,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) $(EXPORTSYMS) +Programs/_testembed: Programs/_testembed.o $(LIBRARY_DEPS) $(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/_testembed.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) ############################################################################ @@ -1305,19 +1308,21 @@ altbininstall: $(BUILDPYTHON) @FRAMEWORKPYTHONW@ fi; \ (cd $(DESTDIR)$(BINDIR); $(LN) python$(LDVERSION)$(EXE) python$(VERSION)$(EXE)); \ fi - if test -f $(LDLIBRARY) && test "$(PYTHONFRAMEWORKDIR)" = "no-framework" ; then \ - if test -n "$(DLLLIBRARY)" ; then \ - $(INSTALL_SHARED) $(DLLLIBRARY) $(DESTDIR)$(BINDIR); \ - else \ - $(INSTALL_SHARED) $(LDLIBRARY) $(DESTDIR)$(LIBDIR)/$(INSTSONAME); \ - if test $(LDLIBRARY) != $(INSTSONAME); then \ - (cd $(DESTDIR)$(LIBDIR); $(LN) -sf $(INSTSONAME) $(LDLIBRARY)) \ - fi \ - fi; \ - if test -n "$(PY3LIBRARY)"; then \ - $(INSTALL_SHARED) $(PY3LIBRARY) $(DESTDIR)$(LIBDIR)/$(PY3LIBRARY); \ + @if test "$(PY_ENABLE_SHARED)" = 1 -o "$(STATIC_LIBPYTHON)" = 1; then \ + if test -f $(LDLIBRARY) && test "$(PYTHONFRAMEWORKDIR)" = "no-framework" ; then \ + if test -n "$(DLLLIBRARY)" ; then \ + $(INSTALL_SHARED) $(DLLLIBRARY) $(DESTDIR)$(BINDIR); \ + else \ + $(INSTALL_SHARED) $(LDLIBRARY) $(DESTDIR)$(LIBDIR)/$(INSTSONAME); \ + if test $(LDLIBRARY) != $(INSTSONAME); then \ + (cd $(DESTDIR)$(LIBDIR); $(LN) -sf $(INSTSONAME) $(LDLIBRARY)) \ + fi \ + fi; \ + if test -n "$(PY3LIBRARY)"; then \ + $(INSTALL_SHARED) $(PY3LIBRARY) $(DESTDIR)$(LIBDIR)/$(PY3LIBRARY); \ + fi; \ + else true; \ fi; \ - else true; \ fi if test "x$(LIPO_32BIT_FLAGS)" != "x" ; then \ rm -f $(DESTDIR)$(BINDIR)python$(VERSION)-32$(EXE); \ @@ -1661,19 +1666,21 @@ libainstall: @DEF_MAKE_RULE@ python-config else true; \ fi; \ done - @if test -d $(LIBRARY); then :; else \ - if test "$(PYTHONFRAMEWORKDIR)" = no-framework; then \ - if test "$(SHLIB_SUFFIX)" = .dll; then \ - $(INSTALL_DATA) $(LDLIBRARY) $(DESTDIR)$(LIBPL) ; \ + @if test "$(STATIC_LIBPYTHON)" = 1; then \ + if test -d $(LIBRARY); then :; else \ + if test "$(PYTHONFRAMEWORKDIR)" = no-framework; then \ + if test "$(SHLIB_SUFFIX)" = .dll; then \ + $(INSTALL_DATA) $(LDLIBRARY) $(DESTDIR)$(LIBPL) ; \ + else \ + $(INSTALL_DATA) $(LIBRARY) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \ + fi; \ else \ - $(INSTALL_DATA) $(LIBRARY) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \ + echo Skip install of $(LIBRARY) - use make frameworkinstall; \ fi; \ - else \ - echo Skip install of $(LIBRARY) - use make frameworkinstall; \ fi; \ + $(INSTALL_DATA) Programs/python.o $(DESTDIR)$(LIBPL)/python.o; \ fi $(INSTALL_DATA) Modules/config.c $(DESTDIR)$(LIBPL)/config.c - $(INSTALL_DATA) Programs/python.o $(DESTDIR)$(LIBPL)/python.o $(INSTALL_DATA) $(srcdir)/Modules/config.c.in $(DESTDIR)$(LIBPL)/config.c.in $(INSTALL_DATA) Makefile $(DESTDIR)$(LIBPL)/Makefile $(INSTALL_DATA) $(srcdir)/Modules/Setup $(DESTDIR)$(LIBPL)/Setup diff --git a/Misc/NEWS.d/next/Build/2021-02-02-16-26-44.bpo-43103.VWeyP_.rst b/Misc/NEWS.d/next/Build/2021-02-02-16-26-44.bpo-43103.VWeyP_.rst new file mode 100644 index 0000000000000..edf04c126897a --- /dev/null +++ b/Misc/NEWS.d/next/Build/2021-02-02-16-26-44.bpo-43103.VWeyP_.rst @@ -0,0 +1,3 @@ +Add a new configure ``--without-static-libpython`` option to not build the +``libpythonMAJOR.MINOR.a`` static library and not install the ``python.o`` +object file. diff --git a/Tools/scripts/smelly.py b/Tools/scripts/smelly.py index e8a375c808cda..fb01660dea33a 100755 --- a/Tools/scripts/smelly.py +++ b/Tools/scripts/smelly.py @@ -136,11 +136,14 @@ def check_extensions(): def main(): + nsymbol = 0 + # static library LIBRARY = sysconfig.get_config_var('LIBRARY') if not LIBRARY: raise Exception("failed to get LIBRARY variable from sysconfig") - nsymbol = check_library(LIBRARY) + if os.path.exists(LIBRARY): + nsymbol += check_library(LIBRARY) # dynamic library LDLIBRARY = sysconfig.get_config_var('LDLIBRARY') diff --git a/Tools/scripts/stable_abi.py b/Tools/scripts/stable_abi.py index 47547a97bfd31..117dfeb3cb57a 100755 --- a/Tools/scripts/stable_abi.py +++ b/Tools/scripts/stable_abi.py @@ -2,8 +2,9 @@ import argparse import glob -import re +import os.path import pathlib +import re import subprocess import sys import sysconfig @@ -213,7 +214,8 @@ def check_symbols(parser_args): LIBRARY = sysconfig.get_config_var("LIBRARY") if not LIBRARY: raise Exception("failed to get LIBRARY variable from sysconfig") - check_library(parser_args.stable_abi_file, LIBRARY, abi_funcs) + if os.path.exists(LIBRARY): + check_library(parser_args.stable_abi_file, LIBRARY, abi_funcs) # dynamic library LDLIBRARY = sysconfig.get_config_var("LDLIBRARY") diff --git a/configure b/configure index 8e0cc71a50480..8c948250e41e4 100755 --- a/configure +++ b/configure @@ -624,6 +624,8 @@ ac_includes_default="\ ac_subst_vars='LTLIBOBJS TEST_MODULES +LIBRARY_DEPS +STATIC_LIBPYTHON OPENSSL_LDFLAGS OPENSSL_LIBS OPENSSL_INCLUDES @@ -856,6 +858,7 @@ with_openssl with_ssl_default_suites with_builtin_hashlib_hashes with_experimental_isolated_subinterpreters +with_static_libpython enable_test_modules ' ac_precious_vars='build_alias @@ -1602,6 +1605,9 @@ Optional Packages: --with-experimental-isolated-subinterpreters better isolate subinterpreters, experimental build mode (default is no) + --without-static-libpython + do not build libpythonMAJOR.MINOR.a and do not + install python.o (default is yes) Some influential environment variables: MACHDEP name for machine-dependent library files @@ -17776,6 +17782,40 @@ $as_echo "no" >&6; } fi +# --with-static-libpython +STATIC_LIBPYTHON=1 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-static-libpython" >&5 +$as_echo_n "checking for --with-static-libpython... " >&6; } + +# Check whether --with-static-libpython was given. +if test "${with_static_libpython+set}" = set; then : + withval=$with_static_libpython; +if test "$withval" = no +then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; }; + STATIC_LIBPYTHON=0 +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; }; +fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi + +LIBRARY_DEPS='$(PY3LIBRARY) $(EXPORTSYMS)' +if test "$PY_ENABLE_SHARED" = 1; then + LIBRARY_DEPS="\$(LDLIBRARY) $LIBRARY_DEPS" + if test "$STATIC_LIBPYTHON" = 1; then + LIBRARY_DEPS="\$(LIBRARY) $LIBRARY_DEPS" + fi +else + LIBRARY_DEPS="\$(LIBRARY) $LIBRARY_DEPS" +fi + + + # Check whether to disable test modules. Once set, setup.py will not build # test extension modules and "make install" will not install test suites. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --disable-test-modules" >&5 diff --git a/configure.ac b/configure.ac index 60c5d8e0b5b03..29957935e9b2a 100644 --- a/configure.ac +++ b/configure.ac @@ -5882,6 +5882,33 @@ else fi], [AC_MSG_RESULT(no)]) +# --with-static-libpython +STATIC_LIBPYTHON=1 +AC_MSG_CHECKING(for --with-static-libpython) +AC_ARG_WITH(static-libpython, + AS_HELP_STRING([--without-static-libpython], + [do not build libpythonMAJOR.MINOR.a and do not install python.o (default is yes)]), +[ +if test "$withval" = no +then + AC_MSG_RESULT(no); + STATIC_LIBPYTHON=0 +else + AC_MSG_RESULT(yes); +fi], +[AC_MSG_RESULT(yes)]) +LIBRARY_DEPS='$(PY3LIBRARY) $(EXPORTSYMS)' +if test "$PY_ENABLE_SHARED" = 1; then + LIBRARY_DEPS="\$(LDLIBRARY) $LIBRARY_DEPS" + if test "$STATIC_LIBPYTHON" = 1; then + LIBRARY_DEPS="\$(LIBRARY) $LIBRARY_DEPS" + fi +else + LIBRARY_DEPS="\$(LIBRARY) $LIBRARY_DEPS" +fi +AC_SUBST(STATIC_LIBPYTHON) +AC_SUBST(LIBRARY_DEPS) + # Check whether to disable test modules. Once set, setup.py will not build # test extension modules and "make install" will not install test suites. AC_MSG_CHECKING(for --disable-test-modules) From webhook-mailer at python.org Wed Feb 17 05:51:34 2021 From: webhook-mailer at python.org (vstinner) Date: Wed, 17 Feb 2021 10:51:34 -0000 Subject: [Python-checkins] bpo-40170: Always define PyExceptionClass_Name() as a function (GH-24553) Message-ID: https://github.com/python/cpython/commit/cd80f430daa7dfe7feeb431ed34f88db5f64aa30 commit: cd80f430daa7dfe7feeb431ed34f88db5f64aa30 branch: master author: Erlend Egeberg Aasland committer: vstinner date: 2021-02-17T11:51:08+01:00 summary: bpo-40170: Always define PyExceptionClass_Name() as a function (GH-24553) Remove macro variant of PyExceptionClass_Name(). files: A Misc/NEWS.d/next/C API/2021-02-16-22-29-39.bpo-40170.ahHmOo.rst M Include/cpython/pyerrors.h M Objects/exceptions.c diff --git a/Include/cpython/pyerrors.h b/Include/cpython/pyerrors.h index c2500d927bf7f..6711e8be68ffe 100644 --- a/Include/cpython/pyerrors.h +++ b/Include/cpython/pyerrors.h @@ -78,10 +78,6 @@ PyAPI_FUNC(void) _PyErr_GetExcInfo(PyThreadState *, PyObject **, PyObject **, Py PyAPI_FUNC(void) _PyErr_ChainExceptions(PyObject *, PyObject *, PyObject *); -/* */ - -#define PyExceptionClass_Name(x) (((PyTypeObject*)(x))->tp_name) - /* Convenience functions */ #ifdef MS_WINDOWS diff --git a/Misc/NEWS.d/next/C API/2021-02-16-22-29-39.bpo-40170.ahHmOo.rst b/Misc/NEWS.d/next/C API/2021-02-16-22-29-39.bpo-40170.ahHmOo.rst new file mode 100644 index 0000000000000..348fcce98e631 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2021-02-16-22-29-39.bpo-40170.ahHmOo.rst @@ -0,0 +1,3 @@ +:c:func:`PyExceptionClass_Name` is now always declared as a function, in +order to hide implementation details. The macro accessed +:c:member:`PyTypeObject.tp_name` directly. Patch by Erlend E. Aasland. diff --git a/Objects/exceptions.c b/Objects/exceptions.c index d4824938a0f50..62cec9a90f580 100644 --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -364,8 +364,6 @@ PyException_SetContext(PyObject *self, PyObject *context) Py_XSETREF(_PyBaseExceptionObject_cast(self)->context, context); } -#undef PyExceptionClass_Name - const char * PyExceptionClass_Name(PyObject *ob) { From webhook-mailer at python.org Wed Feb 17 05:53:48 2021 From: webhook-mailer at python.org (vstinner) Date: Wed, 17 Feb 2021 10:53:48 -0000 Subject: [Python-checkins] bpo-43155: Add PyCMethod_New to PC/python3.def (GH-24500) (GH-24554) Message-ID: https://github.com/python/cpython/commit/ebe20d9e7eb138c053958bc0a3058d34c6e1a679 commit: ebe20d9e7eb138c053958bc0a3058d34c6e1a679 branch: 3.9 author: Zackery Spytz committer: vstinner date: 2021-02-17T11:53:45+01:00 summary: bpo-43155: Add PyCMethod_New to PC/python3.def (GH-24500) (GH-24554) (cherry picked from commit 8a8b5df93f379f561aab4f2fc5b2ad54f5009f7a) files: A Misc/NEWS.d/next/Windows/2021-02-10-04-16-51.bpo-43155.O1tURk.rst M PC/python3.def diff --git a/Misc/NEWS.d/next/Windows/2021-02-10-04-16-51.bpo-43155.O1tURk.rst b/Misc/NEWS.d/next/Windows/2021-02-10-04-16-51.bpo-43155.O1tURk.rst new file mode 100644 index 0000000000000..2eeef2b0ea27a --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2021-02-10-04-16-51.bpo-43155.O1tURk.rst @@ -0,0 +1 @@ +:c:func:`PyCMethod_New` is now present in ``python3.lib``. diff --git a/PC/python3.def b/PC/python3.def index fce01249758e2..d27d7d07128a4 100644 --- a/PC/python3.def +++ b/PC/python3.def @@ -40,6 +40,7 @@ EXPORTS 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 From webhook-mailer at python.org Wed Feb 17 13:15:49 2021 From: webhook-mailer at python.org (vstinner) Date: Wed, 17 Feb 2021 18:15:49 -0000 Subject: [Python-checkins] bpo-40170: Move 3 NEWS entries to the C API section (GH-24555) Message-ID: https://github.com/python/cpython/commit/630264a152115f9671d6b793455ef5c2cea09a97 commit: 630264a152115f9671d6b793455ef5c2cea09a97 branch: master author: Erlend Egeberg Aasland committer: vstinner date: 2021-02-17T19:15:39+01:00 summary: bpo-40170: Move 3 NEWS entries to the C API section (GH-24555) files: A Misc/NEWS.d/next/C API/2021-02-11-11-37-14.bpo-43181.ydv33S.rst A Misc/NEWS.d/next/C API/2021-02-15-13-41-14.bpo-40170.r2FAtl.rst A Misc/NEWS.d/next/C API/2021-02-15-15-06-43.bpo-40170.ZYeSii.rst D Misc/NEWS.d/next/Core and Builtins/2021-02-11-11-37-14.bpo-43181.ydv33S.rst D Misc/NEWS.d/next/Core and Builtins/2021-02-15-13-41-14.bpo-40170.r2FAtl.rst D Misc/NEWS.d/next/Core and Builtins/2021-02-15-15-06-43.bpo-40170.ZYeSii.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-02-11-11-37-14.bpo-43181.ydv33S.rst b/Misc/NEWS.d/next/C API/2021-02-11-11-37-14.bpo-43181.ydv33S.rst similarity index 100% rename from Misc/NEWS.d/next/Core and Builtins/2021-02-11-11-37-14.bpo-43181.ydv33S.rst rename to Misc/NEWS.d/next/C API/2021-02-11-11-37-14.bpo-43181.ydv33S.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-02-15-13-41-14.bpo-40170.r2FAtl.rst b/Misc/NEWS.d/next/C API/2021-02-15-13-41-14.bpo-40170.r2FAtl.rst similarity index 100% rename from Misc/NEWS.d/next/Core and Builtins/2021-02-15-13-41-14.bpo-40170.r2FAtl.rst rename to Misc/NEWS.d/next/C API/2021-02-15-13-41-14.bpo-40170.r2FAtl.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-02-15-15-06-43.bpo-40170.ZYeSii.rst b/Misc/NEWS.d/next/C API/2021-02-15-15-06-43.bpo-40170.ZYeSii.rst similarity index 100% rename from Misc/NEWS.d/next/Core and Builtins/2021-02-15-15-06-43.bpo-40170.ZYeSii.rst rename to Misc/NEWS.d/next/C API/2021-02-15-15-06-43.bpo-40170.ZYeSii.rst From webhook-mailer at python.org Wed Feb 17 13:30:58 2021 From: webhook-mailer at python.org (vstinner) Date: Wed, 17 Feb 2021 18:30:58 -0000 Subject: [Python-checkins] bpo-35134: Move Include/{pyarena.h, pyctype.h} to Include/cpython/ (GH-24550) Message-ID: https://github.com/python/cpython/commit/366dc3a1354078e38808b9c16276e97cca5b8aaf commit: 366dc3a1354078e38808b9c16276e97cca5b8aaf branch: master author: Nicholas Sim committer: vstinner date: 2021-02-17T19:30:31+01:00 summary: bpo-35134: Move Include/{pyarena.h,pyctype.h} to Include/cpython/ (GH-24550) Move non-limited C API headers pyarena.h and pyctype.h into Include/cpython/ directory. files: A Include/cpython/pyarena.h A Include/cpython/pyctype.h A Misc/NEWS.d/next/C API/2021-02-17-18-51-26.bpo-35134.YoQdk8.rst D Include/pyarena.h D Include/pyctype.h M Include/Python.h M Makefile.pre.in M PCbuild/pythoncore.vcxproj M PCbuild/pythoncore.vcxproj.filters M Parser/pegen.h M Tools/scripts/stable_abi.py diff --git a/Include/Python.h b/Include/Python.h index 76ead9e5765ec..c71a71f875e3e 100644 --- a/Include/Python.h +++ b/Include/Python.h @@ -137,7 +137,7 @@ #include "pystate.h" #include "context.h" -#include "pyarena.h" +#include "cpython/pyarena.h" #include "modsupport.h" #include "compile.h" #include "pythonrun.h" @@ -154,7 +154,7 @@ #include "eval.h" -#include "pyctype.h" +#include "cpython/pyctype.h" #include "pystrtod.h" #include "pystrcmp.h" #include "fileutils.h" diff --git a/Include/pyarena.h b/Include/cpython/pyarena.h similarity index 100% rename from Include/pyarena.h rename to Include/cpython/pyarena.h diff --git a/Include/pyctype.h b/Include/cpython/pyctype.h similarity index 100% rename from Include/pyctype.h rename to Include/cpython/pyctype.h diff --git a/Makefile.pre.in b/Makefile.pre.in index d3ac2dab893f0..593da93a6bc2a 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1057,9 +1057,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/osmodule.h \ $(srcdir)/Include/patchlevel.h \ $(srcdir)/Include/picklebufobject.h \ - $(srcdir)/Include/pyarena.h \ $(srcdir)/Include/pycapsule.h \ - $(srcdir)/Include/pyctype.h \ $(srcdir)/Include/pydebug.h \ $(srcdir)/Include/pydtrace.h \ $(srcdir)/Include/pyerrors.h \ @@ -1113,6 +1111,8 @@ PYTHON_HEADERS= \ $(srcdir)/Include/cpython/methodobject.h \ $(srcdir)/Include/cpython/object.h \ $(srcdir)/Include/cpython/objimpl.h \ + $(srcdir)/Include/cpython/pyarena.h \ + $(srcdir)/Include/cpython/pyctype.h \ $(srcdir)/Include/cpython/pyerrors.h \ $(srcdir)/Include/cpython/pylifecycle.h \ $(srcdir)/Include/cpython/pymem.h \ diff --git a/Misc/NEWS.d/next/C API/2021-02-17-18-51-26.bpo-35134.YoQdk8.rst b/Misc/NEWS.d/next/C API/2021-02-17-18-51-26.bpo-35134.YoQdk8.rst new file mode 100644 index 0000000000000..c3534fce68f83 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2021-02-17-18-51-26.bpo-35134.YoQdk8.rst @@ -0,0 +1,3 @@ +Move pyarena.h, pyctype.h, and pytime.h into the cpython/ directory. They +must not be included directly, as they are already included by Python.h: +:ref:`Include Files `. diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 711a68fcc5c7a..89b6218a2739a 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -142,6 +142,8 @@ + + @@ -226,9 +228,7 @@ - - diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index ab826427acc68..bd8fd3433bce0 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -177,15 +177,9 @@ Include - - Include - Include - - Include - Include @@ -438,6 +432,12 @@ Include\cpython + + Include + + + Include + Include\cpython diff --git a/Parser/pegen.h b/Parser/pegen.h index 2a165c12d252c..3765b2425fff7 100644 --- a/Parser/pegen.h +++ b/Parser/pegen.h @@ -5,7 +5,6 @@ #include #include #include -#include #if 0 #define PyPARSE_YIELD_IS_KEYWORD 0x0001 diff --git a/Tools/scripts/stable_abi.py b/Tools/scripts/stable_abi.py index 117dfeb3cb57a..44f426e096adc 100755 --- a/Tools/scripts/stable_abi.py +++ b/Tools/scripts/stable_abi.py @@ -22,9 +22,7 @@ "genobject.h", "longintrepr.h", "parsetok.h", - "pyarena.h", "pyatomic.h", - "pyctype.h", "pydebug.h", "pytime.h", "symtable.h", From webhook-mailer at python.org Thu Feb 18 06:36:11 2021 From: webhook-mailer at python.org (vstinner) Date: Thu, 18 Feb 2021 11:36:11 -0000 Subject: [Python-checkins] bpo-42990: Add __builtins__ attribute to functions (GH-24559) Message-ID: https://github.com/python/cpython/commit/a3c3ffa68e6fc4524b1149a6a14d56c3a2e9b612 commit: a3c3ffa68e6fc4524b1149a6a14d56c3a2e9b612 branch: master author: Victor Stinner committer: vstinner date: 2021-02-18T12:35:37+01:00 summary: bpo-42990: Add __builtins__ attribute to functions (GH-24559) Expose the new PyFunctionObject.func_builtins member in Python as a new __builtins__ attribute on functions. Document also the behavior change in What's New in Python 3.10. files: A Misc/NEWS.d/next/Core and Builtins/2021-02-17-19-02-21.bpo-42990.SKXHiI.rst M Doc/library/inspect.rst M Doc/whatsnew/3.10.rst M Lib/test/test_collections.py M Lib/test/test_funcattrs.py M Objects/funcobject.c diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst index 850d6018bab1f..10339641c3b43 100644 --- a/Doc/library/inspect.rst +++ b/Doc/library/inspect.rst @@ -95,6 +95,8 @@ attributes: | | __globals__ | global namespace in which | | | | this function was defined | +-----------+-------------------+---------------------------+ +| | __builtins__ | builtins namespace | ++-----------+-------------------+---------------------------+ | | __annotations__ | mapping of parameters | | | | names to annotations; | | | | ``"return"`` key is | @@ -251,6 +253,10 @@ attributes: Add ``cr_origin`` attribute to coroutines. +.. versionchanged:: 3.10 + + Add ``__builtins__`` attribute to functions. + .. function:: getmembers(object[, predicate]) Return all the members of an object in a list of ``(name, value)`` diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 0fba27c7d5845..b903b3e0b81d9 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -280,6 +280,11 @@ Other Language Changes * Assignment expressions can now be used unparenthesized within set literals and set comprehensions, as well as in sequence indexes (but not slices). +* Functions have a new ``__builtins__`` attribute which is used to look for + builtin symbols when a function is executed, instead of looking into + ``__globals__['__builtins__']``. + (Contributed by Mark Shannon in :issue:`42990`.) + New Modules =========== diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py index befb7ab436c40..54a4cbed44e37 100644 --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -682,9 +682,10 @@ class NewPoint(tuple): self.assertEqual(np.y, 2) def test_new_builtins_issue_43102(self): - self.assertEqual( - namedtuple('C', ()).__new__.__globals__['__builtins__'], - {}) + obj = namedtuple('C', ()) + new_func = obj.__new__ + self.assertEqual(new_func.__globals__['__builtins__'], {}) + self.assertEqual(new_func.__builtins__, {}) ################################################################################ diff --git a/Lib/test/test_funcattrs.py b/Lib/test/test_funcattrs.py index 11d68cc75e208..15cf250f192a9 100644 --- a/Lib/test/test_funcattrs.py +++ b/Lib/test/test_funcattrs.py @@ -73,6 +73,11 @@ def test___globals__(self): self.cannot_set_attr(self.b, '__globals__', 2, (AttributeError, TypeError)) + def test___builtins__(self): + self.assertIs(self.b.__builtins__, __builtins__) + self.cannot_set_attr(self.b, '__builtins__', 2, + (AttributeError, TypeError)) + def test___closure__(self): a = 12 def f(): print(a) diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-02-17-19-02-21.bpo-42990.SKXHiI.rst b/Misc/NEWS.d/next/Core and Builtins/2021-02-17-19-02-21.bpo-42990.SKXHiI.rst new file mode 100644 index 0000000000000..cc17154762a91 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-02-17-19-02-21.bpo-42990.SKXHiI.rst @@ -0,0 +1,3 @@ +Functions have a new ``__builtins__`` attribute which is used to look for +builtin symbols when a function is executed, instead of looking into +``__globals__['__builtins__']``. Patch by Mark Shannon and Victor Stinner. diff --git a/Objects/funcobject.c b/Objects/funcobject.c index b331c4c4d6e35..523930da8dc62 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -250,6 +250,7 @@ static PyMemberDef func_memberlist[] = { {"__doc__", T_OBJECT, OFF(func_doc), 0}, {"__globals__", T_OBJECT, OFF(func_globals), READONLY}, {"__module__", T_OBJECT, OFF(func_module), 0}, + {"__builtins__", T_OBJECT, OFF(func_builtins), READONLY}, {NULL} /* Sentinel */ }; From webhook-mailer at python.org Thu Feb 18 10:26:29 2021 From: webhook-mailer at python.org (vstinner) Date: Thu, 18 Feb 2021 15:26:29 -0000 Subject: [Python-checkins] bpo-42960: Add resource.RLIMIT_KQUEUES constant from FreeBSD (GH-24251) Message-ID: https://github.com/python/cpython/commit/7be00ee64a2ced73c00ec855c7265e2ba795213d commit: 7be00ee64a2ced73c00ec855c7265e2ba795213d branch: master author: David CARLIER committer: vstinner date: 2021-02-18T16:26:20+01:00 summary: bpo-42960: Add resource.RLIMIT_KQUEUES constant from FreeBSD (GH-24251) files: A Misc/NEWS.d/next/Library/2021-01-18-21-07-20.bpo-42960.a7Dote.rst M Doc/library/resource.rst M Modules/resource.c diff --git a/Doc/library/resource.rst b/Doc/library/resource.rst index e4eac43642d14..00ff3b5dd3b6a 100644 --- a/Doc/library/resource.rst +++ b/Doc/library/resource.rst @@ -255,6 +255,14 @@ platform. .. versionadded:: 3.4 +.. data:: RLIMIT_KQUEUES + + The maximum number of kqueues this user id is allowed to create. + + .. availability:: FreeBSD 11 or later. + + .. versionadded:: 3.10 + Resource Usage -------------- diff --git a/Misc/NEWS.d/next/Library/2021-01-18-21-07-20.bpo-42960.a7Dote.rst b/Misc/NEWS.d/next/Library/2021-01-18-21-07-20.bpo-42960.a7Dote.rst new file mode 100644 index 0000000000000..58c1bcc85ef70 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-01-18-21-07-20.bpo-42960.a7Dote.rst @@ -0,0 +1 @@ +Adds :data:`resource.RLIMIT_KQUEUES` constant from FreeBSD to the :mod:`resource` module. diff --git a/Modules/resource.c b/Modules/resource.c index f10a80f477686..0d69c2983b4d1 100644 --- a/Modules/resource.c +++ b/Modules/resource.c @@ -480,6 +480,10 @@ resource_exec(PyObject *module) ADD_INT(module, RLIMIT_NPTS); #endif +#ifdef RLIMIT_KQUEUES + ADD_INT(module, RLIMIT_KQUEUES); +#endif + PyObject *v; if (sizeof(RLIM_INFINITY) > sizeof(long)) { v = PyLong_FromLongLong((long long) RLIM_INFINITY); From webhook-mailer at python.org Thu Feb 18 10:45:04 2021 From: webhook-mailer at python.org (berkerpeksag) Date: Thu, 18 Feb 2021 15:45:04 -0000 Subject: [Python-checkins] bpo-43249: sqlite3_column_bytes() must follow sqlite_column_blob() (GH-24562) Message-ID: https://github.com/python/cpython/commit/47feb1feb28631b6647699b7633109aa85340966 commit: 47feb1feb28631b6647699b7633109aa85340966 branch: master author: Erlend Egeberg Aasland committer: berkerpeksag date: 2021-02-18T17:44:43+02:00 summary: bpo-43249: sqlite3_column_bytes() must follow sqlite_column_blob() (GH-24562) files: M Modules/_sqlite/cursor.c diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index f8fe11ed1ea75..63176b81b10ef 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -278,9 +278,15 @@ _pysqlite_fetch_one_row(pysqlite_Cursor* self) converter = Py_None; } + /* + * Note, sqlite3_column_bytes() must come after sqlite3_column_blob() + * or sqlite3_column_text(). + * + * See https://sqlite.org/c3ref/column_blob.html for details. + */ if (converter != Py_None) { - nbytes = sqlite3_column_bytes(self->statement->st, i); val_str = (const char*)sqlite3_column_blob(self->statement->st, i); + nbytes = sqlite3_column_bytes(self->statement->st, i); if (!val_str) { converted = Py_NewRef(Py_None); } else { @@ -330,9 +336,13 @@ _pysqlite_fetch_one_row(pysqlite_Cursor* self) } } else { /* coltype == SQLITE_BLOB */ - nbytes = sqlite3_column_bytes(self->statement->st, i); - converted = PyBytes_FromStringAndSize( - sqlite3_column_blob(self->statement->st, i), nbytes); + const char *blob = sqlite3_column_blob(self->statement->st, i); + if (!blob) { + converted = Py_NewRef(Py_None); + } else { + nbytes = sqlite3_column_bytes(self->statement->st, i); + converted = PyBytes_FromStringAndSize(blob, nbytes); + } } } From webhook-mailer at python.org Thu Feb 18 12:13:24 2021 From: webhook-mailer at python.org (berkerpeksag) Date: Thu, 18 Feb 2021 17:13:24 -0000 Subject: [Python-checkins] bpo-43249: Improve scoping in _pysqlite_fetch_one_row() (GH-24565) Message-ID: https://github.com/python/cpython/commit/cc96231f0a59cc7393943064800ecb6c18892662 commit: cc96231f0a59cc7393943064800ecb6c18892662 branch: master author: Erlend Egeberg Aasland committer: berkerpeksag date: 2021-02-18T19:13:14+02:00 summary: bpo-43249: Improve scoping in _pysqlite_fetch_one_row() (GH-24565) files: M Modules/_sqlite/cursor.c diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index 63176b81b10ef..d1578ad6aafb8 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -249,7 +249,6 @@ _pysqlite_fetch_one_row(pysqlite_Cursor* self) PyObject* converter; PyObject* converted; Py_ssize_t nbytes; - const char* val_str; char buf[200]; const char* colname; PyObject* error_msg; @@ -285,12 +284,12 @@ _pysqlite_fetch_one_row(pysqlite_Cursor* self) * See https://sqlite.org/c3ref/column_blob.html for details. */ if (converter != Py_None) { - val_str = (const char*)sqlite3_column_blob(self->statement->st, i); + const char *blob = (const char*)sqlite3_column_blob(self->statement->st, i); nbytes = sqlite3_column_bytes(self->statement->st, i); - if (!val_str) { + if (!blob) { converted = Py_NewRef(Py_None); } else { - item = PyBytes_FromStringAndSize(val_str, nbytes); + item = PyBytes_FromStringAndSize(blob, nbytes); if (!item) goto error; converted = PyObject_CallOneArg(converter, item); @@ -307,10 +306,10 @@ _pysqlite_fetch_one_row(pysqlite_Cursor* self) } else if (coltype == SQLITE_FLOAT) { converted = PyFloat_FromDouble(sqlite3_column_double(self->statement->st, i)); } else if (coltype == SQLITE_TEXT) { - val_str = (const char*)sqlite3_column_text(self->statement->st, i); + const char *text = (const char*)sqlite3_column_text(self->statement->st, i); nbytes = sqlite3_column_bytes(self->statement->st, i); if (self->connection->text_factory == (PyObject*)&PyUnicode_Type) { - converted = PyUnicode_FromStringAndSize(val_str, nbytes); + converted = PyUnicode_FromStringAndSize(text, nbytes); if (!converted && PyErr_ExceptionMatches(PyExc_UnicodeDecodeError)) { PyErr_Clear(); colname = sqlite3_column_name(self->statement->st, i); @@ -318,7 +317,7 @@ _pysqlite_fetch_one_row(pysqlite_Cursor* self) colname = ""; } PyOS_snprintf(buf, sizeof(buf) - 1, "Could not decode to UTF-8 column '%s' with text '%s'", - colname , val_str); + colname , text); error_msg = PyUnicode_Decode(buf, strlen(buf), "ascii", "replace"); if (!error_msg) { PyErr_SetString(pysqlite_OperationalError, "Could not decode to UTF-8"); @@ -328,11 +327,11 @@ _pysqlite_fetch_one_row(pysqlite_Cursor* self) } } } else if (self->connection->text_factory == (PyObject*)&PyBytes_Type) { - converted = PyBytes_FromStringAndSize(val_str, nbytes); + converted = PyBytes_FromStringAndSize(text, nbytes); } else if (self->connection->text_factory == (PyObject*)&PyByteArray_Type) { - converted = PyByteArray_FromStringAndSize(val_str, nbytes); + converted = PyByteArray_FromStringAndSize(text, nbytes); } else { - converted = PyObject_CallFunction(self->connection->text_factory, "y#", val_str, nbytes); + converted = PyObject_CallFunction(self->connection->text_factory, "y#", text, nbytes); } } else { /* coltype == SQLITE_BLOB */ From webhook-mailer at python.org Thu Feb 18 13:20:44 2021 From: webhook-mailer at python.org (vstinner) Date: Thu, 18 Feb 2021 18:20:44 -0000 Subject: [Python-checkins] bpo-42990: Refactor _PyFrame_New_NoTrack() (GH-24566) Message-ID: https://github.com/python/cpython/commit/44085a3fc9a150478aec1872dd1079c60dcc42f6 commit: 44085a3fc9a150478aec1872dd1079c60dcc42f6 branch: master author: Victor Stinner committer: vstinner date: 2021-02-18T19:20:16+01:00 summary: bpo-42990: Refactor _PyFrame_New_NoTrack() (GH-24566) * Refactor _PyFrame_New_NoTrack() and PyFunction_NewWithQualName() code. * PyFrame_New() checks for _PyEval_BuiltinsFromGlobals() failure. * Fix a ref leak in _PyEval_BuiltinsFromGlobals() error path. * Complete PyFunction_GetModule() documentation: it returns a borrowed reference and it can return NULL. * Move _PyEval_BuiltinsFromGlobals() definition to the internal C API. * PyFunction_NewWithQualName() uses _Py_IDENTIFIER() API for the "__name__" string to make it compatible with subinterpreters. files: M Doc/c-api/function.rst M Include/cpython/frameobject.h M Include/internal/pycore_ceval.h M Objects/frameobject.c M Objects/funcobject.c M Python/ceval.c diff --git a/Doc/c-api/function.rst b/Doc/c-api/function.rst index 20968828e0bb3..ad008425f3811 100644 --- a/Doc/c-api/function.rst +++ b/Doc/c-api/function.rst @@ -61,9 +61,11 @@ There are a few functions specific to Python functions. .. c:function:: PyObject* PyFunction_GetModule(PyObject *op) - Return the *__module__* attribute of the function object *op*. This is normally - a string containing the module name, but can be set to any other object by - Python code. + Return a :term:`borrowed reference` to the *__module__* attribute of the + function object *op*. It can be *NULL*. + + This is normally a string containing the module name, but can be set to any + other object by Python code. .. c:function:: PyObject* PyFunction_GetDefaults(PyObject *op) diff --git a/Include/cpython/frameobject.h b/Include/cpython/frameobject.h index 5a19c006d9153..5122ec41a3d22 100644 --- a/Include/cpython/frameobject.h +++ b/Include/cpython/frameobject.h @@ -92,5 +92,3 @@ PyAPI_FUNC(void) PyFrame_FastToLocals(PyFrameObject *); PyAPI_FUNC(void) _PyFrame_DebugMallocStats(FILE *out); PyAPI_FUNC(PyFrameObject *) PyFrame_GetBack(PyFrameObject *frame); - -PyObject *_PyEval_BuiltinsFromGlobals(PyObject *globals); diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index 0491d48a789eb..bb22322114ecb 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -31,9 +31,12 @@ PyAPI_FUNC(void) _PyEval_SetCoroutineOriginTrackingDepth( PyThreadState *tstate, int new_depth); -/* Private function */ void _PyEval_Fini(void); + +extern PyObject *_PyEval_BuiltinsFromGlobals(PyObject *globals); + + static inline PyObject* _PyEval_EvalFrame(PyThreadState *tstate, PyFrameObject *f, int throwflag) { diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 57105e1a9eb1e..5f7fa40ff6e0e 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -1,12 +1,11 @@ /* Frame object implementation */ #include "Python.h" -#include "pycore_object.h" -#include "pycore_gc.h" // _PyObject_GC_IS_TRACKED() +#include "pycore_ceval.h" // _PyEval_BuiltinsFromGlobals() +#include "pycore_object.h" // _PyObject_GC_UNTRACK() -#include "code.h" -#include "frameobject.h" -#include "opcode.h" +#include "frameobject.h" // PyFrameObject +#include "opcode.h" // EXTENDED_ARG #include "structmember.h" // PyMemberDef #define OFF(x) offsetof(PyFrameObject, x) @@ -762,9 +761,7 @@ _Py_IDENTIFIER(__builtins__); static inline PyFrameObject* frame_alloc(PyCodeObject *code) { - PyFrameObject *f; - - f = code->co_zombieframe; + PyFrameObject *f = code->co_zombieframe; if (f != NULL) { code->co_zombieframe = NULL; _Py_NewReference((PyObject *)f); @@ -803,14 +800,11 @@ frame_alloc(PyCodeObject *code) _Py_NewReference((PyObject *)f); } - 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; } - f->f_locals = NULL; - f->f_trace = NULL; return f; } @@ -818,42 +812,33 @@ frame_alloc(PyCodeObject *code) PyFrameObject* _Py_HOT_FUNCTION _PyFrame_New_NoTrack(PyThreadState *tstate, PyFrameConstructor *con, PyObject *locals) { -#ifdef Py_DEBUG - if (con == NULL || con->fc_code == NULL || - (locals != NULL && !PyMapping_Check(locals))) { - PyErr_BadInternalCall(); - return NULL; - } -#endif - - PyFrameObject *back = tstate->frame; + assert(con != NULL); + assert(con->fc_globals != NULL); + assert(con->fc_builtins != NULL); + assert(con->fc_code != NULL); + assert(locals == NULL || PyMapping_Check(locals)); PyFrameObject *f = frame_alloc((PyCodeObject *)con->fc_code); if (f == NULL) { return NULL; } + f->f_back = (PyFrameObject*)Py_XNewRef(tstate->frame); + f->f_code = (PyCodeObject *)Py_NewRef(con->fc_code); + f->f_builtins = Py_NewRef(con->fc_builtins); + f->f_globals = Py_NewRef(con->fc_globals); + f->f_locals = Py_XNewRef(locals); + // f_valuestack initialized by frame_alloc() + f->f_trace = NULL; f->f_stackdepth = 0; - Py_INCREF(con->fc_builtins); - f->f_builtins = con->fc_builtins; - Py_XINCREF(back); - f->f_back = back; - Py_INCREF(con->fc_code); - Py_INCREF(con->fc_globals); - f->f_globals = con->fc_globals; - Py_XINCREF(locals); - f->f_locals = locals; - + f->f_trace_lines = 1; + f->f_trace_opcodes = 0; + f->f_gen = NULL; f->f_lasti = -1; f->f_lineno = 0; f->f_iblock = 0; f->f_state = FRAME_CREATED; - f->f_gen = NULL; - f->f_trace_opcodes = 0; - f->f_trace_lines = 1; - - assert(f->f_code != NULL); - + // f_blockstack and f_localsplus initialized by frame_alloc() return f; } @@ -863,6 +848,9 @@ PyFrame_New(PyThreadState *tstate, PyCodeObject *code, PyObject *globals, PyObject *locals) { PyObject *builtins = _PyEval_BuiltinsFromGlobals(globals); + if (builtins == NULL) { + return NULL; + } PyFrameConstructor desc = { .fc_globals = globals, .fc_builtins = builtins, @@ -875,8 +863,9 @@ PyFrame_New(PyThreadState *tstate, PyCodeObject *code, }; PyFrameObject *f = _PyFrame_New_NoTrack(tstate, &desc, locals); Py_DECREF(builtins); - if (f) + if (f) { _PyObject_GC_TRACK(f); + } return f; } @@ -1173,27 +1162,30 @@ PyFrame_GetBack(PyFrameObject *frame) return back; } -PyObject *_PyEval_BuiltinsFromGlobals(PyObject *globals) { +PyObject* +_PyEval_BuiltinsFromGlobals(PyObject *globals) +{ PyObject *builtins = _PyDict_GetItemIdWithError(globals, &PyId___builtins__); if (builtins) { if (PyModule_Check(builtins)) { builtins = PyModule_GetDict(builtins); assert(builtins != NULL); } + return Py_NewRef(builtins); } + + if (PyErr_Occurred()) { + return NULL; + } + + /* No builtins! Make up a minimal one. Give them 'None', at least. */ + builtins = PyDict_New(); if (builtins == NULL) { - if (PyErr_Occurred()) { - 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; + return NULL; + } + if (PyDict_SetItemString(builtins, "None", Py_None) < 0) { + Py_DECREF(builtins); + return NULL; } - else - Py_INCREF(builtins); return builtins; } diff --git a/Objects/funcobject.c b/Objects/funcobject.c index 523930da8dc62..4b92f6c0342d9 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -2,83 +2,90 @@ /* Function object implementation */ #include "Python.h" -#include "pycore_object.h" -#include "frameobject.h" -#include "code.h" +#include "pycore_ceval.h" // _PyEval_BuiltinsFromGlobals() +#include "pycore_object.h" // _PyObject_GC_UNTRACK() #include "structmember.h" // PyMemberDef PyObject * PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname) { - PyFunctionObject *op; - PyObject *doc, *consts, *module; - static PyObject *__name__ = NULL; + assert(globals != NULL); + assert(PyDict_Check(globals)); + Py_INCREF(globals); - if (__name__ == NULL) { - __name__ = PyUnicode_InternFromString("__name__"); - if (__name__ == NULL) - return NULL; + PyCodeObject *code_obj = (PyCodeObject *)code; + Py_INCREF(code_obj); + + PyObject *name = code_obj->co_name; + assert(name != NULL); + Py_INCREF(name); + if (!qualname) { + qualname = name; } + Py_INCREF(qualname); - /* __module__: If module name is in globals, use it. - Otherwise, use None. */ - module = PyDict_GetItemWithError(globals, __name__); - if (module) { - Py_INCREF(module); + PyObject *consts = code_obj->co_consts; + assert(PyTuple_Check(consts)); + PyObject *doc; + if (PyTuple_Size(consts) >= 1) { + doc = PyTuple_GetItem(consts, 0); + if (!PyUnicode_Check(doc)) { + doc = Py_None; + } } - else if (PyErr_Occurred()) { - return NULL; + else { + doc = Py_None; + } + Py_INCREF(doc); + + // __module__: Use globals['__name__'] if it exists, or NULL. + _Py_IDENTIFIER(__name__); + PyObject *module = _PyDict_GetItemIdWithError(globals, &PyId___name__); + PyObject *builtins = NULL; + if (module == NULL && PyErr_Occurred()) { + goto error; + } + Py_XINCREF(module); + + builtins = _PyEval_BuiltinsFromGlobals(globals); + if (builtins == NULL) { + goto error; } - op = PyObject_GC_New(PyFunctionObject, &PyFunction_Type); + PyFunctionObject *op = PyObject_GC_New(PyFunctionObject, &PyFunction_Type); if (op == NULL) { - Py_XDECREF(module); - return NULL; + goto error; } /* Note: No failures from this point on, since func_dealloc() does not expect a partially-created object. */ - op->func_weakreflist = NULL; - Py_INCREF(code); - op->func_code = code; - assert(globals != NULL); - Py_INCREF(globals); op->func_globals = globals; - PyObject *builtins = _PyEval_BuiltinsFromGlobals(globals); - if (builtins == NULL) { - return NULL; - } op->func_builtins = builtins; - op->func_name = ((PyCodeObject *)code)->co_name; - Py_INCREF(op->func_name); - op->func_defaults = NULL; /* No default arguments */ - op->func_kwdefaults = NULL; /* No keyword only defaults */ + op->func_name = name; + op->func_qualname = qualname; + op->func_code = (PyObject*)code_obj; + op->func_defaults = NULL; // No default positional arguments + op->func_kwdefaults = NULL; // No default keyword arguments op->func_closure = NULL; - op->vectorcall = _PyFunction_Vectorcall; - op->func_module = module; - - consts = ((PyCodeObject *)code)->co_consts; - if (PyTuple_Size(consts) >= 1) { - doc = PyTuple_GetItem(consts, 0); - if (!PyUnicode_Check(doc)) - doc = Py_None; - } - else - doc = Py_None; - Py_INCREF(doc); op->func_doc = doc; - op->func_dict = NULL; + op->func_weakreflist = NULL; + op->func_module = module; op->func_annotations = NULL; - - if (qualname) - op->func_qualname = qualname; - else - op->func_qualname = op->func_name; - Py_INCREF(op->func_qualname); + op->vectorcall = _PyFunction_Vectorcall; _PyObject_GC_TRACK(op); return (PyObject *)op; + +error: + Py_DECREF(globals); + Py_DECREF(code_obj); + Py_DECREF(name); + Py_DECREF(qualname); + Py_DECREF(doc); + Py_XDECREF(module); + Py_XDECREF(builtins); + return NULL; } PyObject * diff --git a/Python/ceval.c b/Python/ceval.c index 9e4c2666ac6f7..0b7400359e001 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -908,7 +908,7 @@ PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals) .fc_closure = NULL }; PyThreadState *tstate = PyThreadState_GET(); - PyObject *res =_PyEval_Vector(tstate, &desc, locals, NULL, 0, NULL); + PyObject *res = _PyEval_Vector(tstate, &desc, locals, NULL, 0, NULL); Py_DECREF(builtins); return res; } @@ -4800,8 +4800,8 @@ PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals, }; PyThreadState *tstate = _PyThreadState_GET(); res = _PyEval_Vector(tstate, &constr, locals, - allargs, argcount, - kwnames); + allargs, argcount, + kwnames); if (kwcount) { Py_DECREF(kwnames); PyMem_Free(newargs); From webhook-mailer at python.org Thu Feb 18 14:43:59 2021 From: webhook-mailer at python.org (miss-islington) Date: Thu, 18 Feb 2021 19:43:59 -0000 Subject: [Python-checkins] Remove all links to mingw.org (GH-24552) Message-ID: https://github.com/python/cpython/commit/743932d50815edbe4ffd530ae091c53ae47dd34b commit: 743932d50815edbe4ffd530ae091c53ae47dd34b branch: master author: Jeremy Paige committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2021-02-18T11:43:35-08:00 summary: Remove all links to mingw.org (GH-24552) This lease on this domain has lapsed. This not only makes these dead links, but a potential attack vector for readers of python.org as the domain can be obtained by an untrustworthy party. I considered redirecting these links to http://mingw-w64.org/ which is a maintained fork of mingw, but beyond my unfamiliarity with the exact level of compatibility, at the time of this PR that site had an expired cert and so is not much of a vulnerability fix. Automerge-Triggered-By: GH:Mariatta files: M Doc/install/index.rst M Doc/using/windows.rst diff --git a/Doc/install/index.rst b/Doc/install/index.rst index b6b7085fb35aa..48c6e76a682a4 100644 --- a/Doc/install/index.rst +++ b/Doc/install/index.rst @@ -1071,8 +1071,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/using/windows.rst b/Doc/using/windows.rst index 0f713fcab4be8..3d638642f3008 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -1149,8 +1149,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 =============== From webhook-mailer at python.org Thu Feb 18 15:07:51 2021 From: webhook-mailer at python.org (miss-islington) Date: Thu, 18 Feb 2021 20:07:51 -0000 Subject: [Python-checkins] Remove all links to mingw.org (GH-24552) Message-ID: https://github.com/python/cpython/commit/f03b61aaed28e005305210979261d5040c9df1aa commit: f03b61aaed28e005305210979261d5040c9df1aa branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2021-02-18T12:07:24-08:00 summary: Remove all links to mingw.org (GH-24552) This lease on this domain has lapsed. This not only makes these dead links, but a potential attack vector for readers of python.org as the domain can be obtained by an untrustworthy party. I considered redirecting these links to http://mingw-w64.org/ which is a maintained fork of mingw, but beyond my unfamiliarity with the exact level of compatibility, at the time of this PR that site had an expired cert and so is not much of a vulnerability fix. Automerge-Triggered-By: GH:Mariatta (cherry picked from commit 743932d50815edbe4ffd530ae091c53ae47dd34b) Co-authored-by: Jeremy Paige files: M Doc/install/index.rst M Doc/using/windows.rst diff --git a/Doc/install/index.rst b/Doc/install/index.rst index e6d5a3e6ebde6..ae0d0294ef777 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/using/windows.rst b/Doc/using/windows.rst index 1d5e9e4b5d9f7..12ec0fc90c0ff 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -1161,8 +1161,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 =============== From webhook-mailer at python.org Thu Feb 18 15:07:51 2021 From: webhook-mailer at python.org (miss-islington) Date: Thu, 18 Feb 2021 20:07:51 -0000 Subject: [Python-checkins] Remove all links to mingw.org (GH-24552) Message-ID: https://github.com/python/cpython/commit/ec2385e315fc6b28d92dfb4c97fefcbb1e7daa68 commit: ec2385e315fc6b28d92dfb4c97fefcbb1e7daa68 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2021-02-18T12:07:30-08:00 summary: Remove all links to mingw.org (GH-24552) This lease on this domain has lapsed. This not only makes these dead links, but a potential attack vector for readers of python.org as the domain can be obtained by an untrustworthy party. I considered redirecting these links to http://mingw-w64.org/ which is a maintained fork of mingw, but beyond my unfamiliarity with the exact level of compatibility, at the time of this PR that site had an expired cert and so is not much of a vulnerability fix. Automerge-Triggered-By: GH:Mariatta (cherry picked from commit 743932d50815edbe4ffd530ae091c53ae47dd34b) Co-authored-by: Jeremy Paige files: M Doc/install/index.rst M Doc/using/windows.rst diff --git a/Doc/install/index.rst b/Doc/install/index.rst index e6d5a3e6ebde6..ae0d0294ef777 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/using/windows.rst b/Doc/using/windows.rst index 857308e77dd1b..4699e37509e6f 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -1155,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 =============== From webhook-mailer at python.org Thu Feb 18 19:49:35 2021 From: webhook-mailer at python.org (nascheme) Date: Fri, 19 Feb 2021 00:49:35 -0000 Subject: [Python-checkins] bpo-39448: Add regen-frozen makefile target. (GH-18174) Message-ID: https://github.com/python/cpython/commit/ffa55d21b4a86ad8b4a43a9f597151e526541130 commit: ffa55d21b4a86ad8b4a43a9f597151e526541130 branch: master author: Neil Schemenauer committer: nascheme date: 2021-02-18T16:49:12-08:00 summary: bpo-39448: Add regen-frozen makefile target. (GH-18174) Add the "regen-frozen" makefile target that regenerates the code for the frozen __hello__ module. files: A Misc/NEWS.d/next/Build/2020-01-24-12-54-22.bpo-39448.k4pv14.rst A Python/frozen_hello.h A Tools/freeze/regen_frozen.py M Lib/ctypes/test/test_values.py M Makefile.pre.in M Python/frozen.c diff --git a/Lib/ctypes/test/test_values.py b/Lib/ctypes/test/test_values.py index 87eb9198ade0c..44128298390d9 100644 --- a/Lib/ctypes/test/test_values.py +++ b/Lib/ctypes/test/test_values.py @@ -80,9 +80,9 @@ class struct_frozen(Structure): continue items.append((entry.name.decode("ascii"), entry.size)) - expected = [("__hello__", 141), - ("__phello__", -141), - ("__phello__.spam", 141), + expected = [("__hello__", 125), + ("__phello__", -125), + ("__phello__.spam", 125), ] self.assertEqual(items, expected, "PyImport_FrozenModules example " "in Doc/library/ctypes.rst may be out of date") diff --git a/Makefile.pre.in b/Makefile.pre.in index 593da93a6bc2a..e4ac248d1f02e 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -761,7 +761,7 @@ regen-limited-abi: all regen-all: regen-opcode regen-opcode-targets regen-typeslots \ regen-token regen-ast regen-keyword regen-importlib clinic \ - regen-pegen-metaparser regen-pegen + regen-pegen-metaparser regen-pegen regen-frozen @echo @echo "Note: make regen-stdlib-module-names and autoconf should be run manually" @@ -870,6 +870,11 @@ regen-opcode: $(srcdir)/Include/opcode.h.new $(UPDATE_FILE) $(srcdir)/Include/opcode.h $(srcdir)/Include/opcode.h.new +.PHONY: regen-frozen +regen-frozen: + # Regenerate code for frozen module "__hello__". + $(PYTHON_FOR_REGEN) $(srcdir)/Tools/freeze/regen_frozen.py $(srcdir)/Python/frozen_hello.h + .PHONY: regen-token regen-token: # Regenerate Doc/library/token-list.inc from Grammar/Tokens @@ -974,7 +979,7 @@ Python/ceval.o: $(srcdir)/Python/opcode_targets.h $(srcdir)/Python/ceval_gil.h \ $(srcdir)/Python/condvar.h Python/frozen.o: $(srcdir)/Python/importlib.h $(srcdir)/Python/importlib_external.h \ - $(srcdir)/Python/importlib_zipimport.h + $(srcdir)/Python/importlib_zipimport.h $(srcdir)/Python/frozen_hello.h # Generate DTrace probe macros, then rename them (PYTHON_ -> PyDTrace_) to # follow our naming conventions. dtrace(1) uses the output filename to generate diff --git a/Misc/NEWS.d/next/Build/2020-01-24-12-54-22.bpo-39448.k4pv14.rst b/Misc/NEWS.d/next/Build/2020-01-24-12-54-22.bpo-39448.k4pv14.rst new file mode 100644 index 0000000000000..2a0dc0e2cd6cb --- /dev/null +++ b/Misc/NEWS.d/next/Build/2020-01-24-12-54-22.bpo-39448.k4pv14.rst @@ -0,0 +1,2 @@ +Add the "regen-frozen" makefile target that regenerates the code for the +frozen ``__hello__`` module. diff --git a/Python/frozen.c b/Python/frozen.c index 228a11019cfa6..d4104e166401a 100644 --- a/Python/frozen.c +++ b/Python/frozen.c @@ -1,5 +1,5 @@ -/* Dummy frozen modules initializer */ +/* Frozen modules initializer */ #include "Python.h" #include "importlib.h" @@ -10,21 +10,11 @@ define a single frozen module, __hello__. Loading it will print some famous words... */ -/* To regenerate this data after the bytecode or marshal format has changed, - go to ../Tools/freeze/ and freeze the flag.py file; then copy and paste - the appropriate bytes from M___main__.c. */ - -static unsigned char M___hello__[] = { - 227,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,16,0,0,0,100,0, - 90,0,101,1,100,1,131,1,1,0,100,2,83,0,41,3, - 84,122,12,72,101,108,108,111,32,119,111,114,108,100,33,78, - 41,2,218,11,105,110,105,116,105,97,108,105,122,101,100,218, - 5,112,114,105,110,116,169,0,114,3,0,0,0,114,3,0, - 0,0,250,20,84,111,111,108,115,47,102,114,101,101,122,101, - 47,102,108,97,103,46,112,121,218,8,60,109,111,100,117,108, - 101,62,1,0,0,0,115,2,0,0,0,4,1, -}; +/* Run "make regen-frozen" to regen the file below (e.g. after a bytecode + * format change). The file is created by Tools/frozen/regen_frozen.py. The + * include file defines M___hello__ as an array of bytes. + */ +#include "frozen_hello.h" #define SIZE (int)sizeof(M___hello__) diff --git a/Python/frozen_hello.h b/Python/frozen_hello.h new file mode 100644 index 0000000000000..9c566cc81ebf0 --- /dev/null +++ b/Python/frozen_hello.h @@ -0,0 +1,13 @@ +/* Generated with Tools/freeze/regen_frozen.py */ +static unsigned char M___hello__[] = { + 227,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, + 16,0,0,0,100,0,90,0,101,1,100,1,131, + 1,1,0,100,2,83,0,41,3,84,122,12,72, + 101,108,108,111,32,119,111,114,108,100,33,78,41, + 2,90,11,105,110,105,116,105,97,108,105,122,101, + 100,218,5,112,114,105,110,116,169,0,114,2,0, + 0,0,114,2,0,0,0,218,4,110,111,110,101, + 218,8,60,109,111,100,117,108,101,62,1,0,0, + 0,115,2,0,0,0,4,1, +}; diff --git a/Tools/freeze/regen_frozen.py b/Tools/freeze/regen_frozen.py new file mode 100644 index 0000000000000..391182ac88a38 --- /dev/null +++ b/Tools/freeze/regen_frozen.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python3 +import sys +import os +import marshal + + +DIR = os.path.dirname(sys.argv[0]) +# source code for module to freeze +FILE = os.path.join(DIR, 'flag.py') +# C symbol to use for array holding frozen bytes +SYMBOL = 'M___hello__' + + +def get_module_code(filename): + """Compile 'filename' and return the module code as a marshalled byte + string. + """ + with open(filename, 'r') as fp: + src = fp.read() + co = compile(src, 'none', 'exec') + co_bytes = marshal.dumps(co) + return co_bytes + + +def gen_c_code(fp, co_bytes): + """Generate C code for the module code in 'co_bytes', write it to 'fp'. + """ + def write(*args, **kwargs): + print(*args, **kwargs, file=fp) + write('/* Generated with Tools/freeze/regen_frozen.py */') + write('static unsigned char %s[] = {' % SYMBOL, end='') + bytes_per_row = 13 + for i, opcode in enumerate(co_bytes): + if (i % bytes_per_row) == 0: + # start a new row + write() + write(' ', end='') + write('%d,' % opcode, end='') + write() + write('};') + + +def main(): + out_filename = sys.argv[1] + co_bytes = get_module_code(FILE) + with open(out_filename, 'w') as fp: + gen_c_code(fp, co_bytes) + + +if __name__ == '__main__': + main() From webhook-mailer at python.org Thu Feb 18 20:53:53 2021 From: webhook-mailer at python.org (benjaminp) Date: Fri, 19 Feb 2021 01:53:53 -0000 Subject: [Python-checkins] closes bpo-43254: Fix *snprintf() man page refs. (GH-24563) Message-ID: https://github.com/python/cpython/commit/e92d67dfbb4790df37aa6a0961fb6dc7e8d2fbbf commit: e92d67dfbb4790df37aa6a0961fb6dc7e8d2fbbf branch: master author: Erlend Egeberg Aasland committer: benjaminp date: 2021-02-18T19:53:33-06:00 summary: closes bpo-43254: Fix *snprintf() man page refs. (GH-24563) files: M Doc/c-api/conversion.rst diff --git a/Doc/c-api/conversion.rst b/Doc/c-api/conversion.rst index efbaa52e2dc46..e47072f04747a 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 From webhook-mailer at python.org Thu Feb 18 21:03:44 2021 From: webhook-mailer at python.org (miss-islington) Date: Fri, 19 Feb 2021 02:03:44 -0000 Subject: [Python-checkins] closes bpo-43254: Fix *snprintf() man page refs. (GH-24563) Message-ID: https://github.com/python/cpython/commit/8a42eb1492dec2ec0cc79146f0c817acb7328b19 commit: 8a42eb1492dec2ec0cc79146f0c817acb7328b19 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2021-02-18T18:03:34-08:00 summary: closes bpo-43254: Fix *snprintf() man page refs. (GH-24563) (cherry picked from commit e92d67dfbb4790df37aa6a0961fb6dc7e8d2fbbf) Co-authored-by: Erlend Egeberg Aasland files: M Doc/c-api/conversion.rst diff --git a/Doc/c-api/conversion.rst b/Doc/c-api/conversion.rst index b310fcb5e4f91..ee76accae62b8 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 From webhook-mailer at python.org Thu Feb 18 21:16:40 2021 From: webhook-mailer at python.org (miss-islington) Date: Fri, 19 Feb 2021 02:16:40 -0000 Subject: [Python-checkins] closes bpo-43254: Fix *snprintf() man page refs. (GH-24563) Message-ID: https://github.com/python/cpython/commit/138488750512b47f1773630f90e92ec5038b6978 commit: 138488750512b47f1773630f90e92ec5038b6978 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2021-02-18T18:16:30-08:00 summary: closes bpo-43254: Fix *snprintf() man page refs. (GH-24563) (cherry picked from commit e92d67dfbb4790df37aa6a0961fb6dc7e8d2fbbf) Co-authored-by: Erlend Egeberg Aasland files: M Doc/c-api/conversion.rst diff --git a/Doc/c-api/conversion.rst b/Doc/c-api/conversion.rst index b310fcb5e4f91..ee76accae62b8 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 From webhook-mailer at python.org Fri Feb 19 06:21:03 2021 From: webhook-mailer at python.org (berkerpeksag) Date: Fri, 19 Feb 2021 11:21:03 -0000 Subject: [Python-checkins] bpo-43258: Don't allocate sqlite3 aggregate context for empty queries (GH-24569) Message-ID: https://github.com/python/cpython/commit/979b23cbe44071b056ff524c0aa20e5d9794b5b0 commit: 979b23cbe44071b056ff524c0aa20e5d9794b5b0 branch: master author: Erlend Egeberg Aasland committer: berkerpeksag date: 2021-02-19T13:20:32+02:00 summary: bpo-43258: Don't allocate sqlite3 aggregate context for empty queries (GH-24569) files: A Misc/NEWS.d/next/Library/2021-02-18-23-30-52.bpo-43258.LeU-q8.rst M Lib/sqlite3/test/userfunctions.py M Modules/_sqlite/connection.c diff --git a/Lib/sqlite3/test/userfunctions.py b/Lib/sqlite3/test/userfunctions.py index 2285abd4fd8a5..749ea049c834a 100644 --- a/Lib/sqlite3/test/userfunctions.py +++ b/Lib/sqlite3/test/userfunctions.py @@ -429,6 +429,11 @@ def test_aggr_check_aggr_sum(self): val = cur.fetchone()[0] self.assertEqual(val, 60) + def test_aggr_no_match(self): + cur = self.con.execute("select mysum(i) from (select 1 as i) where i == 0") + val = cur.fetchone()[0] + self.assertIsNone(val) + class AuthorizerTests(unittest.TestCase): @staticmethod def authorizer_cb(action, arg1, arg2, dbname, source): diff --git a/Misc/NEWS.d/next/Library/2021-02-18-23-30-52.bpo-43258.LeU-q8.rst b/Misc/NEWS.d/next/Library/2021-02-18-23-30-52.bpo-43258.LeU-q8.rst new file mode 100644 index 0000000000000..0529214718c44 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-02-18-23-30-52.bpo-43258.LeU-q8.rst @@ -0,0 +1,2 @@ +Prevent needless allocation of :mod:`sqlite3` aggregate function context +when no rows match an aggregate query. Patch by Erlend E. Aasland. diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index 63fcb0055de2c..39b55fc60da42 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -708,8 +708,12 @@ void _pysqlite_final_callback(sqlite3_context* context) threadstate = PyGILState_Ensure(); - aggregate_instance = (PyObject**)sqlite3_aggregate_context(context, sizeof(PyObject*)); - if (!*aggregate_instance) { + aggregate_instance = (PyObject**)sqlite3_aggregate_context(context, 0); + if (aggregate_instance == NULL) { + /* No rows matched the query; the step handler was never called. */ + goto error; + } + else if (!*aggregate_instance) { /* this branch is executed if there was an exception in the aggregate's * __init__ */ From webhook-mailer at python.org Fri Feb 19 06:59:38 2021 From: webhook-mailer at python.org (berkerpeksag) Date: Fri, 19 Feb 2021 11:59:38 -0000 Subject: [Python-checkins] bpo-43258: Make sqlite3 callback functions static (GH-24574) Message-ID: https://github.com/python/cpython/commit/2bb0bf4dd8c0bd4d23eb04afce1a5eeee8e07982 commit: 2bb0bf4dd8c0bd4d23eb04afce1a5eeee8e07982 branch: master author: Erlend Egeberg Aasland committer: berkerpeksag date: 2021-02-19T13:59:24+02:00 summary: bpo-43258: Make sqlite3 callback functions static (GH-24574) files: M Modules/_sqlite/connection.c diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index 39b55fc60da42..81f12e83c2fe1 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -600,7 +600,8 @@ PyObject* _pysqlite_build_py_params(sqlite3_context *context, int argc, sqlite3_ return args; } -void _pysqlite_func_callback(sqlite3_context* context, int argc, sqlite3_value** argv) +static void +_pysqlite_func_callback(sqlite3_context *context, int argc, sqlite3_value **argv) { PyObject* args; PyObject* py_func; @@ -696,7 +697,8 @@ static void _pysqlite_step_callback(sqlite3_context *context, int argc, sqlite3_ PyGILState_Release(threadstate); } -void _pysqlite_final_callback(sqlite3_context* context) +static void +_pysqlite_final_callback(sqlite3_context *context) { PyObject* function_result; PyObject** aggregate_instance; From webhook-mailer at python.org Fri Feb 19 07:17:57 2021 From: webhook-mailer at python.org (ambv) Date: Fri, 19 Feb 2021 12:17:57 -0000 Subject: [Python-checkins] Python 3.8.8 Message-ID: https://github.com/python/cpython/commit/024d8058b0cb2b13dfd65c8e3804a6b194a151ba commit: 024d8058b0cb2b13dfd65c8e3804a6b194a151ba branch: 3.8 author: ?ukasz Langa committer: ambv date: 2021-02-19T11:28:41+01:00 summary: Python 3.8.8 files: A Misc/NEWS.d/3.8.8.rst M Include/patchlevel.h M Lib/pydoc_data/topics.py M README.rst diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 5ed226c9e975f..b4dbb02abaedb 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -19,11 +19,11 @@ #define PY_MAJOR_VERSION 3 #define PY_MINOR_VERSION 8 #define PY_MICRO_VERSION 8 -#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_GAMMA -#define PY_RELEASE_SERIAL 1 +#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL +#define PY_RELEASE_SERIAL 0 /* Version as a string */ -#define PY_VERSION "3.8.8rc1+" +#define PY_VERSION "3.8.8" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py index ebdab5733b86a..475c256be57a2 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Autogenerated by Sphinx on Tue Feb 16 19:10:16 2021 +# Autogenerated by Sphinx on Fri Feb 19 11:26:48 2021 topics = {'assert': 'The "assert" statement\n' '**********************\n' '\n' diff --git a/Misc/NEWS.d/3.8.8.rst b/Misc/NEWS.d/3.8.8.rst new file mode 100644 index 0000000000000..b6fc112ce92be --- /dev/null +++ b/Misc/NEWS.d/3.8.8.rst @@ -0,0 +1,8 @@ +.. bpo: 0 +.. date: 2021-02-19 +.. no changes: True +.. nonce: -KzyCx +.. release date: 2021-02-19 +.. section: Library + +There were no new changes in version 3.8.8. diff --git a/README.rst b/README.rst index d6d9c5b2b1bef..18223f9f4e972 100644 --- a/README.rst +++ b/README.rst @@ -1,5 +1,5 @@ -This is Python version 3.8.8rc1 -=============================== +This is Python version 3.8.8 +============================ .. image:: https://travis-ci.org/python/cpython.svg?branch=3.8 :alt: CPython build status on Travis CI From webhook-mailer at python.org Fri Feb 19 07:21:32 2021 From: webhook-mailer at python.org (vstinner) Date: Fri, 19 Feb 2021 12:21:32 -0000 Subject: [Python-checkins] bpo-43268: Replace _PyThreadState_GET() with _PyInterpreterState_GET() (GH-24576) Message-ID: https://github.com/python/cpython/commit/5592f2b9daa24bf74cc616abcc40a29da2bdccb2 commit: 5592f2b9daa24bf74cc616abcc40a29da2bdccb2 branch: master author: Victor Stinner committer: vstinner date: 2021-02-19T13:21:28+01:00 summary: bpo-43268: Replace _PyThreadState_GET() with _PyInterpreterState_GET() (GH-24576) Replace _PyThreadState_GET() with _PyInterpreterState_GET() in functions which only need the current interpreter, but don't need the current Python thread state. Replace also _PyThreadState_UncheckedGet() with _PyThreadState_GET() in faulthandler.c, since _PyThreadState_UncheckedGet() is just an alias to _PyThreadState_GET() in practice. files: M Include/internal/pycore_long.h M Include/internal/pycore_object.h M Modules/faulthandler.c diff --git a/Include/internal/pycore_long.h b/Include/internal/pycore_long.h index ec95786531c85..a785b23a92b8c 100644 --- a/Include/internal/pycore_long.h +++ b/Include/internal/pycore_long.h @@ -14,13 +14,10 @@ extern "C" { // Don't call this function but _PyLong_GetZero() and _PyLong_GetOne() static inline PyObject* __PyLong_GetSmallInt_internal(int value) { - PyThreadState *tstate = _PyThreadState_GET(); -#ifdef Py_DEBUG - _Py_EnsureTstateNotNULL(tstate); -#endif + PyInterpreterState *interp = _PyInterpreterState_GET(); assert(-_PY_NSMALLNEGINTS <= value && value < _PY_NSMALLPOSINTS); size_t index = _PY_NSMALLNEGINTS + value; - PyObject *obj = (PyObject*)tstate->interp->small_ints[index]; + PyObject *obj = (PyObject*)interp->small_ints[index]; // _PyLong_GetZero() and _PyLong_GetOne() must not be called // before _PyLong_Init() nor after _PyLong_Fini() assert(obj != NULL); diff --git a/Include/internal/pycore_object.h b/Include/internal/pycore_object.h index 3cd27b035c2c7..79c1c44ae72d6 100644 --- a/Include/internal/pycore_object.h +++ b/Include/internal/pycore_object.h @@ -8,9 +8,9 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_gc.h" // _PyObject_GC_IS_TRACKED() -#include "pycore_interp.h" // PyInterpreterState.gc -#include "pycore_pystate.h" // _PyThreadState_GET() +#include "pycore_gc.h" // _PyObject_GC_IS_TRACKED() +#include "pycore_interp.h" // PyInterpreterState.gc +#include "pycore_pystate.h" // _PyInterpreterState_GET() PyAPI_FUNC(int) _PyType_CheckConsistency(PyTypeObject *type); PyAPI_FUNC(int) _PyDict_CheckConsistency(PyObject *mp, int check_content); @@ -85,8 +85,8 @@ static inline void _PyObject_GC_TRACK( "object is in generation which is garbage collected", filename, lineno, __func__); - PyThreadState *tstate = _PyThreadState_GET(); - PyGC_Head *generation0 = tstate->interp->gc.generation0; + PyInterpreterState *interp = _PyInterpreterState_GET(); + PyGC_Head *generation0 = interp->gc.generation0; PyGC_Head *last = (PyGC_Head*)(generation0->_gc_prev); _PyGCHead_SET_NEXT(last, gc); _PyGCHead_SET_PREV(gc, last); diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c index da8b7741345de..350f4cf6b8edf 100644 --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -1,6 +1,7 @@ #include "Python.h" #include "pycore_initconfig.h" // _PyStatus_ERR #include "pycore_pyerrors.h" // _Py_DumpExtensionModules +#include "pycore_pystate.h" // _PyThreadState_GET() #include "pycore_traceback.h" // _Py_DumpTracebackThreads #include #include @@ -208,7 +209,7 @@ faulthandler_get_fileno(PyObject **file_ptr) static PyThreadState* get_thread_state(void) { - PyThreadState *tstate = _PyThreadState_UncheckedGet(); + PyThreadState *tstate = _PyThreadState_GET(); if (tstate == NULL) { /* just in case but very unlikely... */ PyErr_SetString(PyExc_RuntimeError, From webhook-mailer at python.org Fri Feb 19 07:21:55 2021 From: webhook-mailer at python.org (vstinner) Date: Fri, 19 Feb 2021 12:21:55 -0000 Subject: [Python-checkins] bpo-40522: Replace PyThreadState_GET() with PyThreadState_Get() (GH-24575) Message-ID: https://github.com/python/cpython/commit/62078101ea1be5d2fc472a3f0d9d135e0bd5cd38 commit: 62078101ea1be5d2fc472a3f0d9d135e0bd5cd38 branch: master author: Victor Stinner committer: vstinner date: 2021-02-19T13:21:51+01:00 summary: bpo-40522: Replace PyThreadState_GET() with PyThreadState_Get() (GH-24575) Use directly the PyThreadState_Get() function in public header files, since PyThreadState_GET() macro is just an alias to it in pratice in these files. files: M Include/cpython/abstract.h M Include/cpython/object.h diff --git a/Include/cpython/abstract.h b/Include/cpython/abstract.h index db5055d201107..db85021964528 100644 --- a/Include/cpython/abstract.h +++ b/Include/cpython/abstract.h @@ -119,7 +119,7 @@ static inline PyObject * PyObject_Vectorcall(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwnames) { - PyThreadState *tstate = PyThreadState_GET(); + PyThreadState *tstate = PyThreadState_Get(); return _PyObject_VectorcallTstate(tstate, callable, args, nargsf, kwnames); } @@ -155,7 +155,7 @@ _PyObject_FastCallTstate(PyThreadState *tstate, PyObject *func, PyObject *const static inline PyObject * _PyObject_FastCall(PyObject *func, PyObject *const *args, Py_ssize_t nargs) { - PyThreadState *tstate = PyThreadState_GET(); + PyThreadState *tstate = PyThreadState_Get(); return _PyObject_FastCallTstate(tstate, func, args, nargs); } @@ -164,7 +164,7 @@ _PyObject_FastCall(PyObject *func, PyObject *const *args, Py_ssize_t nargs) PyObject_CallNoArgs(). */ static inline PyObject * _PyObject_CallNoArg(PyObject *func) { - PyThreadState *tstate = PyThreadState_GET(); + PyThreadState *tstate = PyThreadState_Get(); return _PyObject_VectorcallTstate(tstate, func, NULL, 0, NULL); } @@ -179,7 +179,7 @@ PyObject_CallOneArg(PyObject *func, PyObject *arg) assert(arg != NULL); args = _args + 1; // For PY_VECTORCALL_ARGUMENTS_OFFSET args[0] = arg; - tstate = PyThreadState_GET(); + tstate = PyThreadState_Get(); nargsf = 1 | PY_VECTORCALL_ARGUMENTS_OFFSET; return _PyObject_VectorcallTstate(tstate, func, args, nargsf, NULL); } diff --git a/Include/cpython/object.h b/Include/cpython/object.h index 86889f857689c..58e4d2b11b93f 100644 --- a/Include/cpython/object.h +++ b/Include/cpython/object.h @@ -528,7 +528,7 @@ PyAPI_FUNC(int) _PyTrash_cond(PyObject *op, destructor dealloc); /* If "cond" is false, then _tstate remains NULL and the deallocator \ * is run normally without involving the trashcan */ \ if (cond) { \ - _tstate = PyThreadState_GET(); \ + _tstate = PyThreadState_Get(); \ if (_PyTrash_begin(_tstate, _PyObject_CAST(op))) { \ break; \ } \ From webhook-mailer at python.org Fri Feb 19 07:33:20 2021 From: webhook-mailer at python.org (ambv) Date: Fri, 19 Feb 2021 12:33:20 -0000 Subject: [Python-checkins] Python 3.9.2 Message-ID: https://github.com/python/cpython/commit/1a79785e3e8fea80bcf6a800b45a04e06c787480 commit: 1a79785e3e8fea80bcf6a800b45a04e06c787480 branch: 3.9 author: ?ukasz Langa committer: ambv date: 2021-02-19T13:31:44+01:00 summary: Python 3.9.2 files: A Misc/NEWS.d/3.9.2.rst D Misc/NEWS.d/next/Windows/2021-02-10-04-16-51.bpo-43155.O1tURk.rst M Include/patchlevel.h M Lib/pydoc_data/topics.py M README.rst diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 1e84a276d8363..a23b2f15f79f9 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -19,11 +19,11 @@ #define PY_MAJOR_VERSION 3 #define PY_MINOR_VERSION 9 #define PY_MICRO_VERSION 2 -#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_GAMMA -#define PY_RELEASE_SERIAL 1 +#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL +#define PY_RELEASE_SERIAL 0 /* Version as a string */ -#define PY_VERSION "3.9.2rc1+" +#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/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py index acaae371aeb22..ae896c2e5afd6 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Autogenerated by Sphinx on Tue Feb 16 21:03:59 2021 +# Autogenerated by Sphinx on Fri Feb 19 13:29:38 2021 topics = {'assert': 'The "assert" statement\n' '**********************\n' '\n' diff --git a/Misc/NEWS.d/3.9.2.rst b/Misc/NEWS.d/3.9.2.rst new file mode 100644 index 0000000000000..a2756a9f9e076 --- /dev/null +++ b/Misc/NEWS.d/3.9.2.rst @@ -0,0 +1,7 @@ +.. bpo: 43155 +.. date: 2021-02-10-04-16-51 +.. nonce: O1tURk +.. release date: 2021-02-19 +.. section: Windows + +:c:func:`PyCMethod_New` is now present in ``python3.lib``. diff --git a/Misc/NEWS.d/next/Windows/2021-02-10-04-16-51.bpo-43155.O1tURk.rst b/Misc/NEWS.d/next/Windows/2021-02-10-04-16-51.bpo-43155.O1tURk.rst deleted file mode 100644 index 2eeef2b0ea27a..0000000000000 --- a/Misc/NEWS.d/next/Windows/2021-02-10-04-16-51.bpo-43155.O1tURk.rst +++ /dev/null @@ -1 +0,0 @@ -:c:func:`PyCMethod_New` is now present in ``python3.lib``. diff --git a/README.rst b/README.rst index a2d2b83180687..0a36bc16a958b 100644 --- a/README.rst +++ b/README.rst @@ -1,5 +1,5 @@ -This is Python version 3.9.2rc1 -=============================== +This is Python version 3.9.2 +============================ .. image:: https://travis-ci.org/python/cpython.svg?branch=3.9 :alt: CPython build status on Travis CI From webhook-mailer at python.org Fri Feb 19 07:33:35 2021 From: webhook-mailer at python.org (vstinner) Date: Fri, 19 Feb 2021 12:33:35 -0000 Subject: [Python-checkins] bpo-43268: _Py_IsMainInterpreter() now expects interp (GH-24577) Message-ID: https://github.com/python/cpython/commit/101bf69ff18a946fed7c274f088878aaf85174cc commit: 101bf69ff18a946fed7c274f088878aaf85174cc branch: master author: Victor Stinner committer: vstinner date: 2021-02-19T13:33:31+01:00 summary: bpo-43268: _Py_IsMainInterpreter() now expects interp (GH-24577) The _Py_IsMainInterpreter() function now expects interp rather than tstate. files: M Include/internal/pycore_pystate.h M Objects/longobject.c M Objects/typeobject.c M Objects/unicodeobject.c M Python/ceval.c M Python/context.c M Python/import.c M Python/pylifecycle.c M Python/pystate.c diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index 0cd5550cfda5c..4b894f3eff496 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -22,11 +22,11 @@ _Py_IsMainThread(void) static inline int -_Py_IsMainInterpreter(PyThreadState* tstate) +_Py_IsMainInterpreter(PyInterpreterState *interp) { /* 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); + return (interp == _PyRuntime.interpreters.main); } diff --git a/Objects/longobject.c b/Objects/longobject.c index 240e92a41e0ec..c0b4ce079e46a 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -5719,7 +5719,7 @@ _PyLong_Init(PyThreadState *tstate) tstate->interp->small_ints[i] = v; } - if (_Py_IsMainInterpreter(tstate)) { + if (_Py_IsMainInterpreter(tstate->interp)) { /* initialize int_info */ if (Int_InfoType.tp_name == NULL) { if (PyStructSequence_InitType2(&Int_InfoType, &int_info_desc) < 0) { diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 3498f0d484e01..9dbb7bed50b3f 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -286,7 +286,7 @@ void _PyType_Fini(PyThreadState *tstate) { _PyType_ClearCache(&tstate->interp->type_cache); - if (_Py_IsMainInterpreter(tstate)) { + if (_Py_IsMainInterpreter(tstate->interp)) { clear_slotdefs(); } } diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 64fd408085d5e..498f3933dec6a 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -15701,7 +15701,7 @@ _PyUnicode_Init(PyThreadState *tstate) return _PyStatus_NO_MEMORY(); } - if (_Py_IsMainInterpreter(tstate)) { + if (_Py_IsMainInterpreter(tstate->interp)) { /* initialize the linebreak bloom filter */ bloom_linebreak = make_bloom_mask( PyUnicode_2BYTE_KIND, linebreak, diff --git a/Python/ceval.c b/Python/ceval.c index 0b7400359e001..81a21c9a0f534 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -298,7 +298,7 @@ PyStatus _PyEval_InitGIL(PyThreadState *tstate) { #ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - if (!_Py_IsMainInterpreter(tstate)) { + if (!_Py_IsMainInterpreter(tstate->interp)) { /* Currently, the GIL is shared by all interpreters, and only the main interpreter is responsible to create and destroy it. */ @@ -326,7 +326,7 @@ void _PyEval_FiniGIL(PyThreadState *tstate) { #ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - if (!_Py_IsMainInterpreter(tstate)) { + if (!_Py_IsMainInterpreter(tstate->interp)) { /* Currently, the GIL is shared by all interpreters, and only the main interpreter is responsible to create and destroy it. */ diff --git a/Python/context.c b/Python/context.c index 82826bf928fa0..6a4562149cbec 100644 --- a/Python/context.c +++ b/Python/context.c @@ -1302,7 +1302,7 @@ _PyContext_ClearFreeList(PyThreadState *tstate) void _PyContext_Fini(PyThreadState *tstate) { - if (_Py_IsMainInterpreter(tstate)) { + if (_Py_IsMainInterpreter(tstate->interp)) { Py_CLEAR(_token_missing); } _PyContext_ClearFreeList(tstate); diff --git a/Python/import.c b/Python/import.c index 75ac21df82da9..6189dcfbe0eca 100644 --- a/Python/import.c +++ b/Python/import.c @@ -441,7 +441,7 @@ _PyImport_FixupExtensionObject(PyObject *mod, PyObject *name, return -1; } - if (_Py_IsMainInterpreter(tstate)) { + if (_Py_IsMainInterpreter(tstate->interp)) { if (def->m_size == -1) { if (def->m_base.m_copy) { /* Somebody already imported the module, diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index bf5dcdd107e20..f990fa6f1db3e 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -430,7 +430,7 @@ interpreter_update_config(PyThreadState *tstate, int only_update_path_config) } } - if (_Py_IsMainInterpreter(tstate)) { + if (_Py_IsMainInterpreter(tstate->interp)) { PyStatus status = _PyConfig_WritePathConfig(config); if (_PyStatus_EXCEPTION(status)) { _PyErr_SetFromPyStatus(status); @@ -627,7 +627,7 @@ static PyStatus pycore_init_types(PyThreadState *tstate) { PyStatus status; - int is_main_interp = _Py_IsMainInterpreter(tstate); + int is_main_interp = _Py_IsMainInterpreter(tstate->interp); status = _PyGC_Init(tstate); if (_PyStatus_EXCEPTION(status)) { @@ -1003,7 +1003,7 @@ init_interp_main(PyThreadState *tstate) assert(!_PyErr_Occurred(tstate)); PyStatus status; - int is_main_interp = _Py_IsMainInterpreter(tstate); + int is_main_interp = _Py_IsMainInterpreter(tstate->interp); PyInterpreterState *interp = tstate->interp; const PyConfig *config = _PyInterpreterState_GetConfig(interp); @@ -1597,7 +1597,7 @@ finalize_interp_types(PyThreadState *tstate) static void finalize_interp_clear(PyThreadState *tstate) { - int is_main_interp = _Py_IsMainInterpreter(tstate); + int is_main_interp = _Py_IsMainInterpreter(tstate->interp); /* Clear interpreter state and all thread states */ _PyInterpreterState_Clear(tstate); @@ -1622,7 +1622,7 @@ finalize_interp_clear(PyThreadState *tstate) static void finalize_interp_delete(PyThreadState *tstate) { - if (_Py_IsMainInterpreter(tstate)) { + if (_Py_IsMainInterpreter(tstate->interp)) { /* Cleanup auto-thread-state */ _PyGILState_Fini(tstate); } diff --git a/Python/pystate.c b/Python/pystate.c index 922e5bee2cbfc..f4fd03982181b 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -1327,7 +1327,7 @@ PyThreadState_IsCurrent(PyThreadState *tstate) PyStatus _PyGILState_Init(PyThreadState *tstate) { - if (!_Py_IsMainInterpreter(tstate)) { + if (!_Py_IsMainInterpreter(tstate->interp)) { /* Currently, PyGILState is shared by all interpreters. The main * interpreter is responsible to initialize it. */ return _PyStatus_OK(); From webhook-mailer at python.org Fri Feb 19 09:08:03 2021 From: webhook-mailer at python.org (vstinner) Date: Fri, 19 Feb 2021 14:08:03 -0000 Subject: [Python-checkins] bpo-43268: Remove abusive usage of tstate in sysmodule.c (#24581) Message-ID: https://github.com/python/cpython/commit/acde3f1530f1664c9ec7f22e16a7f54c5191e4a6 commit: acde3f1530f1664c9ec7f22e16a7f54c5191e4a6 branch: master author: Victor Stinner committer: vstinner date: 2021-02-19T15:07:59+01:00 summary: bpo-43268: Remove abusive usage of tstate in sysmodule.c (#24581) Remove explicit tstate usage in sysmodule.c when it's only used raise exceptions: get it implicitly using PyErr_XXX() functions. files: M Python/sysmodule.c diff --git a/Python/sysmodule.c b/Python/sysmodule.c index b9349effe3c87..33d4e2bbb6eac 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -838,8 +838,7 @@ 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. */ - PyThreadState *tstate = _PyThreadState_GET(); - _PyErr_SetObject(tstate, PyExc_SystemExit, status); + PyErr_SetObject(PyExc_SystemExit, status); return NULL; } @@ -905,15 +904,14 @@ 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(tstate, PyExc_TypeError, - "can't intern %.400s", Py_TYPE(s)->tp_name); + PyErr_Format(PyExc_TypeError, + "can't intern %.400s", Py_TYPE(s)->tp_name); return NULL; } } @@ -1141,10 +1139,9 @@ 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(tstate, PyExc_ValueError, - "switch interval must be strictly positive"); + PyErr_SetString(PyExc_ValueError, + "switch interval must be strictly positive"); return NULL; } _PyEval_SetSwitchInterval((unsigned long) (1e6 * interval)); @@ -1277,7 +1274,6 @@ 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, @@ -1287,9 +1283,9 @@ sys_set_asyncgen_hooks(PyObject *self, PyObject *args, PyObject *kw) if (finalizer && finalizer != Py_None) { if (!PyCallable_Check(finalizer)) { - _PyErr_Format(tstate, PyExc_TypeError, - "callable finalizer expected, got %.50s", - Py_TYPE(finalizer)->tp_name); + PyErr_Format(PyExc_TypeError, + "callable finalizer expected, got %.50s", + Py_TYPE(finalizer)->tp_name); return NULL; } if (_PyEval_SetAsyncGenFinalizer(finalizer) < 0) { @@ -1302,9 +1298,9 @@ sys_set_asyncgen_hooks(PyObject *self, PyObject *args, PyObject *kw) if (firstiter && firstiter != Py_None) { if (!PyCallable_Check(firstiter)) { - _PyErr_Format(tstate, PyExc_TypeError, - "callable firstiter expected, got %.50s", - Py_TYPE(firstiter)->tp_name); + PyErr_Format(PyExc_TypeError, + "callable firstiter expected, got %.50s", + Py_TYPE(firstiter)->tp_name); return NULL; } if (_PyEval_SetAsyncGenFirstiter(firstiter) < 0) { @@ -1505,7 +1501,6 @@ 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)) @@ -1556,11 +1551,10 @@ sys_getwindowsversion_impl(PyObject *module) realBuild )); - if (_PyErr_Occurred(tstate)) { + if (PyErr_Occurred()) { Py_DECREF(version); return NULL; } - return version; } From webhook-mailer at python.org Fri Feb 19 09:08:57 2021 From: webhook-mailer at python.org (vstinner) Date: Fri, 19 Feb 2021 14:08:57 -0000 Subject: [Python-checkins] bpo-43270: Remove private _PyErr_OCCURRED() macro (GH-24579) Message-ID: https://github.com/python/cpython/commit/a486054b24658fa623e030ddd4cc0cbfcac54ab0 commit: a486054b24658fa623e030ddd4cc0cbfcac54ab0 branch: master author: Victor Stinner committer: vstinner date: 2021-02-19T15:08:54+01:00 summary: bpo-43270: Remove private _PyErr_OCCURRED() macro (GH-24579) Remove the private _PyErr_OCCURRED() macro: use the public PyErr_Occurred() function instead. CPython internals must use the internal _PyErr_Occurred(tstate) function instead: it is the most efficient way to check if an exception was raised. files: A Misc/NEWS.d/next/C API/2021-02-19-14-28-26.bpo-43270.UKx4XN.rst M Include/pyerrors.h M Python/ceval.c diff --git a/Include/pyerrors.h b/Include/pyerrors.h index 979a26ba68a03..692d67175741e 100644 --- a/Include/pyerrors.h +++ b/Include/pyerrors.h @@ -30,12 +30,6 @@ PyAPI_FUNC(void) PyErr_SetExcInfo(PyObject *, PyObject *, PyObject *); macro is defined. */ PyAPI_FUNC(void) _Py_NO_RETURN Py_FatalError(const char *message); -#if defined(Py_DEBUG) || defined(Py_LIMITED_API) -#define _PyErr_OCCURRED() PyErr_Occurred() -#else -#define _PyErr_OCCURRED() (PyThreadState_GET()->curexc_type) -#endif - /* Error testing and normalization */ PyAPI_FUNC(int) PyErr_GivenExceptionMatches(PyObject *, PyObject *); PyAPI_FUNC(int) PyErr_ExceptionMatches(PyObject *); diff --git a/Misc/NEWS.d/next/C API/2021-02-19-14-28-26.bpo-43270.UKx4XN.rst b/Misc/NEWS.d/next/C API/2021-02-19-14-28-26.bpo-43270.UKx4XN.rst new file mode 100644 index 0000000000000..ab8c9772cb0f9 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2021-02-19-14-28-26.bpo-43270.UKx4XN.rst @@ -0,0 +1,2 @@ +Remove the private ``_PyErr_OCCURRED()`` macro: use the public +:c:func:`PyErr_Occurred` function instead. diff --git a/Python/ceval.c b/Python/ceval.c index 81a21c9a0f534..4771a516a96e8 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2750,7 +2750,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) (PyDictObject *)f->f_builtins, name); if (v == NULL) { - if (!_PyErr_OCCURRED()) { + if (!_PyErr_Occurred(tstate)) { /* _PyDict_LoadGlobal() returns NULL without raising * an exception if the key doesn't exist */ format_exc_check_arg(tstate, PyExc_NameError, From webhook-mailer at python.org Fri Feb 19 09:10:53 2021 From: webhook-mailer at python.org (vstinner) Date: Fri, 19 Feb 2021 14:10:53 -0000 Subject: [Python-checkins] bpo-43268: Pass interp rather than tstate to internal functions (GH-24580) Message-ID: https://github.com/python/cpython/commit/bcb094b41f7fe4dd1686c50891d85632fcf0d481 commit: bcb094b41f7fe4dd1686c50891d85632fcf0d481 branch: master author: Victor Stinner committer: vstinner date: 2021-02-19T15:10:45+01:00 summary: bpo-43268: Pass interp rather than tstate to internal functions (GH-24580) Pass the current interpreter (interp) rather than the current Python thread state (tstate) to internal functions which only use the interpreter. Modified functions: * _PyXXX_Fini() and _PyXXX_ClearFreeList() functions * _PyEval_SignalAsyncExc(), make_pending_calls() * _PySys_GetObject(), sys_set_object(), sys_set_object_id(), sys_set_object_str() * should_audit(), set_flags_from_config(), make_flags() * _PyAtExit_Call() * init_stdio_encoding() * etc. files: M Include/internal/pycore_ceval.h M Include/internal/pycore_context.h M Include/internal/pycore_gc.h M Include/internal/pycore_pylifecycle.h M Include/internal/pycore_warnings.h M Modules/atexitmodule.c M Modules/gcmodule.c M Objects/bytesobject.c M Objects/dictobject.c M Objects/exceptions.c M Objects/floatobject.c M Objects/frameobject.c M Objects/genobject.c M Objects/listobject.c M Objects/longobject.c M Objects/sliceobject.c M Objects/tupleobject.c M Objects/typeobject.c M Objects/unicodeobject.c M Python/_warnings.c M Python/bltinmodule.c M Python/ceval.c M Python/ceval_gil.h M Python/context.c M Python/import.c M Python/initconfig.c M Python/pylifecycle.c M Python/pystate.c M Python/sysmodule.c diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index bb22322114ecb..78a7056f2e7c3 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -23,7 +23,7 @@ PyAPI_FUNC(int) _PyEval_AddPendingCall( PyInterpreterState *interp, int (*func)(void *), void *arg); -PyAPI_FUNC(void) _PyEval_SignalAsyncExc(PyThreadState *tstate); +PyAPI_FUNC(void) _PyEval_SignalAsyncExc(PyInterpreterState *interp); #ifdef HAVE_FORK extern PyStatus _PyEval_ReInitThreads(PyThreadState *tstate); #endif @@ -55,7 +55,7 @@ extern int _PyEval_ThreadsInitialized(PyInterpreterState *interp); extern int _PyEval_ThreadsInitialized(struct pyruntimestate *runtime); #endif extern PyStatus _PyEval_InitGIL(PyThreadState *tstate); -extern void _PyEval_FiniGIL(PyThreadState *tstate); +extern void _PyEval_FiniGIL(PyInterpreterState *interp); extern void _PyEval_ReleaseLock(PyThreadState *tstate); diff --git a/Include/internal/pycore_context.h b/Include/internal/pycore_context.h index ea4b3c8ea738f..a482dd4212287 100644 --- a/Include/internal/pycore_context.h +++ b/Include/internal/pycore_context.h @@ -37,6 +37,6 @@ struct _pycontexttokenobject { int _PyContext_Init(void); -void _PyContext_Fini(PyThreadState *tstate); +void _PyContext_Fini(PyInterpreterState *interp); #endif /* !Py_INTERNAL_CONTEXT_H */ diff --git a/Include/internal/pycore_gc.h b/Include/internal/pycore_gc.h index e2d47c90c10d8..9db4a4716fa58 100644 --- a/Include/internal/pycore_gc.h +++ b/Include/internal/pycore_gc.h @@ -167,13 +167,13 @@ extern Py_ssize_t _PyGC_CollectNoFail(PyThreadState *tstate); // Functions to clear types free lists -extern void _PyFrame_ClearFreeList(PyThreadState *tstate); -extern void _PyTuple_ClearFreeList(PyThreadState *tstate); -extern void _PyFloat_ClearFreeList(PyThreadState *tstate); -extern void _PyList_ClearFreeList(PyThreadState *tstate); -extern void _PyDict_ClearFreeList(PyThreadState *tstate); -extern void _PyAsyncGen_ClearFreeLists(PyThreadState *tstate); -extern void _PyContext_ClearFreeList(PyThreadState *tstate); +extern void _PyFrame_ClearFreeList(PyInterpreterState *interp); +extern void _PyTuple_ClearFreeList(PyInterpreterState *interp); +extern void _PyFloat_ClearFreeList(PyInterpreterState *interp); +extern void _PyList_ClearFreeList(PyInterpreterState *interp); +extern void _PyDict_ClearFreeList(PyInterpreterState *interp); +extern void _PyAsyncGen_ClearFreeLists(PyInterpreterState *interp); +extern void _PyContext_ClearFreeList(PyInterpreterState *interp); #ifdef __cplusplus } diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index c9e6947ae6cfc..75f4cdbf9a735 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -31,21 +31,21 @@ PyAPI_FUNC(int) _Py_IsLocaleCoercionTarget(const char *ctype_loc); /* Various one-time initializers */ -extern PyStatus _PyUnicode_Init(PyThreadState *tstate); -extern PyStatus _PyBytes_Init(PyThreadState *tstate); +extern PyStatus _PyUnicode_Init(PyInterpreterState *interp); +extern PyStatus _PyBytes_Init(PyInterpreterState *interp); extern int _PyStructSequence_Init(void); -extern int _PyLong_Init(PyThreadState *tstate); -extern PyStatus _PyTuple_Init(PyThreadState *tstate); +extern int _PyLong_Init(PyInterpreterState *interp); +extern PyStatus _PyTuple_Init(PyInterpreterState *interp); extern PyStatus _PyFaulthandler_Init(int enable); extern int _PyTraceMalloc_Init(int enable); -extern PyObject * _PyBuiltin_Init(PyThreadState *tstate); +extern PyObject * _PyBuiltin_Init(PyInterpreterState *interp); extern PyStatus _PySys_Create( PyThreadState *tstate, PyObject **sysmod_p); extern PyStatus _PySys_ReadPreinitWarnOptions(PyWideStringList *options); extern PyStatus _PySys_ReadPreinitXOptions(PyConfig *config); extern int _PySys_UpdateConfig(PyThreadState *tstate); -extern PyStatus _PyExc_Init(PyThreadState *tstate); +extern PyStatus _PyExc_Init(PyInterpreterState *interp); extern PyStatus _PyErr_Init(void); extern PyStatus _PyBuiltins_AddExceptions(PyObject * bltinmod); extern int _PyFloat_Init(void); @@ -54,33 +54,33 @@ extern PyStatus _Py_HashRandomization_Init(const PyConfig *); extern PyStatus _PyTypes_Init(void); extern PyStatus _PyTypes_InitSlotDefs(void); extern PyStatus _PyImportZip_Init(PyThreadState *tstate); -extern PyStatus _PyGC_Init(PyThreadState *tstate); -extern PyStatus _PyAtExit_Init(PyThreadState *tstate); +extern PyStatus _PyGC_Init(PyInterpreterState *interp); +extern PyStatus _PyAtExit_Init(PyInterpreterState *interp); /* Various internal finalizers */ -extern void _PyFrame_Fini(PyThreadState *tstate); -extern void _PyDict_Fini(PyThreadState *tstate); -extern void _PyTuple_Fini(PyThreadState *tstate); -extern void _PyList_Fini(PyThreadState *tstate); -extern void _PyBytes_Fini(PyThreadState *tstate); -extern void _PyFloat_Fini(PyThreadState *tstate); -extern void _PySlice_Fini(PyThreadState *tstate); -extern void _PyAsyncGen_Fini(PyThreadState *tstate); +extern void _PyFrame_Fini(PyInterpreterState *interp); +extern void _PyDict_Fini(PyInterpreterState *interp); +extern void _PyTuple_Fini(PyInterpreterState *interp); +extern void _PyList_Fini(PyInterpreterState *interp); +extern void _PyBytes_Fini(PyInterpreterState *interp); +extern void _PyFloat_Fini(PyInterpreterState *interp); +extern void _PySlice_Fini(PyInterpreterState *interp); +extern void _PyAsyncGen_Fini(PyInterpreterState *interp); extern int _PySignal_Init(int install_signal_handlers); extern void _PySignal_Fini(void); -extern void _PyExc_Fini(PyThreadState *tstate); +extern void _PyExc_Fini(PyInterpreterState *interp); extern void _PyImport_Fini(void); extern void _PyImport_Fini2(void); -extern void _PyGC_Fini(PyThreadState *tstate); -extern void _PyType_Fini(PyThreadState *tstate); +extern void _PyGC_Fini(PyInterpreterState *interp); +extern void _PyType_Fini(PyInterpreterState *interp); extern void _Py_HashRandomization_Fini(void); -extern void _PyUnicode_Fini(PyThreadState *tstate); -extern void _PyUnicode_ClearInterned(PyThreadState *tstate); -extern void _PyLong_Fini(PyThreadState *tstate); +extern void _PyUnicode_Fini(PyInterpreterState *interp); +extern void _PyUnicode_ClearInterned(PyInterpreterState *interp); +extern void _PyLong_Fini(PyInterpreterState *interp); extern void _PyFaulthandler_Fini(void); extern void _PyHash_Fini(void); extern void _PyTraceMalloc_Fini(void); @@ -89,9 +89,9 @@ extern void _PyAST_Fini(PyInterpreterState *interp); extern void _PyAtExit_Fini(PyInterpreterState *interp); extern PyStatus _PyGILState_Init(PyThreadState *tstate); -extern void _PyGILState_Fini(PyThreadState *tstate); +extern void _PyGILState_Fini(PyInterpreterState *interp); -PyAPI_FUNC(void) _PyGC_DumpShutdownStats(PyThreadState *tstate); +PyAPI_FUNC(void) _PyGC_DumpShutdownStats(PyInterpreterState *interp); PyAPI_FUNC(PyStatus) _Py_PreInitializeFromPyArgv( const PyPreConfig *src_config, @@ -111,7 +111,7 @@ PyAPI_FUNC(void) _PyErr_Display(PyObject *file, PyObject *exception, PyAPI_FUNC(void) _PyThreadState_DeleteCurrent(PyThreadState *tstate); -extern void _PyAtExit_Call(PyThreadState *tstate); +extern void _PyAtExit_Call(PyInterpreterState *interp); #ifdef __cplusplus } diff --git a/Include/internal/pycore_warnings.h b/Include/internal/pycore_warnings.h index 2a473b860c47d..f728ec3077b3c 100644 --- a/Include/internal/pycore_warnings.h +++ b/Include/internal/pycore_warnings.h @@ -17,7 +17,7 @@ struct _warnings_runtime_state { long filters_version; }; -extern int _PyWarnings_InitState(PyThreadState *tstate); +extern int _PyWarnings_InitState(PyInterpreterState *interp); #ifdef __cplusplus } diff --git a/Modules/atexitmodule.c b/Modules/atexitmodule.c index 49e2a75137e4a..e536b4abe295f 100644 --- a/Modules/atexitmodule.c +++ b/Modules/atexitmodule.c @@ -52,9 +52,9 @@ atexit_cleanup(struct atexit_state *state) PyStatus -_PyAtExit_Init(PyThreadState *tstate) +_PyAtExit_Init(PyInterpreterState *interp) { - struct atexit_state *state = &tstate->interp->atexit; + struct atexit_state *state = &interp->atexit; // _PyAtExit_Init() must only be called once assert(state->callbacks == NULL); @@ -109,9 +109,9 @@ atexit_callfuncs(struct atexit_state *state) void -_PyAtExit_Call(PyThreadState *tstate) +_PyAtExit_Call(PyInterpreterState *interp) { - struct atexit_state *state = &tstate->interp->atexit; + struct atexit_state *state = &interp->atexit; atexit_callfuncs(state); } diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index f0d5699490823..21f6bd1a9b6d0 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -161,9 +161,9 @@ _PyGC_InitState(GCState *gcstate) PyStatus -_PyGC_Init(PyThreadState *tstate) +_PyGC_Init(PyInterpreterState *interp) { - GCState *gcstate = &tstate->interp->gc; + GCState *gcstate = &interp->gc; gcstate->garbage = PyList_New(0); if (gcstate->garbage == NULL) { @@ -1036,15 +1036,15 @@ delete_garbage(PyThreadState *tstate, GCState *gcstate, * Clearing the free lists may give back memory to the OS earlier. */ static void -clear_freelists(PyThreadState *tstate) +clear_freelists(PyInterpreterState *interp) { - _PyFrame_ClearFreeList(tstate); - _PyTuple_ClearFreeList(tstate); - _PyFloat_ClearFreeList(tstate); - _PyList_ClearFreeList(tstate); - _PyDict_ClearFreeList(tstate); - _PyAsyncGen_ClearFreeLists(tstate); - _PyContext_ClearFreeList(tstate); + _PyFrame_ClearFreeList(interp); + _PyTuple_ClearFreeList(interp); + _PyFloat_ClearFreeList(interp); + _PyList_ClearFreeList(interp); + _PyDict_ClearFreeList(interp); + _PyAsyncGen_ClearFreeLists(interp); + _PyContext_ClearFreeList(interp); } // Show stats for objects in each generations @@ -1323,7 +1323,7 @@ gc_collect_main(PyThreadState *tstate, int generation, /* Clear free list only during the collection of the highest * generation */ if (generation == NUM_GENERATIONS-1) { - clear_freelists(tstate); + clear_freelists(tstate->interp); } if (_PyErr_Occurred(tstate)) { @@ -2092,9 +2092,9 @@ _PyGC_CollectNoFail(PyThreadState *tstate) } void -_PyGC_DumpShutdownStats(PyThreadState *tstate) +_PyGC_DumpShutdownStats(PyInterpreterState *interp) { - GCState *gcstate = &tstate->interp->gc; + GCState *gcstate = &interp->gc; if (!(gcstate->debug & DEBUG_SAVEALL) && gcstate->garbage != NULL && PyList_GET_SIZE(gcstate->garbage) > 0) { const char *message; @@ -2129,9 +2129,9 @@ _PyGC_DumpShutdownStats(PyThreadState *tstate) } void -_PyGC_Fini(PyThreadState *tstate) +_PyGC_Fini(PyInterpreterState *interp) { - GCState *gcstate = &tstate->interp->gc; + GCState *gcstate = &interp->gc; Py_CLEAR(gcstate->garbage); Py_CLEAR(gcstate->callbacks); } diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index ccabbdca1d562..5814e8a54c7d4 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -3063,9 +3063,9 @@ _PyBytes_Resize(PyObject **pv, Py_ssize_t newsize) PyStatus -_PyBytes_Init(PyThreadState *tstate) +_PyBytes_Init(PyInterpreterState *interp) { - struct _Py_bytes_state *state = &tstate->interp->bytes; + struct _Py_bytes_state *state = &interp->bytes; if (bytes_create_empty_string_singleton(state) < 0) { return _PyStatus_NO_MEMORY(); } @@ -3074,9 +3074,9 @@ _PyBytes_Init(PyThreadState *tstate) void -_PyBytes_Fini(PyThreadState *tstate) +_PyBytes_Fini(PyInterpreterState *interp) { - struct _Py_bytes_state* state = &tstate->interp->bytes; + struct _Py_bytes_state* state = &interp->bytes; for (int i = 0; i < UCHAR_MAX + 1; i++) { Py_CLEAR(state->characters[i]); } diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 35e881fe27230..9b5898d13a880 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -260,9 +260,9 @@ get_dict_state(void) void -_PyDict_ClearFreeList(PyThreadState *tstate) +_PyDict_ClearFreeList(PyInterpreterState *interp) { - struct _Py_dict_state *state = &tstate->interp->dict_state; + struct _Py_dict_state *state = &interp->dict_state; while (state->numfree) { PyDictObject *op = state->free_list[--state->numfree]; assert(PyDict_CheckExact(op)); @@ -275,11 +275,11 @@ _PyDict_ClearFreeList(PyThreadState *tstate) void -_PyDict_Fini(PyThreadState *tstate) +_PyDict_Fini(PyInterpreterState *interp) { - _PyDict_ClearFreeList(tstate); + _PyDict_ClearFreeList(interp); #ifdef Py_DEBUG - struct _Py_dict_state *state = get_dict_state(); + struct _Py_dict_state *state = &interp->dict_state; state->numfree = -1; state->keys_numfree = -1; #endif diff --git a/Objects/exceptions.c b/Objects/exceptions.c index 62cec9a90f580..88e2287b14354 100644 --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -2529,9 +2529,9 @@ SimpleExtendsException(PyExc_Warning, ResourceWarning, #endif /* MS_WINDOWS */ PyStatus -_PyExc_Init(PyThreadState *tstate) +_PyExc_Init(PyInterpreterState *interp) { - struct _Py_exc_state *state = &tstate->interp->exc_state; + struct _Py_exc_state *state = &interp->exc_state; #define PRE_INIT(TYPE) \ if (!(_PyExc_ ## TYPE.tp_flags & Py_TPFLAGS_READY)) { \ @@ -2766,9 +2766,9 @@ _PyBuiltins_AddExceptions(PyObject *bltinmod) } void -_PyExc_Fini(PyThreadState *tstate) +_PyExc_Fini(PyInterpreterState *interp) { - struct _Py_exc_state *state = &tstate->interp->exc_state; + struct _Py_exc_state *state = &interp->exc_state; free_preallocated_memerrors(state); Py_CLEAR(state->errnomap); } diff --git a/Objects/floatobject.c b/Objects/floatobject.c index 34fb57a946afa..fdeb1896ffaee 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -2026,9 +2026,9 @@ _PyFloat_Init(void) } void -_PyFloat_ClearFreeList(PyThreadState *tstate) +_PyFloat_ClearFreeList(PyInterpreterState *interp) { - struct _Py_float_state *state = &tstate->interp->float_state; + struct _Py_float_state *state = &interp->float_state; PyFloatObject *f = state->free_list; while (f != NULL) { PyFloatObject *next = (PyFloatObject*) Py_TYPE(f); @@ -2040,11 +2040,11 @@ _PyFloat_ClearFreeList(PyThreadState *tstate) } void -_PyFloat_Fini(PyThreadState *tstate) +_PyFloat_Fini(PyInterpreterState *interp) { - _PyFloat_ClearFreeList(tstate); + _PyFloat_ClearFreeList(interp); #ifdef Py_DEBUG - struct _Py_float_state *state = &tstate->interp->float_state; + struct _Py_float_state *state = &interp->float_state; state->numfree = -1; #endif } diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 5f7fa40ff6e0e..0571bfed9c076 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -1109,9 +1109,9 @@ PyFrame_LocalsToFast(PyFrameObject *f, int clear) /* Clear out the free list */ void -_PyFrame_ClearFreeList(PyThreadState *tstate) +_PyFrame_ClearFreeList(PyInterpreterState *interp) { - struct _Py_frame_state *state = &tstate->interp->frame; + struct _Py_frame_state *state = &interp->frame; while (state->free_list != NULL) { PyFrameObject *f = state->free_list; state->free_list = state->free_list->f_back; @@ -1122,11 +1122,11 @@ _PyFrame_ClearFreeList(PyThreadState *tstate) } void -_PyFrame_Fini(PyThreadState *tstate) +_PyFrame_Fini(PyInterpreterState *interp) { - _PyFrame_ClearFreeList(tstate); + _PyFrame_ClearFreeList(interp); #ifdef Py_DEBUG - struct _Py_frame_state *state = &tstate->interp->frame; + struct _Py_frame_state *state = &interp->frame; state->numfree = -1; #endif } diff --git a/Objects/genobject.c b/Objects/genobject.c index bde92b462da19..26e27cc84c871 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -1489,9 +1489,9 @@ PyAsyncGen_New(PyFrameObject *f, PyObject *name, PyObject *qualname) void -_PyAsyncGen_ClearFreeLists(PyThreadState *tstate) +_PyAsyncGen_ClearFreeLists(PyInterpreterState *interp) { - struct _Py_async_gen_state *state = &tstate->interp->async_gen; + struct _Py_async_gen_state *state = &interp->async_gen; while (state->value_numfree) { _PyAsyncGenWrappedValue *o; @@ -1509,11 +1509,11 @@ _PyAsyncGen_ClearFreeLists(PyThreadState *tstate) } void -_PyAsyncGen_Fini(PyThreadState *tstate) +_PyAsyncGen_Fini(PyInterpreterState *interp) { - _PyAsyncGen_ClearFreeLists(tstate); + _PyAsyncGen_ClearFreeLists(interp); #ifdef Py_DEBUG - struct _Py_async_gen_state *state = &tstate->interp->async_gen; + struct _Py_async_gen_state *state = &interp->async_gen; state->value_numfree = -1; state->asend_numfree = -1; #endif diff --git a/Objects/listobject.c b/Objects/listobject.c index ca9df599a0bd4..415f9a27dde39 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -106,9 +106,9 @@ list_preallocate_exact(PyListObject *self, Py_ssize_t size) } void -_PyList_ClearFreeList(PyThreadState *tstate) +_PyList_ClearFreeList(PyInterpreterState *interp) { - struct _Py_list_state *state = &tstate->interp->list; + struct _Py_list_state *state = &interp->list; while (state->numfree) { PyListObject *op = state->free_list[--state->numfree]; assert(PyList_CheckExact(op)); @@ -117,11 +117,11 @@ _PyList_ClearFreeList(PyThreadState *tstate) } void -_PyList_Fini(PyThreadState *tstate) +_PyList_Fini(PyInterpreterState *interp) { - _PyList_ClearFreeList(tstate); + _PyList_ClearFreeList(interp); #ifdef Py_DEBUG - struct _Py_list_state *state = &tstate->interp->list; + struct _Py_list_state *state = &interp->list; state->numfree = -1; #endif } diff --git a/Objects/longobject.c b/Objects/longobject.c index c0b4ce079e46a..02b3603115602 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -5702,7 +5702,7 @@ PyLong_GetInfo(void) } int -_PyLong_Init(PyThreadState *tstate) +_PyLong_Init(PyInterpreterState *interp) { for (Py_ssize_t i=0; i < NSMALLNEGINTS + NSMALLPOSINTS; i++) { sdigit ival = (sdigit)i - NSMALLNEGINTS; @@ -5716,10 +5716,10 @@ _PyLong_Init(PyThreadState *tstate) Py_SET_SIZE(v, size); v->ob_digit[0] = (digit)abs(ival); - tstate->interp->small_ints[i] = v; + interp->small_ints[i] = v; } - if (_Py_IsMainInterpreter(tstate->interp)) { + if (_Py_IsMainInterpreter(interp)) { /* initialize int_info */ if (Int_InfoType.tp_name == NULL) { if (PyStructSequence_InitType2(&Int_InfoType, &int_info_desc) < 0) { @@ -5732,9 +5732,9 @@ _PyLong_Init(PyThreadState *tstate) } void -_PyLong_Fini(PyThreadState *tstate) +_PyLong_Fini(PyInterpreterState *interp) { for (Py_ssize_t i = 0; i < NSMALLNEGINTS + NSMALLPOSINTS; i++) { - Py_CLEAR(tstate->interp->small_ints[i]); + Py_CLEAR(interp->small_ints[i]); } } diff --git a/Objects/sliceobject.c b/Objects/sliceobject.c index 02ba033a62a49..22fb7c61c354f 100644 --- a/Objects/sliceobject.c +++ b/Objects/sliceobject.c @@ -97,9 +97,8 @@ PyObject _Py_EllipsisObject = { /* Slice object implementation */ -void _PySlice_Fini(PyThreadState *tstate) +void _PySlice_Fini(PyInterpreterState *interp) { - PyInterpreterState *interp = tstate->interp; PySliceObject *obj = interp->slice_cache; if (obj != NULL) { interp->slice_cache = NULL; diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c index 41677d7e710aa..becdf705985fe 100644 --- a/Objects/tupleobject.c +++ b/Objects/tupleobject.c @@ -1007,10 +1007,10 @@ _PyTuple_Resize(PyObject **pv, Py_ssize_t newsize) } void -_PyTuple_ClearFreeList(PyThreadState *tstate) +_PyTuple_ClearFreeList(PyInterpreterState *interp) { #if PyTuple_MAXSAVESIZE > 0 - struct _Py_tuple_state *state = &tstate->interp->tuple; + struct _Py_tuple_state *state = &interp->tuple; for (Py_ssize_t i = 1; i < PyTuple_MAXSAVESIZE; i++) { PyTupleObject *p = state->free_list[i]; state->free_list[i] = NULL; @@ -1027,9 +1027,9 @@ _PyTuple_ClearFreeList(PyThreadState *tstate) PyStatus -_PyTuple_Init(PyThreadState *tstate) +_PyTuple_Init(PyInterpreterState *interp) { - struct _Py_tuple_state *state = &tstate->interp->tuple; + struct _Py_tuple_state *state = &interp->tuple; if (tuple_create_empty_tuple_singleton(state) < 0) { return _PyStatus_NO_MEMORY(); } @@ -1038,14 +1038,14 @@ _PyTuple_Init(PyThreadState *tstate) void -_PyTuple_Fini(PyThreadState *tstate) +_PyTuple_Fini(PyInterpreterState *interp) { #if PyTuple_MAXSAVESIZE > 0 - struct _Py_tuple_state *state = &tstate->interp->tuple; + struct _Py_tuple_state *state = &interp->tuple; // The empty tuple singleton must not be tracked by the GC assert(!_PyObject_GC_IS_TRACKED(state->free_list[0])); Py_CLEAR(state->free_list[0]); - _PyTuple_ClearFreeList(tstate); + _PyTuple_ClearFreeList(interp); #ifdef Py_DEBUG state->numfree[0] = -1; #endif diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 9dbb7bed50b3f..33a7872ecc45c 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -283,10 +283,10 @@ PyType_ClearCache(void) void -_PyType_Fini(PyThreadState *tstate) +_PyType_Fini(PyInterpreterState *interp) { - _PyType_ClearCache(&tstate->interp->type_cache); - if (_Py_IsMainInterpreter(tstate->interp)) { + _PyType_ClearCache(&interp->type_cache); + if (_Py_IsMainInterpreter(interp)) { clear_slotdefs(); } } diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 498f3933dec6a..5e1b6b0531241 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -15682,7 +15682,7 @@ PyTypeObject PyUnicode_Type = { /* Initialize the Unicode implementation */ PyStatus -_PyUnicode_Init(PyThreadState *tstate) +_PyUnicode_Init(PyInterpreterState *interp) { /* XXX - move this array to unicodectype.c ? */ const Py_UCS2 linebreak[] = { @@ -15696,12 +15696,12 @@ _PyUnicode_Init(PyThreadState *tstate) 0x2029, /* PARAGRAPH SEPARATOR */ }; - struct _Py_unicode_state *state = &tstate->interp->unicode; + struct _Py_unicode_state *state = &interp->unicode; if (unicode_create_empty_string_singleton(state) < 0) { return _PyStatus_NO_MEMORY(); } - if (_Py_IsMainInterpreter(tstate->interp)) { + if (_Py_IsMainInterpreter(interp)) { /* initialize the linebreak bloom filter */ bloom_linebreak = make_bloom_mask( PyUnicode_2BYTE_KIND, linebreak, @@ -15813,9 +15813,9 @@ PyUnicode_InternFromString(const char *cp) void -_PyUnicode_ClearInterned(PyThreadState *tstate) +_PyUnicode_ClearInterned(PyInterpreterState *interp) { - struct _Py_unicode_state *state = &tstate->interp->unicode; + struct _Py_unicode_state *state = &interp->unicode; if (state->interned == NULL) { return; } @@ -16093,10 +16093,10 @@ config_get_codec_name(wchar_t **config_encoding) static PyStatus -init_stdio_encoding(PyThreadState *tstate) +init_stdio_encoding(PyInterpreterState *interp) { /* Update the stdio encoding to the normalized Python codec name. */ - PyConfig *config = (PyConfig*)_PyInterpreterState_GetConfig(tstate->interp); + PyConfig *config = (PyConfig*)_PyInterpreterState_GetConfig(interp); if (config_get_codec_name(&config->stdio_encoding) < 0) { return _PyStatus_ERR("failed to get the Python codec name " "of the stdio encoding"); @@ -16189,7 +16189,7 @@ _PyUnicode_InitEncodings(PyThreadState *tstate) return status; } - return init_stdio_encoding(tstate); + return init_stdio_encoding(tstate->interp); } @@ -16233,9 +16233,9 @@ _PyUnicode_EnableLegacyWindowsFSEncoding(void) void -_PyUnicode_Fini(PyThreadState *tstate) +_PyUnicode_Fini(PyInterpreterState *interp) { - struct _Py_unicode_state *state = &tstate->interp->unicode; + struct _Py_unicode_state *state = &interp->unicode; // _PyUnicode_ClearInterned() must be called before assert(state->interned == NULL); diff --git a/Python/_warnings.c b/Python/_warnings.c index 021400f5580d6..2c9a2a7687267 100644 --- a/Python/_warnings.c +++ b/Python/_warnings.c @@ -114,9 +114,9 @@ init_filters(void) /* Initialize the given warnings module state. */ int -_PyWarnings_InitState(PyThreadState *tstate) +_PyWarnings_InitState(PyInterpreterState *interp) { - WarningsState *st = &tstate->interp->warnings; + WarningsState *st = &interp->warnings; if (st->filters == NULL) { st->filters = init_filters(); diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 8c4e6e5107f9e..dec2984a068df 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -2853,11 +2853,11 @@ static struct PyModuleDef builtinsmodule = { PyObject * -_PyBuiltin_Init(PyThreadState *tstate) +_PyBuiltin_Init(PyInterpreterState *interp) { PyObject *mod, *dict, *debug; - const PyConfig *config = _PyInterpreterState_GetConfig(tstate->interp); + const PyConfig *config = _PyInterpreterState_GetConfig(interp); if (PyType_Ready(&PyFilter_Type) < 0 || PyType_Ready(&PyMap_Type) < 0 || diff --git a/Python/ceval.c b/Python/ceval.c index 4771a516a96e8..7ccb8fcf5ae54 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -323,10 +323,10 @@ _PyEval_InitGIL(PyThreadState *tstate) } void -_PyEval_FiniGIL(PyThreadState *tstate) +_PyEval_FiniGIL(PyInterpreterState *interp) { #ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - if (!_Py_IsMainInterpreter(tstate->interp)) { + if (!_Py_IsMainInterpreter(interp)) { /* Currently, the GIL is shared by all interpreters, and only the main interpreter is responsible to create and destroy it. */ @@ -335,9 +335,9 @@ _PyEval_FiniGIL(PyThreadState *tstate) #endif #ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - struct _gil_runtime_state *gil = &tstate->interp->ceval.gil; + struct _gil_runtime_state *gil = &interp->ceval.gil; #else - struct _gil_runtime_state *gil = &tstate->interp->runtime->ceval.gil; + struct _gil_runtime_state *gil = &interp->runtime->ceval.gil; #endif if (!gil_created(gil)) { /* First Py_InitializeFromConfig() call: the GIL doesn't exist @@ -502,10 +502,9 @@ _PyEval_ReInitThreads(PyThreadState *tstate) raised. */ void -_PyEval_SignalAsyncExc(PyThreadState *tstate) +_PyEval_SignalAsyncExc(PyInterpreterState *interp) { - assert(is_tstate_valid(tstate)); - SIGNAL_ASYNC_EXC(tstate->interp); + SIGNAL_ASYNC_EXC(interp); } PyThreadState * @@ -690,10 +689,8 @@ handle_signals(PyThreadState *tstate) } static int -make_pending_calls(PyThreadState *tstate) +make_pending_calls(PyInterpreterState *interp) { - assert(is_tstate_valid(tstate)); - /* only execute pending calls on main thread */ if (!_Py_ThreadCanHandlePendingCalls()) { return 0; @@ -708,11 +705,11 @@ make_pending_calls(PyThreadState *tstate) /* unsignal before starting to call callbacks, so that any callback added in-between re-signals */ - UNSIGNAL_PENDING_CALLS(tstate->interp); + UNSIGNAL_PENDING_CALLS(interp); int res = 0; /* perform a bounded number of calls, in case of recursion */ - struct _pending_calls *pending = &tstate->interp->ceval.pending; + struct _pending_calls *pending = &interp->ceval.pending; for (int i=0; iinterp); + SIGNAL_PENDING_CALLS(interp); return res; } @@ -745,6 +742,7 @@ void _Py_FinishPendingCalls(PyThreadState *tstate) { assert(PyGILState_Check()); + assert(is_tstate_valid(tstate)); struct _pending_calls *pending = &tstate->interp->ceval.pending; @@ -752,7 +750,7 @@ _Py_FinishPendingCalls(PyThreadState *tstate) return; } - if (make_pending_calls(tstate) < 0) { + if (make_pending_calls(tstate->interp) < 0) { PyObject *exc, *val, *tb; _PyErr_Fetch(tstate, &exc, &val, &tb); PyErr_BadInternalCall(); @@ -769,6 +767,7 @@ Py_MakePendingCalls(void) assert(PyGILState_Check()); PyThreadState *tstate = _PyThreadState_GET(); + assert(is_tstate_valid(tstate)); /* Python signal handler doesn't really queue a callback: it only signals that a signal was received, see _PyEval_SignalReceived(). */ @@ -777,7 +776,7 @@ Py_MakePendingCalls(void) return res; } - res = make_pending_calls(tstate); + res = make_pending_calls(tstate->interp); if (res != 0) { return res; } @@ -950,7 +949,7 @@ eval_frame_handle_pending(PyThreadState *tstate) /* 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) { + if (make_pending_calls(tstate->interp) != 0) { return -1; } } diff --git a/Python/ceval_gil.h b/Python/ceval_gil.h index 56944b89237fb..9b8b43253f04d 100644 --- a/Python/ceval_gil.h +++ b/Python/ceval_gil.h @@ -318,7 +318,7 @@ take_gil(PyThreadState *tstate) /* Don't access tstate if the thread must exit */ if (tstate->async_exc != NULL) { - _PyEval_SignalAsyncExc(tstate); + _PyEval_SignalAsyncExc(tstate->interp); } MUTEX_UNLOCK(gil->mutex); diff --git a/Python/context.c b/Python/context.c index 6a4562149cbec..bf2ba93c14eb8 100644 --- a/Python/context.c +++ b/Python/context.c @@ -1287,9 +1287,9 @@ get_token_missing(void) void -_PyContext_ClearFreeList(PyThreadState *tstate) +_PyContext_ClearFreeList(PyInterpreterState *interp) { - struct _Py_context_state *state = &tstate->interp->context; + struct _Py_context_state *state = &interp->context; for (; state->numfree; state->numfree--) { PyContext *ctx = state->freelist; state->freelist = (PyContext *)ctx->ctx_weakreflist; @@ -1300,14 +1300,14 @@ _PyContext_ClearFreeList(PyThreadState *tstate) void -_PyContext_Fini(PyThreadState *tstate) +_PyContext_Fini(PyInterpreterState *interp) { - if (_Py_IsMainInterpreter(tstate->interp)) { + if (_Py_IsMainInterpreter(interp)) { Py_CLEAR(_token_missing); } - _PyContext_ClearFreeList(tstate); + _PyContext_ClearFreeList(interp); #ifdef Py_DEBUG - struct _Py_context_state *state = &tstate->interp->context; + struct _Py_context_state *state = &interp->context; state->numfree = -1; #endif _PyHamt_Fini(); diff --git a/Python/import.c b/Python/import.c index 6189dcfbe0eca..538db69af6e0f 100644 --- a/Python/import.c +++ b/Python/import.c @@ -301,16 +301,16 @@ _PyImport_GetModuleId(struct _Py_Identifier *nameid) int _PyImport_SetModule(PyObject *name, PyObject *m) { - PyThreadState *tstate = _PyThreadState_GET(); - PyObject *modules = tstate->interp->modules; + PyInterpreterState *interp = _PyInterpreterState_GET(); + PyObject *modules = interp->modules; return PyObject_SetItem(modules, name, m); } int _PyImport_SetModuleString(const char *name, PyObject *m) { - PyThreadState *tstate = _PyThreadState_GET(); - PyObject *modules = tstate->interp->modules; + PyInterpreterState *interp = _PyInterpreterState_GET(); + PyObject *modules = interp->modules; return PyMapping_SetItemString(modules, name, m); } @@ -342,9 +342,8 @@ import_get_module(PyThreadState *tstate, PyObject *name) static int -import_ensure_initialized(PyThreadState *tstate, PyObject *mod, PyObject *name) +import_ensure_initialized(PyInterpreterState *interp, PyObject *mod, PyObject *name) { - PyInterpreterState *interp = tstate->interp; PyObject *spec; _Py_IDENTIFIER(_lock_unlock_module); @@ -1530,7 +1529,7 @@ PyImport_GetModule(PyObject *name) mod = import_get_module(tstate, name); if (mod != NULL && mod != Py_None) { - if (import_ensure_initialized(tstate, mod, name) < 0) { + if (import_ensure_initialized(tstate->interp, mod, name) < 0) { Py_DECREF(mod); remove_importlib_frames(tstate); return NULL; @@ -1594,7 +1593,7 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals, } if (mod != NULL && mod != Py_None) { - if (import_ensure_initialized(tstate, mod, name) < 0) { + if (import_ensure_initialized(tstate->interp, mod, name) < 0) { goto error; } } diff --git a/Python/initconfig.c b/Python/initconfig.c index 62087fb4208dd..7886d09f7a027 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -2909,8 +2909,8 @@ _Py_GetConfigsAsDict(void) Py_CLEAR(dict); /* pre config */ - PyThreadState *tstate = _PyThreadState_GET(); - const PyPreConfig *pre_config = &tstate->interp->runtime->preconfig; + PyInterpreterState *interp = _PyInterpreterState_GET(); + const PyPreConfig *pre_config = &interp->runtime->preconfig; dict = _PyPreConfig_AsDict(pre_config); if (dict == NULL) { goto error; @@ -2921,7 +2921,7 @@ _Py_GetConfigsAsDict(void) Py_CLEAR(dict); /* core config */ - const PyConfig *config = _PyInterpreterState_GetConfig(tstate->interp); + const PyConfig *config = _PyInterpreterState_GetConfig(interp); dict = _PyConfig_AsDict(config); if (dict == NULL) { goto error; diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index f990fa6f1db3e..ec770841c8de3 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -574,7 +574,7 @@ init_interp_create_gil(PyThreadState *tstate) /* finalize_interp_delete() comment explains why _PyEval_FiniGIL() is only called here. */ - _PyEval_FiniGIL(tstate); + _PyEval_FiniGIL(tstate->interp); /* Auto-thread-state API */ status = _PyGILState_Init(tstate); @@ -624,12 +624,12 @@ pycore_create_interpreter(_PyRuntimeState *runtime, static PyStatus -pycore_init_types(PyThreadState *tstate) +pycore_init_types(PyInterpreterState *interp) { PyStatus status; - int is_main_interp = _Py_IsMainInterpreter(tstate->interp); + int is_main_interp = _Py_IsMainInterpreter(interp); - status = _PyGC_Init(tstate); + status = _PyGC_Init(interp); if (_PyStatus_EXCEPTION(status)) { return status; } @@ -637,7 +637,7 @@ pycore_init_types(PyThreadState *tstate) // Create the empty tuple singleton. It must be created before the first // PyType_Ready() call since PyType_Ready() creates tuples, for tp_bases // for example. - status = _PyTuple_Init(tstate); + status = _PyTuple_Init(interp); if (_PyStatus_EXCEPTION(status)) { return status; } @@ -649,21 +649,21 @@ pycore_init_types(PyThreadState *tstate) } } - if (!_PyLong_Init(tstate)) { + if (!_PyLong_Init(interp)) { return _PyStatus_ERR("can't init longs"); } - status = _PyUnicode_Init(tstate); + status = _PyUnicode_Init(interp); if (_PyStatus_EXCEPTION(status)) { return status; } - status = _PyBytes_Init(tstate); + status = _PyBytes_Init(interp); if (_PyStatus_EXCEPTION(status)) { return status; } - status = _PyExc_Init(tstate); + status = _PyExc_Init(interp); if (_PyStatus_EXCEPTION(status)) { return status; } @@ -689,11 +689,11 @@ pycore_init_types(PyThreadState *tstate) } } - if (_PyWarnings_InitState(tstate) < 0) { + if (_PyWarnings_InitState(interp) < 0) { return _PyStatus_ERR("can't initialize warnings"); } - status = _PyAtExit_Init(tstate); + status = _PyAtExit_Init(interp); if (_PyStatus_EXCEPTION(status)) { return status; } @@ -703,16 +703,13 @@ pycore_init_types(PyThreadState *tstate) static PyStatus -pycore_init_builtins(PyThreadState *tstate) +pycore_init_builtins(PyInterpreterState *interp) { - assert(!_PyErr_Occurred(tstate)); - - PyObject *bimod = _PyBuiltin_Init(tstate); + PyObject *bimod = _PyBuiltin_Init(interp); if (bimod == NULL) { goto error; } - PyInterpreterState *interp = tstate->interp; if (_PyImport_FixupBuiltin(bimod, "builtins", interp->modules) < 0) { goto error; } @@ -743,8 +740,6 @@ pycore_init_builtins(PyThreadState *tstate) } interp->import_func = Py_NewRef(import_func); - assert(!_PyErr_Occurred(tstate)); - return _PyStatus_OK(); error: @@ -759,7 +754,7 @@ pycore_interp_init(PyThreadState *tstate) PyStatus status; PyObject *sysmod = NULL; - status = pycore_init_types(tstate); + status = pycore_init_types(tstate->interp); if (_PyStatus_EXCEPTION(status)) { goto done; } @@ -769,11 +764,15 @@ pycore_interp_init(PyThreadState *tstate) goto done; } - status = pycore_init_builtins(tstate); + assert(!_PyErr_Occurred(tstate)); + + status = pycore_init_builtins(tstate->interp); if (_PyStatus_EXCEPTION(status)) { goto done; } + assert(!_PyErr_Occurred(tstate)); + const PyConfig *config = _PyInterpreterState_GetConfig(tstate->interp); if (config->_install_importlib) { /* This call sets up builtin and frozen import support */ @@ -1464,7 +1463,7 @@ finalize_modules(PyThreadState *tstate) // Dump GC stats before it's too late, since it uses the warnings // machinery. - _PyGC_DumpShutdownStats(tstate); + _PyGC_DumpShutdownStats(interp); if (weaklist != NULL) { // Now, if there are any modules left alive, clear their globals to @@ -1570,27 +1569,27 @@ flush_std_files(void) static void -finalize_interp_types(PyThreadState *tstate) +finalize_interp_types(PyInterpreterState *interp) { - _PyExc_Fini(tstate); - _PyFrame_Fini(tstate); - _PyAsyncGen_Fini(tstate); - _PyContext_Fini(tstate); - _PyType_Fini(tstate); + _PyExc_Fini(interp); + _PyFrame_Fini(interp); + _PyAsyncGen_Fini(interp); + _PyContext_Fini(interp); + _PyType_Fini(interp); // Call _PyUnicode_ClearInterned() before _PyDict_Fini() since it uses // a dict internally. - _PyUnicode_ClearInterned(tstate); + _PyUnicode_ClearInterned(interp); - _PyDict_Fini(tstate); - _PyList_Fini(tstate); - _PyTuple_Fini(tstate); + _PyDict_Fini(interp); + _PyList_Fini(interp); + _PyTuple_Fini(interp); - _PySlice_Fini(tstate); + _PySlice_Fini(interp); - _PyBytes_Fini(tstate); - _PyUnicode_Fini(tstate); - _PyFloat_Fini(tstate); - _PyLong_Fini(tstate); + _PyBytes_Fini(interp); + _PyUnicode_Fini(interp); + _PyFloat_Fini(interp); + _PyLong_Fini(interp); } @@ -1615,16 +1614,16 @@ finalize_interp_clear(PyThreadState *tstate) _Py_ClearFileSystemEncoding(); } - finalize_interp_types(tstate); + finalize_interp_types(tstate->interp); } static void -finalize_interp_delete(PyThreadState *tstate) +finalize_interp_delete(PyInterpreterState *interp) { - if (_Py_IsMainInterpreter(tstate->interp)) { + if (_Py_IsMainInterpreter(interp)) { /* Cleanup auto-thread-state */ - _PyGILState_Fini(tstate); + _PyGILState_Fini(interp); } /* We can't call _PyEval_FiniGIL() here because destroying the GIL lock can @@ -1633,7 +1632,7 @@ finalize_interp_delete(PyThreadState *tstate) created GIL, which ensures that Py_Initialize / Py_FinalizeEx can be called multiple times. */ - PyInterpreterState_Delete(tstate->interp); + PyInterpreterState_Delete(interp); } @@ -1666,7 +1665,7 @@ Py_FinalizeEx(void) * the threads created via Threading. */ - _PyAtExit_Call(tstate); + _PyAtExit_Call(tstate->interp); /* Copy the core config, PyInterpreterState_Delete() free the core config memory */ @@ -1779,7 +1778,7 @@ Py_FinalizeEx(void) #endif /* Py_TRACE_REFS */ finalize_interp_clear(tstate); - finalize_interp_delete(tstate); + finalize_interp_delete(tstate->interp); #ifdef Py_TRACE_REFS /* Display addresses (& refcnts) of all objects still alive. @@ -1954,7 +1953,7 @@ Py_EndInterpreter(PyThreadState *tstate) // Wrap up existing "threading"-module-created, non-daemon threads. wait_for_thread_shutdown(tstate); - _PyAtExit_Call(tstate); + _PyAtExit_Call(tstate->interp); if (tstate != interp->tstate_head || tstate->next != NULL) { Py_FatalError("not the last thread"); @@ -1963,7 +1962,7 @@ Py_EndInterpreter(PyThreadState *tstate) finalize_modules(tstate); finalize_interp_clear(tstate); - finalize_interp_delete(tstate); + finalize_interp_delete(tstate->interp); } /* Add the __main__ module */ diff --git a/Python/pystate.c b/Python/pystate.c index f4fd03982181b..1623babeff4b2 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -324,7 +324,7 @@ interpreter_clear(PyInterpreterState *interp, PyThreadState *tstate) /* Last garbage collection on this interpreter */ _PyGC_CollectNoFail(tstate); - _PyGC_Fini(tstate); + _PyGC_Fini(interp); /* We don't clear sysdict and builtins until the end of this function. Because clearing other attributes can execute arbitrary Python code @@ -1146,7 +1146,7 @@ PyThreadState_SetAsyncExc(unsigned long id, PyObject *exc) HEAD_UNLOCK(runtime); Py_XDECREF(old_exc); - _PyEval_SignalAsyncExc(tstate); + _PyEval_SignalAsyncExc(tstate->interp); return 1; } HEAD_UNLOCK(runtime); @@ -1357,9 +1357,9 @@ _PyGILState_GetInterpreterStateUnsafe(void) } void -_PyGILState_Fini(PyThreadState *tstate) +_PyGILState_Fini(PyInterpreterState *interp) { - struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate; + struct _gilstate_runtime_state *gilstate = &interp->runtime->gilstate; PyThread_tss_delete(&gilstate->autoTSSkey); gilstate->autoInterpreterState = NULL; } diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 33d4e2bbb6eac..13b9034bf7369 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -86,9 +86,9 @@ _PySys_GetObjectId(_Py_Identifier *key) } static PyObject * -_PySys_GetObject(PyThreadState *tstate, const char *name) +_PySys_GetObject(PyInterpreterState *interp, const char *name) { - PyObject *sysdict = tstate->interp->sysdict; + PyObject *sysdict = interp->sysdict; if (sysdict == NULL) { return NULL; } @@ -102,7 +102,7 @@ PySys_GetObject(const char *name) PyObject *exc_type, *exc_value, *exc_tb; _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb); - PyObject *value = _PySys_GetObject(tstate, name); + PyObject *value = _PySys_GetObject(tstate->interp, name); /* XXX Suppress a new exception if it was raised and restore * the old one. */ _PyErr_Restore(tstate, exc_type, exc_value, exc_tb); @@ -110,12 +110,12 @@ PySys_GetObject(const char *name) } static int -sys_set_object(PyThreadState *tstate, PyObject *key, PyObject *v) +sys_set_object(PyInterpreterState *interp, PyObject *key, PyObject *v) { if (key == NULL) { return -1; } - PyObject *sd = tstate->interp->sysdict; + PyObject *sd = interp->sysdict; if (v == NULL) { v = _PyDict_Pop(sd, key, Py_None); if (v == NULL) { @@ -130,24 +130,24 @@ sys_set_object(PyThreadState *tstate, PyObject *key, PyObject *v) } static int -sys_set_object_id(PyThreadState *tstate, _Py_Identifier *key, PyObject *v) +sys_set_object_id(PyInterpreterState *interp, _Py_Identifier *key, PyObject *v) { - return sys_set_object(tstate, _PyUnicode_FromId(key), v); + return sys_set_object(interp, _PyUnicode_FromId(key), v); } int _PySys_SetObjectId(_Py_Identifier *key, PyObject *v) { - PyThreadState *tstate = _PyThreadState_GET(); - return sys_set_object_id(tstate, key, v); + PyInterpreterState *interp = _PyInterpreterState_GET(); + return sys_set_object_id(interp, key, v); } static int -sys_set_object_str(PyThreadState *tstate, const char *name, PyObject *v) +sys_set_object_str(PyInterpreterState *interp, const char *name, PyObject *v) { PyObject *key = v ? PyUnicode_InternFromString(name) : PyUnicode_FromString(name); - int r = sys_set_object(tstate, key, v); + int r = sys_set_object(interp, key, v); Py_XDECREF(key); return r; } @@ -155,22 +155,21 @@ sys_set_object_str(PyThreadState *tstate, const char *name, PyObject *v) int PySys_SetObject(const char *name, PyObject *v) { - PyThreadState *tstate = _PyThreadState_GET(); - return sys_set_object_str(tstate, name, v); + PyInterpreterState *interp = _PyInterpreterState_GET(); + return sys_set_object_str(interp, name, v); } static int -should_audit(PyInterpreterState *is) +should_audit(PyInterpreterState *interp) { - /* tstate->interp cannot be NULL, but test it just in case - for extra safety */ - assert(is != NULL); - if (!is) { + /* interp must not be NULL, but test it just in case for extra safety */ + assert(interp != NULL); + if (!interp) { return 0; } - return (is->runtime->audit_hook_head - || is->audit_hooks + return (interp->runtime->audit_hook_head + || interp->audit_hooks || PyDTrace_AUDIT_ENABLED()); } @@ -455,15 +454,15 @@ sys_addaudithook_impl(PyObject *module, PyObject *hook) return NULL; } - PyInterpreterState *is = tstate->interp; - if (is->audit_hooks == NULL) { - is->audit_hooks = PyList_New(0); - if (is->audit_hooks == NULL) { + PyInterpreterState *interp = tstate->interp; + if (interp->audit_hooks == NULL) { + interp->audit_hooks = PyList_New(0); + if (interp->audit_hooks == NULL) { return NULL; } } - if (PyList_Append(is->audit_hooks, hook) < 0) { + if (PyList_Append(interp->audit_hooks, hook) < 0) { return NULL; } @@ -1607,8 +1606,8 @@ static PyObject * sys_setdlopenflags_impl(PyObject *module, int new_val) /*[clinic end generated code: output=ec918b7fe0a37281 input=4c838211e857a77f]*/ { - PyThreadState *tstate = _PyThreadState_GET(); - tstate->interp->dlopenflags = new_val; + PyInterpreterState *interp = _PyInterpreterState_GET(); + interp->dlopenflags = new_val; Py_RETURN_NONE; } @@ -1625,8 +1624,8 @@ static PyObject * sys_getdlopenflags_impl(PyObject *module) /*[clinic end generated code: output=e92cd1bc5005da6e input=dc4ea0899c53b4b6]*/ { - PyThreadState *tstate = _PyThreadState_GET(); - return PyLong_FromLong(tstate->interp->dlopenflags); + PyInterpreterState *interp = _PyInterpreterState_GET(); + return PyLong_FromLong(interp->dlopenflags); } #endif /* HAVE_DLOPEN */ @@ -2217,7 +2216,7 @@ get_warnoptions(PyThreadState *tstate) if (warnoptions == NULL) { return NULL; } - if (sys_set_object_id(tstate, &PyId_warnoptions, warnoptions)) { + if (sys_set_object_id(tstate->interp, &PyId_warnoptions, warnoptions)) { Py_DECREF(warnoptions); return NULL; } @@ -2310,7 +2309,7 @@ get_xoptions(PyThreadState *tstate) if (xoptions == NULL) { return NULL; } - if (sys_set_object_id(tstate, &PyId__xoptions, xoptions)) { + if (sys_set_object_id(tstate->interp, &PyId__xoptions, xoptions)) { Py_DECREF(xoptions); return NULL; } @@ -2511,9 +2510,8 @@ static PyStructSequence_Desc flags_desc = { }; static int -set_flags_from_config(PyObject *flags, PyThreadState *tstate) +set_flags_from_config(PyInterpreterState *interp, PyObject *flags) { - PyInterpreterState *interp = tstate->interp; const PyPreConfig *preconfig = &interp->runtime->preconfig; const PyConfig *config = _PyInterpreterState_GetConfig(interp); @@ -2554,14 +2552,14 @@ set_flags_from_config(PyObject *flags, PyThreadState *tstate) static PyObject* -make_flags(PyThreadState *tstate) +make_flags(PyInterpreterState *interp) { PyObject *flags = PyStructSequence_New(&FlagsType); if (flags == NULL) { return NULL; } - if (set_flags_from_config(flags, tstate) < 0) { + if (set_flags_from_config(interp, flags) < 0) { Py_DECREF(flags); return NULL; } @@ -2819,7 +2817,7 @@ _PySys_InitCore(PyThreadState *tstate, PyObject *sysdict) goto type_init_failed; } } - SET_SYS("flags", make_flags(tstate)); + SET_SYS("flags", make_flags(tstate->interp)); /* prevent user from creating new instances */ FlagsType.tp_init = NULL; FlagsType.tp_new = NULL; @@ -2941,8 +2939,9 @@ sys_create_xoptions_dict(const PyConfig *config) int _PySys_UpdateConfig(PyThreadState *tstate) { - PyObject *sysdict = tstate->interp->sysdict; - const PyConfig *config = _PyInterpreterState_GetConfig(tstate->interp); + PyInterpreterState *interp = tstate->interp; + PyObject *sysdict = interp->sysdict; + const PyConfig *config = _PyInterpreterState_GetConfig(interp); int res; #define COPY_LIST(KEY, VALUE) \ @@ -2985,11 +2984,11 @@ _PySys_UpdateConfig(PyThreadState *tstate) #undef COPY_WSTR // sys.flags - PyObject *flags = _PySys_GetObject(tstate, "flags"); // borrowed ref + PyObject *flags = _PySys_GetObject(interp, "flags"); // borrowed ref if (flags == NULL) { return -1; } - if (set_flags_from_config(flags, tstate) < 0) { + if (set_flags_from_config(interp, flags) < 0) { return -1; } @@ -3129,8 +3128,8 @@ PySys_SetPath(const wchar_t *path) PyObject *v; if ((v = makepathobject(path, DELIM)) == NULL) Py_FatalError("can't create sys.path"); - PyThreadState *tstate = _PyThreadState_GET(); - if (sys_set_object_id(tstate, &PyId_path, v) != 0) { + PyInterpreterState *interp = _PyInterpreterState_GET(); + if (sys_set_object_id(interp, &PyId_path, v) != 0) { Py_FatalError("can't assign sys.path"); } Py_DECREF(v); @@ -3171,7 +3170,7 @@ PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath) if (av == NULL) { Py_FatalError("no mem for sys.argv"); } - if (sys_set_object_str(tstate, "argv", av) != 0) { + if (sys_set_object_str(tstate->interp, "argv", av) != 0) { Py_DECREF(av); Py_FatalError("can't assign sys.argv"); } From webhook-mailer at python.org Fri Feb 19 09:51:58 2021 From: webhook-mailer at python.org (vstinner) Date: Fri, 19 Feb 2021 14:51:58 -0000 Subject: [Python-checkins] bpo-43268: local_clear() uses _PyInterpreterState_GET() (GH-24583) Message-ID: https://github.com/python/cpython/commit/839184f85cb2d2ad514fff9b431733d1c9607533 commit: 839184f85cb2d2ad514fff9b431733d1c9607533 branch: master author: Victor Stinner committer: vstinner date: 2021-02-19T15:51:36+01:00 summary: bpo-43268: local_clear() uses _PyInterpreterState_GET() (GH-24583) Cleanup also the code. files: M Modules/_threadmodule.c diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index 9b8757715a0b9..f6217e672f7aa 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -828,27 +828,26 @@ local_traverse(localobject *self, visitproc visit, void *arg) static int local_clear(localobject *self) { - PyThreadState *tstate; Py_CLEAR(self->args); Py_CLEAR(self->kw); Py_CLEAR(self->dummies); Py_CLEAR(self->wr_callback); /* Remove all strong references to dummies from the thread states */ - if (self->key - && (tstate = PyThreadState_Get()) - && tstate->interp) { - for(tstate = PyInterpreterState_ThreadHead(tstate->interp); - tstate; - tstate = PyThreadState_Next(tstate)) - if (tstate->dict) { - PyObject *v = _PyDict_Pop(tstate->dict, self->key, Py_None); - if (v == NULL) { - PyErr_Clear(); - } - else { - Py_DECREF(v); - } + if (self->key) { + PyInterpreterState *interp = _PyInterpreterState_GET(); + PyThreadState *tstate = PyInterpreterState_ThreadHead(interp); + for(; tstate; tstate = PyThreadState_Next(tstate)) { + if (tstate->dict == NULL) { + continue; } + PyObject *v = _PyDict_Pop(tstate->dict, self->key, Py_None); + if (v != NULL) { + Py_DECREF(v); + } + else { + PyErr_Clear(); + } + } } return 0; } From webhook-mailer at python.org Fri Feb 19 09:55:54 2021 From: webhook-mailer at python.org (vstinner) Date: Fri, 19 Feb 2021 14:55:54 -0000 Subject: [Python-checkins] bpo-35134: Move non-limited C API files to Include/cpython/ (GH-24561) Message-ID: https://github.com/python/cpython/commit/4a6bf276ed3e6687394afe26b0d9a061ac06fc6b commit: 4a6bf276ed3e6687394afe26b0d9a061ac06fc6b branch: master author: Nicholas Sim committer: vstinner date: 2021-02-19T15:55:46+01:00 summary: bpo-35134: Move non-limited C API files to Include/cpython/ (GH-24561) Include/{odictobject.h,parser_interface.h,picklebufobject.h,pydebug.h,pyfpe.h} into Include/cpython/. Parser: peg_api: include Python.h instead of parser_interface.h. files: A Include/cpython/odictobject.h A Include/cpython/parser_interface.h A Include/cpython/picklebufobject.h A Include/cpython/pydebug.h A Include/cpython/pyfpe.h A Misc/NEWS.d/next/C API/2021-02-18-18-46-42.bpo-35134.dFpEDT.rst D Include/odictobject.h D Include/parser_interface.h D Include/picklebufobject.h D Include/pydebug.h D Include/pyfpe.h M Doc/whatsnew/3.10.rst M Include/Python.h M Makefile.pre.in M PCbuild/pythoncore.vcxproj M PCbuild/pythoncore.vcxproj.filters M Parser/peg_api.c M Python/pythonrun.c M Tools/scripts/stable_abi.py diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index b903b3e0b81d9..c4a79b6a1e98f 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -934,6 +934,14 @@ Porting to Python 3.10 bugs like ``if (PyList_SET_ITEM (a, b, c) < 0) ...`` test. (Contributed by Zackery Spytz and Victor Stinner in :issue:`30459`.) +* The non-limited API files ``odictobject.h``, ``parser_interface.h``, + ``picklebufobject.h``, ``pyarena.h``, ``pyctype.h``, ``pydebug.h``, + ``pyfpe.h``, and ``pytime.h`` have been moved to the ``Include/cpython`` + directory. These files must not be included directly, as they are already + included in ``Python.h``: :ref:`Include Files `. If they have + been included directly, consider including ``Python.h`` instead. + (Contributed by Nicholas Sim in :issue:`35134`) + Deprecated ---------- diff --git a/Include/Python.h b/Include/Python.h index c71a71f875e3e..86dbbcf6bd85d 100644 --- a/Include/Python.h +++ b/Include/Python.h @@ -89,7 +89,7 @@ #include "typeslots.h" #include "pyhash.h" -#include "pydebug.h" +#include "cpython/pydebug.h" #include "bytearrayobject.h" #include "bytesobject.h" @@ -104,7 +104,7 @@ #include "tupleobject.h" #include "listobject.h" #include "dictobject.h" -#include "odictobject.h" +#include "cpython/odictobject.h" #include "enumobject.h" #include "setobject.h" #include "methodobject.h" @@ -126,7 +126,7 @@ #include "weakrefobject.h" #include "structseq.h" #include "namespaceobject.h" -#include "picklebufobject.h" +#include "cpython/picklebufobject.h" #include "cpython/pytime.h" #include "codecs.h" @@ -141,7 +141,7 @@ #include "modsupport.h" #include "compile.h" #include "pythonrun.h" -#include "parser_interface.h" +#include "cpython/parser_interface.h" #include "pylifecycle.h" #include "ceval.h" #include "sysmodule.h" @@ -158,7 +158,7 @@ #include "pystrtod.h" #include "pystrcmp.h" #include "fileutils.h" -#include "pyfpe.h" +#include "cpython/pyfpe.h" #include "tracemalloc.h" #endif /* !Py_PYTHON_H */ diff --git a/Include/odictobject.h b/Include/cpython/odictobject.h similarity index 100% rename from Include/odictobject.h rename to Include/cpython/odictobject.h diff --git a/Include/parser_interface.h b/Include/cpython/parser_interface.h similarity index 100% rename from Include/parser_interface.h rename to Include/cpython/parser_interface.h diff --git a/Include/picklebufobject.h b/Include/cpython/picklebufobject.h similarity index 100% rename from Include/picklebufobject.h rename to Include/cpython/picklebufobject.h diff --git a/Include/pydebug.h b/Include/cpython/pydebug.h similarity index 100% rename from Include/pydebug.h rename to Include/cpython/pydebug.h diff --git a/Include/pyfpe.h b/Include/cpython/pyfpe.h similarity index 100% rename from Include/pyfpe.h rename to Include/cpython/pyfpe.h diff --git a/Makefile.pre.in b/Makefile.pre.in index e4ac248d1f02e..0f59700952989 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -316,7 +316,7 @@ PEGEN_OBJS= \ PEGEN_HEADERS= \ - $(srcdir)/Include/parser_interface.h \ + $(srcdir)/Include/cpython/parser_interface.h \ $(srcdir)/Parser/pegen.h \ $(srcdir)/Parser/string_parser.h @@ -1056,17 +1056,13 @@ PYTHON_HEADERS= \ $(srcdir)/Include/namespaceobject.h \ $(srcdir)/Include/object.h \ $(srcdir)/Include/objimpl.h \ - $(srcdir)/Include/odictobject.h \ $(srcdir)/Include/opcode.h \ $(srcdir)/Include/osdefs.h \ $(srcdir)/Include/osmodule.h \ $(srcdir)/Include/patchlevel.h \ - $(srcdir)/Include/picklebufobject.h \ $(srcdir)/Include/pycapsule.h \ - $(srcdir)/Include/pydebug.h \ $(srcdir)/Include/pydtrace.h \ $(srcdir)/Include/pyerrors.h \ - $(srcdir)/Include/pyfpe.h \ $(srcdir)/Include/pyframe.h \ $(srcdir)/Include/pyhash.h \ $(srcdir)/Include/pylifecycle.h \ @@ -1116,9 +1112,13 @@ PYTHON_HEADERS= \ $(srcdir)/Include/cpython/methodobject.h \ $(srcdir)/Include/cpython/object.h \ $(srcdir)/Include/cpython/objimpl.h \ + $(srcdir)/Include/cpython/odictobject.h \ + $(srcdir)/Include/cpython/picklebufobject.h \ $(srcdir)/Include/cpython/pyarena.h \ $(srcdir)/Include/cpython/pyctype.h \ + $(srcdir)/Include/cpython/pydebug.h \ $(srcdir)/Include/cpython/pyerrors.h \ + $(srcdir)/Include/cpython/pyfpe.h \ $(srcdir)/Include/cpython/pylifecycle.h \ $(srcdir)/Include/cpython/pymem.h \ $(srcdir)/Include/cpython/pystate.h \ diff --git a/Misc/NEWS.d/next/C API/2021-02-18-18-46-42.bpo-35134.dFpEDT.rst b/Misc/NEWS.d/next/C API/2021-02-18-18-46-42.bpo-35134.dFpEDT.rst new file mode 100644 index 0000000000000..5384cb8288f33 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2021-02-18-18-46-42.bpo-35134.dFpEDT.rst @@ -0,0 +1,3 @@ +Move odictobject.h, parser_interface.h, picklebufobject.h, pydebug.h, and +pyfpe.h into the cpython/ directory. They must not be included directly, as +they are already included by Python.h: :ref:`Include Files `. diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 89b6218a2739a..92355a886d91a 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -142,9 +142,14 @@ + + + + + @@ -220,19 +225,14 @@ - - - - - diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index bd8fd3433bce0..d0b69dbc5b64f 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -171,27 +171,18 @@ Include - - Include - Include Include - - Include - Include Include - - Include - Include @@ -378,9 +369,6 @@ Modules - - Include - Parser @@ -420,6 +408,9 @@ Include\cpython + + Include + Include\cpython @@ -432,15 +423,27 @@ Include\cpython + + Include + + + Include + Include Include + + Include + Include\cpython + + Include + Include\cpython @@ -474,9 +477,6 @@ Include\cpython - - Include - Include\internal diff --git a/Parser/peg_api.c b/Parser/peg_api.c index 8381d5e86b0db..1555dea51c2d9 100644 --- a/Parser/peg_api.c +++ b/Parser/peg_api.c @@ -1,4 +1,4 @@ -#include "parser_interface.h" +#include "Python.h" #include "tokenizer.h" #include "pegen.h" diff --git a/Python/pythonrun.c b/Python/pythonrun.c index dacf1a647106f..338a1b96d39e1 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -26,8 +26,6 @@ #include "symtable.h" // PySymtable_BuildObject() #include "marshal.h" // PyMarshal_ReadLongFromFile() -#include "parser_interface.h" // PyParser_ASTFrom* - #ifdef MS_WINDOWS # include "malloc.h" // alloca() #endif diff --git a/Tools/scripts/stable_abi.py b/Tools/scripts/stable_abi.py index 44f426e096adc..cc1009da1bde2 100755 --- a/Tools/scripts/stable_abi.py +++ b/Tools/scripts/stable_abi.py @@ -23,7 +23,6 @@ "longintrepr.h", "parsetok.h", "pyatomic.h", - "pydebug.h", "pytime.h", "symtable.h", "token.h", From webhook-mailer at python.org Fri Feb 19 10:32:52 2021 From: webhook-mailer at python.org (benjaminp) Date: Fri, 19 Feb 2021 15:32:52 -0000 Subject: [Python-checkins] closes bpo-43266: Improve array formatting. (GH-24573) Message-ID: https://github.com/python/cpython/commit/2d3e463e4a5aa109d1c15c86f9631580f5ef7a7e commit: 2d3e463e4a5aa109d1c15c86f9631580f5ef7a7e branch: master author: Erlend Egeberg Aasland committer: benjaminp date: 2021-02-19T09:32:31-06:00 summary: closes bpo-43266: Improve array formatting. (GH-24573) files: M Doc/c-api/conversion.rst diff --git a/Doc/c-api/conversion.rst b/Doc/c-api/conversion.rst index e47072f04747a..7b4cc1cacdd4a 100644 --- a/Doc/c-api/conversion.rst +++ b/Doc/c-api/conversion.rst @@ -25,7 +25,7 @@ functions :c:func:`snprintf` and :c:func:`vsnprintf`. Their purpose is to guarantee consistent behavior in corner cases, which the Standard C functions do not. -The wrappers ensure that *str*[*size*-1] is always ``'\0'`` upon return. They +The wrappers ensure that ``str[size-1]`` is always ``'\0'`` upon return. They never write more than *size* bytes (including the trailing ``'\0'``) into str. Both functions require that ``str != NULL``, ``size > 0``, ``format != NULL`` and ``size < INT_MAX``. @@ -34,13 +34,13 @@ The return value (*rv*) for these functions should be interpreted as follows: * When ``0 <= rv < size``, the output conversion was successful and *rv* characters were written to *str* (excluding the trailing ``'\0'`` byte at - *str*[*rv*]). + ``str[rv]``). * When ``rv >= size``, the output conversion was truncated and a buffer with - ``rv + 1`` bytes would have been needed to succeed. *str*[*size*-1] is ``'\0'`` + ``rv + 1`` bytes would have been needed to succeed. ``str[size-1]`` is ``'\0'`` in this case. -* When ``rv < 0``, "something bad happened." *str*[*size*-1] is ``'\0'`` in +* When ``rv < 0``, "something bad happened." ``str[size-1]`` is ``'\0'`` in this case too, but the rest of *str* is undefined. The exact cause of the error depends on the underlying platform. From webhook-mailer at python.org Fri Feb 19 10:55:52 2021 From: webhook-mailer at python.org (miss-islington) Date: Fri, 19 Feb 2021 15:55:52 -0000 Subject: [Python-checkins] closes bpo-43266: Improve array formatting. (GH-24573) Message-ID: https://github.com/python/cpython/commit/1cfed3d5b0ec1419c8a1d5cf8bff1a6e1483771a commit: 1cfed3d5b0ec1419c8a1d5cf8bff1a6e1483771a branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2021-02-19T07:55:44-08:00 summary: closes bpo-43266: Improve array formatting. (GH-24573) (cherry picked from commit 2d3e463e4a5aa109d1c15c86f9631580f5ef7a7e) Co-authored-by: Erlend Egeberg Aasland files: M Doc/c-api/conversion.rst diff --git a/Doc/c-api/conversion.rst b/Doc/c-api/conversion.rst index ee76accae62b8..0cc836b70a018 100644 --- a/Doc/c-api/conversion.rst +++ b/Doc/c-api/conversion.rst @@ -25,7 +25,7 @@ functions :c:func:`snprintf` and :c:func:`vsnprintf`. Their purpose is to guarantee consistent behavior in corner cases, which the Standard C functions do not. -The wrappers ensure that *str*[*size*-1] is always ``'\0'`` upon return. They +The wrappers ensure that ``str[size-1]`` is always ``'\0'`` upon return. They never write more than *size* bytes (including the trailing ``'\0'``) into str. Both functions require that ``str != NULL``, ``size > 0`` and ``format != NULL``. @@ -38,13 +38,13 @@ The return value (*rv*) for these functions should be interpreted as follows: * When ``0 <= rv < size``, the output conversion was successful and *rv* characters were written to *str* (excluding the trailing ``'\0'`` byte at - *str*[*rv*]). + ``str[rv]``). * When ``rv >= size``, the output conversion was truncated and a buffer with - ``rv + 1`` bytes would have been needed to succeed. *str*[*size*-1] is ``'\0'`` + ``rv + 1`` bytes would have been needed to succeed. ``str[size-1]`` is ``'\0'`` in this case. -* When ``rv < 0``, "something bad happened." *str*[*size*-1] is ``'\0'`` in +* When ``rv < 0``, "something bad happened." ``str[size-1]`` is ``'\0'`` in this case too, but the rest of *str* is undefined. The exact cause of the error depends on the underlying platform. From webhook-mailer at python.org Fri Feb 19 18:27:09 2021 From: webhook-mailer at python.org (zooba) Date: Fri, 19 Feb 2021 23:27:09 -0000 Subject: [Python-checkins] bpo-42825: Enable /OPT:REF (GH-24098) Message-ID: https://github.com/python/cpython/commit/b4af629f4d4868ef74ee298d66259fae78c7fd89 commit: b4af629f4d4868ef74ee298d66259fae78c7fd89 branch: master author: Austin Lamb committer: zooba date: 2021-02-19T23:27:01Z summary: bpo-42825: Enable /OPT:REF (GH-24098) We explicitly disable /OPT:ICF as some manual optimisations depend on some functions still having distinct pointers (such as wrap_binary_func and wrap_binary_func_l). files: M PCbuild/pyproject.props diff --git a/PCbuild/pyproject.props b/PCbuild/pyproject.props index 98e5ab030321d..834b27c86d42c 100644 --- a/PCbuild/pyproject.props +++ b/PCbuild/pyproject.props @@ -74,6 +74,7 @@ PGInstrument PGUpdate advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;%(AdditionalDependencies) + /OPT:REF,NOICF %(AdditionalOptions) true From webhook-mailer at python.org Fri Feb 19 19:26:33 2021 From: webhook-mailer at python.org (terryjreedy) Date: Sat, 20 Feb 2021 00:26:33 -0000 Subject: [Python-checkins] bpo-43042: Augment tutorial sentence (GH-24514) Message-ID: https://github.com/python/cpython/commit/b30fcba3a8abaabd1087f2392ae8aec4c1b1f210 commit: b30fcba3a8abaabd1087f2392ae8aec4c1b1f210 branch: master author: Terry Jan Reedy committer: terryjreedy date: 2021-02-19T19:26:21-05:00 summary: bpo-43042: Augment tutorial sentence (GH-24514) Calling same function also gets new local namespace. files: M Doc/tutorial/controlflow.rst diff --git a/Doc/tutorial/controlflow.rst b/Doc/tutorial/controlflow.rst index b8aec2b04f13f..9ee18f75847e7 100644 --- a/Doc/tutorial/controlflow.rst +++ b/Doc/tutorial/controlflow.rst @@ -297,7 +297,8 @@ referenced. The actual parameters (arguments) to a function call are introduced in the local symbol table of the called function when it is called; thus, arguments are passed using *call by value* (where the *value* is always an object *reference*, -not the value of the object). [#]_ When a function calls another function, a new +not the value of the object). [#]_ When a function calls another function, +or calls itself recursively, a new local symbol table is created for that call. A function definition associates the function name with the function object in From webhook-mailer at python.org Fri Feb 19 19:36:14 2021 From: webhook-mailer at python.org (miss-islington) Date: Sat, 20 Feb 2021 00:36:14 -0000 Subject: [Python-checkins] bpo-43042: Augment tutorial sentence (GH-24514) Message-ID: https://github.com/python/cpython/commit/a072788c57f7a40ecc53cb32f795f4ec844c0aba commit: a072788c57f7a40ecc53cb32f795f4ec844c0aba branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2021-02-19T16:36:07-08:00 summary: bpo-43042: Augment tutorial sentence (GH-24514) Calling same function also gets new local namespace. (cherry picked from commit b30fcba3a8abaabd1087f2392ae8aec4c1b1f210) Co-authored-by: Terry Jan Reedy files: M Doc/tutorial/controlflow.rst diff --git a/Doc/tutorial/controlflow.rst b/Doc/tutorial/controlflow.rst index 3af288a17b270..97b4c6363a239 100644 --- a/Doc/tutorial/controlflow.rst +++ b/Doc/tutorial/controlflow.rst @@ -294,7 +294,8 @@ referenced. The actual parameters (arguments) to a function call are introduced in the local symbol table of the called function when it is called; thus, arguments are passed using *call by value* (where the *value* is always an object *reference*, -not the value of the object). [#]_ When a function calls another function, a new +not the value of the object). [#]_ When a function calls another function, +or calls itself recursively, a new local symbol table is created for that call. A function definition associates the function name with the function object in From webhook-mailer at python.org Fri Feb 19 19:47:05 2021 From: webhook-mailer at python.org (miss-islington) Date: Sat, 20 Feb 2021 00:47:05 -0000 Subject: [Python-checkins] bpo-43042: Augment tutorial sentence (GH-24514) Message-ID: https://github.com/python/cpython/commit/a67fd011eadfae7103ca9e0a0b0f8312e4f00b0f commit: a67fd011eadfae7103ca9e0a0b0f8312e4f00b0f branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2021-02-19T16:46:57-08:00 summary: bpo-43042: Augment tutorial sentence (GH-24514) Calling same function also gets new local namespace. (cherry picked from commit b30fcba3a8abaabd1087f2392ae8aec4c1b1f210) Co-authored-by: Terry Jan Reedy files: M Doc/tutorial/controlflow.rst diff --git a/Doc/tutorial/controlflow.rst b/Doc/tutorial/controlflow.rst index 3af288a17b270..97b4c6363a239 100644 --- a/Doc/tutorial/controlflow.rst +++ b/Doc/tutorial/controlflow.rst @@ -294,7 +294,8 @@ referenced. The actual parameters (arguments) to a function call are introduced in the local symbol table of the called function when it is called; thus, arguments are passed using *call by value* (where the *value* is always an object *reference*, -not the value of the object). [#]_ When a function calls another function, a new +not the value of the object). [#]_ When a function calls another function, +or calls itself recursively, a new local symbol table is created for that call. A function definition associates the function name with the function object in From webhook-mailer at python.org Fri Feb 19 20:36:22 2021 From: webhook-mailer at python.org (pablogsal) Date: Sat, 20 Feb 2021 01:36:22 -0000 Subject: [Python-checkins] [3.9] bpo-43272: Fix old parser test failures for backported grammar constructs (GH-24591) Message-ID: https://github.com/python/cpython/commit/f9d1bf2de07131a8d80bc1e4914ee534bc5effa4 commit: f9d1bf2de07131a8d80bc1e4914ee534bc5effa4 branch: 3.9 author: Pablo Galindo committer: pablogsal date: 2021-02-20T01:36:15Z summary: [3.9] bpo-43272: Fix old parser test failures for backported grammar constructs (GH-24591) files: M Lib/test/test_fstring.py M Lib/test/test_named_expressions.py M Lib/test/test_unpack_ex.py diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py index 2f08d35f26dc3..05e7102d624f3 100644 --- a/Lib/test/test_fstring.py +++ b/Lib/test/test_fstring.py @@ -374,10 +374,10 @@ def test_ast_line_numbers_with_parentheses(self): # 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) + self.assertEqual(call.lineno, 4 if use_old_parser() else 5) + self.assertEqual(call.end_lineno, 4 if use_old_parser() else 5) + self.assertEqual(call.col_offset, 13 if use_old_parser() else 27) + self.assertEqual(call.end_col_offset, 17 if use_old_parser() else 31) # check the second wat self.assertEqual(type(wat2), ast.Constant) self.assertEqual(wat2.lineno, 4) diff --git a/Lib/test/test_named_expressions.py b/Lib/test/test_named_expressions.py index 2adcd4b5d6466..55c003888d478 100644 --- a/Lib/test/test_named_expressions.py +++ b/Lib/test/test_named_expressions.py @@ -1,4 +1,5 @@ import unittest +from test.support import use_old_parser GLOBAL_VAR = None @@ -167,6 +168,7 @@ def test_named_expression_invalid_list_comprehension_iterable_expression(self): with self.assertRaisesRegex(SyntaxError, msg): exec(f"lambda: {code}", {}) # Function scope + @unittest.skipIf(use_old_parser(), "Old parser does not support walruses in set comprehensions") def test_named_expression_invalid_rebinding_set_comprehension_iteration_variable(self): cases = [ ("Local reuse", 'i', "{i := 0 for i in range(5)}"), @@ -199,6 +201,7 @@ def test_named_expression_invalid_rebinding_set_comprehension_inner_loop(self): with self.assertRaisesRegex(SyntaxError, msg): exec(f"lambda: {code}", {}) # Function scope + @unittest.skipIf(use_old_parser(), "Old parser does not support walruses in set comprehensions") def test_named_expression_invalid_set_comprehension_iterable_expression(self): cases = [ ("Top level", "{i for i in (i := range(5))}"), diff --git a/Lib/test/test_unpack_ex.py b/Lib/test/test_unpack_ex.py index 049e48b13fa1f..2dff57c268f07 100644 --- a/Lib/test/test_unpack_ex.py +++ b/Lib/test/test_unpack_ex.py @@ -1,5 +1,7 @@ # Tests for extended unpacking, starred expressions. +from test.support import use_old_parser + doctests = """ Unpack tuple @@ -346,6 +348,26 @@ ... 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)" + >>> compile(s, 'test', 'exec') # doctest:+ELLIPSIS + Traceback (most recent call last): + ... + SyntaxError: too many expressions in star-unpacking assignment + + >>> s = ", ".join("a%d" % i for i in range(1<<8 + 1)) + ", *rest = range(1<<8 + 2)" + >>> compile(s, 'test', 'exec') # doctest:+ELLIPSIS + Traceback (most recent call last): + ... + SyntaxError: too many expressions in star-unpacking assignment + +(there is an additional limit, on the number of expressions after the +'*rest', but it's 1<<24 and testing it takes too much memory.) + +""" + +new_parser_doctests = """\ >>> (*x),y = 1, 2 # doctest:+ELLIPSIS Traceback (most recent call last): ... @@ -370,27 +392,12 @@ 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)" - >>> compile(s, 'test', 'exec') # doctest:+ELLIPSIS - Traceback (most recent call last): - ... - SyntaxError: too many expressions in star-unpacking assignment - - >>> s = ", ".join("a%d" % i for i in range(1<<8 + 1)) + ", *rest = range(1<<8 + 2)" - >>> compile(s, 'test', 'exec') # doctest:+ELLIPSIS - Traceback (most recent call last): - ... - SyntaxError: too many expressions in star-unpacking assignment - -(there is an additional limit, on the number of expressions after the -'*rest', but it's 1<<24 and testing it takes too much memory.) - """ -__test__ = {'doctests' : doctests} +if use_old_parser(): + __test__ = {'doctests' : doctests} +else: + __test__ = {'doctests' : doctests + new_parser_doctests} def test_main(verbose=False): from test import support From webhook-mailer at python.org Fri Feb 19 23:22:44 2021 From: webhook-mailer at python.org (tirkarthi) Date: Sat, 20 Feb 2021 04:22:44 -0000 Subject: [Python-checkins] Fix typo in dis module doc (GH-24509) Message-ID: https://github.com/python/cpython/commit/292f23186c6573bc1c3fa4f6e91116e8ee444cf4 commit: 292f23186c6573bc1c3fa4f6e91116e8ee444cf4 branch: master author: Irit Katriel committer: tirkarthi date: 2021-02-20T09:52:37+05:30 summary: Fix typo in dis module doc (GH-24509) files: M Doc/library/dis.rst diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index f3b25383c53d1..dad836997c0af 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -346,7 +346,7 @@ The Python compiler currently generates the following bytecode instructions. .. opcode:: ROT_FOUR - Lifts second, third and forth stack items one position up, moves top down + Lifts second, third and fourth stack items one position up, moves top down to position four. .. versionadded:: 3.8 From webhook-mailer at python.org Fri Feb 19 23:31:25 2021 From: webhook-mailer at python.org (miss-islington) Date: Sat, 20 Feb 2021 04:31:25 -0000 Subject: [Python-checkins] Fix typo in dis module doc (GH-24509) Message-ID: https://github.com/python/cpython/commit/9a12c213c6f26876c9e00a8cebef3bc9030b6b99 commit: 9a12c213c6f26876c9e00a8cebef3bc9030b6b99 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2021-02-19T20:31:18-08:00 summary: Fix typo in dis module doc (GH-24509) (cherry picked from commit 292f23186c6573bc1c3fa4f6e91116e8ee444cf4) Co-authored-by: Irit Katriel files: M Doc/library/dis.rst diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index 015be2029502a..f282415cc33d4 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -346,7 +346,7 @@ The Python compiler currently generates the following bytecode instructions. .. opcode:: ROT_FOUR - Lifts second, third and forth stack items one position up, moves top down + Lifts second, third and fourth stack items one position up, moves top down to position four. .. versionadded:: 3.8 From webhook-mailer at python.org Fri Feb 19 23:46:50 2021 From: webhook-mailer at python.org (miss-islington) Date: Sat, 20 Feb 2021 04:46:50 -0000 Subject: [Python-checkins] Fix typo in dis module doc (GH-24509) Message-ID: https://github.com/python/cpython/commit/216cb1469f566ba5493bf53a73da9ccdac05ccfc commit: 216cb1469f566ba5493bf53a73da9ccdac05ccfc branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2021-02-19T20:46:34-08:00 summary: Fix typo in dis module doc (GH-24509) (cherry picked from commit 292f23186c6573bc1c3fa4f6e91116e8ee444cf4) Co-authored-by: Irit Katriel files: M Doc/library/dis.rst diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index c1e72d1d1633b..08730c4d99351 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -346,7 +346,7 @@ The Python compiler currently generates the following bytecode instructions. .. opcode:: ROT_FOUR - Lifts second, third and forth stack items one position up, moves top down + Lifts second, third and fourth stack items one position up, moves top down to position four. .. versionadded:: 3.8 From webhook-mailer at python.org Sat Feb 20 05:03:57 2021 From: webhook-mailer at python.org (corona10) Date: Sat, 20 Feb 2021 10:03:57 -0000 Subject: [Python-checkins] Fix typo in launcher.c (GH-24497) Message-ID: https://github.com/python/cpython/commit/4233ff3ee4add287b3617f38943d01a7a6f4d7c4 commit: 4233ff3ee4add287b3617f38943d01a7a6f4d7c4 branch: master author: Ikko Ashimine committer: corona10 date: 2021-02-20T19:03:50+09:00 summary: Fix typo in launcher.c (GH-24497) files: M PC/launcher.c diff --git a/PC/launcher.c b/PC/launcher.c index cc2d35b2c4cb7..f5b225ac08cfe 100644 --- a/PC/launcher.c +++ b/PC/launcher.c @@ -1552,8 +1552,8 @@ Launcher arguments:\n\n\ 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 With -2 or -3 flag a matching PY_PYTHON2 or PY_PYTHON3 Environment variable", stdout); + fputws(L"\n A PY_PYTHON Environment 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); From webhook-mailer at python.org Sat Feb 20 09:17:26 2021 From: webhook-mailer at python.org (vstinner) Date: Sat, 20 Feb 2021 14:17:26 -0000 Subject: [Python-checkins] bpo-42990: Functions inherit current builtins (GH-24564) Message-ID: https://github.com/python/cpython/commit/46496f9d12582bf11f4911ad0f23315d6f277907 commit: 46496f9d12582bf11f4911ad0f23315d6f277907 branch: master author: Victor Stinner committer: vstinner date: 2021-02-20T15:17:18+01:00 summary: bpo-42990: Functions inherit current builtins (GH-24564) The types.FunctionType constructor now inherits the current builtins if the globals dictionary has no "__builtins__" key, rather than using {"None": None} as builtins: same behavior as eval() and exec() functions. Defining a function with "def function(...): ..." in Python is not affected, globals cannot be overriden with this syntax: it also inherits the current builtins. PyFrame_New(), PyEval_EvalCode(), PyEval_EvalCodeEx(), PyFunction_New() and PyFunction_NewWithQualName() now inherits the current builtins namespace if the globals dictionary has no "__builtins__" key. * Add _PyEval_GetBuiltins() function. * _PyEval_BuiltinsFromGlobals() now uses _PyEval_GetBuiltins() if builtins cannot be found in globals. * Add tstate parameter to _PyEval_BuiltinsFromGlobals(). files: A Misc/NEWS.d/next/Core and Builtins/2021-02-18-15-12-30.bpo-42990.toAqBH.rst M Doc/whatsnew/3.10.rst M Include/internal/pycore_ceval.h M Lib/test/test_funcattrs.py M Objects/frameobject.c M Objects/funcobject.c M Python/ceval.c diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index c4a79b6a1e98f..2ceb26fabb8e7 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -282,7 +282,8 @@ Other Language Changes * Functions have a new ``__builtins__`` attribute which is used to look for builtin symbols when a function is executed, instead of looking into - ``__globals__['__builtins__']``. + ``__globals__['__builtins__']``. The attribute is initialized from + ``__globals__["__builtins__"]`` if it exists, else from the current builtins. (Contributed by Mark Shannon in :issue:`42990`.) @@ -789,6 +790,14 @@ Changes in the Python API (Contributed by Yurii Karabas, Andrew Svetlov, Yury Selivanov and Kyle Stanley in :issue:`42392`.) +* The :data:`types.FunctionType` constructor now inherits the current builtins + if the *globals* dictionary has no ``"__builtins__"`` key, rather than using + ``{"None": None}`` as builtins: same behavior as :func:`eval` and + :func:`exec` functions. Defining a function with ``def function(...): ...`` + in Python is not affected, globals cannot be overriden with this syntax: it + also inherits the current builtins. + (Contributed by Victor Stinner in :issue:`42990`.) + CPython bytecode changes ======================== diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index 78a7056f2e7c3..f07959da770d9 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -34,7 +34,10 @@ PyAPI_FUNC(void) _PyEval_SetCoroutineOriginTrackingDepth( void _PyEval_Fini(void); -extern PyObject *_PyEval_BuiltinsFromGlobals(PyObject *globals); +extern PyObject* _PyEval_GetBuiltins(PyThreadState *tstate); +extern PyObject *_PyEval_BuiltinsFromGlobals( + PyThreadState *tstate, + PyObject *globals); static inline PyObject* diff --git a/Lib/test/test_funcattrs.py b/Lib/test/test_funcattrs.py index 15cf250f192a9..77977d0ae966f 100644 --- a/Lib/test/test_funcattrs.py +++ b/Lib/test/test_funcattrs.py @@ -1,3 +1,4 @@ +import textwrap import types import unittest @@ -78,6 +79,32 @@ def test___builtins__(self): self.cannot_set_attr(self.b, '__builtins__', 2, (AttributeError, TypeError)) + # bpo-42990: If globals is specified and has no "__builtins__" key, + # a function inherits the current builtins namespace. + def func(s): return len(s) + ns = {} + func2 = type(func)(func.__code__, ns) + self.assertIs(func2.__globals__, ns) + self.assertIs(func2.__builtins__, __builtins__) + + # Make sure that the function actually works. + self.assertEqual(func2("abc"), 3) + self.assertEqual(ns, {}) + + # Define functions using exec() with different builtins, + # and test inheritance when globals has no "__builtins__" key + code = textwrap.dedent(""" + def func3(s): pass + func4 = type(func3)(func3.__code__, {}) + """) + safe_builtins = {'None': None} + ns = {'type': type, '__builtins__': safe_builtins} + exec(code, ns) + self.assertIs(ns['func3'].__builtins__, safe_builtins) + self.assertIs(ns['func4'].__builtins__, safe_builtins) + self.assertIs(ns['func3'].__globals__['__builtins__'], safe_builtins) + self.assertNotIn('__builtins__', ns['func4'].__globals__) + def test___closure__(self): a = 12 def f(): print(a) diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-02-18-15-12-30.bpo-42990.toAqBH.rst b/Misc/NEWS.d/next/Core and Builtins/2021-02-18-15-12-30.bpo-42990.toAqBH.rst new file mode 100644 index 0000000000000..b9e66471e6893 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-02-18-15-12-30.bpo-42990.toAqBH.rst @@ -0,0 +1,7 @@ +The :data:`types.FunctionType` constructor now inherits the current builtins if +the *globals* dictionary has no ``"__builtins__"`` key, rather than using +``{"None": None}`` as builtins: same behavior as :func:`eval` and :func:`exec` +functions. Defining a function with ``def function(...): ...`` in Python is +not affected, globals cannot be overriden with this syntax: it also inherits +the current builtins. +Patch by Victor Stinner. diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 0571bfed9c076..056d42a0d9ebb 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -847,7 +847,7 @@ PyFrameObject* PyFrame_New(PyThreadState *tstate, PyCodeObject *code, PyObject *globals, PyObject *locals) { - PyObject *builtins = _PyEval_BuiltinsFromGlobals(globals); + PyObject *builtins = _PyEval_BuiltinsFromGlobals(tstate, globals); if (builtins == NULL) { return NULL; } @@ -862,7 +862,6 @@ PyFrame_New(PyThreadState *tstate, PyCodeObject *code, .fc_closure = NULL }; PyFrameObject *f = _PyFrame_New_NoTrack(tstate, &desc, locals); - Py_DECREF(builtins); if (f) { _PyObject_GC_TRACK(f); } @@ -1163,7 +1162,7 @@ PyFrame_GetBack(PyFrameObject *frame) } PyObject* -_PyEval_BuiltinsFromGlobals(PyObject *globals) +_PyEval_BuiltinsFromGlobals(PyThreadState *tstate, PyObject *globals) { PyObject *builtins = _PyDict_GetItemIdWithError(globals, &PyId___builtins__); if (builtins) { @@ -1171,21 +1170,11 @@ _PyEval_BuiltinsFromGlobals(PyObject *globals) builtins = PyModule_GetDict(builtins); assert(builtins != NULL); } - return Py_NewRef(builtins); + return builtins; } - if (PyErr_Occurred()) { return 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; + return _PyEval_GetBuiltins(tstate); } diff --git a/Objects/funcobject.c b/Objects/funcobject.c index 4b92f6c0342d9..36df88a28100d 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -4,6 +4,7 @@ #include "Python.h" #include "pycore_ceval.h" // _PyEval_BuiltinsFromGlobals() #include "pycore_object.h" // _PyObject_GC_UNTRACK() +#include "pycore_pyerrors.h" // _PyErr_Occurred() #include "structmember.h" // PyMemberDef PyObject * @@ -13,6 +14,8 @@ PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname assert(PyDict_Check(globals)); Py_INCREF(globals); + PyThreadState *tstate = _PyThreadState_GET(); + PyCodeObject *code_obj = (PyCodeObject *)code; Py_INCREF(code_obj); @@ -42,15 +45,16 @@ PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname _Py_IDENTIFIER(__name__); PyObject *module = _PyDict_GetItemIdWithError(globals, &PyId___name__); PyObject *builtins = NULL; - if (module == NULL && PyErr_Occurred()) { + if (module == NULL && _PyErr_Occurred(tstate)) { goto error; } Py_XINCREF(module); - builtins = _PyEval_BuiltinsFromGlobals(globals); + builtins = _PyEval_BuiltinsFromGlobals(tstate, globals); if (builtins == NULL) { goto error; } + Py_INCREF(builtins); PyFunctionObject *op = PyObject_GC_New(PyFunctionObject, &PyFunction_Type); if (op == NULL) { diff --git a/Python/ceval.c b/Python/ceval.c index 7ccb8fcf5ae54..e2b2d211fb340 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -889,10 +889,11 @@ static int unpack_iterable(PyThreadState *, PyObject *, int, int, PyObject **); PyObject * PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals) { + PyThreadState *tstate = PyThreadState_GET(); if (locals == NULL) { locals = globals; } - PyObject *builtins = _PyEval_BuiltinsFromGlobals(globals); + PyObject *builtins = _PyEval_BuiltinsFromGlobals(tstate, globals); if (builtins == NULL) { return NULL; } @@ -906,10 +907,7 @@ PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals) .fc_kwdefaults = NULL, .fc_closure = NULL }; - PyThreadState *tstate = PyThreadState_GET(); - PyObject *res = _PyEval_Vector(tstate, &desc, locals, NULL, 0, NULL); - Py_DECREF(builtins); - return res; + return _PyEval_Vector(tstate, &desc, locals, NULL, 0, NULL); } @@ -4733,12 +4731,13 @@ PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals, PyObject *const *defs, int defcount, PyObject *kwdefs, PyObject *closure) { + PyThreadState *tstate = _PyThreadState_GET(); PyObject *res; PyObject *defaults = _PyTuple_FromArray(defs, defcount); if (defaults == NULL) { return NULL; } - PyObject *builtins = _PyEval_BuiltinsFromGlobals(globals); + PyObject *builtins = _PyEval_BuiltinsFromGlobals(tstate, globals); if (builtins == NULL) { Py_DECREF(defaults); return NULL; @@ -4797,7 +4796,6 @@ PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals, .fc_kwdefaults = kwdefs, .fc_closure = closure }; - PyThreadState *tstate = _PyThreadState_GET(); res = _PyEval_Vector(tstate, &constr, locals, allargs, argcount, kwnames); @@ -5315,15 +5313,21 @@ PyEval_GetFrame(void) return tstate->frame; } +PyObject * +_PyEval_GetBuiltins(PyThreadState *tstate) +{ + PyFrameObject *frame = tstate->frame; + if (frame != NULL) { + return frame->f_builtins; + } + return tstate->interp->builtins; +} + PyObject * PyEval_GetBuiltins(void) { PyThreadState *tstate = _PyThreadState_GET(); - PyFrameObject *current_frame = tstate->frame; - if (current_frame == NULL) - return tstate->interp->builtins; - else - return current_frame->f_builtins; + return _PyEval_GetBuiltins(tstate); } /* Convenience function to get a builtin from its name */ From webhook-mailer at python.org Sat Feb 20 13:03:17 2021 From: webhook-mailer at python.org (pablogsal) Date: Sat, 20 Feb 2021 18:03:17 -0000 Subject: [Python-checkins] bpo-43277: Add PySet_CheckExact to the C-API (GH-24598) Message-ID: https://github.com/python/cpython/commit/d439fb304ca3098aab1ed0a314996f9d29347b21 commit: d439fb304ca3098aab1ed0a314996f9d29347b21 branch: master author: Pablo Galindo committer: pablogsal date: 2021-02-20T18:03:08Z summary: bpo-43277: Add PySet_CheckExact to the C-API (GH-24598) For some mysterious reason we have PySet_Check, PyFrozenSet_Check, PyAnySet_Check, PyAnySet_CheckExact and PyFrozenSet_CheckExact but no PySet_CheckExact. files: A Misc/NEWS.d/next/Core and Builtins/2021-02-20-16-50-22.bpo-43277.FXkRXk.rst M Doc/c-api/set.rst M Doc/whatsnew/3.10.rst M Include/setobject.h M Objects/dictobject.c M Objects/setobject.c diff --git a/Doc/c-api/set.rst b/Doc/c-api/set.rst index 84f34e7dae80b..eca19c4d81647 100644 --- a/Doc/c-api/set.rst +++ b/Doc/c-api/set.rst @@ -65,6 +65,12 @@ the constructor functions work with any iterable Python object. Return true if *p* is a :class:`set` object, a :class:`frozenset` object, or an instance of a subtype. This function always succeeds. +.. c:function:: int PySet_CheckExact(PyObject *p) + + Return true if *p* is a :class:`set` object but not an instance of a + subtype. This function always succeeds. + + .. versionadded:: 3.10 .. c:function:: int PyAnySet_CheckExact(PyObject *p) diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 2ceb26fabb8e7..d353f33c71801 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -893,6 +893,9 @@ New Features * The :c:func:`PyType_GetSlot` function can accept static types. (Contributed by Hai Shi and Petr Viktorin in :issue:`41073`.) +* Add a new :c:func:`PySet_CheckExact` function to the C-API to check if an + object is an instance of :class:`set` but not an instance of a subtype. + (Contributed by Pablo Galindo in :issue:`43277`.) Porting to Python 3.10 ---------------------- diff --git a/Include/setobject.h b/Include/setobject.h index 119619ebe7299..62516be5ab29b 100644 --- a/Include/setobject.h +++ b/Include/setobject.h @@ -88,18 +88,21 @@ PyAPI_FUNC(PyObject *) PySet_Pop(PyObject *set); PyAPI_FUNC(Py_ssize_t) PySet_Size(PyObject *anyset); #define PyFrozenSet_CheckExact(ob) Py_IS_TYPE(ob, &PyFrozenSet_Type) +#define PyFrozenSet_Check(ob) \ + (Py_IS_TYPE(ob, &PyFrozenSet_Type) || \ + PyType_IsSubtype(Py_TYPE(ob), &PyFrozenSet_Type)) + #define PyAnySet_CheckExact(ob) \ (Py_IS_TYPE(ob, &PySet_Type) || Py_IS_TYPE(ob, &PyFrozenSet_Type)) #define PyAnySet_Check(ob) \ (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_CheckExact(op) Py_IS_TYPE(op, &PySet_Type) #define PySet_Check(ob) \ (Py_IS_TYPE(ob, &PySet_Type) || \ PyType_IsSubtype(Py_TYPE(ob), &PySet_Type)) -#define PyFrozenSet_Check(ob) \ - (Py_IS_TYPE(ob, &PyFrozenSet_Type) || \ - PyType_IsSubtype(Py_TYPE(ob), &PyFrozenSet_Type)) #ifdef __cplusplus } diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-02-20-16-50-22.bpo-43277.FXkRXk.rst b/Misc/NEWS.d/next/Core and Builtins/2021-02-20-16-50-22.bpo-43277.FXkRXk.rst new file mode 100644 index 0000000000000..64e57911bbe7e --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-02-20-16-50-22.bpo-43277.FXkRXk.rst @@ -0,0 +1,3 @@ +Add a new :c:func:`PySet_CheckExact` function to the C-API to check if an +object is an instance of :class:`set` but not an instance of a subtype. +Patch by Pablo Galindo. diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 9b5898d13a880..773eda0d75a9c 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -4482,7 +4482,7 @@ _PyDictView_Intersect(PyObject* self, PyObject *other) /* 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)) { + if (PySet_CheckExact(other) && len_self <= PyObject_Size(other)) { _Py_IDENTIFIER(intersection); return _PyObject_CallMethodIdObjArgs(other, &PyId_intersection, self, NULL); } diff --git a/Objects/setobject.c b/Objects/setobject.c index 79e84511926e1..bfe6917b79b7a 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -522,7 +522,7 @@ set_repr(PySetObject *so) goto done; listrepr = tmp; - if (!Py_IS_TYPE(so, &PySet_Type)) + if (!PySet_CheckExact(so)) result = PyUnicode_FromFormat("%s({%U})", Py_TYPE(so)->tp_name, listrepr); From webhook-mailer at python.org Sat Feb 20 19:29:35 2021 From: webhook-mailer at python.org (berkerpeksag) Date: Sun, 21 Feb 2021 00:29:35 -0000 Subject: [Python-checkins] bpo-43269: Clean up sqlite3 file scope (GH-24578) Message-ID: https://github.com/python/cpython/commit/bf838a6e7eec2063a17c7c33dfa94afeef116f36 commit: bf838a6e7eec2063a17c7c33dfa94afeef116f36 branch: master author: Erlend Egeberg Aasland committer: berkerpeksag date: 2021-02-21T02:29:19+02:00 summary: bpo-43269: Clean up sqlite3 file scope (GH-24578) files: M Modules/_sqlite/cache.c M Modules/_sqlite/connection.c M Modules/_sqlite/cursor.c M Modules/_sqlite/prepare_protocol.c M Modules/_sqlite/row.c M Modules/_sqlite/statement.c diff --git a/Modules/_sqlite/cache.c b/Modules/_sqlite/cache.c index 078a484b86cee..ec4a22fb7a2d8 100644 --- a/Modules/_sqlite/cache.c +++ b/Modules/_sqlite/cache.c @@ -25,7 +25,8 @@ #include /* only used internally */ -pysqlite_Node* pysqlite_new_node(PyObject* key, PyObject* data) +static pysqlite_Node * +pysqlite_new_node(PyObject *key, PyObject *data) { pysqlite_Node* node; @@ -43,7 +44,8 @@ pysqlite_Node* pysqlite_new_node(PyObject* key, PyObject* data) return node; } -void pysqlite_node_dealloc(pysqlite_Node* self) +static void +pysqlite_node_dealloc(pysqlite_Node *self) { PyTypeObject *tp = Py_TYPE(self); @@ -54,7 +56,8 @@ void pysqlite_node_dealloc(pysqlite_Node* self) Py_DECREF(tp); } -int pysqlite_cache_init(pysqlite_Cache* self, PyObject* args, PyObject* kwargs) +static int +pysqlite_cache_init(pysqlite_Cache *self, PyObject *args, PyObject *kwargs) { PyObject* factory; int size = 10; @@ -85,7 +88,8 @@ int pysqlite_cache_init(pysqlite_Cache* self, PyObject* args, PyObject* kwargs) return 0; } -void pysqlite_cache_dealloc(pysqlite_Cache* self) +static void +pysqlite_cache_dealloc(pysqlite_Cache *self) { PyTypeObject *tp = Py_TYPE(self); pysqlite_Node* node; @@ -217,7 +221,8 @@ PyObject* pysqlite_cache_get(pysqlite_Cache* self, PyObject* key) return Py_NewRef(node->data); } -PyObject* pysqlite_cache_display(pysqlite_Cache* self, PyObject* args) +static PyObject * +pysqlite_cache_display(pysqlite_Cache *self, PyObject *args) { pysqlite_Node* ptr; PyObject* prevkey; diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index 81f12e83c2fe1..34ba29be3497f 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -57,8 +57,9 @@ static const char * const begin_statements[] = { static int pysqlite_connection_set_isolation_level(pysqlite_Connection* self, PyObject* isolation_level, void *Py_UNUSED(ignored)); static void _pysqlite_drop_unused_cursor_references(pysqlite_Connection* self); - -int pysqlite_connection_init(pysqlite_Connection* self, PyObject* args, PyObject* kwargs) +static int +pysqlite_connection_init(pysqlite_Connection *self, PyObject *args, + PyObject *kwargs) { static char *kwlist[] = { "database", "timeout", "detect_types", "isolation_level", @@ -193,7 +194,9 @@ int pysqlite_connection_init(pysqlite_Connection* self, PyObject* args, PyObject } /* action in (ACTION_RESET, ACTION_FINALIZE) */ -void pysqlite_do_all_statements(pysqlite_Connection* self, int action, int reset_cursors) +static void +pysqlite_do_all_statements(pysqlite_Connection *self, int action, + int reset_cursors) { int i; PyObject* weakref; @@ -225,7 +228,8 @@ void pysqlite_do_all_statements(pysqlite_Connection* self, int action, int reset } } -void pysqlite_connection_dealloc(pysqlite_Connection* self) +static void +pysqlite_connection_dealloc(pysqlite_Connection *self) { PyTypeObject *tp = Py_TYPE(self); @@ -546,7 +550,9 @@ _pysqlite_set_result(sqlite3_context* context, PyObject* py_val) return 0; } -PyObject* _pysqlite_build_py_params(sqlite3_context *context, int argc, sqlite3_value** argv) +static PyObject * +_pysqlite_build_py_params(sqlite3_context *context, int argc, + sqlite3_value **argv) { PyObject* args; int i; @@ -1288,7 +1294,9 @@ pysqlite_connection_set_isolation_level(pysqlite_Connection* self, PyObject* iso return 0; } -PyObject* pysqlite_connection_call(pysqlite_Connection* self, PyObject* args, PyObject* kwargs) +static PyObject * +pysqlite_connection_call(pysqlite_Connection *self, PyObject *args, + PyObject *kwargs) { PyObject* sql; pysqlite_Statement* statement; diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index d1578ad6aafb8..9058aabb5fc06 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -32,8 +32,6 @@ class _sqlite3.Cursor "pysqlite_Cursor *" "pysqlite_CursorType" [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=b2072d8db95411d5]*/ -PyObject* pysqlite_cursor_iternext(pysqlite_Cursor* self); - static const char errmsg_fetch_across_rollback[] = "Cursor needed to be reset because of commit/rollback and can no longer be fetched from."; /*[clinic input] @@ -746,7 +744,8 @@ pysqlite_cursor_executescript(pysqlite_Cursor *self, PyObject *script_obj) } } -PyObject* pysqlite_cursor_iternext(pysqlite_Cursor *self) +static PyObject * +pysqlite_cursor_iternext(pysqlite_Cursor *self) { PyObject* next_row_tuple; PyObject* next_row; diff --git a/Modules/_sqlite/prepare_protocol.c b/Modules/_sqlite/prepare_protocol.c index 089d66b981085..ad793324b94b5 100644 --- a/Modules/_sqlite/prepare_protocol.c +++ b/Modules/_sqlite/prepare_protocol.c @@ -23,12 +23,15 @@ #include "prepare_protocol.h" -int pysqlite_prepare_protocol_init(pysqlite_PrepareProtocol* self, PyObject* args, PyObject* kwargs) +static int +pysqlite_prepare_protocol_init(pysqlite_PrepareProtocol *self, PyObject *args, + PyObject *kwargs) { return 0; } -void pysqlite_prepare_protocol_dealloc(pysqlite_PrepareProtocol* self) +static void +pysqlite_prepare_protocol_dealloc(pysqlite_PrepareProtocol *self) { PyTypeObject *tp = Py_TYPE(self); diff --git a/Modules/_sqlite/row.c b/Modules/_sqlite/row.c index 04e308fa1c350..97a5a17ada9d0 100644 --- a/Modules/_sqlite/row.c +++ b/Modules/_sqlite/row.c @@ -31,7 +31,8 @@ class _sqlite3.Row "pysqlite_Row *" "pysqlite_RowType" [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=384227da65f250fd]*/ -void pysqlite_row_dealloc(pysqlite_Row* self) +static void +pysqlite_row_dealloc(pysqlite_Row *self) { PyTypeObject *tp = Py_TYPE(self); @@ -105,7 +106,8 @@ equal_ignore_case(PyObject *left, PyObject *right) return 1; } -PyObject* pysqlite_row_subscript(pysqlite_Row* self, PyObject* idx) +static PyObject * +pysqlite_row_subscript(pysqlite_Row *self, PyObject *idx) { Py_ssize_t _idx; Py_ssize_t nitems, i; diff --git a/Modules/_sqlite/statement.c b/Modules/_sqlite/statement.c index b62de58109edd..f179eee16f4d4 100644 --- a/Modules/_sqlite/statement.c +++ b/Modules/_sqlite/statement.c @@ -368,7 +368,8 @@ void pysqlite_statement_mark_dirty(pysqlite_Statement* self) self->in_use = 1; } -void pysqlite_statement_dealloc(pysqlite_Statement* self) +static void +pysqlite_statement_dealloc(pysqlite_Statement *self) { PyTypeObject *tp = Py_TYPE(self); From webhook-mailer at python.org Sat Feb 20 21:33:39 2021 From: webhook-mailer at python.org (terryjreedy) Date: Sun, 21 Feb 2021 02:33:39 -0000 Subject: [Python-checkins] bpo-27646: Say that 'yield from' expression can be any iterable (GH-24595) Message-ID: https://github.com/python/cpython/commit/2f9ef514fb24b6a95bd3272885f197752810c107 commit: 2f9ef514fb24b6a95bd3272885f197752810c107 branch: master author: Terry Jan Reedy committer: terryjreedy date: 2021-02-20T21:33:25-05:00 summary: bpo-27646: Say that 'yield from' expression can be any iterable (GH-24595) Previously, the doc at least strongly implied that it had to be an iterator. files: A Misc/NEWS.d/next/Documentation/2021-02-20-00-09-13.bpo-27646.HRsmo-.rst M Doc/reference/expressions.rst diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index c8c9b4683e62d..17705b117c372 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -478,8 +478,8 @@ allowing any pending :keyword:`finally` clauses to execute. .. index:: single: from; yield from expression -When ``yield from `` is used, it treats the supplied expression as -a subiterator. All values produced by that subiterator are passed directly +When ``yield from `` is used, the supplied expression must be an +iterable. The values produced by iterating that iterable are passed directly to the caller of the current generator's methods. Any values passed in with :meth:`~generator.send` and any exceptions passed in with :meth:`~generator.throw` are passed to the underlying iterator if it has the diff --git a/Misc/NEWS.d/next/Documentation/2021-02-20-00-09-13.bpo-27646.HRsmo-.rst b/Misc/NEWS.d/next/Documentation/2021-02-20-00-09-13.bpo-27646.HRsmo-.rst new file mode 100644 index 0000000000000..8ba398adf6182 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2021-02-20-00-09-13.bpo-27646.HRsmo-.rst @@ -0,0 +1,2 @@ +Clarify that 'yield from ' works with any iterable, not just +iterators. From webhook-mailer at python.org Sat Feb 20 21:42:31 2021 From: webhook-mailer at python.org (miss-islington) Date: Sun, 21 Feb 2021 02:42:31 -0000 Subject: [Python-checkins] bpo-27646: Say that 'yield from' expression can be any iterable (GH-24595) Message-ID: https://github.com/python/cpython/commit/089a21f7429a3fd3cf78e3779df724757d346d19 commit: 089a21f7429a3fd3cf78e3779df724757d346d19 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2021-02-20T18:42:24-08:00 summary: bpo-27646: Say that 'yield from' expression can be any iterable (GH-24595) Previously, the doc at least strongly implied that it had to be an iterator. (cherry picked from commit 2f9ef514fb24b6a95bd3272885f197752810c107) Co-authored-by: Terry Jan Reedy files: A Misc/NEWS.d/next/Documentation/2021-02-20-00-09-13.bpo-27646.HRsmo-.rst M Doc/reference/expressions.rst diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index 81dd6fc860355..0ac45995aef9c 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -476,8 +476,8 @@ allowing any pending :keyword:`finally` clauses to execute. .. index:: single: from; yield from expression -When ``yield from `` is used, it treats the supplied expression as -a subiterator. All values produced by that subiterator are passed directly +When ``yield from `` is used, the supplied expression must be an +iterable. The values produced by iterating that iterable are passed directly to the caller of the current generator's methods. Any values passed in with :meth:`~generator.send` and any exceptions passed in with :meth:`~generator.throw` are passed to the underlying iterator if it has the diff --git a/Misc/NEWS.d/next/Documentation/2021-02-20-00-09-13.bpo-27646.HRsmo-.rst b/Misc/NEWS.d/next/Documentation/2021-02-20-00-09-13.bpo-27646.HRsmo-.rst new file mode 100644 index 0000000000000..8ba398adf6182 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2021-02-20-00-09-13.bpo-27646.HRsmo-.rst @@ -0,0 +1,2 @@ +Clarify that 'yield from ' works with any iterable, not just +iterators. From webhook-mailer at python.org Sat Feb 20 21:55:58 2021 From: webhook-mailer at python.org (miss-islington) Date: Sun, 21 Feb 2021 02:55:58 -0000 Subject: [Python-checkins] bpo-27646: Say that 'yield from' expression can be any iterable (GH-24595) Message-ID: https://github.com/python/cpython/commit/7cc58890b3c16c28360a9abe030258426e89fec1 commit: 7cc58890b3c16c28360a9abe030258426e89fec1 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2021-02-20T18:55:49-08:00 summary: bpo-27646: Say that 'yield from' expression can be any iterable (GH-24595) Previously, the doc at least strongly implied that it had to be an iterator. (cherry picked from commit 2f9ef514fb24b6a95bd3272885f197752810c107) Co-authored-by: Terry Jan Reedy files: A Misc/NEWS.d/next/Documentation/2021-02-20-00-09-13.bpo-27646.HRsmo-.rst M Doc/reference/expressions.rst diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index 512aa5af95619..9b1a395b724d9 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -476,8 +476,8 @@ allowing any pending :keyword:`finally` clauses to execute. .. index:: single: from; yield from expression -When ``yield from `` is used, it treats the supplied expression as -a subiterator. All values produced by that subiterator are passed directly +When ``yield from `` is used, the supplied expression must be an +iterable. The values produced by iterating that iterable are passed directly to the caller of the current generator's methods. Any values passed in with :meth:`~generator.send` and any exceptions passed in with :meth:`~generator.throw` are passed to the underlying iterator if it has the diff --git a/Misc/NEWS.d/next/Documentation/2021-02-20-00-09-13.bpo-27646.HRsmo-.rst b/Misc/NEWS.d/next/Documentation/2021-02-20-00-09-13.bpo-27646.HRsmo-.rst new file mode 100644 index 0000000000000..8ba398adf6182 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2021-02-20-00-09-13.bpo-27646.HRsmo-.rst @@ -0,0 +1,2 @@ +Clarify that 'yield from ' works with any iterable, not just +iterators. From webhook-mailer at python.org Sun Feb 21 02:44:19 2021 From: webhook-mailer at python.org (terryjreedy) Date: Sun, 21 Feb 2021 07:44:19 -0000 Subject: [Python-checkins] bpo-43283: Rearrange some IDLE doc paragraphs. (GH-24604) Message-ID: https://github.com/python/cpython/commit/4cf7bb8e22bf37e6d65bf4cb5618d09c4a8ad612 commit: 4cf7bb8e22bf37e6d65bf4cb5618d09c4a8ad612 branch: master author: Terry Jan Reedy committer: terryjreedy date: 2021-02-21T02:44:11-05:00 summary: bpo-43283: Rearrange some IDLE doc paragraphs. (GH-24604) In the Running User Code section, gather together paragraphs about two processes and the sys.stdstream replacements, preparing to add another. files: M Doc/library/idle.rst M Lib/idlelib/help.html diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst index e7eaabd8bfa25..fc45e3161bc6d 100644 --- a/Doc/library/idle.rst +++ b/Doc/library/idle.rst @@ -726,28 +726,29 @@ with objects that get input from and send output to the Shell window. The original values stored in ``sys.__stdin__``, ``sys.__stdout__``, and ``sys.__stderr__`` are not touched, but may be ``None``. -When Shell has the focus, it controls the keyboard and screen. This is -normally transparent, but functions that directly access the keyboard -and screen will not work. These include system-specific functions that -determine whether a key has been pressed and if so, which. - IDLE's standard stream replacements are not inherited by subprocesses -created in the execution process, whether directly by user code or by modules -such as multiprocessing. If such subprocess use ``input`` from sys.stdin -or ``print`` or ``write`` to sys.stdout or sys.stderr, +created in the execution process, whether directly by user code or by +modules such as multiprocessing. If such subprocess use ``input`` from +sys.stdin or ``print`` or ``write`` to sys.stdout or sys.stderr, IDLE should be started in a command line window. The secondary subprocess will then be attached to that window for input and output. -The IDLE code running in the execution process adds frames to the call stack -that would not be there otherwise. IDLE wraps ``sys.getrecursionlimit`` and -``sys.setrecursionlimit`` to reduce the effect of the additional stack frames. - If ``sys`` is reset by user code, such as with ``importlib.reload(sys)``, IDLE's changes are lost and input from the keyboard and output to the screen will not work correctly. -When user code raises SystemExit either directly or by calling sys.exit, IDLE -returns to a Shell prompt instead of exiting. +When Shell has the focus, it controls the keyboard and screen. This is +normally transparent, but functions that directly access the keyboard +and screen will not work. These include system-specific functions that +determine whether a key has been pressed and if so, which. + +The IDLE code running in the execution process adds frames to the call stack +that would not be there otherwise. IDLE wraps ``sys.getrecursionlimit`` and +``sys.setrecursionlimit`` to reduce the effect of the additional stack +frames. + +When user code raises SystemExit either directly or by calling sys.exit, +IDLE returns to a Shell prompt instead of exiting. User output in Shell ^^^^^^^^^^^^^^^^^^^^ diff --git a/Lib/idlelib/help.html b/Lib/idlelib/help.html index 170999e128017..1eefa506e2c8d 100644 --- a/Lib/idlelib/help.html +++ b/Lib/idlelib/help.html @@ -5,7 +5,7 @@ - IDLE — Python 3.10.0a1 documentation + IDLE — Python 3.10.0a5 documentation @@ -18,7 +18,7 @@ @@ -32,7 +32,6 @@ -