From webhook-mailer at python.org Sat Jun 1 00:10:07 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Sat, 01 Jun 2019 04:10:07 -0000 Subject: [Python-checkins] Improve docstring of list.sort (GH-8516) Message-ID: https://github.com/python/cpython/commit/5c22476c01622f11b7745ee693f8b296a9d6a761 commit: 5c22476c01622f11b7745ee693f8b296a9d6a761 branch: master author: Tim Hoffmann <2836374+timhoffm at users.noreply.github.com> committer: Raymond Hettinger date: 2019-05-31T21:10:02-07:00 summary: Improve docstring of list.sort (GH-8516) files: M Objects/clinic/listobject.c.h M Objects/listobject.c diff --git a/Objects/clinic/listobject.c.h b/Objects/clinic/listobject.c.h index 7b8e2d9905f9..57f0a48eb083 100644 --- a/Objects/clinic/listobject.c.h +++ b/Objects/clinic/listobject.c.h @@ -156,7 +156,15 @@ PyDoc_STRVAR(list_sort__doc__, "sort($self, /, *, key=None, reverse=False)\n" "--\n" "\n" -"Stable sort *IN PLACE*."); +"Sort the list in ascending order and return None.\n" +"\n" +"The sort is in-place (i.e. the list itself is modified) and stable (i.e. the\n" +"order of two equal elements is maintained).\n" +"\n" +"If a key function is given, apply it once to each list item and sort them,\n" +"ascending or descending, according to their function values.\n" +"\n" +"The reverse flag can be set to sort in descending order."); #define LIST_SORT_METHODDEF \ {"sort", (PyCFunction)(void(*)(void))list_sort, METH_FASTCALL|METH_KEYWORDS, list_sort__doc__}, @@ -359,4 +367,4 @@ list___reversed__(PyListObject *self, PyObject *Py_UNUSED(ignored)) { return list___reversed___impl(self); } -/*[clinic end generated code: output=d1d5078edb7d3cf4 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=73718c0c33798c62 input=a9049054013a1b77]*/ diff --git a/Objects/listobject.c b/Objects/listobject.c index 233f13dbab0e..f8bf45e5f8cd 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -2197,12 +2197,20 @@ list.sort key as keyfunc: object = None reverse: bool(accept={int}) = False -Stable sort *IN PLACE*. +Sort the list in ascending order and return None. + +The sort is in-place (i.e. the list itself is modified) and stable (i.e. the +order of two equal elements is maintained). + +If a key function is given, apply it once to each list item and sort them, +ascending or descending, according to their function values. + +The reverse flag can be set to sort in descending order. [clinic start generated code]*/ static PyObject * list_sort_impl(PyListObject *self, PyObject *keyfunc, int reverse) -/*[clinic end generated code: output=57b9f9c5e23fbe42 input=b0fcf743982c5b90]*/ +/*[clinic end generated code: output=57b9f9c5e23fbe42 input=cb56cd179a713060]*/ { MergeState ms; Py_ssize_t nremaining; From webhook-mailer at python.org Sat Jun 1 00:14:01 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Sat, 01 Jun 2019 04:14:01 -0000 Subject: [Python-checkins] bpo-29984: Improve 'heapq' test coverage (GH-992) Message-ID: https://github.com/python/cpython/commit/664fe3996f7e05ae351526f02b21504bb065bcf8 commit: 664fe3996f7e05ae351526f02b21504bb065bcf8 branch: master author: Rob Day committer: Raymond Hettinger date: 2019-05-31T21:13:57-07:00 summary: bpo-29984: Improve 'heapq' test coverage (GH-992) files: M Lib/heapq.py M Lib/test/test_heapq.py diff --git a/Lib/heapq.py b/Lib/heapq.py index 0e3555cf9118..fabefd87f8bf 100644 --- a/Lib/heapq.py +++ b/Lib/heapq.py @@ -597,5 +597,5 @@ def nlargest(n, iterable, key=None): if __name__ == "__main__": - import doctest - print(doctest.testmod()) + import doctest # pragma: no cover + print(doctest.testmod()) # pragma: no cover diff --git a/Lib/test/test_heapq.py b/Lib/test/test_heapq.py index 2f8c648d84a5..6c20b6297dfc 100644 --- a/Lib/test/test_heapq.py +++ b/Lib/test/test_heapq.py @@ -2,6 +2,7 @@ import random import unittest +import doctest from test import support from unittest import TestCase, skipUnless @@ -26,6 +27,23 @@ def test_c_functions(self): self.assertEqual(getattr(c_heapq, fname).__module__, '_heapq') +def load_tests(loader, tests, ignore): + # The 'merge' function has examples in its docstring which we should test + # with 'doctest'. + # + # However, doctest can't easily find all docstrings in the module (loading + # it through import_fresh_module seems to confuse it), so we specifically + # create a finder which returns the doctests from the merge method. + + class HeapqMergeDocTestFinder: + def find(self, *args, **kwargs): + dtf = doctest.DocTestFinder() + return dtf.find(py_heapq.merge) + + tests.addTests(doctest.DocTestSuite(py_heapq, + test_finder=HeapqMergeDocTestFinder())) + return tests + class TestHeap: def test_push_pop(self): @@ -135,6 +153,13 @@ def test_heappushpop(self): x = self.module.heappushpop(h, 11) self.assertEqual((h, x), ([11], 10)) + def test_heappop_max(self): + # _heapop_max has an optimization for one-item lists which isn't + # covered in other tests, so test that case explicitly here + h = [3, 2] + self.assertEqual(self.module._heappop_max(h), 3) + self.assertEqual(self.module._heappop_max(h), 2) + def test_heapsort(self): # Exercise everything with repeated heapsort checks for trial in range(100): @@ -168,6 +193,12 @@ def test_merge(self): list(self.module.merge(*seqs, key=key, reverse=reverse))) self.assertEqual(list(self.module.merge()), []) + def test_empty_merges(self): + # Merging two empty lists (with or without a key) should produce + # another empty list. + self.assertEqual(list(self.module.merge([], [])), []) + self.assertEqual(list(self.module.merge([], [], key=lambda: 6)), []) + def test_merge_does_not_suppress_index_error(self): # Issue 19018: Heapq.merge suppresses IndexError from user generator def iterable(): From webhook-mailer at python.org Sat Jun 1 00:49:13 2019 From: webhook-mailer at python.org (Nick Coghlan) Date: Sat, 01 Jun 2019 04:49:13 -0000 Subject: [Python-checkins] Add option to trace to run modules (GH-5134) Message-ID: https://github.com/python/cpython/commit/354227a1e90036d8c1481a211746de912c6c7c33 commit: 354227a1e90036d8c1481a211746de912c6c7c33 branch: master author: Mario Corchero committer: Nick Coghlan date: 2019-06-01T14:49:09+10:00 summary: Add option to trace to run modules (GH-5134) Adds a new option in trace that allows tracing runnable modules. It is exposed as `--module module_name` as `-m` is already in use for another argument. files: A Misc/NEWS.d/next/Library/2018-01-07-21-04-50.bpo-32515.D8_Wcb.rst M Doc/library/trace.rst M Lib/test/test_trace.py M Lib/trace.py diff --git a/Doc/library/trace.rst b/Doc/library/trace.rst index 5cb7029adf5e..85fec6830006 100644 --- a/Doc/library/trace.rst +++ b/Doc/library/trace.rst @@ -42,6 +42,9 @@ all Python modules imported during the execution into the current directory. Display the version of the module and exit. +.. versionadded:: 3.8 + Added ``--module`` option that allows to run an executable module. + Main options ^^^^^^^^^^^^ diff --git a/Lib/test/test_trace.py b/Lib/test/test_trace.py index afe790267661..4bc21eae02ce 100644 --- a/Lib/test/test_trace.py +++ b/Lib/test/test_trace.py @@ -474,7 +474,7 @@ class TestCommandLine(unittest.TestCase): def test_failures(self): _errors = ( - (b'filename is missing: required with the main options', '-l', '-T'), + (b'progname is missing: required with the main options', '-l', '-T'), (b'cannot specify both --listfuncs and (--trace or --count)', '-lc'), (b'argument -R/--no-report: not allowed with argument -r/--report', '-rR'), (b'must specify one of --trace, --count, --report, --listfuncs, or --trackcalls', '-g'), @@ -524,5 +524,10 @@ def f(): self.assertIn('lines cov% module (path)', stdout) self.assertIn(f'6 100% {TESTFN} ({filename})', stdout) + def test_run_as_module(self): + assert_python_ok('-m', 'trace', '-l', '--module', 'timeit', '-n', '1') + assert_python_failure('-m', 'trace', '-l', '--module', 'not_a_module_zzz') + + if __name__ == '__main__': unittest.main() diff --git a/Lib/trace.py b/Lib/trace.py index 63008a134a8a..62325d3f238a 100755 --- a/Lib/trace.py +++ b/Lib/trace.py @@ -666,7 +666,9 @@ def main(): help='Ignore files in the given directory ' '(multiple directories can be joined by os.pathsep).') - parser.add_argument('filename', nargs='?', + parser.add_argument('--module', action='store_true', default=False, + help='Trace a module. ') + parser.add_argument('progname', nargs='?', help='file to run as main program') parser.add_argument('arguments', nargs=argparse.REMAINDER, help='arguments to the program') @@ -704,26 +706,40 @@ def parse_ignore_dir(s): if opts.summary and not opts.count: parser.error('--summary can only be used with --count or --report') - if opts.filename is None: - parser.error('filename is missing: required with the main options') - - sys.argv = [opts.filename, *opts.arguments] - sys.path[0] = os.path.dirname(opts.filename) + if opts.progname is None: + parser.error('progname is missing: required with the main options') t = Trace(opts.count, opts.trace, countfuncs=opts.listfuncs, countcallers=opts.trackcalls, ignoremods=opts.ignore_module, ignoredirs=opts.ignore_dir, infile=opts.file, outfile=opts.file, timing=opts.timing) try: - with open(opts.filename) as fp: - code = compile(fp.read(), opts.filename, 'exec') - # try to emulate __main__ namespace as much as possible - globs = { - '__file__': opts.filename, - '__name__': '__main__', - '__package__': None, - '__cached__': None, - } + if opts.module: + import runpy + module_name = opts.progname + mod_name, mod_spec, code = runpy._get_module_details(module_name) + sys.argv = [code.co_filename, *opts.arguments] + globs = { + '__name__': '__main__', + '__file__': code.co_filename, + '__package__': mod_spec.parent, + '__loader__': mod_spec.loader, + '__spec__': mod_spec, + '__cached__': None, + } + else: + sys.argv = [opts.progname, *opts.arguments] + sys.path[0] = os.path.dirname(opts.progname) + + with open(opts.progname) as fp: + code = compile(fp.read(), opts.progname, 'exec') + # try to emulate __main__ namespace as much as possible + globs = { + '__file__': opts.progname, + '__name__': '__main__', + '__package__': None, + '__cached__': None, + } t.runctx(code, globs, globs) except OSError as err: sys.exit("Cannot run file %r because: %s" % (sys.argv[0], err)) diff --git a/Misc/NEWS.d/next/Library/2018-01-07-21-04-50.bpo-32515.D8_Wcb.rst b/Misc/NEWS.d/next/Library/2018-01-07-21-04-50.bpo-32515.D8_Wcb.rst new file mode 100644 index 000000000000..ad585b3ab5ed --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-01-07-21-04-50.bpo-32515.D8_Wcb.rst @@ -0,0 +1 @@ +trace.py can now run modules via python3 -m trace -t --module module_name From webhook-mailer at python.org Sat Jun 1 02:33:26 2019 From: webhook-mailer at python.org (Stefan Behnel) Date: Sat, 01 Jun 2019 06:33:26 -0000 Subject: [Python-checkins] bpo-18911: clarify that the minidom XML writer receives texts but not bytes (GH-13352) Message-ID: https://github.com/python/cpython/commit/5ac0b988fd5f1428efe35329c531c7b5c74d37f6 commit: 5ac0b988fd5f1428efe35329c531c7b5c74d37f6 branch: master author: Windson yang committer: Stefan Behnel date: 2019-06-01T08:33:16+02:00 summary: bpo-18911: clarify that the minidom XML writer receives texts but not bytes (GH-13352) files: M Doc/library/xml.dom.minidom.rst diff --git a/Doc/library/xml.dom.minidom.rst b/Doc/library/xml.dom.minidom.rst index 2423a0c15691..8711242d95d7 100644 --- a/Doc/library/xml.dom.minidom.rst +++ b/Doc/library/xml.dom.minidom.rst @@ -134,11 +134,12 @@ module documentation. This section lists the differences between the API and .. method:: Node.writexml(writer, indent="", addindent="", newl="") - Write XML to the writer object. The writer should have a :meth:`write` method - which matches that of the file object interface. The *indent* parameter is the - indentation of the current node. The *addindent* parameter is the incremental - indentation to use for subnodes of the current one. The *newl* parameter - specifies the string to use to terminate newlines. + Write XML to the writer object. The writer receives texts but not bytes as input, + it should have a :meth:`write` method which matches that of the file object + interface. The *indent* parameter is the indentation of the current node. + The *addindent* parameter is the incremental indentation to use for subnodes + of the current one. The *newl* parameter specifies the string to use to + terminate newlines. For the :class:`Document` node, an additional keyword argument *encoding* can be used to specify the encoding field of the XML header. From webhook-mailer at python.org Sat Jun 1 02:58:58 2019 From: webhook-mailer at python.org (Stefan Behnel) Date: Sat, 01 Jun 2019 06:58:58 -0000 Subject: [Python-checkins] bpo-18911: clarify that the minidom XML writer receives texts but not bytes (GH-13718) Message-ID: https://github.com/python/cpython/commit/18e23f227be59241cbb1eeb6d6669771dd7275fb commit: 18e23f227be59241cbb1eeb6d6669771dd7275fb branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Stefan Behnel date: 2019-06-01T08:58:54+02:00 summary: bpo-18911: clarify that the minidom XML writer receives texts but not bytes (GH-13718) (cherry picked from commit 5ac0b988fd5f1428efe35329c531c7b5c74d37f6) Co-authored-by: Windson yang files: M Doc/library/xml.dom.minidom.rst diff --git a/Doc/library/xml.dom.minidom.rst b/Doc/library/xml.dom.minidom.rst index 96080c3e318c..c68b0371af70 100644 --- a/Doc/library/xml.dom.minidom.rst +++ b/Doc/library/xml.dom.minidom.rst @@ -134,11 +134,12 @@ module documentation. This section lists the differences between the API and .. method:: Node.writexml(writer, indent="", addindent="", newl="") - Write XML to the writer object. The writer should have a :meth:`write` method - which matches that of the file object interface. The *indent* parameter is the - indentation of the current node. The *addindent* parameter is the incremental - indentation to use for subnodes of the current one. The *newl* parameter - specifies the string to use to terminate newlines. + Write XML to the writer object. The writer receives texts but not bytes as input, + it should have a :meth:`write` method which matches that of the file object + interface. The *indent* parameter is the indentation of the current node. + The *addindent* parameter is the incremental indentation to use for subnodes + of the current one. The *newl* parameter specifies the string to use to + terminate newlines. For the :class:`Document` node, an additional keyword argument *encoding* can be used to specify the encoding field of the XML header. From webhook-mailer at python.org Sat Jun 1 03:21:31 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Sat, 01 Jun 2019 07:21:31 -0000 Subject: [Python-checkins] bpo-35431: Implemented math.comb (GH-11414) Message-ID: https://github.com/python/cpython/commit/4a686504eb2bbf69adf78077458508a7ba131667 commit: 4a686504eb2bbf69adf78077458508a7ba131667 branch: master author: Yash Aggarwal committer: Raymond Hettinger date: 2019-06-01T00:21:27-07:00 summary: bpo-35431: Implemented math.comb (GH-11414) files: A Misc/NEWS.d/next/Library/2019-01-02-19-48-23.bpo-35431.FhG6QA.rst M Doc/library/math.rst M Lib/test/test_math.py M Modules/clinic/mathmodule.c.h M Modules/mathmodule.c diff --git a/Doc/library/math.rst b/Doc/library/math.rst index b51e96bc4074..5243970df806 100644 --- a/Doc/library/math.rst +++ b/Doc/library/math.rst @@ -232,6 +232,21 @@ Number-theoretic and representation functions :meth:`x.__trunc__() `. +.. function:: comb(n, k) + + Return the number of ways to choose *k* items from *n* items without repetition + and without order. + + Also called the binomial coefficient. It is mathematically equal to the expression + ``n! / (k! (n - k)!)``. It is equivalent to the coefficient of k-th term in + polynomial expansion of the expression ``(1 + x) ** n``. + + Raises :exc:`TypeError` if the arguments not integers. + Raises :exc:`ValueError` if the arguments are negative or if k > n. + + .. versionadded:: 3.8 + + Note that :func:`frexp` and :func:`modf` have a different call/return pattern than their C equivalents: they take a single argument and return a pair of values, rather than returning their second return value through an 'output diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index 853a0e62f823..9da7f7c4e6e2 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -1862,6 +1862,57 @@ def test_fractions(self): self.assertAllClose(fraction_examples, rel_tol=1e-8) self.assertAllNotClose(fraction_examples, rel_tol=1e-9) + def testComb(self): + comb = math.comb + factorial = math.factorial + # Test if factorial defintion is satisfied + for n in range(100): + for k in range(n + 1): + self.assertEqual(comb(n, k), factorial(n) + // (factorial(k) * factorial(n - k))) + + # Test for Pascal's identity + for n in range(1, 100): + for k in range(1, n): + self.assertEqual(comb(n, k), comb(n - 1, k - 1) + comb(n - 1, k)) + + # Test corner cases + for n in range(100): + self.assertEqual(comb(n, 0), 1) + self.assertEqual(comb(n, n), 1) + + for n in range(1, 100): + self.assertEqual(comb(n, 1), n) + self.assertEqual(comb(n, n - 1), n) + + # Test Symmetry + for n in range(100): + for k in range(n // 2): + self.assertEqual(comb(n, k), comb(n, n - k)) + + # Raises TypeError if any argument is non-integer or argument count is + # not 2 + self.assertRaises(TypeError, comb, 10, 1.0) + self.assertRaises(TypeError, comb, 10, "1") + self.assertRaises(TypeError, comb, "10", 1) + self.assertRaises(TypeError, comb, 10.0, 1) + + self.assertRaises(TypeError, comb, 10) + self.assertRaises(TypeError, comb, 10, 1, 3) + self.assertRaises(TypeError, comb) + + # Raises Value error if not k or n are negative numbers + self.assertRaises(ValueError, comb, -1, 1) + self.assertRaises(ValueError, comb, -10*10, 1) + self.assertRaises(ValueError, comb, 1, -1) + self.assertRaises(ValueError, comb, 1, -10*10) + + # Raises value error if k is greater than n + self.assertRaises(ValueError, comb, 1, 10**10) + self.assertRaises(ValueError, comb, 0, 1) + + + def test_main(): from doctest import DocFileSuite diff --git a/Misc/NEWS.d/next/Library/2019-01-02-19-48-23.bpo-35431.FhG6QA.rst b/Misc/NEWS.d/next/Library/2019-01-02-19-48-23.bpo-35431.FhG6QA.rst new file mode 100644 index 000000000000..34687bdb8a25 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-01-02-19-48-23.bpo-35431.FhG6QA.rst @@ -0,0 +1,4 @@ +Implement :func:`math.comb` that returns binomial coefficient, that computes +the number of ways to choose k items from n items without repetition and +without order. +Patch by Yash Aggarwal and Keller Fuchs. diff --git a/Modules/clinic/mathmodule.c.h b/Modules/clinic/mathmodule.c.h index e677bd896cd8..cba791e2098f 100644 --- a/Modules/clinic/mathmodule.c.h +++ b/Modules/clinic/mathmodule.c.h @@ -637,4 +637,53 @@ math_prod(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *k exit: return return_value; } -/*[clinic end generated code: output=aeed62f403b90199 input=a9049054013a1b77]*/ + +PyDoc_STRVAR(math_comb__doc__, +"comb($module, /, n, k)\n" +"--\n" +"\n" +"Number of ways to choose *k* items from *n* items without repetition and without order.\n" +"\n" +"Also called the binomial coefficient. It is mathematically equal to the expression\n" +"n! / (k! * (n - k)!). It is equivalent to the coefficient of k-th term in\n" +"polynomial expansion of the expression (1 + x)**n.\n" +"\n" +"Raises TypeError if the arguments are not integers.\n" +"Raises ValueError if the arguments are negative or if k > n."); + +#define MATH_COMB_METHODDEF \ + {"comb", (PyCFunction)(void(*)(void))math_comb, METH_FASTCALL|METH_KEYWORDS, math_comb__doc__}, + +static PyObject * +math_comb_impl(PyObject *module, PyObject *n, PyObject *k); + +static PyObject * +math_comb(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"n", "k", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "comb", 0}; + PyObject *argsbuf[2]; + PyObject *n; + PyObject *k; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (!PyLong_Check(args[0])) { + _PyArg_BadArgument("comb", 1, "int", args[0]); + goto exit; + } + n = args[0]; + if (!PyLong_Check(args[1])) { + _PyArg_BadArgument("comb", 2, "int", args[1]); + goto exit; + } + k = args[1]; + return_value = math_comb_impl(module, n, k); + +exit: + return return_value; +} +/*[clinic end generated code: output=00aa76356759617a input=a9049054013a1b77]*/ diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index a153e984ca59..007a8801429c 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -2998,6 +2998,126 @@ math_prod_impl(PyObject *module, PyObject *iterable, PyObject *start) } +/*[clinic input] +math.comb + + n: object(subclass_of='&PyLong_Type') + k: object(subclass_of='&PyLong_Type') + +Number of ways to choose *k* items from *n* items without repetition and without order. + +Also called the binomial coefficient. It is mathematically equal to the expression +n! / (k! * (n - k)!). It is equivalent to the coefficient of k-th term in +polynomial expansion of the expression (1 + x)**n. + +Raises TypeError if the arguments are not integers. +Raises ValueError if the arguments are negative or if k > n. + +[clinic start generated code]*/ + +static PyObject * +math_comb_impl(PyObject *module, PyObject *n, PyObject *k) +/*[clinic end generated code: output=bd2cec8d854f3493 input=565f340f98efb5b5]*/ +{ + PyObject *val = NULL, + *temp_obj1 = NULL, + *temp_obj2 = NULL, + *dump_var = NULL; + int overflow, cmp; + long long i, terms; + + cmp = PyObject_RichCompareBool(n, k, Py_LT); + if (cmp < 0) { + goto fail_comb; + } + else if (cmp > 0) { + PyErr_Format(PyExc_ValueError, + "n must be an integer greater than or equal to k"); + goto fail_comb; + } + + /* b = min(b, a - b) */ + dump_var = PyNumber_Subtract(n, k); + if (dump_var == NULL) { + goto fail_comb; + } + cmp = PyObject_RichCompareBool(k, dump_var, Py_GT); + if (cmp < 0) { + goto fail_comb; + } + else if (cmp > 0) { + k = dump_var; + dump_var = NULL; + } + else { + Py_DECREF(dump_var); + dump_var = NULL; + } + + terms = PyLong_AsLongLongAndOverflow(k, &overflow); + if (terms < 0 && PyErr_Occurred()) { + goto fail_comb; + } + else if (overflow > 0) { + PyErr_Format(PyExc_OverflowError, + "minimum(n - k, k) must not exceed %lld", + LLONG_MAX); + goto fail_comb; + } + else if (overflow < 0 || terms < 0) { + PyErr_Format(PyExc_ValueError, + "k must be a positive integer"); + goto fail_comb; + } + + if (terms == 0) { + return PyNumber_Long(_PyLong_One); + } + + val = PyNumber_Long(n); + for (i = 1; i < terms; ++i) { + temp_obj1 = PyLong_FromSsize_t(i); + if (temp_obj1 == NULL) { + goto fail_comb; + } + temp_obj2 = PyNumber_Subtract(n, temp_obj1); + if (temp_obj2 == NULL) { + goto fail_comb; + } + dump_var = val; + val = PyNumber_Multiply(val, temp_obj2); + if (val == NULL) { + goto fail_comb; + } + Py_DECREF(dump_var); + dump_var = NULL; + Py_DECREF(temp_obj2); + temp_obj2 = PyLong_FromUnsignedLongLong((unsigned long long)(i + 1)); + if (temp_obj2 == NULL) { + goto fail_comb; + } + dump_var = val; + val = PyNumber_FloorDivide(val, temp_obj2); + if (val == NULL) { + goto fail_comb; + } + Py_DECREF(dump_var); + Py_DECREF(temp_obj1); + Py_DECREF(temp_obj2); + } + + return val; + +fail_comb: + Py_XDECREF(val); + Py_XDECREF(dump_var); + Py_XDECREF(temp_obj1); + Py_XDECREF(temp_obj2); + + return NULL; +} + + static PyMethodDef math_methods[] = { {"acos", math_acos, METH_O, math_acos_doc}, {"acosh", math_acosh, METH_O, math_acosh_doc}, @@ -3047,6 +3167,7 @@ static PyMethodDef math_methods[] = { {"tanh", math_tanh, METH_O, math_tanh_doc}, MATH_TRUNC_METHODDEF MATH_PROD_METHODDEF + MATH_COMB_METHODDEF {NULL, NULL} /* sentinel */ }; From webhook-mailer at python.org Sat Jun 1 04:00:25 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Sat, 01 Jun 2019 08:00:25 -0000 Subject: [Python-checkins] bpo-37116: Use PEP 570 syntax for positional-only parameters. (GH-13700) Message-ID: https://github.com/python/cpython/commit/2085bd0877e17ad4d98a4586d5eabb6faecbb190 commit: 2085bd0877e17ad4d98a4586d5eabb6faecbb190 branch: master author: Serhiy Storchaka committer: GitHub date: 2019-06-01T11:00:15+03:00 summary: bpo-37116: Use PEP 570 syntax for positional-only parameters. (GH-13700) files: M Doc/library/collections.rst M Doc/library/contextlib.rst M Doc/library/email.headerregistry.rst M Doc/library/functools.rst M Doc/library/inspect.rst M Doc/library/operator.rst M Doc/library/string.rst M Doc/library/types.rst M Doc/library/unittest.mock-examples.rst M Doc/library/unittest.rst M Doc/library/weakref.rst M Doc/whatsnew/3.8.rst M Lib/_collections_abc.py M Lib/_py_abc.py M Lib/_threading_local.py M Lib/collections/__init__.py M Lib/contextlib.py M Lib/dataclasses.py M Lib/functools.py M Lib/idlelib/debugger_r.py M Lib/idlelib/rpc.py M Lib/inspect.py M Lib/multiprocessing/dummy/__init__.py M Lib/multiprocessing/managers.py M Lib/multiprocessing/pool.py M Lib/operator.py M Lib/random.py M Lib/string.py M Lib/test/support/script_helper.py M Lib/typing.py M Lib/unittest/case.py M Lib/unittest/mock.py M Lib/unittest/test/test_runner.py M Lib/weakref.py diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst index ec921d79d0c4..90a3f4bea9a4 100644 --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -1140,7 +1140,7 @@ variants of :func:`functools.lru_cache`:: class LRU(OrderedDict): 'Limit size, evicting the least recently looked-up key when full' - def __init__(self, maxsize=128, *args, **kwds): + def __init__(self, maxsize=128, /, *args, **kwds): self.maxsize = maxsize super().__init__(*args, **kwds) diff --git a/Doc/library/contextlib.rst b/Doc/library/contextlib.rst index 017a87a5648c..73b24e5f251a 100644 --- a/Doc/library/contextlib.rst +++ b/Doc/library/contextlib.rst @@ -637,7 +637,7 @@ even further by means of a small helper class:: from contextlib import ExitStack class Callback(ExitStack): - def __init__(self, callback, *args, **kwds): + def __init__(self, callback, /, *args, **kwds): super(Callback, self).__init__() self.callback(callback, *args, **kwds) diff --git a/Doc/library/email.headerregistry.rst b/Doc/library/email.headerregistry.rst index ce283c6b596c..c3ce90c2d6d9 100644 --- a/Doc/library/email.headerregistry.rst +++ b/Doc/library/email.headerregistry.rst @@ -107,7 +107,7 @@ headers. method if it wishes to set additional attributes beyond those provided by ``BaseHeader`` itself. Such an ``init`` method should look like this:: - def init(self, *args, **kw): + def init(self, /, *args, **kw): self._myattr = kw.pop('myattr') super().init(*args, **kw) diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst index 8b8b1f80a622..654a3efa214b 100644 --- a/Doc/library/functools.rst +++ b/Doc/library/functools.rst @@ -221,7 +221,7 @@ The :mod:`functools` module defines the following functions: Returning NotImplemented from the underlying comparison function for unrecognised types is now supported. -.. function:: partial(func, *args, **keywords) +.. function:: partial(func, /, *args, **keywords) Return a new :ref:`partial object` which when called will behave like *func* called with the positional arguments *args* @@ -230,7 +230,7 @@ The :mod:`functools` module defines the following functions: supplied, they extend and override *keywords*. Roughly equivalent to:: - def partial(func, *args, **keywords): + def partial(func, /, *args, **keywords): def newfunc(*fargs, **fkeywords): newkeywords = {**keywords, **fkeywords} return func(*args, *fargs, **newkeywords) diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst index 1cc503a8e94b..2a71201a80b2 100644 --- a/Doc/library/inspect.rst +++ b/Doc/library/inspect.rst @@ -1022,7 +1022,7 @@ Classes and functions metatype is in use, cls will be the first element of the tuple. -.. function:: getcallargs(func, *args, **kwds) +.. function:: getcallargs(func, /, *args, **kwds) Bind the *args* and *kwds* to the argument names of the Python function or method *func*, as if it was called with them. For bound methods, bind also the diff --git a/Doc/library/operator.rst b/Doc/library/operator.rst index 5d0ea7dfdd89..fa02bde84650 100644 --- a/Doc/library/operator.rst +++ b/Doc/library/operator.rst @@ -339,7 +339,7 @@ expect a function argument. [('orange', 1), ('banana', 2), ('apple', 3), ('pear', 5)] -.. function:: methodcaller(name[, args...]) +.. function:: methodcaller(name, /, *args, **kwargs) Return a callable object that calls the method *name* on its operand. If additional arguments and/or keyword arguments are given, they will be given @@ -352,7 +352,7 @@ expect a function argument. Equivalent to:: - def methodcaller(name, *args, **kwargs): + def methodcaller(name, /, *args, **kwargs): def caller(obj): return getattr(obj, name)(*args, **kwargs) return caller diff --git a/Doc/library/string.rst b/Doc/library/string.rst index c2f65224bc8d..288dde6b3fe4 100644 --- a/Doc/library/string.rst +++ b/Doc/library/string.rst @@ -88,7 +88,7 @@ implementation as the built-in :meth:`~str.format` method. The :class:`Formatter` class has the following public methods: - .. method:: format(format_string, *args, **kwargs) + .. method:: format(format_string, /, *args, **kwargs) The primary API method. It takes a format string and an arbitrary set of positional and keyword arguments. @@ -720,7 +720,7 @@ these rules. The methods of :class:`Template` are: The constructor takes a single argument which is the template string. - .. method:: substitute(mapping, **kwds) + .. method:: substitute(mapping={}, /, **kwds) Performs the template substitution, returning a new string. *mapping* is any dictionary-like object with keys that match the placeholders in the @@ -729,7 +729,7 @@ these rules. The methods of :class:`Template` are: and there are duplicates, the placeholders from *kwds* take precedence. - .. method:: safe_substitute(mapping, **kwds) + .. method:: safe_substitute(mapping={}, /, **kwds) Like :meth:`substitute`, except that if placeholders are missing from *mapping* and *kwds*, instead of raising a :exc:`KeyError` exception, the diff --git a/Doc/library/types.rst b/Doc/library/types.rst index 07c3a2e7f682..e629c2935f27 100644 --- a/Doc/library/types.rst +++ b/Doc/library/types.rst @@ -327,7 +327,7 @@ Additional Utility Classes and Functions The type is roughly equivalent to the following code:: class SimpleNamespace: - def __init__(self, **kwargs): + def __init__(self, /, **kwargs): self.__dict__.update(kwargs) def __repr__(self): diff --git a/Doc/library/unittest.mock-examples.rst b/Doc/library/unittest.mock-examples.rst index 16690f349822..811f0fb1ce93 100644 --- a/Doc/library/unittest.mock-examples.rst +++ b/Doc/library/unittest.mock-examples.rst @@ -848,7 +848,7 @@ Here's an example implementation: >>> from copy import deepcopy >>> class CopyingMock(MagicMock): - ... def __call__(self, *args, **kwargs): + ... def __call__(self, /, *args, **kwargs): ... args = deepcopy(args) ... kwargs = deepcopy(kwargs) ... return super(CopyingMock, self).__call__(*args, **kwargs) @@ -1042,7 +1042,7 @@ that it takes arbitrary keyword arguments (``**kwargs``) which are then passed onto the mock constructor: >>> class Subclass(MagicMock): - ... def _get_child_mock(self, **kwargs): + ... def _get_child_mock(self, /, **kwargs): ... return MagicMock(**kwargs) ... >>> mymock = Subclass() diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst index 54a9f2c6f735..5ec4b40856ae 100644 --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -1456,7 +1456,7 @@ Test cases .. versionadded:: 3.1 - .. classmethod:: addClassCleanup(function, *args, **kwargs) + .. classmethod:: addClassCleanup(function, /, *args, **kwargs) Add a function to be called after :meth:`tearDownClass` to cleanup resources used during the test class. Functions will be called in reverse @@ -2313,7 +2313,7 @@ To add cleanup code that must be run even in the case of an exception, use ``addModuleCleanup``: -.. function:: addModuleCleanup(function, *args, **kwargs) +.. function:: addModuleCleanup(function, /, *args, **kwargs) Add a function to be called after :func:`tearDownModule` to cleanup resources used during the test class. Functions will be called in reverse diff --git a/Doc/library/weakref.rst b/Doc/library/weakref.rst index 80a908bbd83b..a28d71060f38 100644 --- a/Doc/library/weakref.rst +++ b/Doc/library/weakref.rst @@ -396,7 +396,7 @@ the referent is accessed:: import weakref class ExtendedRef(weakref.ref): - def __init__(self, ob, callback=None, **annotations): + def __init__(self, ob, callback=None, /, **annotations): super(ExtendedRef, self).__init__(ob, callback) self.__counter = 0 for k, v in annotations.items(): diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 76d00938dbec..bc7c9ef37442 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -941,8 +941,7 @@ Deprecated :meth:`profile.Profile.runcall`, :meth:`cProfile.Profile.runcall`, :meth:`bdb.Bdb.runcall`, :meth:`trace.Trace.runfunc` and :func:`curses.wrapper`. - - *function* in :func:`unittest.addModuleCleanup` and - :meth:`unittest.TestCase.addCleanup`. + - *function* in :meth:`unittest.TestCase.addCleanup`. - *fn* in the :meth:`~concurrent.futures.Executor.submit` method of :class:`concurrent.futures.ThreadPoolExecutor` and :class:`concurrent.futures.ProcessPoolExecutor`. diff --git a/Lib/_collections_abc.py b/Lib/_collections_abc.py index c363987970b4..2b2ddba170e1 100644 --- a/Lib/_collections_abc.py +++ b/Lib/_collections_abc.py @@ -821,30 +821,21 @@ def clear(self): except KeyError: pass - def update(*args, **kwds): + def update(self, other=(), /, **kwds): ''' D.update([E, ]**F) -> None. Update D from mapping/iterable E and F. If E present and has a .keys() method, does: for k in E: D[k] = E[k] If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v In either case, this is followed by: for k, v in F.items(): D[k] = v ''' - if not args: - raise TypeError("descriptor 'update' of 'MutableMapping' object " - "needs an argument") - self, *args = args - if len(args) > 1: - raise TypeError('update expected at most 1 arguments, got %d' % - len(args)) - if args: - other = args[0] - if isinstance(other, Mapping): - for key in other: - self[key] = other[key] - elif hasattr(other, "keys"): - for key in other.keys(): - self[key] = other[key] - else: - for key, value in other: - self[key] = value + if isinstance(other, Mapping): + for key in other: + self[key] = other[key] + elif hasattr(other, "keys"): + for key in other.keys(): + self[key] = other[key] + else: + for key, value in other: + self[key] = value for key, value in kwds.items(): self[key] = value diff --git a/Lib/_py_abc.py b/Lib/_py_abc.py index 3c3aa8e3d61b..c870ae9048b4 100644 --- a/Lib/_py_abc.py +++ b/Lib/_py_abc.py @@ -32,7 +32,7 @@ class ABCMeta(type): # external code. _abc_invalidation_counter = 0 - def __new__(mcls, name, bases, namespace, **kwargs): + def __new__(mcls, name, bases, namespace, /, **kwargs): cls = super().__new__(mcls, name, bases, namespace, **kwargs) # Compute set of abstract method names abstracts = {name diff --git a/Lib/_threading_local.py b/Lib/_threading_local.py index 245bd0ac91b7..b006d76c4e23 100644 --- a/Lib/_threading_local.py +++ b/Lib/_threading_local.py @@ -56,7 +56,7 @@ >>> class MyLocal(local): ... number = 2 - ... def __init__(self, **kw): + ... def __init__(self, /, **kw): ... self.__dict__.update(kw) ... def squared(self): ... return self.number ** 2 @@ -204,7 +204,7 @@ def _patch(self): class local: __slots__ = '_local__impl', '__dict__' - def __new__(cls, *args, **kw): + def __new__(cls, /, *args, **kw): if (args or kw) and (cls.__init__ is object.__init__): raise TypeError("Initialization arguments are not supported") self = object.__new__(cls) diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py index 5b740d84c275..e9999e27d5f5 100644 --- a/Lib/collections/__init__.py +++ b/Lib/collections/__init__.py @@ -93,16 +93,10 @@ class OrderedDict(dict): # Individual links are kept alive by the hard reference in self.__map. # Those hard references disappear when a key is deleted from an OrderedDict. - def __init__(*args, **kwds): + def __init__(self, other=(), /, **kwds): '''Initialize an ordered dictionary. The signature is the same as regular dictionaries. Keyword argument order is preserved. ''' - if not args: - raise TypeError("descriptor '__init__' of 'OrderedDict' object " - "needs an argument") - self, *args = args - if len(args) > 1: - raise TypeError('expected at most 1 arguments, got %d' % len(args)) try: self.__root except AttributeError: @@ -110,7 +104,7 @@ def __init__(*args, **kwds): self.__root = root = _proxy(self.__hardroot) root.prev = root.next = root self.__map = {} - self.__update(*args, **kwds) + self.__update(other, **kwds) def __setitem__(self, key, value, dict_setitem=dict.__setitem__, proxy=_proxy, Link=_Link): @@ -413,8 +407,8 @@ def _make(cls, iterable): _make.__func__.__doc__ = (f'Make a new {typename} object from a sequence ' 'or iterable') - def _replace(_self, **kwds): - result = _self._make(_map(kwds.pop, field_names, _self)) + def _replace(self, /, **kwds): + result = self._make(_map(kwds.pop, field_names, self)) if kwds: raise ValueError(f'Got unexpected field names: {list(kwds)!r}') return result @@ -543,7 +537,7 @@ class Counter(dict): # http://code.activestate.com/recipes/259174/ # Knuth, TAOCP Vol. II section 4.6.3 - def __init__(*args, **kwds): + def __init__(self, iterable=None, /, **kwds): '''Create a new, empty Counter object. And if given, count elements from an input iterable. Or, initialize the count from another mapping of elements to their counts. @@ -554,14 +548,8 @@ def __init__(*args, **kwds): >>> c = Counter(a=4, b=2) # a new counter from keyword args ''' - if not args: - raise TypeError("descriptor '__init__' of 'Counter' object " - "needs an argument") - self, *args = args - if len(args) > 1: - raise TypeError('expected at most 1 arguments, got %d' % len(args)) super(Counter, self).__init__() - self.update(*args, **kwds) + self.update(iterable, **kwds) def __missing__(self, key): 'The count of elements not in the Counter is zero.' @@ -617,7 +605,7 @@ def fromkeys(cls, iterable, v=None): raise NotImplementedError( 'Counter.fromkeys() is undefined. Use Counter(iterable) instead.') - def update(*args, **kwds): + def update(self, iterable=None, /, **kwds): '''Like dict.update() but add counts instead of replacing them. Source can be an iterable, a dictionary, or another Counter instance. @@ -637,13 +625,6 @@ def update(*args, **kwds): # contexts. Instead, we implement straight-addition. Both the inputs # and outputs are allowed to contain zero and negative counts. - if not args: - raise TypeError("descriptor 'update' of 'Counter' object " - "needs an argument") - self, *args = args - if len(args) > 1: - raise TypeError('expected at most 1 arguments, got %d' % len(args)) - iterable = args[0] if args else None if iterable is not None: if isinstance(iterable, _collections_abc.Mapping): if self: @@ -657,7 +638,7 @@ def update(*args, **kwds): if kwds: self.update(kwds) - def subtract(*args, **kwds): + def subtract(self, iterable=None, /, **kwds): '''Like dict.update() but subtracts counts instead of replacing them. Counts can be reduced below zero. Both the inputs and outputs are allowed to contain zero and negative counts. @@ -673,13 +654,6 @@ def subtract(*args, **kwds): -1 ''' - if not args: - raise TypeError("descriptor 'subtract' of 'Counter' object " - "needs an argument") - self, *args = args - if len(args) > 1: - raise TypeError('expected at most 1 arguments, got %d' % len(args)) - iterable = args[0] if args else None if iterable is not None: self_get = self.get if isinstance(iterable, _collections_abc.Mapping): @@ -1141,7 +1115,7 @@ def copy(self): return self.__class__(self) def count(self, item): return self.data.count(item) def index(self, item, *args): return self.data.index(item, *args) def reverse(self): self.data.reverse() - def sort(self, *args, **kwds): self.data.sort(*args, **kwds) + def sort(self, /, *args, **kwds): self.data.sort(*args, **kwds) def extend(self, other): if isinstance(other, UserList): self.data.extend(other.data) @@ -1240,7 +1214,7 @@ def find(self, sub, start=0, end=_sys.maxsize): if isinstance(sub, UserString): sub = sub.data return self.data.find(sub, start, end) - def format(self, *args, **kwds): + def format(self, /, *args, **kwds): return self.data.format(*args, **kwds) def format_map(self, mapping): return self.data.format_map(mapping) diff --git a/Lib/contextlib.py b/Lib/contextlib.py index de989a001c6d..94dc2bfed06c 100644 --- a/Lib/contextlib.py +++ b/Lib/contextlib.py @@ -377,8 +377,7 @@ def _create_exit_wrapper(cm, cm_exit): return MethodType(cm_exit, cm) @staticmethod - def _create_cb_wrapper(*args, **kwds): - callback, *args = args + def _create_cb_wrapper(callback, /, *args, **kwds): def _exit_wrapper(exc_type, exc, tb): callback(*args, **kwds) return _exit_wrapper @@ -553,8 +552,7 @@ def _create_async_exit_wrapper(cm, cm_exit): return MethodType(cm_exit, cm) @staticmethod - def _create_async_cb_wrapper(*args, **kwds): - callback, *args = args + def _create_async_cb_wrapper(callback, /, *args, **kwds): async def _exit_wrapper(exc_type, exc, tb): await callback(*args, **kwds) return _exit_wrapper diff --git a/Lib/dataclasses.py b/Lib/dataclasses.py index 325b822d9f06..75113f123b3a 100644 --- a/Lib/dataclasses.py +++ b/Lib/dataclasses.py @@ -962,10 +962,7 @@ def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen): return cls -# _cls should never be specified by keyword, so start it with an -# underscore. The presence of _cls is used to detect if this -# decorator is being called with parameters or not. -def dataclass(_cls=None, *, init=True, repr=True, eq=True, order=False, +def dataclass(cls=None, /, *, init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False): """Returns the same class as was passed in, with dunder methods added based on the fields defined in the class. @@ -983,12 +980,12 @@ def wrap(cls): return _process_class(cls, init, repr, eq, order, unsafe_hash, frozen) # See if we're being called as @dataclass or @dataclass(). - if _cls is None: + if cls is None: # We're called with parens. return wrap # We're called as @dataclass without parens. - return wrap(_cls) + return wrap(cls) def fields(class_or_instance): diff --git a/Lib/functools.py b/Lib/functools.py index 30964a6fe3d8..64d120182bb0 100644 --- a/Lib/functools.py +++ b/Lib/functools.py @@ -273,15 +273,9 @@ class partial: __slots__ = "func", "args", "keywords", "__dict__", "__weakref__" - def __new__(*args, **keywords): - if not args: - raise TypeError("descriptor '__new__' of partial needs an argument") - if len(args) < 2: - raise TypeError("type 'partial' takes at least one argument") - cls, func, *args = args + def __new__(cls, func, /, *args, **keywords): if not callable(func): raise TypeError("the first argument must be callable") - args = tuple(args) if hasattr(func, "func"): args = func.args + args @@ -295,10 +289,7 @@ def __new__(*args, **keywords): self.keywords = keywords return self - def __call__(*args, **keywords): - if not args: - raise TypeError("descriptor '__call__' of partial needs an argument") - self, *args = args + def __call__(self, /, *args, **keywords): keywords = {**self.keywords, **keywords} return self.func(*self.args, *args, **keywords) @@ -402,8 +393,7 @@ def __repr__(self): keywords=keywords) def _make_unbound_method(self): - def _method(*args, **keywords): - cls_or_self, *args = args + def _method(cls_or_self, /, *args, **keywords): keywords = {**self.keywords, **keywords} return self.func(cls_or_self, *self.args, *args, **keywords) _method.__isabstractmethod__ = self.__isabstractmethod__ diff --git a/Lib/idlelib/debugger_r.py b/Lib/idlelib/debugger_r.py index 0e6dcfbd12c2..9dcfc56414c0 100644 --- a/Lib/idlelib/debugger_r.py +++ b/Lib/idlelib/debugger_r.py @@ -299,7 +299,7 @@ def __init__(self, conn, shell, oid): self.conn = conn self.shell = shell - def call(self, methodname, *args, **kwargs): + def call(self, methodname, /, *args, **kwargs): ##print("*** IdbProxy.call %s %s %s" % (methodname, args, kwargs)) value = self.conn.remotecall(self.oid, methodname, args, kwargs) ##print("*** IdbProxy.call %s returns %r" % (methodname, value)) diff --git a/Lib/idlelib/rpc.py b/Lib/idlelib/rpc.py index f035bde4a0a0..aa8cbd36c479 100644 --- a/Lib/idlelib/rpc.py +++ b/Lib/idlelib/rpc.py @@ -603,7 +603,7 @@ def __init__(self, sockio, oid, name): self.oid = oid self.name = name - def __call__(self, *args, **kwargs): + def __call__(self, /, *args, **kwargs): value = self.sockio.remotecall(self.oid, self.name, args, kwargs) return value diff --git a/Lib/inspect.py b/Lib/inspect.py index a4f28f755705..ca81a24f0641 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -1329,14 +1329,12 @@ def _too_many(f_name, args, kwonly, varargs, defcount, given, values): (f_name, sig, "s" if plural else "", given, kwonly_sig, "was" if given == 1 and not kwonly_given else "were")) -def getcallargs(*func_and_positional, **named): +def getcallargs(func, /, *positional, **named): """Get the mapping of arguments to values. A dict is returned, with keys the function argument names (including the names of the * and ** arguments, if any), and values the respective bound values from 'positional' and 'named'.""" - func = func_and_positional[0] - positional = func_and_positional[1:] spec = getfullargspec(func) args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, ann = spec f_name = func.__name__ @@ -3027,19 +3025,19 @@ def _bind(self, args, kwargs, *, partial=False): return self._bound_arguments_cls(self, arguments) - def bind(*args, **kwargs): + def bind(self, /, *args, **kwargs): """Get a BoundArguments object, that maps the passed `args` and `kwargs` to the function's signature. Raises `TypeError` if the passed arguments can not be bound. """ - return args[0]._bind(args[1:], kwargs) + return self._bind(args, kwargs) - def bind_partial(*args, **kwargs): + def bind_partial(self, /, *args, **kwargs): """Get a BoundArguments object, that partially maps the passed `args` and `kwargs` to the function's signature. Raises `TypeError` if the passed arguments can not be bound. """ - return args[0]._bind(args[1:], kwargs, partial=True) + return self._bind(args, kwargs, partial=True) def __reduce__(self): return (type(self), diff --git a/Lib/multiprocessing/dummy/__init__.py b/Lib/multiprocessing/dummy/__init__.py index 403f5e5198e4..6a1468609e34 100644 --- a/Lib/multiprocessing/dummy/__init__.py +++ b/Lib/multiprocessing/dummy/__init__.py @@ -80,7 +80,7 @@ def freeze_support(): # class Namespace(object): - def __init__(self, **kwds): + def __init__(self, /, **kwds): self.__dict__.update(kwds) def __repr__(self): items = list(self.__dict__.items()) diff --git a/Lib/multiprocessing/managers.py b/Lib/multiprocessing/managers.py index 514152298b09..7e1818bb0996 100644 --- a/Lib/multiprocessing/managers.py +++ b/Lib/multiprocessing/managers.py @@ -615,13 +615,10 @@ def _run_server(cls, registry, address, authkey, serializer, writer, util.info('manager serving at %r', server.address) server.serve_forever() - def _create(*args, **kwds): + def _create(self, typeid, /, *args, **kwds): ''' Create a new shared object; return the token and exposed tuple ''' - self, typeid, *args = args - args = tuple(args) - assert self._state.value == State.STARTED, 'server not yet started' conn = self._Client(self._address, authkey=self._authkey) try: @@ -738,7 +735,7 @@ def register(cls, typeid, callable=None, proxytype=None, exposed=None, ) if create_method: - def temp(self, *args, **kwds): + def temp(self, /, *args, **kwds): util.debug('requesting creation of a shared %r object', typeid) token, exp = self._create(typeid, *args, **kwds) proxy = proxytype( @@ -978,7 +975,7 @@ def MakeProxyType(name, exposed, _cache={}): dic = {} for meth in exposed: - exec('''def %s(self, *args, **kwds): + exec('''def %s(self, /, *args, **kwds): return self._callmethod(%r, args, kwds)''' % (meth, meth), dic) ProxyType = type(name, (BaseProxy,), dic) @@ -1017,7 +1014,7 @@ def AutoProxy(token, serializer, manager=None, authkey=None, # class Namespace(object): - def __init__(self, **kwds): + def __init__(self, /, **kwds): self.__dict__.update(kwds) def __repr__(self): items = list(self.__dict__.items()) diff --git a/Lib/multiprocessing/pool.py b/Lib/multiprocessing/pool.py index 665ca067fa07..b223d6aa724b 100644 --- a/Lib/multiprocessing/pool.py +++ b/Lib/multiprocessing/pool.py @@ -154,7 +154,7 @@ class _PoolCache(dict): notification is done by the use of a queue that is provided when instantiating the cache. """ - def __init__(self, *args, notifier=None, **kwds): + def __init__(self, /, *args, notifier=None, **kwds): self.notifier = notifier super().__init__(*args, **kwds) diff --git a/Lib/operator.py b/Lib/operator.py index 0e2e53efc69a..fb58851fa6ef 100644 --- a/Lib/operator.py +++ b/Lib/operator.py @@ -302,15 +302,11 @@ class methodcaller: """ __slots__ = ('_name', '_args', '_kwargs') - def __init__(*args, **kwargs): - if len(args) < 2: - msg = "methodcaller needs at least one argument, the method name" - raise TypeError(msg) - self = args[0] - self._name = args[1] + def __init__(self, name, /, *args, **kwargs): + self._name = name if not isinstance(self._name, str): raise TypeError('method name must be a string') - self._args = args[2:] + self._args = args self._kwargs = kwargs def __call__(self, obj): diff --git a/Lib/random.py b/Lib/random.py index 53981f3e4f89..365a01957203 100644 --- a/Lib/random.py +++ b/Lib/random.py @@ -100,7 +100,7 @@ def __init__(self, x=None): self.seed(x) self.gauss_next = None - def __init_subclass__(cls, **kwargs): + def __init_subclass__(cls, /, **kwargs): """Control how subclasses generate random integers. The algorithm a subclass can use depends on the random() and/or diff --git a/Lib/string.py b/Lib/string.py index b9d6f5eb5675..b423ff5dc6f6 100644 --- a/Lib/string.py +++ b/Lib/string.py @@ -52,6 +52,8 @@ def capwords(s, sep=None): import re as _re from collections import ChainMap as _ChainMap +_sentinel_dict = {} + class _TemplateMetaclass(type): pattern = r""" %(delim)s(?: @@ -104,19 +106,11 @@ def _invalid(self, mo): raise ValueError('Invalid placeholder in string: line %d, col %d' % (lineno, colno)) - def substitute(*args, **kws): - if not args: - raise TypeError("descriptor 'substitute' of 'Template' object " - "needs an argument") - self, *args = args # allow the "self" keyword be passed - if len(args) > 1: - raise TypeError('Too many positional arguments') - if not args: + def substitute(self, mapping=_sentinel_dict, /, **kws): + if mapping is _sentinel_dict: mapping = kws elif kws: - mapping = _ChainMap(kws, args[0]) - else: - mapping = args[0] + mapping = _ChainMap(kws, mapping) # Helper function for .sub() def convert(mo): # Check the most common path first. @@ -131,19 +125,11 @@ def convert(mo): self.pattern) return self.pattern.sub(convert, self.template) - def safe_substitute(*args, **kws): - if not args: - raise TypeError("descriptor 'safe_substitute' of 'Template' object " - "needs an argument") - self, *args = args # allow the "self" keyword be passed - if len(args) > 1: - raise TypeError('Too many positional arguments') - if not args: + def safe_substitute(self, mapping=_sentinel_dict, /, **kws): + if mapping is _sentinel_dict: mapping = kws elif kws: - mapping = _ChainMap(kws, args[0]) - else: - mapping = args[0] + mapping = _ChainMap(kws, mapping) # Helper function for .sub() def convert(mo): named = mo.group('named') or mo.group('braced') @@ -173,16 +159,7 @@ def convert(mo): # The field name parser is implemented in _string.formatter_field_name_split class Formatter: - def format(*args, **kwargs): - if not args: - raise TypeError("descriptor 'format' of 'Formatter' object " - "needs an argument") - self, *args = args # allow the "self" keyword be passed - try: - format_string, *args = args # allow the "format_string" keyword be passed - except ValueError: - raise TypeError("format() missing 1 required positional " - "argument: 'format_string'") from None + def format(self, format_string, /, *args, **kwargs): return self.vformat(format_string, args, kwargs) def vformat(self, format_string, args, kwargs): diff --git a/Lib/test/support/script_helper.py b/Lib/test/support/script_helper.py index 27a47f2c4e66..83519988e394 100644 --- a/Lib/test/support/script_helper.py +++ b/Lib/test/support/script_helper.py @@ -137,7 +137,7 @@ def run_python_until_end(*args, **env_vars): err = strip_python_stderr(err) return _PythonRunResult(rc, out, err), cmd_line -def _assert_python(expected_success, *args, **env_vars): +def _assert_python(expected_success, /, *args, **env_vars): res, cmd_line = run_python_until_end(*args, **env_vars) if (res.rc and expected_success) or (not res.rc and not expected_success): res.fail(cmd_line) diff --git a/Lib/typing.py b/Lib/typing.py index 16ccfad049f4..5f1a0ad3d637 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -283,7 +283,7 @@ class _Final: __slots__ = ('__weakref__',) - def __init_subclass__(self, *args, **kwds): + def __init_subclass__(self, /, *args, **kwds): if '_root' not in kwds: raise TypeError("Cannot subclass special typing classes") diff --git a/Lib/unittest/case.py b/Lib/unittest/case.py index 7b1e86941315..b363c6351007 100644 --- a/Lib/unittest/case.py +++ b/Lib/unittest/case.py @@ -86,23 +86,10 @@ def _id(obj): _module_cleanups = [] -def addModuleCleanup(*args, **kwargs): +def addModuleCleanup(function, /, *args, **kwargs): """Same as addCleanup, except the cleanup items are called even if setUpModule fails (unlike tearDownModule).""" - if args: - function, *args = args - elif 'function' in kwargs: - function = kwargs.pop('function') - import warnings - warnings.warn("Passing 'function' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError('addModuleCleanup expected at least 1 positional ' - 'argument, got %d' % (len(args)-1)) - args = tuple(args) - _module_cleanups.append((function, args, kwargs)) -addModuleCleanup.__text_signature__ = '(function, /, *args, **kwargs)' def doModuleCleanups(): @@ -501,22 +488,11 @@ def addCleanup(*args, **kwargs): self._cleanups.append((function, args, kwargs)) addCleanup.__text_signature__ = '($self, function, /, *args, **kwargs)' - def addClassCleanup(*args, **kwargs): + @classmethod + def addClassCleanup(cls, function, /, *args, **kwargs): """Same as addCleanup, except the cleanup items are called even if setUpClass fails (unlike tearDownClass).""" - if len(args) >= 2: - cls, function, *args = args - elif not args: - raise TypeError("descriptor 'addClassCleanup' of 'TestCase' object " - "needs an argument") - else: - raise TypeError('addClassCleanup expected at least 1 positional ' - 'argument, got %d' % (len(args)-1)) - args = tuple(args) - cls._class_cleanups.append((function, args, kwargs)) - addClassCleanup.__text_signature__ = '($cls, function, /, *args, **kwargs)' - addClassCleanup = classmethod(addClassCleanup) def setUp(self): "Hook method for setting up the test fixture before exercising it." diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index be96194793ef..c2802726d75d 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -106,7 +106,7 @@ def _check_signature(func, mock, skipfirst, instance=False): if sig is None: return func, sig = sig - def checksig(_mock_self, *args, **kwargs): + def checksig(self, /, *args, **kwargs): sig.bind(*args, **kwargs) _copy_func_details(func, checksig) type(mock)._mock_check_sig = checksig @@ -243,7 +243,7 @@ def _setup_async_mock(mock): # Mock is not configured yet so the attributes are set # to a function and then the corresponding mock helper function # is called when the helper is accessed similar to _setup_func. - def wrapper(attr, *args, **kwargs): + def wrapper(attr, /, *args, **kwargs): return getattr(mock.mock, attr)(*args, **kwargs) for attribute in ('assert_awaited', @@ -387,7 +387,7 @@ def __next__(self): class Base(object): _mock_return_value = DEFAULT _mock_side_effect = None - def __init__(self, *args, **kwargs): + def __init__(self, /, *args, **kwargs): pass @@ -395,7 +395,7 @@ def __init__(self, *args, **kwargs): class NonCallableMock(Base): """A non-callable version of `Mock`""" - def __new__(cls, *args, **kw): + def __new__(cls, /, *args, **kw): # every instance has its own class # so we can create magic methods on the # class without stomping on other mocks @@ -602,7 +602,7 @@ def reset_mock(self, visited=None,*, return_value=False, side_effect=False): ret.reset_mock(visited) - def configure_mock(self, **kwargs): + def configure_mock(self, /, **kwargs): """Set attributes on the mock through keyword arguments. Attributes plus return values and side effects can be set on child @@ -820,10 +820,9 @@ def _call_matcher(self, _call): else: return _call - def assert_not_called(_mock_self): + def assert_not_called(self): """assert that the mock was never called. """ - self = _mock_self if self.call_count != 0: msg = ("Expected '%s' to not have been called. Called %s times.%s" % (self._mock_name or 'mock', @@ -831,19 +830,17 @@ def assert_not_called(_mock_self): self._calls_repr())) raise AssertionError(msg) - def assert_called(_mock_self): + def assert_called(self): """assert that the mock was called at least once """ - self = _mock_self if self.call_count == 0: msg = ("Expected '%s' to have been called." % self._mock_name or 'mock') raise AssertionError(msg) - def assert_called_once(_mock_self): + def assert_called_once(self): """assert that the mock was called only once. """ - self = _mock_self if not self.call_count == 1: msg = ("Expected '%s' to have been called once. Called %s times.%s" % (self._mock_name or 'mock', @@ -851,12 +848,11 @@ def assert_called_once(_mock_self): self._calls_repr())) raise AssertionError(msg) - def assert_called_with(_mock_self, *args, **kwargs): + def assert_called_with(self, /, *args, **kwargs): """assert that the mock was called with the specified arguments. Raises an AssertionError if the args and keyword args passed in are different to the last call to the mock.""" - self = _mock_self if self.call_args is None: expected = self._format_mock_call_signature(args, kwargs) actual = 'not called.' @@ -874,10 +870,9 @@ def _error_message(): raise AssertionError(_error_message()) from cause - def assert_called_once_with(_mock_self, *args, **kwargs): + def assert_called_once_with(self, /, *args, **kwargs): """assert that the mock was called exactly once and that that call was with the specified arguments.""" - self = _mock_self if not self.call_count == 1: msg = ("Expected '%s' to be called once. Called %s times.%s" % (self._mock_name or 'mock', @@ -924,7 +919,7 @@ def assert_has_calls(self, calls, any_order=False): ) from cause - def assert_any_call(self, *args, **kwargs): + def assert_any_call(self, /, *args, **kwargs): """assert the mock has been called with the specified arguments. The assert passes if the mock has *ever* been called, unlike @@ -940,7 +935,7 @@ def assert_any_call(self, *args, **kwargs): ) from cause - def _get_child_mock(self, **kw): + def _get_child_mock(self, /, **kw): """Create the child mocks for attributes and return value. By default child mocks will be the same type as the parent. Subclasses of Mock may want to override this to customize the way @@ -1016,20 +1011,19 @@ def __init__(self, spec=None, side_effect=None, return_value=DEFAULT, self.side_effect = side_effect - def _mock_check_sig(self, *args, **kwargs): + def _mock_check_sig(self, /, *args, **kwargs): # stub method that can be replaced with one with a specific signature pass - def __call__(_mock_self, *args, **kwargs): + def __call__(self, /, *args, **kwargs): # can't use self in-case a function / method we are mocking uses self # in the signature - _mock_self._mock_check_sig(*args, **kwargs) - return _mock_self._mock_call(*args, **kwargs) + self._mock_check_sig(*args, **kwargs) + return self._mock_call(*args, **kwargs) - def _mock_call(_mock_self, *args, **kwargs): - self = _mock_self + def _mock_call(self, /, *args, **kwargs): self.called = True self.call_count += 1 @@ -1840,7 +1834,7 @@ def _patch_stopall(): def _get_method(name, func): "Turns a callable object (like a mock) into a real function" - def method(self, *args, **kw): + def method(self, /, *args, **kw): return func(self, *args, **kw) method.__name__ = name return method @@ -1954,7 +1948,7 @@ def _set_return_value(mock, method, name): class MagicMixin(object): - def __init__(self, *args, **kw): + def __init__(self, /, *args, **kw): self._mock_set_magics() # make magic work for kwargs in init _safe_super(MagicMixin, self).__init__(*args, **kw) self._mock_set_magics() # fix magic broken by upper level init @@ -1996,7 +1990,7 @@ def mock_add_spec(self, spec, spec_set=False): class AsyncMagicMixin: - def __init__(self, *args, **kw): + def __init__(self, /, *args, **kw): self._mock_set_async_magics() # make magic work for kwargs in init _safe_super(AsyncMagicMixin, self).__init__(*args, **kw) self._mock_set_async_magics() # fix magic broken by upper level init @@ -2067,7 +2061,7 @@ class AsyncMockMixin(Base): await_args = _delegating_property('await_args') await_args_list = _delegating_property('await_args_list') - def __init__(self, *args, **kwargs): + def __init__(self, /, *args, **kwargs): super().__init__(*args, **kwargs) # asyncio.iscoroutinefunction() checks _is_coroutine property to say if an # object is a coroutine. Without this check it looks to see if it is a @@ -2084,8 +2078,7 @@ def __init__(self, *args, **kwargs): code_mock.co_flags = inspect.CO_COROUTINE self.__dict__['__code__'] = code_mock - async def _mock_call(_mock_self, *args, **kwargs): - self = _mock_self + async def _mock_call(self, /, *args, **kwargs): try: result = super()._mock_call(*args, **kwargs) except (BaseException, StopIteration) as e: @@ -2110,30 +2103,27 @@ def __init__(self, *args, **kwargs): return await proxy() - def assert_awaited(_mock_self): + def assert_awaited(self): """ Assert that the mock was awaited at least once. """ - self = _mock_self if self.await_count == 0: msg = f"Expected {self._mock_name or 'mock'} to have been awaited." raise AssertionError(msg) - def assert_awaited_once(_mock_self): + def assert_awaited_once(self): """ Assert that the mock was awaited exactly once. """ - self = _mock_self if not self.await_count == 1: msg = (f"Expected {self._mock_name or 'mock'} to have been awaited once." f" Awaited {self.await_count} times.") raise AssertionError(msg) - def assert_awaited_with(_mock_self, *args, **kwargs): + def assert_awaited_with(self, /, *args, **kwargs): """ Assert that the last await was with the specified arguments. """ - self = _mock_self if self.await_args is None: expected = self._format_mock_call_signature(args, kwargs) raise AssertionError(f'Expected await: {expected}\nNot awaited') @@ -2148,23 +2138,21 @@ def _error_message(): cause = expected if isinstance(expected, Exception) else None raise AssertionError(_error_message()) from cause - def assert_awaited_once_with(_mock_self, *args, **kwargs): + def assert_awaited_once_with(self, /, *args, **kwargs): """ Assert that the mock was awaited exactly once and with the specified arguments. """ - self = _mock_self if not self.await_count == 1: msg = (f"Expected {self._mock_name or 'mock'} to have been awaited once." f" Awaited {self.await_count} times.") raise AssertionError(msg) return self.assert_awaited_with(*args, **kwargs) - def assert_any_await(_mock_self, *args, **kwargs): + def assert_any_await(self, /, *args, **kwargs): """ Assert the mock has ever been awaited with the specified arguments. """ - self = _mock_self expected = self._call_matcher((args, kwargs)) actual = [self._call_matcher(c) for c in self.await_args_list] if expected not in actual: @@ -2174,7 +2162,7 @@ def assert_any_await(_mock_self, *args, **kwargs): '%s await not found' % expected_string ) from cause - def assert_has_awaits(_mock_self, calls, any_order=False): + def assert_has_awaits(self, calls, any_order=False): """ Assert the mock has been awaited with the specified calls. The :attr:`await_args_list` list is checked for the awaits. @@ -2186,7 +2174,6 @@ def assert_has_awaits(_mock_self, calls, any_order=False): If `any_order` is True then the awaits can be in any order, but they must all appear in :attr:`await_args_list`. """ - self = _mock_self expected = [self._call_matcher(c) for c in calls] cause = expected if isinstance(expected, Exception) else None all_awaits = _CallList(self._call_matcher(c) for c in self.await_args_list) @@ -2211,17 +2198,16 @@ def assert_has_awaits(_mock_self, calls, any_order=False): '%r not all found in await list' % (tuple(not_found),) ) from cause - def assert_not_awaited(_mock_self): + def assert_not_awaited(self): """ Assert that the mock was never awaited. """ - self = _mock_self if self.await_count != 0: msg = (f"Expected {self._mock_name or 'mock'} to not have been awaited." f" Awaited {self.await_count} times.") raise AssertionError(msg) - def reset_mock(self, *args, **kwargs): + def reset_mock(self, /, *args, **kwargs): """ See :func:`.Mock.reset_mock()` """ @@ -2424,7 +2410,7 @@ def __eq__(self, other): __ne__ = object.__ne__ - def __call__(self, *args, **kwargs): + def __call__(self, /, *args, **kwargs): if self._mock_name is None: return _Call(('', args, kwargs), name='()') @@ -2439,10 +2425,10 @@ def __getattr__(self, attr): return _Call(name=name, parent=self, from_kall=False) - def count(self, *args, **kwargs): + def count(self, /, *args, **kwargs): return self.__getattr__('count')(*args, **kwargs) - def index(self, *args, **kwargs): + def index(self, /, *args, **kwargs): return self.__getattr__('index')(*args, **kwargs) def _get_call_arguments(self): @@ -2778,7 +2764,7 @@ class PropertyMock(Mock): Fetching a `PropertyMock` instance from an object calls the mock, with no args. Setting it calls the mock with the value being set. """ - def _get_child_mock(self, **kwargs): + def _get_child_mock(self, /, **kwargs): return MagicMock(**kwargs) def __get__(self, obj, obj_type): diff --git a/Lib/unittest/test/test_runner.py b/Lib/unittest/test/test_runner.py index 443b689dbea0..7d36340741f4 100644 --- a/Lib/unittest/test/test_runner.py +++ b/Lib/unittest/test/test_runner.py @@ -410,14 +410,13 @@ def cleanup(*args, **kwargs): class Module(object): unittest.addModuleCleanup(cleanup, 1, 2, function='hello') - with self.assertWarns(DeprecationWarning): + with self.assertRaises(TypeError): unittest.addModuleCleanup(function=cleanup, arg='hello') with self.assertRaises(TypeError): unittest.addModuleCleanup() unittest.case.doModuleCleanups() self.assertEqual(cleanups, - [((), {'arg': 'hello'}), - ((1, 2), {'function': 'hello'})]) + [((1, 2), {'function': 'hello'})]) def test_run_module_cleanUp(self): blowUp = True diff --git a/Lib/weakref.py b/Lib/weakref.py index 1eeb7b0a0b44..8d71af653b7e 100644 --- a/Lib/weakref.py +++ b/Lib/weakref.py @@ -99,13 +99,7 @@ class WeakValueDictionary(_collections_abc.MutableMapping): # objects are unwrapped on the way out, and we always wrap on the # way in). - def __init__(*args, **kw): - if not args: - raise TypeError("descriptor '__init__' of 'WeakValueDictionary' " - "object needs an argument") - self, *args = args - if len(args) > 1: - raise TypeError('expected at most 1 arguments, got %d' % len(args)) + def __init__(self, other=(), /, **kw): def remove(wr, selfref=ref(self), _atomic_removal=_remove_dead_weakref): self = selfref() if self is not None: @@ -120,7 +114,7 @@ def remove(wr, selfref=ref(self), _atomic_removal=_remove_dead_weakref): self._pending_removals = [] self._iterating = set() self.data = d = {} - self.update(*args, **kw) + self.update(other, **kw) def _commit_removals(self): l = self._pending_removals @@ -287,24 +281,17 @@ def setdefault(self, key, default=None): else: return o - def update(*args, **kwargs): - if not args: - raise TypeError("descriptor 'update' of 'WeakValueDictionary' " - "object needs an argument") - self, *args = args - if len(args) > 1: - raise TypeError('expected at most 1 arguments, got %d' % len(args)) - dict = args[0] if args else None + def update(self, other=None, /, **kwargs): if self._pending_removals: self._commit_removals() d = self.data - if dict is not None: - if not hasattr(dict, "items"): - dict = type({})(dict) - for key, o in dict.items(): + if other is not None: + if not hasattr(other, "items"): + other = dict(other) + for key, o in other.items(): d[key] = KeyedRef(o, self._remove, key) - if len(kwargs): - self.update(kwargs) + for key, o in kwargs.items(): + d[key] = KeyedRef(o, self._remove, key) def valuerefs(self): """Return a list of weak references to the values. @@ -488,7 +475,7 @@ def pop(self, key, *args): def setdefault(self, key, default=None): return self.data.setdefault(ref(key, self._remove),default) - def update(self, dict=None, **kwargs): + def update(self, dict=None, /, **kwargs): d = self.data if dict is not None: if not hasattr(dict, "items"): From webhook-mailer at python.org Sat Jun 1 04:38:29 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Sat, 01 Jun 2019 08:38:29 -0000 Subject: [Python-checkins] Use more PEP 570 syntax in the documentation. (GH-13720) Message-ID: https://github.com/python/cpython/commit/70c5f2ae6e6a07d44a8d3f3202ea01bf697e05db commit: 70c5f2ae6e6a07d44a8d3f3202ea01bf697e05db branch: master author: Serhiy Storchaka committer: GitHub date: 2019-06-01T11:38:24+03:00 summary: Use more PEP 570 syntax in the documentation. (GH-13720) files: M Doc/faq/programming.rst M Doc/howto/logging-cookbook.rst M Doc/library/functools.rst M Doc/reference/datamodel.rst diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst index 9660a701427f..a00c6a053ef1 100644 --- a/Doc/faq/programming.rst +++ b/Doc/faq/programming.rst @@ -554,8 +554,8 @@ desired effect in a number of ways. 5) Or bundle up values in a class instance:: class callByRef: - def __init__(self, **args): - for (key, value) in args.items(): + def __init__(self, /, **args): + for key, value in args.items(): setattr(self, key, value) def func4(args): diff --git a/Doc/howto/logging-cookbook.rst b/Doc/howto/logging-cookbook.rst index 4956aa0dd957..71f9fc920fdf 100644 --- a/Doc/howto/logging-cookbook.rst +++ b/Doc/howto/logging-cookbook.rst @@ -579,7 +579,7 @@ information. When you call one of the logging methods on an instance of information in the delegated call. Here's a snippet from the code of :class:`LoggerAdapter`:: - def debug(self, msg, *args, **kwargs): + def debug(self, msg, /, *args, **kwargs): """ Delegate a debug call to the underlying logger, after adding contextual information from this adapter instance. @@ -1079,7 +1079,7 @@ call ``str()`` on that object to get the actual format string. Consider the following two classes:: class BraceMessage: - def __init__(self, fmt, *args, **kwargs): + def __init__(self, fmt, /, *args, **kwargs): self.fmt = fmt self.args = args self.kwargs = kwargs @@ -1088,7 +1088,7 @@ following two classes:: return self.fmt.format(*self.args, **self.kwargs) class DollarMessage: - def __init__(self, fmt, **kwargs): + def __init__(self, fmt, /, **kwargs): self.fmt = fmt self.kwargs = kwargs @@ -1143,7 +1143,7 @@ to the above, as in the following example:: import logging - class Message(object): + class Message: def __init__(self, fmt, args): self.fmt = fmt self.args = args @@ -1155,7 +1155,7 @@ to the above, as in the following example:: def __init__(self, logger, extra=None): super(StyleAdapter, self).__init__(logger, extra or {}) - def log(self, level, msg, *args, **kwargs): + def log(self, level, msg, /, *args, **kwargs): if self.isEnabledFor(level): msg, kwargs = self.process(msg, kwargs) self.logger._log(level, Message(msg, args), (), **kwargs) @@ -1301,7 +1301,7 @@ You can also subclass :class:`QueueListener` to get messages from other kinds of queues, for example a ZeroMQ 'subscribe' socket. Here's an example:: class ZeroMQSocketListener(QueueListener): - def __init__(self, uri, *handlers, **kwargs): + def __init__(self, uri, /, *handlers, **kwargs): self.ctx = kwargs.get('ctx') or zmq.Context() socket = zmq.Socket(self.ctx, zmq.SUB) socket.setsockopt_string(zmq.SUBSCRIBE, '') # subscribe to everything @@ -1706,8 +1706,8 @@ which uses JSON to serialise the event in a machine-parseable manner:: import json import logging - class StructuredMessage(object): - def __init__(self, message, **kwargs): + class StructuredMessage: + def __init__(self, message, /, **kwargs): self.message = message self.kwargs = kwargs @@ -1750,8 +1750,8 @@ as in the following complete example:: return o.encode('unicode_escape').decode('ascii') return super(Encoder, self).default(o) - class StructuredMessage(object): - def __init__(self, message, **kwargs): + class StructuredMessage: + def __init__(self, message, /, **kwargs): self.message = message self.kwargs = kwargs @@ -1982,8 +1982,8 @@ object as a message format string, and that the logging package will call :func:`str` on that object to get the actual format string. Consider the following two classes:: - class BraceMessage(object): - def __init__(self, fmt, *args, **kwargs): + class BraceMessage: + def __init__(self, fmt, /, *args, **kwargs): self.fmt = fmt self.args = args self.kwargs = kwargs @@ -1991,8 +1991,8 @@ following two classes:: def __str__(self): return self.fmt.format(*self.args, **self.kwargs) - class DollarMessage(object): - def __init__(self, fmt, **kwargs): + class DollarMessage: + def __init__(self, fmt, /, **kwargs): self.fmt = fmt self.kwargs = kwargs @@ -2457,7 +2457,7 @@ scope of the context manager:: import logging import sys - class LoggingContext(object): + class LoggingContext: def __init__(self, logger, level=None, handler=None, close=True): self.logger = logger self.level = level diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst index 654a3efa214b..3a0b554e923c 100644 --- a/Doc/library/functools.rst +++ b/Doc/library/functools.rst @@ -252,7 +252,7 @@ The :mod:`functools` module defines the following functions: 18 -.. class:: partialmethod(func, *args, **keywords) +.. class:: partialmethod(func, /, *args, **keywords) Return a new :class:`partialmethod` descriptor which behaves like :class:`partial` except that it is designed to be used as a method diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index 8b4d889535fb..c566dfdf856d 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -1809,7 +1809,7 @@ class defining the method. class, as in:: class Philosopher: - def __init_subclass__(cls, default_name, **kwargs): + def __init_subclass__(cls, /, default_name, **kwargs): super().__init_subclass__(**kwargs) cls.default_name = default_name From webhook-mailer at python.org Sat Jun 1 05:19:16 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 01 Jun 2019 09:19:16 -0000 Subject: [Python-checkins] bpo-36813: Fix QueueListener to call task_done() upon termination. (GH-13113) Message-ID: https://github.com/python/cpython/commit/6b282e18877ec84e927b381b4ce187eaf4ba3dd7 commit: 6b282e18877ec84e927b381b4ce187eaf4ba3dd7 branch: master author: Bar Harel committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-06-01T02:19:09-07:00 summary: bpo-36813: Fix QueueListener to call task_done() upon termination. (GH-13113) Fixed QueueListener in order to avoid random deadlocks. Unable to add regression tests atm due to time constraints, will add it in a bit. Regarding implementation, although it's nested, it does not cause performance issues whatsoever, and does not call task_done() in case of an exception (which is the right thing to do IMHO). https://bugs.python.org/issue36813 files: A Misc/NEWS.d/next/Library/2019-05-06-18-28-38.bpo-36813.NXD0KZ.rst M Lib/logging/handlers.py M Lib/test/test_logging.py diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py index 3727bf0677cd..a913d27389ab 100644 --- a/Lib/logging/handlers.py +++ b/Lib/logging/handlers.py @@ -1477,6 +1477,8 @@ def _monitor(self): try: record = self.dequeue(True) if record is self._sentinel: + if has_task_done: + q.task_done() break self.handle(record) if has_task_done: diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index b884753ad397..50148dc2f252 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -3633,6 +3633,16 @@ def test_no_messages_in_queue_after_stop(self): [m.msg if isinstance(m, logging.LogRecord) else m for m in items])) + def test_calls_task_done_after_stop(self): + # Issue 36813: Make sure queue.join does not deadlock. + log_queue = queue.Queue() + listener = logging.handlers.QueueListener(log_queue) + listener.start() + listener.stop() + with self.assertRaises(ValueError): + # Make sure all tasks are done and .join won't block. + log_queue.task_done() + ZERO = datetime.timedelta(0) diff --git a/Misc/NEWS.d/next/Library/2019-05-06-18-28-38.bpo-36813.NXD0KZ.rst b/Misc/NEWS.d/next/Library/2019-05-06-18-28-38.bpo-36813.NXD0KZ.rst new file mode 100644 index 000000000000..e89358aa4051 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-06-18-28-38.bpo-36813.NXD0KZ.rst @@ -0,0 +1,2 @@ +Fix :class:`~logging.handlers.QueueListener` to call ``queue.task_done()`` +upon stopping. Patch by Bar Harel. From webhook-mailer at python.org Sat Jun 1 05:36:33 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 01 Jun 2019 09:36:33 -0000 Subject: [Python-checkins] bpo-36813: Fix QueueListener to call task_done() upon termination. (GH-13113) Message-ID: https://github.com/python/cpython/commit/f286e0373feda0955c910a9fe4ef99cd2c40969e commit: f286e0373feda0955c910a9fe4ef99cd2c40969e branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-01T02:36:29-07:00 summary: bpo-36813: Fix QueueListener to call task_done() upon termination. (GH-13113) Fixed QueueListener in order to avoid random deadlocks. Unable to add regression tests atm due to time constraints, will add it in a bit. Regarding implementation, although it's nested, it does not cause performance issues whatsoever, and does not call task_done() in case of an exception (which is the right thing to do IMHO). https://bugs.python.org/issue36813 (cherry picked from commit 6b282e18877ec84e927b381b4ce187eaf4ba3dd7) Co-authored-by: Bar Harel files: A Misc/NEWS.d/next/Library/2019-05-06-18-28-38.bpo-36813.NXD0KZ.rst M Lib/logging/handlers.py M Lib/test/test_logging.py diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py index 3727bf0677cd..a913d27389ab 100644 --- a/Lib/logging/handlers.py +++ b/Lib/logging/handlers.py @@ -1477,6 +1477,8 @@ def _monitor(self): try: record = self.dequeue(True) if record is self._sentinel: + if has_task_done: + q.task_done() break self.handle(record) if has_task_done: diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index d12e1e57455d..97c13a4c5214 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -3495,6 +3495,16 @@ def test_no_messages_in_queue_after_stop(self): [m.msg if isinstance(m, logging.LogRecord) else m for m in items])) + def test_calls_task_done_after_stop(self): + # Issue 36813: Make sure queue.join does not deadlock. + log_queue = queue.Queue() + listener = logging.handlers.QueueListener(log_queue) + listener.start() + listener.stop() + with self.assertRaises(ValueError): + # Make sure all tasks are done and .join won't block. + log_queue.task_done() + ZERO = datetime.timedelta(0) diff --git a/Misc/NEWS.d/next/Library/2019-05-06-18-28-38.bpo-36813.NXD0KZ.rst b/Misc/NEWS.d/next/Library/2019-05-06-18-28-38.bpo-36813.NXD0KZ.rst new file mode 100644 index 000000000000..e89358aa4051 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-06-18-28-38.bpo-36813.NXD0KZ.rst @@ -0,0 +1,2 @@ +Fix :class:`~logging.handlers.QueueListener` to call ``queue.task_done()`` +upon stopping. Patch by Bar Harel. From webhook-mailer at python.org Sat Jun 1 07:21:57 2019 From: webhook-mailer at python.org (Mark Dickinson) Date: Sat, 01 Jun 2019 11:21:57 -0000 Subject: [Python-checkins] Move whats-new entry for math.factorial to the math module section. (GH-13723) Message-ID: https://github.com/python/cpython/commit/a0adffb90287900a9e2c809ce2c1bbe481ac7dd0 commit: a0adffb90287900a9e2c809ce2c1bbe481ac7dd0 branch: master author: Mark Dickinson committer: GitHub date: 2019-06-01T12:21:53+01:00 summary: Move whats-new entry for math.factorial to the math module section. (GH-13723) files: M Doc/whatsnew/3.8.rst diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index bc7c9ef37442..2d5291102d2a 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -460,6 +460,9 @@ numbers. (Contributed by Pablo Galindo in :issue:`35606`) Added new function :func:`math.isqrt` for computing integer square roots. (Contributed by Mark Dickinson in :issue:`36887`.) +The function :func:`math.factorial` no longer accepts arguments that are not +int-like. (Contributed by Pablo Galindo in :issue:`33083`.) + mmap ---- @@ -1140,9 +1143,6 @@ Changes in the Python API success; an exception was raised on error under Unix. (Contributed by Berker Peksag in :issue:`2122`.) -* The function :func:`math.factorial` no longer accepts arguments that are not - int-like. (Contributed by Pablo Galindo in :issue:`33083`.) - * :mod:`xml.dom.minidom` and :mod:`xml.sax` modules no longer process external entities by default. (Contributed by Christian Heimes in :issue:`17239`.) From webhook-mailer at python.org Sat Jun 1 07:41:43 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Sat, 01 Jun 2019 11:41:43 -0000 Subject: [Python-checkins] Doc: Correct the creation year and the credits of the Logo Programming language (GH-13520) Message-ID: https://github.com/python/cpython/commit/66501058fef76a5d77e6879f6da3282f0a9eef1b commit: 66501058fef76a5d77e6879f6da3282f0a9eef1b branch: master author: St?phane Wirtel committer: Cheryl Sabella date: 2019-06-01T07:41:33-04:00 summary: Doc: Correct the creation year and the credits of the Logo Programming language (GH-13520) files: M Doc/library/turtle.rst diff --git a/Doc/library/turtle.rst b/Doc/library/turtle.rst index 3d90d3cbd974..7f9f0c343867 100644 --- a/Doc/library/turtle.rst +++ b/Doc/library/turtle.rst @@ -20,8 +20,8 @@ Introduction ============ Turtle graphics is a popular way for introducing programming to kids. It was -part of the original Logo programming language developed by Wally Feurzig and -Seymour Papert in 1966. +part of the original Logo programming language developed by Wally Feurzeig, +Seymour Papert and Cynthia Solomon in 1967. Imagine a robotic turtle starting at (0, 0) in the x-y plane. After an ``import turtle``, give it the command ``turtle.forward(15)``, and it moves (on-screen!) 15 pixels in the From webhook-mailer at python.org Sat Jun 1 07:47:20 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 01 Jun 2019 11:47:20 -0000 Subject: [Python-checkins] Doc: Correct the creation year and the credits of the Logo Programming language (GH-13520) Message-ID: https://github.com/python/cpython/commit/fc914dd5e03db9188b6d28d1c48574dc78ee4325 commit: fc914dd5e03db9188b6d28d1c48574dc78ee4325 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-01T04:47:15-07:00 summary: Doc: Correct the creation year and the credits of the Logo Programming language (GH-13520) (cherry picked from commit 66501058fef76a5d77e6879f6da3282f0a9eef1b) Co-authored-by: St?phane Wirtel files: M Doc/library/turtle.rst diff --git a/Doc/library/turtle.rst b/Doc/library/turtle.rst index 175010b89906..5d7f0608aebb 100644 --- a/Doc/library/turtle.rst +++ b/Doc/library/turtle.rst @@ -20,8 +20,8 @@ Introduction ============ Turtle graphics is a popular way for introducing programming to kids. It was -part of the original Logo programming language developed by Wally Feurzig and -Seymour Papert in 1966. +part of the original Logo programming language developed by Wally Feurzeig, +Seymour Papert and Cynthia Solomon in 1967. Imagine a robotic turtle starting at (0, 0) in the x-y plane. After an ``import turtle``, give it the command ``turtle.forward(15)``, and it moves (on-screen!) 15 pixels in the From webhook-mailer at python.org Sat Jun 1 11:52:02 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Sat, 01 Jun 2019 15:52:02 -0000 Subject: [Python-checkins] bpo-31968: Documentation -- add clarification on the globals dict for exec() (GH-13140) Message-ID: https://github.com/python/cpython/commit/059b9ea5ac98f432e41b05d1fa5aab4ffa22df4d commit: 059b9ea5ac98f432e41b05d1fa5aab4ffa22df4d branch: master author: Anthony Shaw committer: Raymond Hettinger date: 2019-06-01T08:51:58-07:00 summary: bpo-31968: Documentation -- add clarification on the globals dict for exec() (GH-13140) files: M Doc/library/functions.rst diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 7170a7817205..425a985320fc 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -499,7 +499,8 @@ are always available. They are listed here in alphabetical order. :func:`exec` function. The return value is ``None``. In all cases, if the optional parts are omitted, the code is executed in the - current scope. If only *globals* is provided, it must be a dictionary, which + current scope. If only *globals* is provided, it must be a dictionary + (and not a subclass of dictionary), which will be used for both the global and the local variables. If *globals* and *locals* are given, they are used for the global and local variables, respectively. If provided, *locals* can be any mapping object. Remember From webhook-mailer at python.org Sat Jun 1 13:08:08 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Sat, 01 Jun 2019 17:08:08 -0000 Subject: [Python-checkins] bpo-37122: Make co->co_argcount represent the total number of positonal arguments in the code object (GH-13726) Message-ID: https://github.com/python/cpython/commit/cd74e66a8c420be675fd2fbf3fe708ac02ee9f21 commit: cd74e66a8c420be675fd2fbf3fe708ac02ee9f21 branch: master author: Pablo Galindo committer: GitHub date: 2019-06-01T18:08:04+01:00 summary: bpo-37122: Make co->co_argcount represent the total number of positonal arguments in the code object (GH-13726) files: A Misc/NEWS.d/next/Core and Builtins/2019-06-01-16-53-41.bpo-37122.dZ3-NY.rst M Doc/c-api/code.rst M Doc/reference/datamodel.rst M Doc/whatsnew/3.8.rst M Lib/inspect.py M Lib/pdb.py M Lib/test/test_code.py M Lib/test/test_dis.py M Lib/test/test_positional_only_arg.py M Objects/call.c M Objects/codeobject.c M Objects/typeobject.c M Python/ceval.c M Python/compile.c diff --git a/Doc/c-api/code.rst b/Doc/c-api/code.rst index 7aa91ee84d2e..92baa4c7df5c 100644 --- a/Doc/c-api/code.rst +++ b/Doc/c-api/code.rst @@ -42,6 +42,8 @@ bound into a function. .. versionchanged:: 3.8 An extra parameter is required (*posonlyargcount*) to support :PEP:`570`. + The first parameter (*argcount*) now represents the total number of positional arguments, + including positional-only. .. audit-event:: code.__new__ "code filename name argcount kwonlyargcount nlocals stacksize flags" diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index c566dfdf856d..44017d8a55df 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -907,24 +907,26 @@ Internal types single: co_freevars (code object attribute) Special read-only attributes: :attr:`co_name` gives the function name; - :attr:`co_argcount` is the number of positional arguments (including arguments - with default values); :attr:`co_posonlyargcount` is the number of - positional-only arguments (including arguments with default values); - :attr:`co_kwonlyargcount` is the number of keyword-only arguments (including - arguments with default values); :attr:`co_nlocals` is the number of local - variables used by the function (including arguments); :attr:`co_varnames` is a - tuple containing the names of the local variables (starting with the argument - names); :attr:`co_cellvars` is a tuple containing the names of local variables + :attr:`co_argcount` is the total number of positional arguments + (including positional-only arguments and arguments with default values); + :attr:`co_posonlyargcount` is the number of positional-only arguments + (including arguments with default values); :attr:`co_kwonlyargcount` is + the number of keyword-only arguments (including arguments with default + values); :attr:`co_nlocals` is the number of local variables used by the + function (including arguments); :attr:`co_varnames` is a tuple containing + the names of the local variables (starting with the argument names); + :attr:`co_cellvars` is a tuple containing the names of local variables that are referenced by nested functions; :attr:`co_freevars` is a tuple - containing the names of free variables; :attr:`co_code` is a string representing - the sequence of bytecode instructions; :attr:`co_consts` is a tuple containing - the literals used by the bytecode; :attr:`co_names` is a tuple containing the - names used by the bytecode; :attr:`co_filename` is the filename from which the - code was compiled; :attr:`co_firstlineno` is the first line number of the - function; :attr:`co_lnotab` is a string encoding the mapping from bytecode - offsets to line numbers (for details see the source code of the interpreter); - :attr:`co_stacksize` is the required stack size (including local variables); - :attr:`co_flags` is an integer encoding a number of flags for the interpreter. + containing the names of free variables; :attr:`co_code` is a string + representing the sequence of bytecode instructions; :attr:`co_consts` is + a tuple containing the literals used by the bytecode; :attr:`co_names` is + a tuple containing the names used by the bytecode; :attr:`co_filename` is + the filename from which the code was compiled; :attr:`co_firstlineno` is + the first line number of the function; :attr:`co_lnotab` is a string + encoding the mapping from bytecode offsets to line numbers (for details + see the source code of the interpreter); :attr:`co_stacksize` is the + required stack size (including local variables); :attr:`co_flags` is an + integer encoding a number of flags for the interpreter. .. index:: object: generator diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 2d5291102d2a..4c5a9bb0cdb9 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -1177,8 +1177,10 @@ Changes in the Python API * :class:`types.CodeType` has a new parameter in the second position of the constructor (*posonlyargcount*) to support positional-only arguments defined - in :pep:`570`. A new ``replace()`` method of :class:`types.CodeType` can be - used to make the code future-proof. + in :pep:`570`. The first argument (*argcount*) now represents the total + number of positional arguments (including positional-only arguments). A new + ``replace()`` method of :class:`types.CodeType` can be used to make the code + future-proof. Changes in the C API diff --git a/Lib/inspect.py b/Lib/inspect.py index ca81a24f0641..91d209dc64bc 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -1037,15 +1037,11 @@ def getargs(co): names = co.co_varnames nargs = co.co_argcount - nposonlyargs = co.co_posonlyargcount nkwargs = co.co_kwonlyargcount - nposargs = nargs + nposonlyargs - posonlyargs = list(names[:nposonlyargs]) - args = list(names[nposonlyargs:nposonlyargs+nargs]) - kwonlyargs = list(names[nposargs:nposargs+nkwargs]) + args = list(names[:nargs]) + kwonlyargs = list(names[nargs:nargs+nkwargs]) step = 0 - nargs += nposonlyargs nargs += nkwargs varargs = None if co.co_flags & CO_VARARGS: @@ -1054,7 +1050,7 @@ def getargs(co): varkw = None if co.co_flags & CO_VARKEYWORDS: varkw = co.co_varnames[nargs] - return Arguments(posonlyargs + args + kwonlyargs, varargs, varkw) + return Arguments(args + kwonlyargs, varargs, varkw) ArgSpec = namedtuple('ArgSpec', 'args varargs keywords defaults') @@ -2136,11 +2132,9 @@ def _signature_from_function(cls, func, skip_bound_arg=True): pos_count = func_code.co_argcount arg_names = func_code.co_varnames posonly_count = func_code.co_posonlyargcount - positional_count = posonly_count + pos_count - positional_only = tuple(arg_names[:posonly_count]) - positional = tuple(arg_names[posonly_count:positional_count]) + positional = arg_names[:pos_count] keyword_only_count = func_code.co_kwonlyargcount - keyword_only = arg_names[positional_count:(positional_count + keyword_only_count)] + keyword_only = arg_names[pos_count:pos_count + keyword_only_count] annotations = func.__annotations__ defaults = func.__defaults__ kwdefaults = func.__kwdefaults__ @@ -2152,13 +2146,11 @@ def _signature_from_function(cls, func, skip_bound_arg=True): parameters = [] - non_default_count = positional_count - pos_default_count - all_positional = positional_only + positional - + non_default_count = pos_count - pos_default_count posonly_left = posonly_count # Non-keyword-only parameters w/o defaults. - for name in all_positional[:non_default_count]: + for name in positional[:non_default_count]: kind = _POSITIONAL_ONLY if posonly_left else _POSITIONAL_OR_KEYWORD annotation = annotations.get(name, _empty) parameters.append(Parameter(name, annotation=annotation, @@ -2167,7 +2159,7 @@ def _signature_from_function(cls, func, skip_bound_arg=True): posonly_left -= 1 # ... w/ defaults. - for offset, name in enumerate(all_positional[non_default_count:]): + for offset, name in enumerate(positional[non_default_count:]): kind = _POSITIONAL_ONLY if posonly_left else _POSITIONAL_OR_KEYWORD annotation = annotations.get(name, _empty) parameters.append(Parameter(name, annotation=annotation, @@ -2178,7 +2170,7 @@ def _signature_from_function(cls, func, skip_bound_arg=True): # *args if func_code.co_flags & CO_VARARGS: - name = arg_names[positional_count + keyword_only_count] + name = arg_names[pos_count + keyword_only_count] annotation = annotations.get(name, _empty) parameters.append(Parameter(name, annotation=annotation, kind=_VAR_POSITIONAL)) @@ -2195,7 +2187,7 @@ def _signature_from_function(cls, func, skip_bound_arg=True): default=default)) # **kwargs if func_code.co_flags & CO_VARKEYWORDS: - index = positional_count + keyword_only_count + index = pos_count + keyword_only_count if func_code.co_flags & CO_VARARGS: index += 1 diff --git a/Lib/pdb.py b/Lib/pdb.py index 13068ce27bd1..0e7609e43d4e 100755 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -1132,7 +1132,7 @@ def do_args(self, arg): """ co = self.curframe.f_code dict = self.curframe_locals - n = co.co_argcount + co.co_posonlyargcount + co.co_kwonlyargcount + n = co.co_argcount + co.co_kwonlyargcount if co.co_flags & inspect.CO_VARARGS: n = n+1 if co.co_flags & inspect.CO_VARKEYWORDS: n = n+1 for i in range(n): diff --git a/Lib/test/test_code.py b/Lib/test/test_code.py index 91008c04f7fd..0d80af44d9f1 100644 --- a/Lib/test/test_code.py +++ b/Lib/test/test_code.py @@ -112,7 +112,7 @@ >>> dump(posonly_args.__code__) name: posonly_args -argcount: 1 +argcount: 3 posonlyargcount: 2 kwonlyargcount: 0 names: () diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index 1561021f5bc7..652af45d55ad 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -640,7 +640,7 @@ def f(c=c): code_info_tricky = """\ Name: tricky Filename: (.*) -Argument count: 3 +Argument count: 5 Positional-only arguments: 2 Kw-only arguments: 3 Number of locals: 10 diff --git a/Lib/test/test_positional_only_arg.py b/Lib/test/test_positional_only_arg.py index 0aaad84cb3bf..59b0b8fb5562 100644 --- a/Lib/test/test_positional_only_arg.py +++ b/Lib/test/test_positional_only_arg.py @@ -100,14 +100,14 @@ def test_pos_only_definition(self): def f(a, b, c, /, d, e=1, *, f, g=2): pass - self.assertEqual(2, f.__code__.co_argcount) # 2 "standard args" + self.assertEqual(5, f.__code__.co_argcount) # 3 posonly + 2 "standard args" self.assertEqual(3, f.__code__.co_posonlyargcount) self.assertEqual((1,), f.__defaults__) def f(a, b, c=1, /, d=2, e=3, *, f, g=4): pass - self.assertEqual(2, f.__code__.co_argcount) # 2 "standard args" + self.assertEqual(5, f.__code__.co_argcount) # 3 posonly + 2 "standard args" self.assertEqual(3, f.__code__.co_posonlyargcount) self.assertEqual((1, 2, 3), f.__defaults__) diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-06-01-16-53-41.bpo-37122.dZ3-NY.rst b/Misc/NEWS.d/next/Core and Builtins/2019-06-01-16-53-41.bpo-37122.dZ3-NY.rst new file mode 100644 index 000000000000..b9584b50e61d --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-06-01-16-53-41.bpo-37122.dZ3-NY.rst @@ -0,0 +1,5 @@ +Make the *co_argcount* attribute of code objects represent the total number +of positional arguments (including positional-only arguments). The value of +*co_posonlyargcount* can be used to distinguish which arguments are +positional only, and the difference (*co_argcount* - *co_posonlyargcount*) +is the number of positional-or-keyword arguments. Patch by Pablo Galindo. diff --git a/Objects/call.c b/Objects/call.c index acd1f26dcbb5..c0d14567e430 100644 --- a/Objects/call.c +++ b/Objects/call.c @@ -308,11 +308,11 @@ _PyFunction_FastCallDict(PyObject *func, PyObject *const *args, Py_ssize_t nargs (co->co_flags & ~PyCF_MASK) == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { /* Fast paths */ - if (argdefs == NULL && co->co_argcount + co->co_posonlyargcount == nargs) { + if (argdefs == NULL && co->co_argcount == nargs) { return function_code_fastcall(co, args, nargs, globals); } else if (nargs == 0 && argdefs != NULL - && co->co_argcount + co->co_posonlyargcount == PyTuple_GET_SIZE(argdefs)) { + && co->co_argcount == PyTuple_GET_SIZE(argdefs)) { /* function called with no arguments, but all parameters have a default value: use default values as arguments .*/ args = _PyTuple_ITEMS(argdefs); @@ -396,11 +396,11 @@ _PyFunction_Vectorcall(PyObject *func, PyObject* const* stack, if (co->co_kwonlyargcount == 0 && nkwargs == 0 && (co->co_flags & ~PyCF_MASK) == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { - if (argdefs == NULL && co->co_argcount + co->co_posonlyargcount== nargs) { + if (argdefs == NULL && co->co_argcount == nargs) { return function_code_fastcall(co, stack, nargs, globals); } else if (nargs == 0 && argdefs != NULL - && co->co_argcount + co->co_posonlyargcount == PyTuple_GET_SIZE(argdefs)) { + && 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); diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 886ce4194438..bf68e54f42ec 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -114,8 +114,9 @@ PyCode_New(int argcount, int posonlyargcount, int kwonlyargcount, Py_ssize_t i, n_cellvars, n_varnames, total_args; /* Check argument types */ - if (argcount < 0 || posonlyargcount < 0 || kwonlyargcount < 0 || - nlocals < 0 || stacksize < 0 || flags < 0 || + if (argcount < posonlyargcount || posonlyargcount < 0 || + kwonlyargcount < 0 || nlocals < 0 || + stacksize < 0 || flags < 0 || code == NULL || !PyBytes_Check(code) || consts == NULL || !PyTuple_Check(consts) || names == NULL || !PyTuple_Check(names) || @@ -152,11 +153,9 @@ PyCode_New(int argcount, int posonlyargcount, int kwonlyargcount, } n_varnames = PyTuple_GET_SIZE(varnames); - if (posonlyargcount + argcount <= n_varnames - && kwonlyargcount <= n_varnames) { + if (argcount <= n_varnames && kwonlyargcount <= n_varnames) { /* Never overflows. */ - total_args = (Py_ssize_t)posonlyargcount + (Py_ssize_t)argcount - + (Py_ssize_t)kwonlyargcount + + total_args = (Py_ssize_t)argcount + (Py_ssize_t)kwonlyargcount + ((flags & CO_VARARGS) != 0) + ((flags & CO_VARKEYWORDS) != 0); } else { diff --git a/Objects/typeobject.c b/Objects/typeobject.c index da249b569ad2..b6d925c1442e 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -7807,7 +7807,7 @@ super_init(PyObject *self, PyObject *args, PyObject *kwds) "super(): no code object"); return -1; } - if (co->co_posonlyargcount + co->co_argcount == 0) { + if (co->co_argcount == 0) { PyErr_SetString(PyExc_RuntimeError, "super(): no arguments"); return -1; diff --git a/Python/ceval.c b/Python/ceval.c index f9ff4e09f17e..d9a71e942153 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -3757,10 +3757,10 @@ missing_arguments(PyThreadState *tstate, PyCodeObject *co, return; if (positional) { start = 0; - end = co->co_posonlyargcount + co->co_argcount - defcount; + end = co->co_argcount - defcount; } else { - start = co->co_posonlyargcount + co->co_argcount; + start = co->co_argcount; end = start + co->co_kwonlyargcount; } for (i = start; i < end; i++) { @@ -3788,25 +3788,23 @@ too_many_positional(PyThreadState *tstate, PyCodeObject *co, Py_ssize_t kwonly_given = 0; Py_ssize_t i; PyObject *sig, *kwonly_sig; - Py_ssize_t co_posonlyargcount = co->co_posonlyargcount; Py_ssize_t co_argcount = co->co_argcount; - Py_ssize_t total_positional = co_argcount + co_posonlyargcount; assert((co->co_flags & CO_VARARGS) == 0); /* Count missing keyword-only args. */ - for (i = total_positional; i < total_positional + co->co_kwonlyargcount; i++) { + for (i = co_argcount; i < co_argcount + co->co_kwonlyargcount; i++) { if (GETLOCAL(i) != NULL) { kwonly_given++; } } if (defcount) { - Py_ssize_t atleast = total_positional - defcount; + Py_ssize_t atleast = co_argcount - defcount; plural = 1; - sig = PyUnicode_FromFormat("from %zd to %zd", atleast, total_positional); + sig = PyUnicode_FromFormat("from %zd to %zd", atleast, co_argcount); } else { - plural = (total_positional != 1); - sig = PyUnicode_FromFormat("%zd", total_positional); + plural = (co_argcount != 1); + sig = PyUnicode_FromFormat("%zd", co_argcount); } if (sig == NULL) return; @@ -3917,7 +3915,7 @@ _PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals, PyObject *retval = NULL; PyObject **fastlocals, **freevars; PyObject *x, *u; - const Py_ssize_t total_args = co->co_argcount + co->co_kwonlyargcount + co->co_posonlyargcount; + const Py_ssize_t total_args = co->co_argcount + co->co_kwonlyargcount; Py_ssize_t i, j, n; PyObject *kwdict; @@ -3953,9 +3951,9 @@ _PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals, kwdict = NULL; } - /* Copy positional only arguments into local variables */ - if (argcount > co->co_argcount + co->co_posonlyargcount) { - n = co->co_posonlyargcount; + /* Copy all positional arguments into local variables */ + if (argcount > co->co_argcount) { + n = co->co_argcount; } else { n = argcount; @@ -3966,20 +3964,6 @@ _PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals, SETLOCAL(j, x); } - - /* Copy positional arguments into local variables */ - if (argcount > co->co_argcount + co->co_posonlyargcount) { - n += co->co_argcount; - } - else { - n = argcount; - } - for (i = j; i < n; i++) { - x = args[i]; - Py_INCREF(x); - SETLOCAL(i, x); - } - /* Pack other positional arguments into the *args argument */ if (co->co_flags & CO_VARARGS) { u = _PyTuple_FromArray(args + n, argcount - n); @@ -4059,14 +4043,14 @@ _PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals, } /* Check the number of positional arguments */ - if ((argcount > co->co_argcount + co->co_posonlyargcount) && !(co->co_flags & CO_VARARGS)) { + if ((argcount > co->co_argcount) && !(co->co_flags & CO_VARARGS)) { too_many_positional(tstate, co, argcount, defcount, fastlocals); goto fail; } /* Add missing positional arguments (copy default values from defs) */ - if (argcount < co->co_posonlyargcount + co->co_argcount) { - Py_ssize_t m = co->co_posonlyargcount + co->co_argcount - defcount; + if (argcount < co->co_argcount) { + Py_ssize_t m = co->co_argcount - defcount; Py_ssize_t missing = 0; for (i = argcount; i < m; i++) { if (GETLOCAL(i) == NULL) { @@ -4093,7 +4077,7 @@ _PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals, /* Add missing keyword arguments (copy default values from kwdefs) */ if (co->co_kwonlyargcount > 0) { Py_ssize_t missing = 0; - for (i = co->co_posonlyargcount + co->co_argcount; i < total_args; i++) { + for (i = co->co_argcount; i < total_args; i++) { PyObject *name; if (GETLOCAL(i) != NULL) continue; diff --git a/Python/compile.c b/Python/compile.c index f6ec929b3ca4..9e4a2094ac9b 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -5764,7 +5764,7 @@ makecode(struct compiler *c, struct assembler *a) Py_ssize_t nlocals; int nlocals_int; int flags; - int argcount, posonlyargcount, kwonlyargcount, maxdepth; + int posorkeywordargcount, posonlyargcount, kwonlyargcount, maxdepth; consts = consts_dict_keys_inorder(c->u->u_consts); names = dict_keys_inorder(c->u->u_names, 0); @@ -5808,15 +5808,15 @@ makecode(struct compiler *c, struct assembler *a) goto error; } - argcount = Py_SAFE_DOWNCAST(c->u->u_argcount, Py_ssize_t, int); posonlyargcount = Py_SAFE_DOWNCAST(c->u->u_posonlyargcount, Py_ssize_t, int); + posorkeywordargcount = Py_SAFE_DOWNCAST(c->u->u_argcount, Py_ssize_t, int); kwonlyargcount = Py_SAFE_DOWNCAST(c->u->u_kwonlyargcount, Py_ssize_t, int); maxdepth = stackdepth(c); if (maxdepth < 0) { goto error; } - co = PyCode_New(argcount, posonlyargcount, kwonlyargcount, - nlocals_int, maxdepth, flags, + co = PyCode_New(posonlyargcount+posorkeywordargcount, posonlyargcount, + kwonlyargcount, nlocals_int, maxdepth, flags, bytecode, consts, names, varnames, freevars, cellvars, c->c_filename, c->u->u_name, From webhook-mailer at python.org Sat Jun 1 13:14:04 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Sat, 01 Jun 2019 17:14:04 -0000 Subject: [Python-checkins] Improve exception message for str.format (GH-12675) Message-ID: https://github.com/python/cpython/commit/9843bc110dc4241ba7cb05f3d3ef74ac6c77caf2 commit: 9843bc110dc4241ba7cb05f3d3ef74ac6c77caf2 branch: master author: Francisco Couzo committer: Raymond Hettinger date: 2019-06-01T10:14:00-07:00 summary: Improve exception message for str.format (GH-12675) files: M Objects/stringlib/unicode_format.h diff --git a/Objects/stringlib/unicode_format.h b/Objects/stringlib/unicode_format.h index 0fa54eb32cd3..ddf1e2644869 100644 --- a/Objects/stringlib/unicode_format.h +++ b/Objects/stringlib/unicode_format.h @@ -440,8 +440,13 @@ get_field_object(SubString *input, PyObject *args, PyObject *kwargs, /* look up in args */ obj = PySequence_GetItem(args, index); - if (obj == NULL) - goto error; + if (obj == NULL) { + PyErr_Format(PyExc_IndexError, + "Replacement index %zd out of range for positional " + "args tuple", + index); + goto error; + } } /* iterate over the rest of the field_name */ From webhook-mailer at python.org Sat Jun 1 15:09:06 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Sat, 01 Jun 2019 19:09:06 -0000 Subject: [Python-checkins] bpo-35431: Refactor math.comb() implementation. (GH-13725) Message-ID: https://github.com/python/cpython/commit/2b843ac0ae745026ce39514573c5d075137bef65 commit: 2b843ac0ae745026ce39514573c5d075137bef65 branch: master author: Serhiy Storchaka committer: GitHub date: 2019-06-01T22:09:02+03:00 summary: bpo-35431: Refactor math.comb() implementation. (GH-13725) * Fixed some bugs. * Added support for index-likes objects. * Improved error messages. * Cleaned up and optimized the code. * Added more tests. files: M Doc/library/math.rst M Lib/test/test_math.py M Modules/clinic/mathmodule.c.h M Modules/mathmodule.c diff --git a/Doc/library/math.rst b/Doc/library/math.rst index 5243970df806..206b06edd2a2 100644 --- a/Doc/library/math.rst +++ b/Doc/library/math.rst @@ -238,11 +238,11 @@ Number-theoretic and representation functions and without order. Also called the binomial coefficient. It is mathematically equal to the expression - ``n! / (k! (n - k)!)``. It is equivalent to the coefficient of k-th term in + ``n! / (k! (n - k)!)``. It is equivalent to the coefficient of the *k*-th term in the polynomial expansion of the expression ``(1 + x) ** n``. Raises :exc:`TypeError` if the arguments not integers. - Raises :exc:`ValueError` if the arguments are negative or if k > n. + Raises :exc:`ValueError` if the arguments are negative or if *k* > *n*. .. versionadded:: 3.8 diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index 9da7f7c4e6e2..e27092eefd6e 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -1893,9 +1893,11 @@ def testComb(self): # Raises TypeError if any argument is non-integer or argument count is # not 2 self.assertRaises(TypeError, comb, 10, 1.0) + self.assertRaises(TypeError, comb, 10, decimal.Decimal(1.0)) self.assertRaises(TypeError, comb, 10, "1") - self.assertRaises(TypeError, comb, "10", 1) self.assertRaises(TypeError, comb, 10.0, 1) + self.assertRaises(TypeError, comb, decimal.Decimal(10.0), 1) + self.assertRaises(TypeError, comb, "10", 1) self.assertRaises(TypeError, comb, 10) self.assertRaises(TypeError, comb, 10, 1, 3) @@ -1903,15 +1905,28 @@ def testComb(self): # Raises Value error if not k or n are negative numbers self.assertRaises(ValueError, comb, -1, 1) - self.assertRaises(ValueError, comb, -10*10, 1) + self.assertRaises(ValueError, comb, -2**1000, 1) self.assertRaises(ValueError, comb, 1, -1) - self.assertRaises(ValueError, comb, 1, -10*10) + self.assertRaises(ValueError, comb, 1, -2**1000) # Raises value error if k is greater than n - self.assertRaises(ValueError, comb, 1, 10**10) - self.assertRaises(ValueError, comb, 0, 1) - - + self.assertRaises(ValueError, comb, 1, 2) + self.assertRaises(ValueError, comb, 1, 2**1000) + + n = 2**1000 + self.assertEqual(comb(n, 0), 1) + self.assertEqual(comb(n, 1), n) + self.assertEqual(comb(n, 2), n * (n-1) // 2) + self.assertEqual(comb(n, n), 1) + self.assertEqual(comb(n, n-1), n) + self.assertEqual(comb(n, n-2), n * (n-1) // 2) + self.assertRaises((OverflowError, MemoryError), comb, n, n//2) + + for n, k in (True, True), (True, False), (False, False): + self.assertEqual(comb(n, k), 1) + self.assertIs(type(comb(n, k)), int) + self.assertEqual(comb(MyIndexable(5), MyIndexable(2)), 10) + self.assertIs(type(comb(MyIndexable(5), MyIndexable(2))), int) def test_main(): diff --git a/Modules/clinic/mathmodule.c.h b/Modules/clinic/mathmodule.c.h index cba791e2098f..92ec4bec9bf1 100644 --- a/Modules/clinic/mathmodule.c.h +++ b/Modules/clinic/mathmodule.c.h @@ -639,10 +639,10 @@ math_prod(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *k } PyDoc_STRVAR(math_comb__doc__, -"comb($module, /, n, k)\n" +"comb($module, n, k, /)\n" "--\n" "\n" -"Number of ways to choose *k* items from *n* items without repetition and without order.\n" +"Number of ways to choose k items from n items without repetition and without order.\n" "\n" "Also called the binomial coefficient. It is mathematically equal to the expression\n" "n! / (k! * (n - k)!). It is equivalent to the coefficient of k-th term in\n" @@ -652,38 +652,26 @@ PyDoc_STRVAR(math_comb__doc__, "Raises ValueError if the arguments are negative or if k > n."); #define MATH_COMB_METHODDEF \ - {"comb", (PyCFunction)(void(*)(void))math_comb, METH_FASTCALL|METH_KEYWORDS, math_comb__doc__}, + {"comb", (PyCFunction)(void(*)(void))math_comb, METH_FASTCALL, math_comb__doc__}, static PyObject * math_comb_impl(PyObject *module, PyObject *n, PyObject *k); static PyObject * -math_comb(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +math_comb(PyObject *module, PyObject *const *args, Py_ssize_t nargs) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"n", "k", NULL}; - static _PyArg_Parser _parser = {NULL, _keywords, "comb", 0}; - PyObject *argsbuf[2]; PyObject *n; PyObject *k; - args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); - if (!args) { - goto exit; - } - if (!PyLong_Check(args[0])) { - _PyArg_BadArgument("comb", 1, "int", args[0]); + if (!_PyArg_CheckPositional("comb", nargs, 2, 2)) { goto exit; } n = args[0]; - if (!PyLong_Check(args[1])) { - _PyArg_BadArgument("comb", 2, "int", args[1]); - goto exit; - } k = args[1]; return_value = math_comb_impl(module, n, k); exit: return return_value; } -/*[clinic end generated code: output=00aa76356759617a input=a9049054013a1b77]*/ +/*[clinic end generated code: output=6709521e5e1d90ec input=a9049054013a1b77]*/ diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index 007a8801429c..bea4607b9be1 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -3001,10 +3001,11 @@ math_prod_impl(PyObject *module, PyObject *iterable, PyObject *start) /*[clinic input] math.comb - n: object(subclass_of='&PyLong_Type') - k: object(subclass_of='&PyLong_Type') + n: object + k: object + / -Number of ways to choose *k* items from *n* items without repetition and without order. +Number of ways to choose k items from n items without repetition and without order. Also called the binomial coefficient. It is mathematically equal to the expression n! / (k! * (n - k)!). It is equivalent to the coefficient of k-th term in @@ -3017,103 +3018,109 @@ Raises ValueError if the arguments are negative or if k > n. static PyObject * math_comb_impl(PyObject *module, PyObject *n, PyObject *k) -/*[clinic end generated code: output=bd2cec8d854f3493 input=565f340f98efb5b5]*/ +/*[clinic end generated code: output=bd2cec8d854f3493 input=2f336ac9ec8242f9]*/ { - PyObject *val = NULL, - *temp_obj1 = NULL, - *temp_obj2 = NULL, - *dump_var = NULL; + PyObject *result = NULL, *factor = NULL, *temp; int overflow, cmp; - long long i, terms; + long long i, factors; - cmp = PyObject_RichCompareBool(n, k, Py_LT); - if (cmp < 0) { - goto fail_comb; + n = PyNumber_Index(n); + if (n == NULL) { + return NULL; } - else if (cmp > 0) { - PyErr_Format(PyExc_ValueError, - "n must be an integer greater than or equal to k"); - goto fail_comb; + k = PyNumber_Index(k); + if (k == NULL) { + Py_DECREF(n); + return NULL; } - /* b = min(b, a - b) */ - dump_var = PyNumber_Subtract(n, k); - if (dump_var == NULL) { - goto fail_comb; + if (Py_SIZE(n) < 0) { + PyErr_SetString(PyExc_ValueError, + "n must be a non-negative integer"); + goto error; } - cmp = PyObject_RichCompareBool(k, dump_var, Py_GT); - if (cmp < 0) { - goto fail_comb; + /* k = min(k, n - k) */ + temp = PyNumber_Subtract(n, k); + if (temp == NULL) { + goto error; } - else if (cmp > 0) { - k = dump_var; - dump_var = NULL; + if (Py_SIZE(temp) < 0) { + Py_DECREF(temp); + PyErr_SetString(PyExc_ValueError, + "k must be an integer less than or equal to n"); + goto error; + } + cmp = PyObject_RichCompareBool(k, temp, Py_GT); + if (cmp > 0) { + Py_SETREF(k, temp); } else { - Py_DECREF(dump_var); - dump_var = NULL; + Py_DECREF(temp); + if (cmp < 0) { + goto error; + } } - terms = PyLong_AsLongLongAndOverflow(k, &overflow); - if (terms < 0 && PyErr_Occurred()) { - goto fail_comb; - } - else if (overflow > 0) { + factors = PyLong_AsLongLongAndOverflow(k, &overflow); + if (overflow > 0) { PyErr_Format(PyExc_OverflowError, - "minimum(n - k, k) must not exceed %lld", + "min(n - k, k) must not exceed %lld", LLONG_MAX); - goto fail_comb; + goto error; } - else if (overflow < 0 || terms < 0) { - PyErr_Format(PyExc_ValueError, - "k must be a positive integer"); - goto fail_comb; + else if (overflow < 0 || factors < 0) { + if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_ValueError, + "k must be a non-negative integer"); + } + goto error; } - if (terms == 0) { - return PyNumber_Long(_PyLong_One); + if (factors == 0) { + result = PyLong_FromLong(1); + goto done; } - val = PyNumber_Long(n); - for (i = 1; i < terms; ++i) { - temp_obj1 = PyLong_FromSsize_t(i); - if (temp_obj1 == NULL) { - goto fail_comb; - } - temp_obj2 = PyNumber_Subtract(n, temp_obj1); - if (temp_obj2 == NULL) { - goto fail_comb; + result = n; + Py_INCREF(result); + if (factors == 1) { + goto done; + } + + factor = n; + Py_INCREF(factor); + for (i = 1; i < factors; ++i) { + Py_SETREF(factor, PyNumber_Subtract(factor, _PyLong_One)); + if (factor == NULL) { + goto error; } - dump_var = val; - val = PyNumber_Multiply(val, temp_obj2); - if (val == NULL) { - goto fail_comb; + Py_SETREF(result, PyNumber_Multiply(result, factor)); + if (result == NULL) { + goto error; } - Py_DECREF(dump_var); - dump_var = NULL; - Py_DECREF(temp_obj2); - temp_obj2 = PyLong_FromUnsignedLongLong((unsigned long long)(i + 1)); - if (temp_obj2 == NULL) { - goto fail_comb; + + temp = PyLong_FromUnsignedLongLong((unsigned long long)i + 1); + if (temp == NULL) { + goto error; } - dump_var = val; - val = PyNumber_FloorDivide(val, temp_obj2); - if (val == NULL) { - goto fail_comb; + Py_SETREF(result, PyNumber_FloorDivide(result, temp)); + Py_DECREF(temp); + if (result == NULL) { + goto error; } - Py_DECREF(dump_var); - Py_DECREF(temp_obj1); - Py_DECREF(temp_obj2); } + Py_DECREF(factor); - return val; - -fail_comb: - Py_XDECREF(val); - Py_XDECREF(dump_var); - Py_XDECREF(temp_obj1); - Py_XDECREF(temp_obj2); +done: + Py_DECREF(n); + Py_DECREF(k); + return result; +error: + Py_XDECREF(factor); + Py_XDECREF(result); + Py_DECREF(n); + Py_DECREF(k); return NULL; } From webhook-mailer at python.org Sat Jun 1 15:09:26 2019 From: webhook-mailer at python.org (Vinay Sajip) Date: Sat, 01 Jun 2019 19:09:26 -0000 Subject: [Python-checkins] bpo-28595: Allow shlex whitespace_split with punctuation_chars (GH-2071) Message-ID: https://github.com/python/cpython/commit/56624a99a916fd27152d5b23364303acc0d707de commit: 56624a99a916fd27152d5b23364303acc0d707de branch: master author: Evan committer: Vinay Sajip date: 2019-06-01T20:09:22+01:00 summary: bpo-28595: Allow shlex whitespace_split with punctuation_chars (GH-2071) files: M Doc/library/shlex.rst M Lib/shlex.py M Lib/test/test_shlex.py diff --git a/Doc/library/shlex.rst b/Doc/library/shlex.rst index 8c5b0239d1f0..a8421fdb7008 100644 --- a/Doc/library/shlex.rst +++ b/Doc/library/shlex.rst @@ -225,7 +225,8 @@ variables which either control lexical analysis or can be used for debugging: appear in filename specifications and command line parameters, will also be included in this attribute, and any characters which appear in ``punctuation_chars`` will be removed from ``wordchars`` if they are present - there. + there. If :attr:`whitespace_split` is set to ``True``, this will have no + effect. .. attribute:: shlex.whitespace @@ -258,11 +259,13 @@ variables which either control lexical analysis or can be used for debugging: If ``True``, tokens will only be split in whitespaces. This is useful, for example, for parsing command lines with :class:`~shlex.shlex`, getting - tokens in a similar way to shell arguments. If this attribute is ``True``, - :attr:`punctuation_chars` will have no effect, and splitting will happen - only on whitespaces. When using :attr:`punctuation_chars`, which is - intended to provide parsing closer to that implemented by shells, it is - advisable to leave ``whitespace_split`` as ``False`` (the default value). + tokens in a similar way to shell arguments. When used in combination with + :attr:`punctuation_chars`, tokens will be split on whitespace in addition to + those characters. + + .. versionchanged:: 3.8 + The :attr:`punctuation_chars` attribute was made compatible with the + :attr:`whitespace_split` attribute. .. attribute:: shlex.infile @@ -398,12 +401,15 @@ otherwise. To illustrate, you can see the difference in the following snippet: >>> import shlex >>> text = "a && b; c && d || e; f >'abc'; (def \"ghi\")" - >>> list(shlex.shlex(text)) - ['a', '&', '&', 'b', ';', 'c', '&', '&', 'd', '|', '|', 'e', ';', 'f', '>', - "'abc'", ';', '(', 'def', '"ghi"', ')'] - >>> list(shlex.shlex(text, punctuation_chars=True)) - ['a', '&&', 'b', ';', 'c', '&&', 'd', '||', 'e', ';', 'f', '>', "'abc'", - ';', '(', 'def', '"ghi"', ')'] + >>> s = shlex.shlex(text, posix=True) + >>> s.whitespace_split = True + >>> list(s) + ['a', '&&', 'b;', 'c', '&&', 'd', '||', 'e;', 'f', '>abc;', '(def', 'ghi)'] + >>> s = shlex.shlex(text, posix=True, punctuation_chars=True) + >>> s.whitespace_split = True + >>> list(s) + ['a', '&&', 'b', ';', 'c', '&&', 'd', '||', 'e', ';', 'f', '>', 'abc', ';', + '(', 'def', 'ghi', ')'] Of course, tokens will be returned which are not valid for shells, and you'll need to implement your own error checks on the returned tokens. @@ -428,6 +434,11 @@ which characters constitute punctuation. For example:: >>> list(s) ['~/a', '&&', 'b-c', '--color=auto', '||', 'd', '*.py?'] + However, to match the shell as closely as possible, it is recommended to + always use ``posix`` and :attr:`~shlex.whitespace_split` when using + :attr:`~shlex.punctuation_chars`, which will negate + :attr:`~shlex.wordchars` entirely. + For best effect, ``punctuation_chars`` should be set in conjunction with ``posix=True``. (Note that ``posix=False`` is the default for :class:`~shlex.shlex`.) diff --git a/Lib/shlex.py b/Lib/shlex.py index fb1130d4eac2..edea07794860 100644 --- a/Lib/shlex.py +++ b/Lib/shlex.py @@ -246,7 +246,8 @@ def read_token(self): escapedstate = 'a' self.state = nextchar elif (nextchar in self.wordchars or nextchar in self.quotes - or self.whitespace_split): + or (self.whitespace_split and + nextchar not in self.punctuation_chars)): self.token += nextchar else: if self.punctuation_chars: diff --git a/Lib/test/test_shlex.py b/Lib/test/test_shlex.py index a432610d3af4..376c5e88d381 100644 --- a/Lib/test/test_shlex.py +++ b/Lib/test/test_shlex.py @@ -1,4 +1,5 @@ import io +import itertools import shlex import string import unittest @@ -183,10 +184,12 @@ def testSyntaxSplitAmpersandAndPipe(self): src = ['echo hi %s echo bye' % delimiter, 'echo hi%secho bye' % delimiter] ref = ['echo', 'hi', delimiter, 'echo', 'bye'] - for ss in src: + for ss, ws in itertools.product(src, (False, True)): s = shlex.shlex(ss, punctuation_chars=True) + s.whitespace_split = ws result = list(s) - self.assertEqual(ref, result, "While splitting '%s'" % ss) + self.assertEqual(ref, result, + "While splitting '%s' [ws=%s]" % (ss, ws)) def testSyntaxSplitSemicolon(self): """Test handling of syntax splitting of ;""" @@ -197,10 +200,12 @@ def testSyntaxSplitSemicolon(self): 'echo hi%s echo bye' % delimiter, 'echo hi%secho bye' % delimiter] ref = ['echo', 'hi', delimiter, 'echo', 'bye'] - for ss in src: + for ss, ws in itertools.product(src, (False, True)): s = shlex.shlex(ss, punctuation_chars=True) + s.whitespace_split = ws result = list(s) - self.assertEqual(ref, result, "While splitting '%s'" % ss) + self.assertEqual(ref, result, + "While splitting '%s' [ws=%s]" % (ss, ws)) def testSyntaxSplitRedirect(self): """Test handling of syntax splitting of >""" @@ -211,10 +216,11 @@ def testSyntaxSplitRedirect(self): 'echo hi%s out' % delimiter, 'echo hi%sout' % delimiter] ref = ['echo', 'hi', delimiter, 'out'] - for ss in src: + for ss, ws in itertools.product(src, (False, True)): s = shlex.shlex(ss, punctuation_chars=True) result = list(s) - self.assertEqual(ref, result, "While splitting '%s'" % ss) + self.assertEqual(ref, result, + "While splitting '%s' [ws=%s]" % (ss, ws)) def testSyntaxSplitParen(self): """Test handling of syntax splitting of ()""" @@ -222,18 +228,25 @@ def testSyntaxSplitParen(self): src = ['( echo hi )', '(echo hi)'] ref = ['(', 'echo', 'hi', ')'] - for ss in src: + for ss, ws in itertools.product(src, (False, True)): s = shlex.shlex(ss, punctuation_chars=True) + s.whitespace_split = ws result = list(s) - self.assertEqual(ref, result, "While splitting '%s'" % ss) + self.assertEqual(ref, result, + "While splitting '%s' [ws=%s]" % (ss, ws)) def testSyntaxSplitCustom(self): """Test handling of syntax splitting with custom chars""" + ss = "~/a&&b-c --color=auto||d *.py?" ref = ['~/a', '&', '&', 'b-c', '--color=auto', '||', 'd', '*.py?'] - ss = "~/a && b-c --color=auto || d *.py?" s = shlex.shlex(ss, punctuation_chars="|") result = list(s) - self.assertEqual(ref, result, "While splitting '%s'" % ss) + self.assertEqual(ref, result, "While splitting '%s' [ws=False]" % ss) + ref = ['~/a&&b-c', '--color=auto', '||', 'd', '*.py?'] + s = shlex.shlex(ss, punctuation_chars="|") + s.whitespace_split = True + result = list(s) + self.assertEqual(ref, result, "While splitting '%s' [ws=True]" % ss) def testTokenTypes(self): """Test that tokens are split with types as expected.""" @@ -293,6 +306,19 @@ def testEmptyStringHandling(self): s = shlex.shlex("'')abc", punctuation_chars=True) self.assertEqual(list(s), expected) + def testUnicodeHandling(self): + """Test punctuation_chars and whitespace_split handle unicode.""" + ss = "\u2119\u01b4\u2602\u210c\u00f8\u1f24" + # Should be parsed as one complete token (whitespace_split=True). + ref = ['\u2119\u01b4\u2602\u210c\u00f8\u1f24'] + s = shlex.shlex(ss, punctuation_chars=True) + s.whitespace_split = True + self.assertEqual(list(s), ref) + # Without whitespace_split, uses wordchars and splits on all. + ref = ['\u2119', '\u01b4', '\u2602', '\u210c', '\u00f8', '\u1f24'] + s = shlex.shlex(ss, punctuation_chars=True) + self.assertEqual(list(s), ref) + def testQuote(self): safeunquoted = string.ascii_letters + string.digits + '@%_-+=:,./' unicode_sample = '\xe9\xe0\xdf' # e + acute accent, a + grave, sharp s From webhook-mailer at python.org Sat Jun 1 15:49:07 2019 From: webhook-mailer at python.org (Stefan Behnel) Date: Sat, 01 Jun 2019 19:49:07 -0000 Subject: [Python-checkins] Clean up and reduce visual clutter in the makeunicode.py script. (GH-7558) Message-ID: https://github.com/python/cpython/commit/faa2948654d15a859bc4317e00730ff213295764 commit: faa2948654d15a859bc4317e00730ff213295764 branch: master author: Stefan Behnel committer: GitHub date: 2019-06-01T21:49:03+02:00 summary: Clean up and reduce visual clutter in the makeunicode.py script. (GH-7558) files: M Tools/unicode/makeunicodedata.py diff --git a/Tools/unicode/makeunicodedata.py b/Tools/unicode/makeunicodedata.py index 5418eec588c8..5b9427acd390 100644 --- a/Tools/unicode/makeunicodedata.py +++ b/Tools/unicode/makeunicodedata.py @@ -31,6 +31,7 @@ import zipfile from textwrap import dedent +from functools import partial SCRIPT = sys.argv[0] VERSION = "3.3" @@ -106,11 +107,11 @@ ('2CEB0', '2EBE0'), ] + def maketables(trace=0): print("--- Reading", UNICODE_DATA % "", "...") - version = "" unicode = UnicodeData(UNIDATA_VERSION) print(len(list(filter(None, unicode.table))), "characters") @@ -125,6 +126,7 @@ def maketables(trace=0): makeunicodedata(unicode, trace) makeunicodetype(unicode, trace) + # -------------------------------------------------------------------- # unicode character properties @@ -258,124 +260,125 @@ def makeunicodedata(unicode, trace): print("--- Writing", FILE, "...") - fp = open(FILE, "w") - print("/* this file was generated by %s %s */" % (SCRIPT, VERSION), file=fp) - print(file=fp) - print('#define UNIDATA_VERSION "%s"' % UNIDATA_VERSION, file=fp) - print("/* a list of unique database records */", file=fp) - print("const _PyUnicode_DatabaseRecord _PyUnicode_Database_Records[] = {", file=fp) - for item in table: - print(" {%d, %d, %d, %d, %d, %d}," % item, file=fp) - print("};", file=fp) - print(file=fp) - - print("/* Reindexing of NFC first characters. */", file=fp) - print("#define TOTAL_FIRST",total_first, file=fp) - print("#define TOTAL_LAST",total_last, file=fp) - print("struct reindex{int start;short count,index;};", file=fp) - print("static struct reindex nfc_first[] = {", file=fp) - for start,end in comp_first_ranges: - print(" { %d, %d, %d}," % (start,end-start,comp_first[start]), file=fp) - print(" {0,0,0}", file=fp) - print("};\n", file=fp) - print("static struct reindex nfc_last[] = {", file=fp) - for start,end in comp_last_ranges: - print(" { %d, %d, %d}," % (start,end-start,comp_last[start]), file=fp) - print(" {0,0,0}", file=fp) - print("};\n", file=fp) - - # FIXME: the following tables could be made static, and - # the support code moved into unicodedatabase.c - - print("/* string literals */", file=fp) - print("const char *_PyUnicode_CategoryNames[] = {", file=fp) - for name in CATEGORY_NAMES: - print(" \"%s\"," % name, file=fp) - print(" NULL", file=fp) - print("};", file=fp) - - print("const char *_PyUnicode_BidirectionalNames[] = {", file=fp) - for name in BIDIRECTIONAL_NAMES: - print(" \"%s\"," % name, file=fp) - print(" NULL", file=fp) - print("};", file=fp) - - print("const char *_PyUnicode_EastAsianWidthNames[] = {", file=fp) - for name in EASTASIANWIDTH_NAMES: - print(" \"%s\"," % name, file=fp) - print(" NULL", file=fp) - print("};", file=fp) - - print("static const char *decomp_prefix[] = {", file=fp) - for name in decomp_prefix: - print(" \"%s\"," % name, file=fp) - print(" NULL", file=fp) - print("};", file=fp) - - # split record index table - index1, index2, shift = splitbins(index, trace) - - print("/* index tables for the database records */", file=fp) - print("#define SHIFT", shift, file=fp) - Array("index1", index1).dump(fp, trace) - Array("index2", index2).dump(fp, trace) - - # split decomposition index table - index1, index2, shift = splitbins(decomp_index, trace) - - print("/* decomposition data */", file=fp) - Array("decomp_data", decomp_data).dump(fp, trace) - - print("/* index tables for the decomposition data */", file=fp) - print("#define DECOMP_SHIFT", shift, file=fp) - Array("decomp_index1", index1).dump(fp, trace) - Array("decomp_index2", index2).dump(fp, trace) - - index, index2, shift = splitbins(comp_data, trace) - print("/* NFC pairs */", file=fp) - print("#define COMP_SHIFT", shift, file=fp) - Array("comp_index", index).dump(fp, trace) - Array("comp_data", index2).dump(fp, trace) - - # Generate delta tables for old versions - for version, table, normalization in unicode.changed: - cversion = version.replace(".","_") - records = [table[0]] - cache = {table[0]:0} - index = [0] * len(table) - for i, record in enumerate(table): - try: - index[i] = cache[record] - except KeyError: - index[i] = cache[record] = len(records) - records.append(record) + with open(FILE, "w") as fp: + fprint = partial(print, file=fp) + + fprint("/* this file was generated by %s %s */" % (SCRIPT, VERSION)) + fprint() + fprint('#define UNIDATA_VERSION "%s"' % UNIDATA_VERSION) + fprint("/* a list of unique database records */") + fprint("const _PyUnicode_DatabaseRecord _PyUnicode_Database_Records[] = {") + for item in table: + fprint(" {%d, %d, %d, %d, %d, %d}," % item) + fprint("};") + fprint() + + fprint("/* Reindexing of NFC first characters. */") + fprint("#define TOTAL_FIRST",total_first) + fprint("#define TOTAL_LAST",total_last) + fprint("struct reindex{int start;short count,index;};") + fprint("static struct reindex nfc_first[] = {") + for start,end in comp_first_ranges: + fprint(" { %d, %d, %d}," % (start,end-start,comp_first[start])) + fprint(" {0,0,0}") + fprint("};\n") + fprint("static struct reindex nfc_last[] = {") + for start,end in comp_last_ranges: + fprint(" { %d, %d, %d}," % (start,end-start,comp_last[start])) + fprint(" {0,0,0}") + fprint("};\n") + + # FIXME: the following tables could be made static, and + # the support code moved into unicodedatabase.c + + fprint("/* string literals */") + fprint("const char *_PyUnicode_CategoryNames[] = {") + for name in CATEGORY_NAMES: + fprint(" \"%s\"," % name) + fprint(" NULL") + fprint("};") + + fprint("const char *_PyUnicode_BidirectionalNames[] = {") + for name in BIDIRECTIONAL_NAMES: + fprint(" \"%s\"," % name) + fprint(" NULL") + fprint("};") + + fprint("const char *_PyUnicode_EastAsianWidthNames[] = {") + for name in EASTASIANWIDTH_NAMES: + fprint(" \"%s\"," % name) + fprint(" NULL") + fprint("};") + + fprint("static const char *decomp_prefix[] = {") + for name in decomp_prefix: + fprint(" \"%s\"," % name) + fprint(" NULL") + fprint("};") + + # split record index table index1, index2, shift = splitbins(index, trace) - print("static const change_record change_records_%s[] = {" % cversion, file=fp) - for record in records: - print(" { %s }," % ", ".join(map(str,record)), file=fp) - print("};", file=fp) - Array("changes_%s_index" % cversion, index1).dump(fp, trace) - Array("changes_%s_data" % cversion, index2).dump(fp, trace) - print("static const change_record* get_change_%s(Py_UCS4 n)" % cversion, file=fp) - print("{", file=fp) - print(" int index;", file=fp) - print(" if (n >= 0x110000) index = 0;", file=fp) - print(" else {", file=fp) - print(" index = changes_%s_index[n>>%d];" % (cversion, shift), file=fp) - print(" index = changes_%s_data[(index<<%d)+(n & %d)];" % \ - (cversion, shift, ((1<= 0x110000) index = 0;") + fprint(" else {") + fprint(" index = changes_%s_index[n>>%d];" % (cversion, shift)) + fprint(" index = changes_%s_data[(index<<%d)+(n & %d)];" % \ + (cversion, shift, ((1<name phrasebook */", file=fp) - print("#define phrasebook_shift", shift, file=fp) - print("#define phrasebook_short", short, file=fp) - - Array("phrasebook", phrasebook).dump(fp, trace) - Array("phrasebook_offset1", offset1).dump(fp, trace) - Array("phrasebook_offset2", offset2).dump(fp, trace) - - print("/* name->code dictionary */", file=fp) - codehash.dump(fp, trace) - - print(file=fp) - print('static const unsigned int aliases_start = %#x;' % - NAME_ALIASES_START, file=fp) - print('static const unsigned int aliases_end = %#x;' % - (NAME_ALIASES_START + len(unicode.aliases)), file=fp) - - print('static const unsigned int name_aliases[] = {', file=fp) - for name, codepoint in unicode.aliases: - print(' 0x%04X,' % codepoint, file=fp) - print('};', file=fp) - - # In Unicode 6.0.0, the sequences contain at most 4 BMP chars, - # so we are using Py_UCS2 seq[4]. This needs to be updated if longer - # sequences or sequences with non-BMP chars are added. - # unicodedata_lookup should be adapted too. - print(dedent(""" - typedef struct NamedSequence { - int seqlen; - Py_UCS2 seq[4]; - } named_sequence; - """), file=fp) - - print('static const unsigned int named_sequences_start = %#x;' % - NAMED_SEQUENCES_START, file=fp) - print('static const unsigned int named_sequences_end = %#x;' % - (NAMED_SEQUENCES_START + len(unicode.named_sequences)), file=fp) - - print('static const named_sequence named_sequences[] = {', file=fp) - for name, sequence in unicode.named_sequences: - seq_str = ', '.join('0x%04X' % cp for cp in sequence) - print(' {%d, {%s}},' % (len(sequence), seq_str), file=fp) - print('};', file=fp) - - fp.close() + with open(FILE, "w") as fp: + fprint = partial(print, file=fp) + + fprint("/* this file was generated by %s %s */" % (SCRIPT, VERSION)) + fprint() + fprint("#define NAME_MAXLEN", 256) + fprint() + fprint("/* lexicon */") + Array("lexicon", lexicon).dump(fp, trace) + Array("lexicon_offset", lexicon_offset).dump(fp, trace) + + # split decomposition index table + offset1, offset2, shift = splitbins(phrasebook_offset, trace) + + fprint("/* code->name phrasebook */") + fprint("#define phrasebook_shift", shift) + fprint("#define phrasebook_short", short) + + Array("phrasebook", phrasebook).dump(fp, trace) + Array("phrasebook_offset1", offset1).dump(fp, trace) + Array("phrasebook_offset2", offset2).dump(fp, trace) + + fprint("/* name->code dictionary */") + codehash.dump(fp, trace) + + fprint() + fprint('static const unsigned int aliases_start = %#x;' % + NAME_ALIASES_START) + fprint('static const unsigned int aliases_end = %#x;' % + (NAME_ALIASES_START + len(unicode.aliases))) + + fprint('static const unsigned int name_aliases[] = {') + for name, codepoint in unicode.aliases: + fprint(' 0x%04X,' % codepoint) + fprint('};') + + # In Unicode 6.0.0, the sequences contain at most 4 BMP chars, + # so we are using Py_UCS2 seq[4]. This needs to be updated if longer + # sequences or sequences with non-BMP chars are added. + # unicodedata_lookup should be adapted too. + fprint(dedent(""" + typedef struct NamedSequence { + int seqlen; + Py_UCS2 seq[4]; + } named_sequence; + """)) + + fprint('static const unsigned int named_sequences_start = %#x;' % + NAMED_SEQUENCES_START) + fprint('static const unsigned int named_sequences_end = %#x;' % + (NAMED_SEQUENCES_START + len(unicode.named_sequences))) + + fprint('static const named_sequence named_sequences[] = {') + for name, sequence in unicode.named_sequences: + seq_str = ', '.join('0x%04X' % cp for cp in sequence) + fprint(' {%d, {%s}},' % (len(sequence), seq_str)) + fprint('};') def merge_old_version(version, new, old): @@ -882,6 +885,7 @@ class Difference(Exception):pass numeric_changes)), normalization_changes)) + def open_data(template, version): local = template % ('-'+version,) if not os.path.exists(local): @@ -898,6 +902,7 @@ def open_data(template, version): # Unihan.zip return open(local, 'rb') + # -------------------------------------------------------------------- # the following support code is taken from the unidb utilities # Copyright (c) 1999-2000 by Secret Labs AB @@ -1150,6 +1155,7 @@ def uselatin1(self): # restrict character range to ISO Latin 1 self.chars = list(range(256)) + # hash table tools # this is a straight-forward reimplementation of Python's built-in @@ -1165,6 +1171,7 @@ def myhash(s, magic): h = (h ^ ((ix>>24) & 0xff)) & 0x00ffffff return h + SIZES = [ (4,3), (8,3), (16,3), (32,5), (64,3), (128,3), (256,29), (512,17), (1024,9), (2048,5), (4096,83), (8192,27), (16384,43), (32768,3), @@ -1172,6 +1179,7 @@ def myhash(s, magic): (2097152,5), (4194304,3), (8388608,33), (16777216,27) ] + class Hash: def __init__(self, name, data, magic): # turn a (key, value) list into a static hash table structure @@ -1202,7 +1210,7 @@ def __init__(self, name, data, magic): if v is None: table[i] = value continue - incr = (h ^ (h >> 3)) & mask; + incr = (h ^ (h >> 3)) & mask if not incr: incr = mask while 1: @@ -1236,6 +1244,7 @@ def dump(self, file, trace): file.write("#define %s_size %d\n" % (self.name, self.size)) file.write("#define %s_poly %d\n" % (self.name, self.poly)) + # stuff to deal with arrays of unsigned integers class Array: @@ -1270,6 +1279,7 @@ def dump(self, file, trace=0): file.write(s.rstrip() + "\n") file.write("};\n\n") + def getsize(data): # return smallest possible integer size for the given array maxdata = max(data) @@ -1280,6 +1290,7 @@ def getsize(data): else: return 4 + def splitbins(t, trace=0): """t, trace=0 -> (t1, t2, shift). Split a table to save space. @@ -1299,8 +1310,8 @@ def splitbins(t, trace=0): def dump(t1, t2, shift, bytes): print("%d+%d bins at shift %d; %d bytes" % ( len(t1), len(t2), shift, bytes), file=sys.stderr) - print("Size of original table:", len(t)*getsize(t), \ - "bytes", file=sys.stderr) + print("Size of original table:", len(t)*getsize(t), "bytes", + file=sys.stderr) n = len(t)-1 # last valid index maxshift = 0 # the most we can shift n and still have something left if n > 0: @@ -1341,5 +1352,6 @@ def dump(t1, t2, shift, bytes): assert t[i] == t2[(t1[i >> shift] << shift) + (i & mask)] return best + if __name__ == "__main__": maketables(1) From webhook-mailer at python.org Sat Jun 1 16:02:12 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Sat, 01 Jun 2019 20:02:12 -0000 Subject: [Python-checkins] Fix compiler warnings in the pystrehex module (GH-13730) Message-ID: https://github.com/python/cpython/commit/938d9a0167f7fa4ed109484d269902021d274c64 commit: 938d9a0167f7fa4ed109484d269902021d274c64 branch: master author: Pablo Galindo committer: GitHub date: 2019-06-01T21:02:08+01:00 summary: Fix compiler warnings in the pystrehex module (GH-13730) files: M Python/pystrhex.c diff --git a/Python/pystrhex.c b/Python/pystrhex.c index 695a3c394e9b..5dc7c9613796 100644 --- a/Python/pystrhex.c +++ b/Python/pystrhex.c @@ -11,11 +11,11 @@ static PyObject *_Py_strhex_impl(const char* argbuf, const Py_ssize_t arglen, PyObject *retval; Py_UCS1* retbuf; Py_ssize_t i, j, resultlen = 0; - Py_UCS1 sep_char; + Py_UCS1 sep_char = 0; unsigned int abs_bytes_per_sep; if (sep) { - Py_ssize_t seplen = PyObject_Length(sep); + Py_ssize_t seplen = PyObject_Length((PyObject*)sep); if (seplen < 0) { return NULL; } From webhook-mailer at python.org Sat Jun 1 16:18:52 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Sat, 01 Jun 2019 20:18:52 -0000 Subject: [Python-checkins] bpo-36842: Pass positional only parameters to code_new audit hook (GH-13707) Message-ID: https://github.com/python/cpython/commit/3b57f50efc16c65df96914ec53bc8d3dc28e18b6 commit: 3b57f50efc16c65df96914ec53bc8d3dc28e18b6 branch: master author: Pablo Galindo committer: GitHub date: 2019-06-01T21:18:48+01:00 summary: bpo-36842: Pass positional only parameters to code_new audit hook (GH-13707) files: M Doc/c-api/code.rst M Objects/codeobject.c diff --git a/Doc/c-api/code.rst b/Doc/c-api/code.rst index 92baa4c7df5c..48428109e6f2 100644 --- a/Doc/c-api/code.rst +++ b/Doc/c-api/code.rst @@ -45,7 +45,7 @@ bound into a function. The first parameter (*argcount*) now represents the total number of positional arguments, including positional-only. - .. audit-event:: code.__new__ "code filename name argcount kwonlyargcount nlocals stacksize flags" + .. audit-event:: code.__new__ "code filename name argcount posonlyargcount kwonlyargcount nlocals stacksize flags" .. c:function:: PyCodeObject* PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno) diff --git a/Objects/codeobject.c b/Objects/codeobject.c index bf68e54f42ec..233307562a55 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -390,9 +390,9 @@ code_new(PyTypeObject *type, PyObject *args, PyObject *kw) &PyTuple_Type, &cellvars)) return NULL; - if (PySys_Audit("code.__new__", "OOOiiiii", - code, filename, name, argcount, kwonlyargcount, - nlocals, stacksize, flags) < 0) { + if (PySys_Audit("code.__new__", "OOOiiiiii", + code, filename, name, argcount, posonlyargcount, + kwonlyargcount, nlocals, stacksize, flags) < 0) { goto cleanup; } From webhook-mailer at python.org Sat Jun 1 16:32:22 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Sat, 01 Jun 2019 20:32:22 -0000 Subject: [Python-checkins] bpo-34303: Micro-optimizations in functools.reduce() (GH-8598) Message-ID: https://github.com/python/cpython/commit/e5f6207ba6cb510d9370519ba869296be01787be commit: e5f6207ba6cb510d9370519ba869296be01787be branch: master author: Sergey Fedoseev committer: Raymond Hettinger date: 2019-06-01T13:32:17-07:00 summary: bpo-34303: Micro-optimizations in functools.reduce() (GH-8598) files: A Misc/NEWS.d/next/Library/2018-08-03-09-47-20.bpo-34303.tOE2HP.rst M Modules/_functoolsmodule.c diff --git a/Misc/NEWS.d/next/Library/2018-08-03-09-47-20.bpo-34303.tOE2HP.rst b/Misc/NEWS.d/next/Library/2018-08-03-09-47-20.bpo-34303.tOE2HP.rst new file mode 100644 index 000000000000..94c1299e5956 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-08-03-09-47-20.bpo-34303.tOE2HP.rst @@ -0,0 +1,2 @@ +Performance of :func:`functools.reduce` is slightly improved. Patch by +Sergey Fedoseev. diff --git a/Modules/_functoolsmodule.c b/Modules/_functoolsmodule.c index aca5bad23f58..a101363bf02a 100644 --- a/Modules/_functoolsmodule.c +++ b/Modules/_functoolsmodule.c @@ -626,10 +626,13 @@ functools_reduce(PyObject *self, PyObject *args) if (result == NULL) result = op2; else { - PyTuple_SetItem(args, 0, result); - PyTuple_SetItem(args, 1, op2); - if ((result = PyEval_CallObject(func, args)) == NULL) + /* Update the args tuple in-place */ + assert(args->ob_refcnt == 1); + Py_XSETREF(_PyTuple_ITEMS(args)[0], result); + Py_XSETREF(_PyTuple_ITEMS(args)[1], op2); + if ((result = PyObject_Call(func, args, NULL)) == NULL) { goto Fail; + } } } From webhook-mailer at python.org Sat Jun 1 17:03:26 2019 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Sat, 01 Jun 2019 21:03:26 -0000 Subject: [Python-checkins] bpo-32411: IDLE: Remove line number sort in browser.py (#5011) Message-ID: https://github.com/python/cpython/commit/1a4d9ffa1aecd7e750195f2be06d3d16c7a3a88f commit: 1a4d9ffa1aecd7e750195f2be06d3d16c7a3a88f branch: master author: Cheryl Sabella committer: Terry Jan Reedy date: 2019-06-01T17:03:22-04:00 summary: bpo-32411: IDLE: Remove line number sort in browser.py (#5011) Insertion in line order makes sorting keys by line order unneeded. files: A Misc/NEWS.d/next/IDLE/2017-12-25-18-48-50.bpo-32411.vNwDhe.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/browser.py M Lib/idlelib/idle_test/test_browser.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index e1bc009ae933..b260d4e5ef1b 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,8 @@ Released on 2019-10-20? ====================================== +bpo-32411: Stop sorting dict created with desired line order. + bpo-37038: Make idlelib.run runnable; add test clause. bpo-36958: Print any argument other than None or int passed to diff --git a/Lib/idlelib/browser.py b/Lib/idlelib/browser.py index 234883fe8605..e5b0bc53c662 100644 --- a/Lib/idlelib/browser.py +++ b/Lib/idlelib/browser.py @@ -29,9 +29,10 @@ def transform_children(child_dict, modname=None): The dictionary maps names to pyclbr information objects. Filter out imported objects. Augment class names with bases. - Sort objects by line number. + The insertion order of the dictonary is assumed to have been in line + number order, so sorting is not necessary. - The current tree only calls this once per child_dic as it saves + The current tree only calls this once per child_dict as it saves TreeItems once created. A future tree and tests might violate this, so a check prevents multiple in-place augmentations. """ @@ -51,7 +52,7 @@ def transform_children(child_dict, modname=None): supers.append(sname) obj.name += '({})'.format(', '.join(supers)) obs.append(obj) - return sorted(obs, key=lambda o: o.lineno) + return obs class ModuleBrowser: diff --git a/Lib/idlelib/idle_test/test_browser.py b/Lib/idlelib/idle_test/test_browser.py index dfbab6dd6b5e..25d6dc663036 100644 --- a/Lib/idlelib/idle_test/test_browser.py +++ b/Lib/idlelib/idle_test/test_browser.py @@ -61,16 +61,16 @@ 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' -f0 = mb.Function(module, 'f0', fname, 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(module, 'C0', ['base'], fname, 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) -mock_pyclbr_tree = {'f0': f0, 'C0': C0} +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) +mock_pyclbr_tree = {'C0': C0, 'f0': f0} # Adjust C0.name, C1.name so tests do not depend on order. browser.transform_children(mock_pyclbr_tree, 'test') # C0(base) @@ -87,12 +87,12 @@ def test_transform_module_children(self): transform = browser.transform_children # Parameter matches tree module. tcl = list(transform(mock_pyclbr_tree, 'test')) - eq(tcl, [f0, C0]) - eq(tcl[0].name, 'f0') - eq(tcl[1].name, 'C0(base)') + eq(tcl, [C0, f0]) + eq(tcl[0].name, 'C0(base)') + eq(tcl[1].name, 'f0') # Check that second call does not change suffix. tcl = list(transform(mock_pyclbr_tree, 'test')) - eq(tcl[1].name, 'C0(base)') + eq(tcl[0].name, 'C0(base)') # Nothing to traverse if parameter name isn't same as tree module. tcl = list(transform(mock_pyclbr_tree, 'different name')) eq(tcl, []) diff --git a/Misc/NEWS.d/next/IDLE/2017-12-25-18-48-50.bpo-32411.vNwDhe.rst b/Misc/NEWS.d/next/IDLE/2017-12-25-18-48-50.bpo-32411.vNwDhe.rst new file mode 100644 index 000000000000..a5522012923a --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2017-12-25-18-48-50.bpo-32411.vNwDhe.rst @@ -0,0 +1,2 @@ +In browser.py, remove extraneous sorting by line number since dictionary was +created in line number order. From webhook-mailer at python.org Sat Jun 1 17:05:51 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Sat, 01 Jun 2019 21:05:51 -0000 Subject: [Python-checkins] bpo-20092. Use __index__ in constructors of int, float and complex. (GH-13108) Message-ID: https://github.com/python/cpython/commit/bdbad71b9def0b86433de12cecca022eee91bd9f commit: bdbad71b9def0b86433de12cecca022eee91bd9f branch: master author: Serhiy Storchaka committer: GitHub date: 2019-06-02T00:05:48+03:00 summary: bpo-20092. Use __index__ in constructors of int, float and complex. (GH-13108) files: A Misc/NEWS.d/next/Core and Builtins/2019-05-31-11-55-49.bpo-20092.KIMjBW.rst M Doc/c-api/complex.rst M Doc/c-api/float.rst M Doc/library/functions.rst M Doc/reference/datamodel.rst M Doc/whatsnew/3.8.rst M Lib/test/test_cmath.py M Lib/test/test_complex.py M Lib/test/test_float.py M Lib/test/test_getargs2.py M Lib/test/test_index.py M Lib/test/test_int.py M Objects/abstract.c M Objects/complexobject.c M Objects/floatobject.c diff --git a/Doc/c-api/complex.rst b/Doc/c-api/complex.rst index 675bd013e892..06dbb2572725 100644 --- a/Doc/c-api/complex.rst +++ b/Doc/c-api/complex.rst @@ -129,4 +129,10 @@ Complex Numbers as Python Objects If *op* is not a Python complex number object but has a :meth:`__complex__` method, this method will first be called to convert *op* to a Python complex - number object. Upon failure, this method returns ``-1.0`` as a real value. + number object. If ``__complex__()`` is not defined then it falls back to + :meth:`__float__`. If ``__float__()`` is not defined then it falls back + to :meth:`__index__`. Upon failure, this method returns ``-1.0`` as a real + value. + + .. versionchanged:: 3.8 + Use :meth:`__index__` if available. diff --git a/Doc/c-api/float.rst b/Doc/c-api/float.rst index 8a996422ce48..057ff522516a 100644 --- a/Doc/c-api/float.rst +++ b/Doc/c-api/float.rst @@ -47,9 +47,13 @@ Floating Point Objects Return a C :c:type:`double` representation of the contents of *pyfloat*. If *pyfloat* is not a Python floating point object but has a :meth:`__float__` method, this method will first be called to convert *pyfloat* into a float. + If ``__float__()`` is not defined then it falls back to :meth:`__index__`. This method returns ``-1.0`` upon failure, so one should call :c:func:`PyErr_Occurred` to check for errors. + .. versionchanged:: 3.8 + Use :meth:`__index__` if available. + .. c:function:: double PyFloat_AS_DOUBLE(PyObject *pyfloat) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 425a985320fc..d5c9f18c79b7 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -318,6 +318,11 @@ are always available. They are listed here in alphabetical order. :class:`int` and :class:`float`. If both arguments are omitted, returns ``0j``. + For a general Python object ``x``, ``complex(x)`` delegates to + ``x.__complex__()``. If ``__complex__()`` is not defined then it falls back + to :meth:`__float__`. If ``__float__()`` is not defined then it falls back + to :meth:`__index__`. + .. note:: When converting from a string, the string must not contain whitespace @@ -330,6 +335,10 @@ are always available. They are listed here in alphabetical order. .. versionchanged:: 3.6 Grouping digits with underscores as in code literals is allowed. + .. versionchanged:: 3.8 + Falls back to :meth:`__index__` if :meth:`__complex__` and + :meth:`__float__` are not defined. + .. function:: delattr(object, name) @@ -584,7 +593,8 @@ are always available. They are listed here in alphabetical order. float, an :exc:`OverflowError` will be raised. For a general Python object ``x``, ``float(x)`` delegates to - ``x.__float__()``. + ``x.__float__()``. If ``__float__()`` is not defined then it falls back + to :meth:`__index__`. If no argument is given, ``0.0`` is returned. @@ -609,6 +619,9 @@ are always available. They are listed here in alphabetical order. .. versionchanged:: 3.7 *x* is now a positional-only parameter. + .. versionchanged:: 3.8 + Falls back to :meth:`__index__` if :meth:`__float__` is not defined. + .. index:: single: __format__ @@ -780,7 +793,8 @@ are always available. They are listed here in alphabetical order. Return an integer object constructed from a number or string *x*, or return ``0`` if no arguments are given. If *x* defines :meth:`__int__`, - ``int(x)`` returns ``x.__int__()``. If *x* defines :meth:`__trunc__`, + ``int(x)`` returns ``x.__int__()``. If *x* defines :meth:`__index__`, + it returns ``x.__index__()``. If *x* defines :meth:`__trunc__`, it returns ``x.__trunc__()``. For floating point numbers, this truncates towards zero. @@ -812,6 +826,9 @@ are always available. They are listed here in alphabetical order. .. versionchanged:: 3.7 *x* is now a positional-only parameter. + .. versionchanged:: 3.8 + Falls back to :meth:`__index__` if :meth:`__int__` is not defined. + .. function:: isinstance(object, classinfo) diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index 44017d8a55df..fa47bf1c1619 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -2394,11 +2394,9 @@ left undefined. functions). Presence of this method indicates that the numeric object is an integer type. Must return an integer. - .. note:: - - In order to have a coherent integer type class, when :meth:`__index__` is - defined :meth:`__int__` should also be defined, and both should return - the same value. + If :meth:`__int__`, :meth:`__float__` and :meth:`__complex__` are not + defined then corresponding built-in functions :func:`int`, :func:`float` + and :func:`complex` fall back to :meth:`__index__`. .. method:: object.__round__(self, [,ndigits]) diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 4c5a9bb0cdb9..591b45488372 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -250,6 +250,12 @@ Other Language Changes compatible with the existing :meth:`float.as_integer_ratio` method. (Contributed by Lisa Roach in :issue:`33073`.) +* Constructors of :class:`int`, :class:`float` and :class:`complex` will now + use the :meth:`~object.__index__` special method, if available and the + corresponding method :meth:`~object.__int__`, :meth:`~object.__float__` + or :meth:`~object.__complex__` is not available. + (Contributed by Serhiy Storchaka in :issue:`20092`.) + * Added support of ``\N{name}`` escapes in :mod:`regular expressions `. (Contributed by Jonathan Eunice and Serhiy Storchaka in :issue:`30688`.) @@ -868,7 +874,10 @@ Build and C API Changes ``__index__()`` method (like :class:`~decimal.Decimal` and :class:`~fractions.Fraction`). :c:func:`PyNumber_Check` will now return ``1`` for objects implementing ``__index__()``. - (Contributed by Serhiy Storchaka in :issue:`36048`.) + :c:func:`PyNumber_Long`, :c:func:`PyNumber_Float` and + :c:func:`PyFloat_AsDouble` also now use the ``__index__()`` method if + available. + (Contributed by Serhiy Storchaka in :issue:`36048` and :issue:`20092`.) * Heap-allocated type objects will now increase their reference count in :c:func:`PyObject_Init` (and its parallel macro ``PyObject_INIT``) diff --git a/Lib/test/test_cmath.py b/Lib/test/test_cmath.py index 43a074b4b663..a00185f43dbf 100644 --- a/Lib/test/test_cmath.py +++ b/Lib/test/test_cmath.py @@ -220,12 +220,11 @@ class NeitherComplexNorFloat(object): pass class NeitherComplexNorFloatOS: pass - class MyInt(object): + class Index: def __int__(self): return 2 def __index__(self): return 2 - class MyIntOS: + class MyInt: def __int__(self): return 2 - def __index__(self): return 2 # other possible combinations of __float__ and __complex__ # that should work @@ -255,6 +254,7 @@ def __float__(self): self.assertEqual(f(FloatAndComplexOS()), f(cx_arg)) self.assertEqual(f(JustFloat()), f(flt_arg)) self.assertEqual(f(JustFloatOS()), f(flt_arg)) + self.assertEqual(f(Index()), f(int(Index()))) # TypeError should be raised for classes not providing # either __complex__ or __float__, even if they provide # __int__ or __index__. An old-style class @@ -263,7 +263,6 @@ def __float__(self): self.assertRaises(TypeError, f, NeitherComplexNorFloat()) self.assertRaises(TypeError, f, MyInt()) self.assertRaises(Exception, f, NeitherComplexNorFloatOS()) - self.assertRaises(Exception, f, MyIntOS()) # non-complex return value from __complex__ -> TypeError for bad_complex in non_complexes: self.assertRaises(TypeError, f, MyComplex(bad_complex)) diff --git a/Lib/test/test_complex.py b/Lib/test/test_complex.py index 21c6eaed6054..fe1e566562de 100644 --- a/Lib/test/test_complex.py +++ b/Lib/test/test_complex.py @@ -368,6 +368,24 @@ def __float__(self): self.assertAlmostEqual(complex(real=float2(17.), imag=float2(23.)), 17+23j) self.assertRaises(TypeError, complex, float2(None)) + class MyIndex: + def __init__(self, value): + self.value = value + def __index__(self): + return self.value + + self.assertAlmostEqual(complex(MyIndex(42)), 42.0+0.0j) + self.assertAlmostEqual(complex(123, MyIndex(42)), 123.0+42.0j) + self.assertRaises(OverflowError, complex, MyIndex(2**2000)) + self.assertRaises(OverflowError, complex, 123, MyIndex(2**2000)) + + class MyInt: + def __int__(self): + return 42 + + self.assertRaises(TypeError, complex, MyInt()) + self.assertRaises(TypeError, complex, 123, MyInt()) + class complex0(complex): """Test usage of __complex__() when inheriting from 'complex'""" def __complex__(self): diff --git a/Lib/test/test_float.py b/Lib/test/test_float.py index 5278d716de23..b656582538e8 100644 --- a/Lib/test/test_float.py +++ b/Lib/test/test_float.py @@ -223,6 +223,21 @@ def __float__(self): with self.assertWarns(DeprecationWarning): self.assertIs(type(FloatSubclass(F())), FloatSubclass) + class MyIndex: + def __init__(self, value): + self.value = value + def __index__(self): + return self.value + + self.assertEqual(float(MyIndex(42)), 42.0) + self.assertRaises(OverflowError, float, MyIndex(2**2000)) + + class MyInt: + def __int__(self): + return 42 + + self.assertRaises(TypeError, float, MyInt()) + def test_keyword_args(self): with self.assertRaisesRegex(TypeError, 'keyword argument'): float(x='3.14') diff --git a/Lib/test/test_getargs2.py b/Lib/test/test_getargs2.py index 07e2d1513791..1a73fa461580 100644 --- a/Lib/test/test_getargs2.py +++ b/Lib/test/test_getargs2.py @@ -457,6 +457,8 @@ def test_f(self): with self.assertWarns(DeprecationWarning): self.assertEqual(getargs_f(BadFloat2()), 4.25) self.assertEqual(getargs_f(BadFloat3(7.5)), 7.5) + self.assertEqual(getargs_f(Index()), 99.0) + self.assertRaises(TypeError, getargs_f, Int()) for x in (FLT_MIN, -FLT_MIN, FLT_MAX, -FLT_MAX, INF, -INF): self.assertEqual(getargs_f(x), x) @@ -489,6 +491,8 @@ def test_d(self): with self.assertWarns(DeprecationWarning): self.assertEqual(getargs_d(BadFloat2()), 4.25) self.assertEqual(getargs_d(BadFloat3(7.5)), 7.5) + self.assertEqual(getargs_d(Index()), 99.0) + self.assertRaises(TypeError, getargs_d, Int()) for x in (DBL_MIN, -DBL_MIN, DBL_MAX, -DBL_MAX, INF, -INF): self.assertEqual(getargs_d(x), x) @@ -511,6 +515,8 @@ def test_D(self): with self.assertWarns(DeprecationWarning): self.assertEqual(getargs_D(BadComplex2()), 4.25+0.5j) self.assertEqual(getargs_D(BadComplex3(7.5+0.25j)), 7.5+0.25j) + self.assertEqual(getargs_D(Index()), 99.0+0j) + self.assertRaises(TypeError, getargs_D, Int()) for x in (DBL_MIN, -DBL_MIN, DBL_MAX, -DBL_MAX, INF, -INF): c = complex(x, 1.0) diff --git a/Lib/test/test_index.py b/Lib/test/test_index.py index a2ac32132e23..cbdc56c801a4 100644 --- a/Lib/test/test_index.py +++ b/Lib/test/test_index.py @@ -60,7 +60,7 @@ def test_int_subclass_with_index(self): # subclasses. See issue #17576. class MyInt(int): def __index__(self): - return int(self) + 1 + return int(str(self)) + 1 my_int = MyInt(7) direct_index = my_int.__index__() diff --git a/Lib/test/test_int.py b/Lib/test/test_int.py index 307ca36bb4fa..6fdf52ef23f6 100644 --- a/Lib/test/test_int.py +++ b/Lib/test/test_int.py @@ -378,15 +378,23 @@ def __trunc__(self): int(ExceptionalTrunc()) for trunc_result_base in (object, Classic): - class Integral(trunc_result_base): - def __int__(self): + class Index(trunc_result_base): + def __index__(self): return 42 class TruncReturnsNonInt(base): def __trunc__(self): - return Integral() - with self.assertWarns(DeprecationWarning): - self.assertEqual(int(TruncReturnsNonInt()), 42) + return Index() + self.assertEqual(int(TruncReturnsNonInt()), 42) + + class Intable(trunc_result_base): + def __int__(self): + return 42 + + class TruncReturnsNonIndex(base): + def __trunc__(self): + return Intable() + self.assertEqual(int(TruncReturnsNonInt()), 42) class NonIntegral(trunc_result_base): def __trunc__(self): @@ -418,6 +426,21 @@ def __trunc__(self): with self.assertRaises(TypeError): int(TruncReturnsBadInt()) + def test_int_subclass_with_index(self): + class MyIndex(int): + def __index__(self): + return 42 + + class BadIndex(int): + def __index__(self): + return 42.0 + + my_int = MyIndex(7) + self.assertEqual(my_int, 7) + self.assertEqual(int(my_int), 7) + + self.assertEqual(int(BadIndex()), 0) + def test_int_subclass_with_int(self): class MyInt(int): def __int__(self): @@ -431,9 +454,19 @@ def __int__(self): self.assertEqual(my_int, 7) self.assertEqual(int(my_int), 42) - self.assertRaises(TypeError, int, BadInt()) + my_int = BadInt(7) + self.assertEqual(my_int, 7) + self.assertRaises(TypeError, int, my_int) def test_int_returns_int_subclass(self): + class BadIndex: + def __index__(self): + return True + + class BadIndex2(int): + def __index__(self): + return True + class BadInt: def __int__(self): return True @@ -442,6 +475,10 @@ class BadInt2(int): def __int__(self): return True + class TruncReturnsBadIndex: + def __trunc__(self): + return BadIndex() + class TruncReturnsBadInt: def __trunc__(self): return BadInt() @@ -450,6 +487,17 @@ class TruncReturnsIntSubclass: def __trunc__(self): return True + bad_int = BadIndex() + with self.assertWarns(DeprecationWarning): + n = int(bad_int) + self.assertEqual(n, 1) + self.assertIs(type(n), int) + + bad_int = BadIndex2() + n = int(bad_int) + self.assertEqual(n, 0) + self.assertIs(type(n), int) + bad_int = BadInt() with self.assertWarns(DeprecationWarning): n = int(bad_int) @@ -462,6 +510,12 @@ def __trunc__(self): self.assertEqual(n, 1) self.assertIs(type(n), int) + bad_int = TruncReturnsBadIndex() + with self.assertWarns(DeprecationWarning): + n = int(bad_int) + self.assertEqual(n, 1) + self.assertIs(type(n), int) + bad_int = TruncReturnsBadInt() with self.assertWarns(DeprecationWarning): n = int(bad_int) diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-31-11-55-49.bpo-20092.KIMjBW.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-31-11-55-49.bpo-20092.KIMjBW.rst new file mode 100644 index 000000000000..7536dc33c9f1 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-31-11-55-49.bpo-20092.KIMjBW.rst @@ -0,0 +1,4 @@ +Constructors of :class:`int`, :class:`float` and :class:`complex` will now +use the :meth:`~object.__index__` special method, if available and the +corresponding method :meth:`~object.__int__`, :meth:`~object.__float__` +or :meth:`~object.__complex__` is not available. diff --git a/Objects/abstract.c b/Objects/abstract.c index 68d06edfa600..77d09143aa07 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -1373,6 +1373,13 @@ PyNumber_Long(PyObject *o) } return result; } + if (m && m->nb_index) { + result = _PyLong_FromNbIndexOrNbInt(o); + if (result != NULL && !PyLong_CheckExact(result)) { + Py_SETREF(result, _PyLong_Copy((PyLongObject *)result)); + } + return result; + } trunc_func = _PyObject_LookupSpecial(o, &PyId___trunc__); if (trunc_func) { result = _PyObject_CallNoArg(trunc_func); @@ -1480,6 +1487,18 @@ PyNumber_Float(PyObject *o) Py_DECREF(res); return PyFloat_FromDouble(val); } + if (m && m->nb_index) { + PyObject *res = PyNumber_Index(o); + if (!res) { + return NULL; + } + double val = PyLong_AsDouble(res); + Py_DECREF(res); + if (val == -1.0 && PyErr_Occurred()) { + return NULL; + } + return PyFloat_FromDouble(val); + } if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */ return PyFloat_FromDouble(PyFloat_AS_DOUBLE(o)); } diff --git a/Objects/complexobject.c b/Objects/complexobject.c index a5f95186d625..f78c0fdf78de 100644 --- a/Objects/complexobject.c +++ b/Objects/complexobject.c @@ -984,7 +984,7 @@ complex_new_impl(PyTypeObject *type, PyObject *r, PyObject *i) } nbr = r->ob_type->tp_as_number; - if (nbr == NULL || nbr->nb_float == NULL) { + if (nbr == NULL || (nbr->nb_float == NULL && nbr->nb_index == NULL)) { PyErr_Format(PyExc_TypeError, "complex() first argument must be a string or a number, " "not '%.200s'", @@ -996,7 +996,7 @@ complex_new_impl(PyTypeObject *type, PyObject *r, PyObject *i) } if (i != NULL) { nbi = i->ob_type->tp_as_number; - if (nbi == NULL || nbi->nb_float == NULL) { + if (nbi == NULL || (nbi->nb_float == NULL && nbi->nb_index == NULL)) { PyErr_Format(PyExc_TypeError, "complex() second argument must be a number, " "not '%.200s'", @@ -1052,7 +1052,7 @@ complex_new_impl(PyTypeObject *type, PyObject *r, PyObject *i) /* The "imag" part really is entirely imaginary, and contributes nothing in the real direction. Just treat it as a double. */ - tmp = (*nbi->nb_float)(i); + tmp = PyNumber_Float(i); if (tmp == NULL) return NULL; ci.real = PyFloat_AsDouble(tmp); diff --git a/Objects/floatobject.c b/Objects/floatobject.c index 2bf7061d4f62..15cbe5c9d8ba 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -246,6 +246,15 @@ PyFloat_AsDouble(PyObject *op) nb = Py_TYPE(op)->tp_as_number; if (nb == NULL || nb->nb_float == NULL) { + if (nb && nb->nb_index) { + PyObject *res = PyNumber_Index(op); + if (!res) { + return -1; + } + double val = PyLong_AsDouble(res); + Py_DECREF(res); + return val; + } PyErr_Format(PyExc_TypeError, "must be real number, not %.50s", op->ob_type->tp_name); return -1; From webhook-mailer at python.org Sat Jun 1 17:07:49 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Sat, 01 Jun 2019 21:07:49 -0000 Subject: [Python-checkins] Fix the error handling in bytesio_sizeof(). (GH-10459) Message-ID: https://github.com/python/cpython/commit/36dcaab7fde5d2e54cdeff5b705b5adcb27726dd commit: 36dcaab7fde5d2e54cdeff5b705b5adcb27726dd branch: master author: Zackery Spytz committer: Serhiy Storchaka date: 2019-06-02T00:07:45+03:00 summary: Fix the error handling in bytesio_sizeof(). (GH-10459) bytesio_sizeof() must check if an error has occurred in _PySys_GetSizeOf(). files: M Modules/_io/bytesio.c diff --git a/Modules/_io/bytesio.c b/Modules/_io/bytesio.c index 32427e44de5b..19e1ed8441e3 100644 --- a/Modules/_io/bytesio.c +++ b/Modules/_io/bytesio.c @@ -943,8 +943,13 @@ bytesio_sizeof(bytesio *self, void *unused) Py_ssize_t res; res = _PyObject_SIZE(Py_TYPE(self)); - if (self->buf && !SHARED_BUF(self)) - res += _PySys_GetSizeOf(self->buf); + if (self->buf && !SHARED_BUF(self)) { + Py_ssize_t s = _PySys_GetSizeOf(self->buf); + if (s == -1) { + return NULL; + } + res += s; + } return PyLong_FromSsize_t(res); } From webhook-mailer at python.org Sat Jun 1 17:11:51 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Sat, 01 Jun 2019 21:11:51 -0000 Subject: [Python-checkins] bpo-29414: Change 'the for statement is such an iterator' in Tutorial (GH-273) Message-ID: https://github.com/python/cpython/commit/218e47b61862470477922e9aba1a23fd3dab18ae commit: 218e47b61862470477922e9aba1a23fd3dab18ae branch: master author: Marco Buttu committer: Raymond Hettinger date: 2019-06-01T14:11:47-07:00 summary: bpo-29414: Change 'the for statement is such an iterator' in Tutorial (GH-273) files: M Doc/tutorial/controlflow.rst diff --git a/Doc/tutorial/controlflow.rst b/Doc/tutorial/controlflow.rst index 81a28a6e5325..79111f8518d9 100644 --- a/Doc/tutorial/controlflow.rst +++ b/Doc/tutorial/controlflow.rst @@ -139,18 +139,24 @@ but in fact it isn't. It is an object which returns the successive items of the desired sequence when you iterate over it, but it doesn't really make the list, thus saving space. -We say such an object is *iterable*, that is, suitable as a target for +We say such an object is :term:`iterable`, that is, suitable as a target for functions and constructs that expect something from which they can -obtain successive items until the supply is exhausted. We have seen that -the :keyword:`for` statement is such an *iterator*. The function :func:`list` -is another; it creates lists from iterables:: +obtain successive items until the supply is exhausted. We have seen that +the :keyword:`for` statement is such a construct, while an example of function +that takes an iterable is :func:`sum`:: + >>> sum(range(4)) # 0 + 1 + 2 + 3 + 6 - >>> list(range(5)) - [0, 1, 2, 3, 4] +Later we will see more functions that return iterables and take iterables as +arguments. Lastly, maybe you are curious about how to get a list from a range. +Here is the solution:: -Later we will see more functions that return iterables and take iterables as argument. + >>> list(range(4)) + [0, 1, 2, 3] +In chapter :ref:`tut-structures`, we will discuss in more detail about +:func:`list`. .. _tut-break: @@ -161,7 +167,7 @@ The :keyword:`break` statement, like in C, breaks out of the innermost enclosing :keyword:`for` or :keyword:`while` loop. Loop statements may have an :keyword:`!else` clause; it is executed when the loop -terminates through exhaustion of the list (with :keyword:`for`) or when the +terminates through exhaustion of the iterable (with :keyword:`for`) or when the condition becomes false (with :keyword:`while`), but not when the loop is terminated by a :keyword:`break` statement. This is exemplified by the following loop, which searches for prime numbers:: @@ -188,8 +194,8 @@ following loop, which searches for prime numbers:: the :keyword:`for` loop, **not** the :keyword:`if` statement.) When used with a loop, the ``else`` clause has more in common with the -``else`` clause of a :keyword:`try` statement than it does that of -:keyword:`if` statements: a :keyword:`!try` statement's ``else`` clause runs +``else`` clause of a :keyword:`try` statement than it does with that of +:keyword:`if` statements: a :keyword:`try` statement's ``else`` clause runs when no exception occurs, and a loop's ``else`` clause runs when no ``break`` occurs. For more on the :keyword:`!try` statement and exceptions, see :ref:`tut-handling`. From webhook-mailer at python.org Sat Jun 1 17:39:50 2019 From: webhook-mailer at python.org (Eric Snow) Date: Sat, 01 Jun 2019 21:39:50 -0000 Subject: [Python-checkins] bpo-33608: Factor out a private, per-interpreter _Py_AddPendingCall(). (gh-13714) Message-ID: https://github.com/python/cpython/commit/6a150bcaeb190d1731b38ab9c7a5d1a352847ddc commit: 6a150bcaeb190d1731b38ab9c7a5d1a352847ddc branch: master author: Eric Snow committer: GitHub date: 2019-06-01T15:39:46-06:00 summary: bpo-33608: Factor out a private, per-interpreter _Py_AddPendingCall(). (gh-13714) files: A Misc/NEWS.d/next/Core and Builtins/2018-09-15-12-13-46.bpo-33608.avmvVP.rst M Include/internal/pycore_ceval.h M Include/internal/pycore_pystate.h M Lib/test/test_capi.py M Modules/_testcapimodule.c M Modules/signalmodule.c M Python/ceval.c M Python/ceval_gil.h M Python/pylifecycle.c M Python/pystate.c diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index 37170ed438f8..d44afdf4fa46 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -12,19 +12,22 @@ extern "C" { #include "pycore_pystate.h" #include "pythread.h" -PyAPI_FUNC(void) _Py_FinishPendingCalls(_PyRuntimeState *runtime); PyAPI_FUNC(void) _PyEval_Initialize(struct _ceval_runtime_state *); PyAPI_FUNC(void) _PyEval_FiniThreads( - struct _ceval_runtime_state *ceval); + struct _ceval_runtime_state *); PyAPI_FUNC(void) _PyEval_SignalReceived( - struct _ceval_runtime_state *ceval); + struct _ceval_runtime_state *); PyAPI_FUNC(int) _PyEval_AddPendingCall( PyThreadState *tstate, - struct _ceval_runtime_state *ceval, + struct _ceval_runtime_state *, + struct _ceval_interpreter_state *, + unsigned long thread_id, int (*func)(void *), void *arg); +PyAPI_FUNC(void) _PyEval_FinishPendingCalls(PyInterpreterState *); PyAPI_FUNC(void) _PyEval_SignalAsyncExc( - struct _ceval_runtime_state *ceval); + struct _ceval_runtime_state *, + struct _ceval_interpreter_state *); PyAPI_FUNC(void) _PyEval_ReInitThreads( _PyRuntimeState *runtime); diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index 520a74b8a61f..aca5533022e3 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -25,7 +25,7 @@ struct pyruntimestate; /* ceval state */ -struct _pending_calls { +struct _ceval_pending_calls { int finishing; PyThread_type_lock lock; /* Request for running pending calls. */ @@ -36,6 +36,7 @@ struct _pending_calls { int async_exc; #define NPENDINGCALLS 32 struct { + unsigned long thread_id; int (*func)(void *); void *arg; } calls[NPENDINGCALLS]; @@ -53,15 +54,21 @@ struct _ceval_runtime_state { int tracing_possible; /* This single variable consolidates all requests to break out of the fast path in the eval loop. */ + // XXX This can move to _ceval_interpreter_state once all parts + // from COMPUTE_EVAL_BREAKER have moved under PyInterpreterState. _Py_atomic_int eval_breaker; /* Request for dropping the GIL */ _Py_atomic_int gil_drop_request; - struct _pending_calls pending; /* Request for checking signals. */ _Py_atomic_int signals_pending; struct _gil_runtime_state gil; }; +struct _ceval_interpreter_state { + struct _ceval_pending_calls pending; +}; + + /* interpreter state */ typedef PyObject* (*_PyFrameEvalFunction)(struct _frame *, int); @@ -136,6 +143,7 @@ struct _is { uint64_t tstate_next_unique_id; + struct _ceval_interpreter_state ceval; struct _warnings_runtime_state warnings; PyObject *audit_hooks; diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index 4dd78bb9a2fd..fabc821e5c3a 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -431,7 +431,7 @@ def pendingcalls_wait(self, l, n, context = None): def test_pendingcalls_threaded(self): #do every callback on a separate thread - n = 32 #total callbacks + n = 32 #total callbacks (see NPENDINGCALLS in pycore_ceval.h) threads = [] class foo(object):pass context = foo() diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-09-15-12-13-46.bpo-33608.avmvVP.rst b/Misc/NEWS.d/next/Core and Builtins/2018-09-15-12-13-46.bpo-33608.avmvVP.rst new file mode 100644 index 000000000000..73a01a1f46bd --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2018-09-15-12-13-46.bpo-33608.avmvVP.rst @@ -0,0 +1,5 @@ +We added a new internal _Py_AddPendingCall() that operates relative to the +provided interpreter. This allows us to use the existing implementation to +ask another interpreter to do work that cannot be done in the current +interpreter, like decref an object the other interpreter owns. The existing +Py_AddPendingCall() only operates relative to the main interpreter. diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index b42f41cc8d8f..bf20e81a4ce8 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -2677,6 +2677,7 @@ pending_threadfunc(PyObject *self, PyObject *arg) Py_INCREF(callable); Py_BEGIN_ALLOW_THREADS + /* XXX Use the internal _Py_AddPendingCall(). */ r = Py_AddPendingCall(&_pending_callback, callable); Py_END_ALLOW_THREADS diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index 7698984ff3af..1964646da252 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -21,6 +21,7 @@ #include #endif #endif +#include "internal/pycore_pystate.h" #ifdef HAVE_SIGNAL_H #include @@ -259,6 +260,7 @@ trip_signal(int sig_num) /* Notify ceval.c */ _PyRuntimeState *runtime = &_PyRuntime; PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); + PyInterpreterState *interp = runtime->interpreters.main; _PyEval_SignalReceived(&runtime->ceval); /* And then write to the wakeup fd *after* setting all the globals and @@ -299,7 +301,10 @@ trip_signal(int sig_num) { /* Py_AddPendingCall() isn't signal-safe, but we still use it for this exceptional case. */ - _PyEval_AddPendingCall(tstate, &runtime->ceval, + _PyEval_AddPendingCall(tstate, + &runtime->ceval, + &interp->ceval, + runtime->main_thread, report_wakeup_send_error, (void *)(intptr_t) last_error); } @@ -318,7 +323,10 @@ trip_signal(int sig_num) { /* Py_AddPendingCall() isn't signal-safe, but we still use it for this exceptional case. */ - _PyEval_AddPendingCall(tstate, &runtime->ceval, + _PyEval_AddPendingCall(tstate, + &runtime->ceval, + &interp->ceval, + runtime->main_thread, report_wakeup_write_error, (void *)(intptr_t)errno); } diff --git a/Python/ceval.c b/Python/ceval.c index d9a71e942153..a092a2355641 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -101,66 +101,64 @@ static long dxp[256]; #endif #endif -#define GIL_REQUEST _Py_atomic_load_relaxed(&ceval->gil_drop_request) - /* This can set eval_breaker to 0 even though gil_drop_request became 1. We believe this is all right because the eval loop will release the GIL eventually anyway. */ -#define COMPUTE_EVAL_BREAKER(ceval) \ +#define COMPUTE_EVAL_BREAKER(ceval_r, ceval_i) \ _Py_atomic_store_relaxed( \ - &(ceval)->eval_breaker, \ - GIL_REQUEST | \ - _Py_atomic_load_relaxed(&(ceval)->signals_pending) | \ - _Py_atomic_load_relaxed(&(ceval)->pending.calls_to_do) | \ - (ceval)->pending.async_exc) + &(ceval_r)->eval_breaker, \ + _Py_atomic_load_relaxed(&(ceval_r)->gil_drop_request) | \ + _Py_atomic_load_relaxed(&(ceval_r)->signals_pending) | \ + _Py_atomic_load_relaxed(&(ceval_i)->pending.calls_to_do) | \ + (ceval_i)->pending.async_exc) -#define SET_GIL_DROP_REQUEST(ceval) \ +#define SET_GIL_DROP_REQUEST(ceval_r) \ do { \ - _Py_atomic_store_relaxed(&(ceval)->gil_drop_request, 1); \ - _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \ + _Py_atomic_store_relaxed(&(ceval_r)->gil_drop_request, 1); \ + _Py_atomic_store_relaxed(&(ceval_r)->eval_breaker, 1); \ } while (0) -#define RESET_GIL_DROP_REQUEST(ceval) \ +#define RESET_GIL_DROP_REQUEST(ceval_r, ceval_i) \ do { \ - _Py_atomic_store_relaxed(&(ceval)->gil_drop_request, 0); \ - COMPUTE_EVAL_BREAKER(ceval); \ + _Py_atomic_store_relaxed(&(ceval_r)->gil_drop_request, 0); \ + COMPUTE_EVAL_BREAKER(ceval_r, ceval_i); \ } while (0) /* Pending calls are only modified under pending_lock */ -#define SIGNAL_PENDING_CALLS(ceval) \ +#define SIGNAL_PENDING_CALLS(ceval_r, ceval_i) \ do { \ - _Py_atomic_store_relaxed(&(ceval)->pending.calls_to_do, 1); \ - _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \ + _Py_atomic_store_relaxed(&(ceval_i)->pending.calls_to_do, 1); \ + _Py_atomic_store_relaxed(&(ceval_r)->eval_breaker, 1); \ } while (0) -#define UNSIGNAL_PENDING_CALLS(ceval) \ +#define UNSIGNAL_PENDING_CALLS(ceval_r, ceval_i) \ do { \ - _Py_atomic_store_relaxed(&(ceval)->pending.calls_to_do, 0); \ - COMPUTE_EVAL_BREAKER(ceval); \ + _Py_atomic_store_relaxed(&(ceval_i)->pending.calls_to_do, 0); \ + COMPUTE_EVAL_BREAKER(ceval_r, ceval_i); \ } while (0) -#define SIGNAL_PENDING_SIGNALS(ceval) \ +#define SIGNAL_PENDING_SIGNALS(ceval_r) \ do { \ - _Py_atomic_store_relaxed(&(ceval)->signals_pending, 1); \ - _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \ + _Py_atomic_store_relaxed(&(ceval_r)->signals_pending, 1); \ + _Py_atomic_store_relaxed(&(ceval_r)->eval_breaker, 1); \ } while (0) -#define UNSIGNAL_PENDING_SIGNALS(ceval) \ +#define UNSIGNAL_PENDING_SIGNALS(ceval_r, ceval_i) \ do { \ - _Py_atomic_store_relaxed(&(ceval)->signals_pending, 0); \ - COMPUTE_EVAL_BREAKER(ceval); \ + _Py_atomic_store_relaxed(&(ceval_r)->signals_pending, 0); \ + COMPUTE_EVAL_BREAKER(ceval_r, ceval_i); \ } while (0) -#define SIGNAL_ASYNC_EXC(ceval) \ +#define SIGNAL_ASYNC_EXC(ceval_r, ceval_i) \ do { \ - (ceval)->pending.async_exc = 1; \ - _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \ + (ceval_i)->pending.async_exc = 1; \ + _Py_atomic_store_relaxed(&(ceval_r)->eval_breaker, 1); \ } while (0) -#define UNSIGNAL_ASYNC_EXC(ceval) \ +#define UNSIGNAL_ASYNC_EXC(ceval_r, ceval_i) \ do { \ - (ceval)->pending.async_exc = 0; \ - COMPUTE_EVAL_BREAKER(ceval); \ + (ceval_i)->pending.async_exc = 0; \ + COMPUTE_EVAL_BREAKER(ceval_r, ceval_i); \ } while (0) @@ -180,8 +178,8 @@ void PyEval_InitThreads(void) { _PyRuntimeState *runtime = &_PyRuntime; - struct _ceval_runtime_state *ceval = &runtime->ceval; - struct _gil_runtime_state *gil = &ceval->gil; + struct _ceval_runtime_state *ceval_r = &runtime->ceval; + struct _gil_runtime_state *gil = &ceval_r->gil; if (gil_created(gil)) { return; } @@ -189,19 +187,15 @@ PyEval_InitThreads(void) PyThread_init_thread(); create_gil(gil); PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); - take_gil(ceval, tstate); + take_gil(ceval_r, tstate); - struct _pending_calls *pending = &ceval->pending; - pending->lock = PyThread_allocate_lock(); - if (pending->lock == NULL) { - Py_FatalError("Can't initialize threads for pending calls"); - } + // The pending calls mutex is initialized in PyInterpreterState_New(). } void -_PyEval_FiniThreads(struct _ceval_runtime_state *ceval) +_PyEval_FiniThreads(struct _ceval_runtime_state *ceval_r) { - struct _gil_runtime_state *gil = &ceval->gil; + struct _gil_runtime_state *gil = &ceval_r->gil; if (!gil_created(gil)) { return; } @@ -209,20 +203,24 @@ _PyEval_FiniThreads(struct _ceval_runtime_state *ceval) destroy_gil(gil); assert(!gil_created(gil)); - struct _pending_calls *pending = &ceval->pending; - if (pending->lock != NULL) { - PyThread_free_lock(pending->lock); - pending->lock = NULL; - } + // The pending calls mutex is freed in PyInterpreterState_Delete(). } static inline void exit_thread_if_finalizing(PyThreadState *tstate) { - _PyRuntimeState *runtime = tstate->interp->runtime; - /* _Py_Finalizing is protected by the GIL */ + PyInterpreterState *interp = tstate->interp; + // Stop if thread/interpreter inalization already stated. + if (interp == NULL) { + return; + } + _PyRuntimeState *runtime = interp->runtime; + if (runtime == NULL) { + return; + } + // Don't exit if the main thread (i.e. of the main interpreter). if (runtime->finalizing != NULL && !_Py_CURRENTLY_FINALIZING(runtime, tstate)) { - drop_gil(&runtime->ceval, tstate); + drop_gil(&runtime->ceval, &interp->ceval, tstate); PyThread_exit_thread(); } } @@ -231,12 +229,12 @@ void PyEval_AcquireLock(void) { _PyRuntimeState *runtime = &_PyRuntime; - struct _ceval_runtime_state *ceval = &runtime->ceval; + struct _ceval_runtime_state *ceval_r = &runtime->ceval; PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); if (tstate == NULL) { Py_FatalError("PyEval_AcquireLock: current thread state is NULL"); } - take_gil(ceval, tstate); + take_gil(ceval_r, tstate); exit_thread_if_finalizing(tstate); } @@ -244,12 +242,21 @@ void PyEval_ReleaseLock(void) { _PyRuntimeState *runtime = &_PyRuntime; - PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); /* This function must succeed when the current thread state is NULL. We therefore avoid PyThreadState_Get() which dumps a fatal error in debug mode. */ - drop_gil(&runtime->ceval, tstate); + PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); + // Fall back to the main interpreter if there is not active Python + // thread. This only affects the eval_breaker. + PyInterpreterState *interp = runtime->interpreters.main; + if (tstate != NULL) { + interp = tstate->interp; + if (interp == NULL) { + Py_FatalError("PyEval_ReleaseLock: NULL interpreter state"); + } + } + drop_gil(&runtime->ceval, &interp->ceval, tstate); } void @@ -258,14 +265,19 @@ PyEval_AcquireThread(PyThreadState *tstate) if (tstate == NULL) { Py_FatalError("PyEval_AcquireThread: NULL new thread state"); } - assert(tstate->interp != NULL); - - _PyRuntimeState *runtime = tstate->interp->runtime; - struct _ceval_runtime_state *ceval = &runtime->ceval; + PyInterpreterState *interp = tstate->interp; + if (interp == NULL) { + Py_FatalError("PyEval_AcquireThread: NULL interpreter state"); + } + _PyRuntimeState *runtime = interp->runtime; + if (runtime == NULL) { + Py_FatalError("PyEval_AcquireThread: NULL runtime state"); + } + struct _ceval_runtime_state *ceval_r = &runtime->ceval; /* Check someone has called PyEval_InitThreads() to create the lock */ - assert(gil_created(&ceval->gil)); - take_gil(ceval, tstate); + assert(gil_created(&ceval_r->gil)); + take_gil(ceval_r, tstate); exit_thread_if_finalizing(tstate); if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) { Py_FatalError("PyEval_AcquireThread: non-NULL old thread state"); @@ -278,14 +290,20 @@ PyEval_ReleaseThread(PyThreadState *tstate) if (tstate == NULL) { Py_FatalError("PyEval_ReleaseThread: NULL thread state"); } - assert(tstate->interp != NULL); + PyInterpreterState *interp = tstate->interp; + if (interp == NULL) { + Py_FatalError("PyEval_ReleaseThread: NULL interpreter state"); + } + _PyRuntimeState *runtime = interp->runtime; + if (runtime == NULL) { + Py_FatalError("PyEval_ReleaseThread: NULL runtime state"); + } - _PyRuntimeState *runtime = tstate->interp->runtime; PyThreadState *new_tstate = _PyThreadState_Swap(&runtime->gilstate, NULL); if (new_tstate != tstate) { Py_FatalError("PyEval_ReleaseThread: wrong thread state"); } - drop_gil(&runtime->ceval, tstate); + drop_gil(&runtime->ceval, &interp->ceval, tstate); } /* This function is called from PyOS_AfterFork_Child to destroy all threads @@ -296,15 +314,17 @@ PyEval_ReleaseThread(PyThreadState *tstate) void _PyEval_ReInitThreads(_PyRuntimeState *runtime) { - struct _ceval_runtime_state *ceval = &runtime->ceval; - if (!gil_created(&ceval->gil)) { + struct _ceval_runtime_state *ceval_r = &runtime->ceval; + if (!gil_created(&ceval_r->gil)) { return; } - recreate_gil(&ceval->gil); + recreate_gil(&ceval_r->gil); PyThreadState *current_tstate = _PyRuntimeState_GetThreadState(runtime); - take_gil(ceval, current_tstate); + take_gil(ceval_r, current_tstate); - struct _pending_calls *pending = &ceval->pending; + // Only the main interpreter remains, so ignore the rest. + PyInterpreterState *interp = _PyRuntime.interpreters.main; + struct _ceval_pending_calls *pending = &interp->ceval.pending; pending->lock = PyThread_allocate_lock(); if (pending->lock == NULL) { Py_FatalError("Can't initialize threads for pending calls"); @@ -318,22 +338,28 @@ _PyEval_ReInitThreads(_PyRuntimeState *runtime) raised. */ void -_PyEval_SignalAsyncExc(struct _ceval_runtime_state *ceval) +_PyEval_SignalAsyncExc(struct _ceval_runtime_state *ceval_r, + struct _ceval_interpreter_state *ceval_i) { - SIGNAL_ASYNC_EXC(ceval); + SIGNAL_ASYNC_EXC(ceval_r, ceval_i); } PyThreadState * PyEval_SaveThread(void) { _PyRuntimeState *runtime = &_PyRuntime; - struct _ceval_runtime_state *ceval = &runtime->ceval; + struct _ceval_runtime_state *ceval_r = &runtime->ceval; PyThreadState *tstate = _PyThreadState_Swap(&runtime->gilstate, NULL); if (tstate == NULL) { Py_FatalError("PyEval_SaveThread: NULL tstate"); } - assert(gil_created(&ceval->gil)); - drop_gil(ceval, tstate); + PyInterpreterState *interp = tstate->interp; + if (interp == NULL) { + Py_FatalError("PyEval_SaveThread: NULL interpreter state"); + } + + assert(gil_created(&ceval_r->gil)); + drop_gil(ceval_r, &interp->ceval, tstate); return tstate; } @@ -343,14 +369,20 @@ PyEval_RestoreThread(PyThreadState *tstate) if (tstate == NULL) { Py_FatalError("PyEval_RestoreThread: NULL tstate"); } - assert(tstate->interp != NULL); + PyInterpreterState *interp = tstate->interp; + if (interp == NULL) { + Py_FatalError("PyEval_RestoreThread: NULL interpreter state"); + } + _PyRuntimeState *runtime = interp->runtime; + if (runtime == NULL) { + Py_FatalError("PyEval_RestoreThread: NULL runtime state"); + } + struct _ceval_runtime_state *ceval_r = &runtime->ceval; - _PyRuntimeState *runtime = tstate->interp->runtime; - struct _ceval_runtime_state *ceval = &runtime->ceval; - assert(gil_created(&ceval->gil)); + assert(gil_created(&ceval_r->gil)); int err = errno; - take_gil(ceval, tstate); + take_gil(ceval_r, tstate); exit_thread_if_finalizing(tstate); errno = err; @@ -381,17 +413,17 @@ PyEval_RestoreThread(PyThreadState *tstate) */ void -_PyEval_SignalReceived(struct _ceval_runtime_state *ceval) +_PyEval_SignalReceived(struct _ceval_runtime_state *ceval_r) { /* bpo-30703: Function called when the C signal handler of Python gets a signal. We cannot queue a callback using Py_AddPendingCall() since that function is not async-signal-safe. */ - SIGNAL_PENDING_SIGNALS(ceval); + SIGNAL_PENDING_SIGNALS(ceval_r); } /* Push one item onto the queue while holding the lock. */ static int -_push_pending_call(struct _pending_calls *pending, +_push_pending_call(struct _ceval_pending_calls *pending, unsigned long thread_id, int (*func)(void *), void *arg) { int i = pending->last; @@ -399,6 +431,7 @@ _push_pending_call(struct _pending_calls *pending, if (j == pending->first) { return -1; /* Queue full */ } + pending->calls[i].thread_id = thread_id; pending->calls[i].func = func; pending->calls[i].arg = arg; pending->last = j; @@ -407,7 +440,7 @@ _push_pending_call(struct _pending_calls *pending, /* Pop one item off the queue while holding the lock. */ static void -_pop_pending_call(struct _pending_calls *pending, +_pop_pending_call(struct _ceval_pending_calls *pending, unsigned long *thread_id, int (**func)(void *), void **arg) { int i = pending->first; @@ -417,6 +450,7 @@ _pop_pending_call(struct _pending_calls *pending, *func = pending->calls[i].func; *arg = pending->calls[i].arg; + *thread_id = pending->calls[i].thread_id; pending->first = (i + 1) % NPENDINGCALLS; } @@ -427,10 +461,12 @@ _pop_pending_call(struct _pending_calls *pending, int _PyEval_AddPendingCall(PyThreadState *tstate, - struct _ceval_runtime_state *ceval, + struct _ceval_runtime_state *ceval_r, + struct _ceval_interpreter_state *ceval_i, + unsigned long thread_id, int (*func)(void *), void *arg) { - struct _pending_calls *pending = &ceval->pending; + struct _ceval_pending_calls *pending = &ceval_i->pending; PyThread_acquire_lock(pending->lock, WAIT_LOCK); if (pending->finishing) { @@ -445,20 +481,27 @@ _PyEval_AddPendingCall(PyThreadState *tstate, _PyErr_Restore(tstate, exc, val, tb); return -1; } - int result = _push_pending_call(pending, func, arg); + int result = _push_pending_call(pending, thread_id, func, arg); + + /* signal loop */ + SIGNAL_PENDING_CALLS(ceval_r, ceval_i); PyThread_release_lock(pending->lock); - /* signal main loop */ - SIGNAL_PENDING_CALLS(ceval); return result; } +/* Py_AddPendingCall() is a simple wrapper for the sake + of backward-compatibility. */ int Py_AddPendingCall(int (*func)(void *), void *arg) { _PyRuntimeState *runtime = &_PyRuntime; + PyInterpreterState *interp = runtime->interpreters.main; PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); - return _PyEval_AddPendingCall(tstate, &runtime->ceval, func, arg); + return _PyEval_AddPendingCall(tstate, + &runtime->ceval, &interp->ceval, + runtime->main_thread, + func, arg); } static int @@ -479,47 +522,69 @@ handle_signals(_PyRuntimeState *runtime) return 0; } - struct _ceval_runtime_state *ceval = &runtime->ceval; - UNSIGNAL_PENDING_SIGNALS(ceval); + struct _ceval_runtime_state *ceval_r = &runtime->ceval; + struct _ceval_interpreter_state *ceval_i = &interp->ceval; + UNSIGNAL_PENDING_SIGNALS(ceval_r, ceval_i); if (_PyErr_CheckSignals() < 0) { - SIGNAL_PENDING_SIGNALS(ceval); /* We're not done yet */ + SIGNAL_PENDING_SIGNALS(ceval_r); /* We're not done yet */ return -1; } return 0; } static int -make_pending_calls(_PyRuntimeState *runtime) +make_pending_calls(PyInterpreterState *interp) { - static int busy = 0; - - /* only service pending calls on main thread */ - if (PyThread_get_thread_ident() != runtime->main_thread) { - return 0; + if (interp == NULL) { + Py_FatalError("make_pending_calls: NULL interpreter state"); + } + _PyRuntimeState *runtime = interp->runtime; + if (runtime == NULL) { + Py_FatalError("make_pending_calls: NULL runtime state"); + } + PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); + if (tstate == NULL) { + Py_FatalError("make_pending_calls: NULL thread state"); } + if (tstate->interp == NULL || tstate->interp != interp) { + Py_FatalError("make_pending_calls: thread state mismatch"); + } + static int busy = 0; /* don't perform recursive pending calls */ if (busy) { return 0; } busy = 1; - struct _ceval_runtime_state *ceval = &runtime->ceval; + struct _ceval_runtime_state *ceval_r = &runtime->ceval; + struct _ceval_interpreter_state *ceval_i = &interp->ceval; /* unsignal before starting to call callbacks, so that any callback added in-between re-signals */ - UNSIGNAL_PENDING_CALLS(ceval); + UNSIGNAL_PENDING_CALLS(ceval_r, ceval_i); int res = 0; /* perform a bounded number of calls, in case of recursion */ - struct _pending_calls *pending = &ceval->pending; + struct _ceval_pending_calls *pending = &ceval_i->pending; + unsigned long thread_id = 0; for (int i=0; ilock, WAIT_LOCK); - _pop_pending_call(pending, &func, &arg); + _pop_pending_call(pending, &thread_id, &func, &arg); PyThread_release_lock(pending->lock); + if (thread_id && PyThread_get_thread_ident() != thread_id) { + // Thread mismatch, so move it to the end of the list + // and start over. + _PyEval_AddPendingCall(tstate, + &runtime->ceval, &interp->ceval, + thread_id, + func, arg); + goto error; + } + /* having released the lock, perform the callback */ if (func == NULL) { break; @@ -535,17 +600,16 @@ make_pending_calls(_PyRuntimeState *runtime) error: busy = 0; - SIGNAL_PENDING_CALLS(ceval); + SIGNAL_PENDING_CALLS(ceval_r, ceval_i); return res; } void -_Py_FinishPendingCalls(_PyRuntimeState *runtime) +_PyEval_FinishPendingCalls(PyInterpreterState *interp) { assert(PyGILState_Check()); - PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); - struct _pending_calls *pending = &runtime->ceval.pending; + struct _ceval_pending_calls *pending = &interp->ceval.pending; PyThread_acquire_lock(pending->lock, WAIT_LOCK); pending->finishing = 1; @@ -555,12 +619,19 @@ _Py_FinishPendingCalls(_PyRuntimeState *runtime) return; } - if (make_pending_calls(runtime) < 0) { - PyObject *exc, *val, *tb; - _PyErr_Fetch(tstate, &exc, &val, &tb); - PyErr_BadInternalCall(); - _PyErr_ChainExceptions(exc, val, tb); - _PyErr_Print(tstate); + if (make_pending_calls(interp) < 0) { + _PyRuntimeState *runtime = interp->runtime; + if (runtime == NULL) { + runtime = &_PyRuntime; + } + PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); + if (tstate != NULL) { + PyObject *exc, *val, *tb; + _PyErr_Fetch(tstate, &exc, &val, &tb); + PyErr_BadInternalCall(); + _PyErr_ChainExceptions(exc, val, tb); + _PyErr_Print(tstate); + } } } @@ -579,7 +650,8 @@ Py_MakePendingCalls(void) return res; } - res = make_pending_calls(runtime); + PyInterpreterState *interp = _PyRuntime.interpreters.main; + res = make_pending_calls(interp); if (res != 0) { return res; } @@ -596,11 +668,11 @@ Py_MakePendingCalls(void) int _Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT; void -_PyEval_Initialize(struct _ceval_runtime_state *state) +_PyEval_Initialize(struct _ceval_runtime_state *ceval_r) { - state->recursion_limit = Py_DEFAULT_RECURSION_LIMIT; + ceval_r->recursion_limit = Py_DEFAULT_RECURSION_LIMIT; _Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT; - _gil_initialize(&state->gil); + _gil_initialize(&ceval_r->gil); } int @@ -612,9 +684,9 @@ Py_GetRecursionLimit(void) void Py_SetRecursionLimit(int new_limit) { - struct _ceval_runtime_state *ceval = &_PyRuntime.ceval; - ceval->recursion_limit = new_limit; - _Py_CheckRecursionLimit = ceval->recursion_limit; + struct _ceval_runtime_state *ceval_r = &_PyRuntime.ceval; + ceval_r->recursion_limit = new_limit; + _Py_CheckRecursionLimit = ceval_r->recursion_limit; } /* the macro Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall() @@ -663,7 +735,7 @@ _Py_CheckRecursiveCall(const char *where) static int do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause); static int unpack_iterable(PyThreadState *, PyObject *, int, int, PyObject **); -#define _Py_TracingPossible(ceval) ((ceval)->tracing_possible) +#define _Py_TracingPossible(ceval_r) ((ceval_r)->tracing_possible) PyObject * @@ -709,8 +781,10 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) PyObject *retval = NULL; /* Return value */ _PyRuntimeState * const runtime = &_PyRuntime; PyThreadState * const tstate = _PyRuntimeState_GetThreadState(runtime); - struct _ceval_runtime_state * const ceval = &runtime->ceval; - _Py_atomic_int * const eval_breaker = &ceval->eval_breaker; + PyInterpreterState * const interp = tstate->interp; + struct _ceval_runtime_state * const ceval_r = &runtime->ceval; + struct _ceval_interpreter_state * const ceval_i = &interp->ceval; + _Py_atomic_int * const eval_breaker = &ceval_r->eval_breaker; PyCodeObject *co; /* when tracing we set things up so that @@ -797,7 +871,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) #ifdef LLTRACE #define FAST_DISPATCH() \ { \ - if (!lltrace && !_Py_TracingPossible(ceval) && !PyDTrace_LINE_ENABLED()) { \ + if (!lltrace && !_Py_TracingPossible(ceval_r) && !PyDTrace_LINE_ENABLED()) { \ f->f_lasti = INSTR_OFFSET(); \ NEXTOPARG(); \ goto *opcode_targets[opcode]; \ @@ -807,7 +881,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) #else #define FAST_DISPATCH() \ { \ - if (!_Py_TracingPossible(ceval) && !PyDTrace_LINE_ENABLED()) { \ + if (!_Py_TracingPossible(ceval_r) && !PyDTrace_LINE_ENABLED()) { \ f->f_lasti = INSTR_OFFSET(); \ NEXTOPARG(); \ goto *opcode_targets[opcode]; \ @@ -1122,27 +1196,27 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) goto fast_next_opcode; } - if (_Py_atomic_load_relaxed(&ceval->signals_pending)) { + if (_Py_atomic_load_relaxed(&ceval_r->signals_pending)) { if (handle_signals(runtime) != 0) { goto error; } } - if (_Py_atomic_load_relaxed(&ceval->pending.calls_to_do)) { - if (make_pending_calls(runtime) != 0) { + if (_Py_atomic_load_relaxed(&ceval_i->pending.calls_to_do)) { + if (make_pending_calls(interp) != 0) { goto error; } } - if (_Py_atomic_load_relaxed(&ceval->gil_drop_request)) { + if (_Py_atomic_load_relaxed(&ceval_r->gil_drop_request)) { /* Give another thread a chance */ if (_PyThreadState_Swap(&runtime->gilstate, NULL) != tstate) { Py_FatalError("ceval: tstate mix-up"); } - drop_gil(ceval, tstate); + drop_gil(ceval_r, ceval_i, tstate); /* Other threads may run now */ - take_gil(ceval, tstate); + take_gil(ceval_r, tstate); /* Check if we should make a quick exit. */ exit_thread_if_finalizing(tstate); @@ -1155,7 +1229,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) if (tstate->async_exc != NULL) { PyObject *exc = tstate->async_exc; tstate->async_exc = NULL; - UNSIGNAL_ASYNC_EXC(ceval); + UNSIGNAL_ASYNC_EXC(ceval_r, ceval_i); _PyErr_SetNone(tstate, exc); Py_DECREF(exc); goto error; @@ -1170,7 +1244,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) /* line-by-line tracing support */ - if (_Py_TracingPossible(ceval) && + if (_Py_TracingPossible(ceval_r) && tstate->c_tracefunc != NULL && !tstate->tracing) { int err; /* see maybe_call_line_trace diff --git a/Python/ceval_gil.h b/Python/ceval_gil.h index 34d48c990c44..b44d0abad36b 100644 --- a/Python/ceval_gil.h +++ b/Python/ceval_gil.h @@ -141,9 +141,11 @@ static void recreate_gil(struct _gil_runtime_state *gil) } static void -drop_gil(struct _ceval_runtime_state *ceval, PyThreadState *tstate) +drop_gil(struct _ceval_runtime_state *ceval_r, + struct _ceval_interpreter_state *ceval_i, + PyThreadState *tstate) { - struct _gil_runtime_state *gil = &ceval->gil; + struct _gil_runtime_state *gil = &ceval_r->gil; if (!_Py_atomic_load_relaxed(&gil->locked)) { Py_FatalError("drop_gil: GIL is not locked"); } @@ -163,12 +165,12 @@ drop_gil(struct _ceval_runtime_state *ceval, PyThreadState *tstate) MUTEX_UNLOCK(gil->mutex); #ifdef FORCE_SWITCHING - if (_Py_atomic_load_relaxed(&ceval->gil_drop_request) && tstate != NULL) { + if (_Py_atomic_load_relaxed(&ceval_r->gil_drop_request) && tstate != NULL) { MUTEX_LOCK(gil->switch_mutex); /* Not switched yet => wait */ if (((PyThreadState*)_Py_atomic_load_relaxed(&gil->last_holder)) == tstate) { - RESET_GIL_DROP_REQUEST(ceval); + RESET_GIL_DROP_REQUEST(ceval_r, ceval_i); /* NOTE: if COND_WAIT does not atomically start waiting when releasing the mutex, another thread can run through, take the GIL and drop it again, and reset the condition @@ -181,13 +183,19 @@ drop_gil(struct _ceval_runtime_state *ceval, PyThreadState *tstate) } static void -take_gil(struct _ceval_runtime_state *ceval, PyThreadState *tstate) +take_gil(struct _ceval_runtime_state *ceval_r, + PyThreadState *tstate) { if (tstate == NULL) { Py_FatalError("take_gil: NULL tstate"); } + PyInterpreterState *interp = tstate->interp; + if (interp == NULL) { + Py_FatalError("take_gil: NULL interp"); + } + struct _ceval_interpreter_state *ceval_i = &interp->ceval; - struct _gil_runtime_state *gil = &ceval->gil; + struct _gil_runtime_state *gil = &ceval_r->gil; int err = errno; MUTEX_LOCK(gil->mutex); @@ -210,7 +218,7 @@ take_gil(struct _ceval_runtime_state *ceval, PyThreadState *tstate) _Py_atomic_load_relaxed(&gil->locked) && gil->switch_number == saved_switchnum) { - SET_GIL_DROP_REQUEST(ceval); + SET_GIL_DROP_REQUEST(ceval_r); } } _ready: @@ -232,11 +240,11 @@ take_gil(struct _ceval_runtime_state *ceval, PyThreadState *tstate) COND_SIGNAL(gil->switch_cond); MUTEX_UNLOCK(gil->switch_mutex); #endif - if (_Py_atomic_load_relaxed(&ceval->gil_drop_request)) { - RESET_GIL_DROP_REQUEST(ceval); + if (_Py_atomic_load_relaxed(&ceval_r->gil_drop_request)) { + RESET_GIL_DROP_REQUEST(ceval_r, ceval_i); } if (tstate->async_exc != NULL) { - _PyEval_SignalAsyncExc(ceval); + _PyEval_SignalAsyncExc(ceval_r, ceval_i); } MUTEX_UNLOCK(gil->mutex); diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 6590ef8e9a27..3de5528811ae 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1147,15 +1147,31 @@ Py_FinalizeEx(void) return status; } + /* Get current thread state and interpreter pointer */ + PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); + PyInterpreterState *interp = tstate->interp; + // Wrap up existing "threading"-module-created, non-daemon threads. wait_for_thread_shutdown(); // Make any remaining pending calls. - _Py_FinishPendingCalls(runtime); - - /* Get current thread state and interpreter pointer */ - PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); - PyInterpreterState *interp = tstate->interp; + /* XXX For the moment we are going to ignore lingering pending calls. + * We've seen sporadic on some of the buildbots during finalization + * with the changes for per-interpreter pending calls (see bpo-33608), + * meaning the previous _PyEval_FinishPendincCalls() call here is + * a trigger, if not responsible. + * + * Ignoring pending calls at this point in the runtime lifecycle + * is okay (for now) for the following reasons: + * + * * pending calls are still not a widely-used feature + * * this only affects runtime finalization, where the process is + * likely to end soon anyway (except for some embdding cases) + * + * See bpo-37127 about resolving the problem. Ultimately the call + * here should be re-enabled. + */ + //_PyEval_FinishPendingCalls(interp); /* The interpreter is still entirely intact at this point, and the * exit funcs may be relying on that. In particular, if some thread @@ -1580,6 +1596,9 @@ Py_EndInterpreter(PyThreadState *tstate) // Wrap up existing "threading"-module-created, non-daemon threads. wait_for_thread_shutdown(); + // Make any remaining pending calls. + _PyEval_FinishPendingCalls(interp); + call_py_exitfuncs(interp); if (tstate != interp->tstate_head || tstate->next != NULL) diff --git a/Python/pystate.c b/Python/pystate.c index 2b7db0e48deb..a9f3389a0d83 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -218,6 +218,13 @@ PyInterpreterState_New(void) return NULL; } + interp->ceval.pending.lock = PyThread_allocate_lock(); + if (interp->ceval.pending.lock == NULL) { + PyErr_SetString(PyExc_RuntimeError, + "failed to create interpreter ceval pending mutex"); + return NULL; + } + interp->eval_frame = _PyEval_EvalFrameDefault; #ifdef HAVE_DLOPEN #if HAVE_DECL_RTLD_NOW @@ -345,6 +352,10 @@ PyInterpreterState_Delete(PyInterpreterState *interp) if (interp->id_mutex != NULL) { PyThread_free_lock(interp->id_mutex); } + if (interp->ceval.pending.lock != NULL) { + PyThread_free_lock(interp->ceval.pending.lock); + interp->ceval.pending.lock = NULL; + } PyMem_RawFree(interp); } @@ -1014,7 +1025,7 @@ PyThreadState_SetAsyncExc(unsigned long id, PyObject *exc) p->async_exc = exc; HEAD_UNLOCK(runtime); Py_XDECREF(old_exc); - _PyEval_SignalAsyncExc(&runtime->ceval); + _PyEval_SignalAsyncExc(&runtime->ceval, &interp->ceval); return 1; } } @@ -1444,7 +1455,7 @@ _PyObject_GetCrossInterpreterData(PyObject *obj, _PyCrossInterpreterData *data) return 0; } -static void +static int _release_xidata(void *arg) { _PyCrossInterpreterData *data = (_PyCrossInterpreterData *)arg; @@ -1452,42 +1463,21 @@ _release_xidata(void *arg) data->free(data->data); } Py_XDECREF(data->obj); -} - -static void -_call_in_interpreter(struct _gilstate_runtime_state *gilstate, - PyInterpreterState *interp, - void (*func)(void *), void *arg) -{ - /* We would use Py_AddPendingCall() if it weren't specific to the - * main interpreter (see bpo-33608). In the meantime we take a - * naive approach. - */ - PyThreadState *save_tstate = NULL; - if (interp != _PyRuntimeGILState_GetThreadState(gilstate)->interp) { - // XXX Using the "head" thread isn't strictly correct. - PyThreadState *tstate = PyInterpreterState_ThreadHead(interp); - // XXX Possible GILState issues? - save_tstate = _PyThreadState_Swap(gilstate, tstate); - } - - func(arg); - - // Switch back. - if (save_tstate != NULL) { - _PyThreadState_Swap(gilstate, save_tstate); - } + PyMem_Free(data); + return 0; } void _PyCrossInterpreterData_Release(_PyCrossInterpreterData *data) { + _PyRuntimeState *runtime = &_PyRuntime; + if (data->data == NULL && data->obj == NULL) { // Nothing to release! return; } - // Switch to the original interpreter. + // Get the original interpreter. PyInterpreterState *interp = _PyInterpreterState_LookUpID(data->interp); if (interp == NULL) { // The intepreter was already destroyed. @@ -1496,10 +1486,28 @@ _PyCrossInterpreterData_Release(_PyCrossInterpreterData *data) } return; } + // XXX There's an ever-so-slight race here... + if (interp->finalizing) { + // XXX Someone leaked some memory... + return; + } // "Release" the data and/or the object. - struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate; - _call_in_interpreter(gilstate, interp, _release_xidata, data); + _PyCrossInterpreterData *copied = PyMem_Malloc(sizeof(_PyCrossInterpreterData)); + if (copied == NULL) { + PyErr_SetString(PyExc_MemoryError, + "Not enough memory to preserve cross-interpreter data"); + PyErr_Print(); + return; + } + memcpy(copied, data, sizeof(_PyCrossInterpreterData)); + PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); + int res = _PyEval_AddPendingCall(tstate, + &runtime->ceval, &interp->ceval, + 0, _release_xidata, copied); + if (res != 0) { + // XXX Queue full or couldn't get lock. Try again somehow? + } } PyObject * From webhook-mailer at python.org Sat Jun 1 17:58:37 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 01 Jun 2019 21:58:37 -0000 Subject: [Python-checkins] Fix the error handling in bytesio_sizeof(). (GH-10459) Message-ID: https://github.com/python/cpython/commit/fefdc009906c5ea8fb57383817b3c42d3b0634ad commit: fefdc009906c5ea8fb57383817b3c42d3b0634ad branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-01T14:58:33-07:00 summary: Fix the error handling in bytesio_sizeof(). (GH-10459) bytesio_sizeof() must check if an error has occurred in _PySys_GetSizeOf(). (cherry picked from commit 36dcaab7fde5d2e54cdeff5b705b5adcb27726dd) Co-authored-by: Zackery Spytz files: M Modules/_io/bytesio.c diff --git a/Modules/_io/bytesio.c b/Modules/_io/bytesio.c index e4d637cc3aea..8501f42ed800 100644 --- a/Modules/_io/bytesio.c +++ b/Modules/_io/bytesio.c @@ -942,8 +942,13 @@ bytesio_sizeof(bytesio *self, void *unused) Py_ssize_t res; res = _PyObject_SIZE(Py_TYPE(self)); - if (self->buf && !SHARED_BUF(self)) - res += _PySys_GetSizeOf(self->buf); + if (self->buf && !SHARED_BUF(self)) { + Py_ssize_t s = _PySys_GetSizeOf(self->buf); + if (s == -1) { + return NULL; + } + res += s; + } return PyLong_FromSsize_t(res); } From webhook-mailer at python.org Sat Jun 1 18:01:50 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Sat, 01 Jun 2019 22:01:50 -0000 Subject: [Python-checkins] Put math.comb() docs is correct place alphabetically (GH-13734) Message-ID: https://github.com/python/cpython/commit/b7fade4f87e0d37d1686a4e8596141e55ecef099 commit: b7fade4f87e0d37d1686a4e8596141e55ecef099 branch: master author: Raymond Hettinger committer: GitHub date: 2019-06-01T15:01:46-07:00 summary: Put math.comb() docs is correct place alphabetically (GH-13734) files: M Doc/library/math.rst diff --git a/Doc/library/math.rst b/Doc/library/math.rst index 206b06edd2a2..8c6837050319 100644 --- a/Doc/library/math.rst +++ b/Doc/library/math.rst @@ -36,6 +36,21 @@ Number-theoretic and representation functions :class:`~numbers.Integral` value. +.. function:: comb(n, k) + + Return the number of ways to choose *k* items from *n* items without repetition + and without order. + + Also called the binomial coefficient. It is mathematically equal to the expression + ``n! / (k! (n - k)!)``. It is equivalent to the coefficient of the *k*-th term in the + polynomial expansion of the expression ``(1 + x) ** n``. + + Raises :exc:`TypeError` if the arguments not integers. + Raises :exc:`ValueError` if the arguments are negative or if *k* > *n*. + + .. versionadded:: 3.8 + + .. function:: copysign(x, y) Return a float with the magnitude (absolute value) of *x* but the sign of @@ -232,21 +247,6 @@ Number-theoretic and representation functions :meth:`x.__trunc__() `. -.. function:: comb(n, k) - - Return the number of ways to choose *k* items from *n* items without repetition - and without order. - - Also called the binomial coefficient. It is mathematically equal to the expression - ``n! / (k! (n - k)!)``. It is equivalent to the coefficient of the *k*-th term in the - polynomial expansion of the expression ``(1 + x) ** n``. - - Raises :exc:`TypeError` if the arguments not integers. - Raises :exc:`ValueError` if the arguments are negative or if *k* > *n*. - - .. versionadded:: 3.8 - - Note that :func:`frexp` and :func:`modf` have a different call/return pattern than their C equivalents: they take a single argument and return a pair of values, rather than returning their second return value through an 'output From webhook-mailer at python.org Sat Jun 1 18:26:04 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 01 Jun 2019 22:26:04 -0000 Subject: [Python-checkins] bpo-32411: IDLE: Remove line number sort in browser.py (GH-5011) Message-ID: https://github.com/python/cpython/commit/ac60d1afd2b04f61fe4c965740fa32809f2b84ed commit: ac60d1afd2b04f61fe4c965740fa32809f2b84ed branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-01T15:26:00-07:00 summary: bpo-32411: IDLE: Remove line number sort in browser.py (GH-5011) Insertion in line order makes sorting keys by line order unneeded. (cherry picked from commit 1a4d9ffa1aecd7e750195f2be06d3d16c7a3a88f) Co-authored-by: Cheryl Sabella files: A Misc/NEWS.d/next/IDLE/2017-12-25-18-48-50.bpo-32411.vNwDhe.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/browser.py M Lib/idlelib/idle_test/test_browser.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 7b5a13a21524..808c236bb590 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,8 @@ Released on 2019-06-24? ====================================== +bpo-32411: Stop sorting dict created with desired line order. + bpo-37038: Make idlelib.run runnable; add test clause. bpo-36958: Print any argument other than None or int passed to diff --git a/Lib/idlelib/browser.py b/Lib/idlelib/browser.py index 234883fe8605..e5b0bc53c662 100644 --- a/Lib/idlelib/browser.py +++ b/Lib/idlelib/browser.py @@ -29,9 +29,10 @@ def transform_children(child_dict, modname=None): The dictionary maps names to pyclbr information objects. Filter out imported objects. Augment class names with bases. - Sort objects by line number. + The insertion order of the dictonary is assumed to have been in line + number order, so sorting is not necessary. - The current tree only calls this once per child_dic as it saves + The current tree only calls this once per child_dict as it saves TreeItems once created. A future tree and tests might violate this, so a check prevents multiple in-place augmentations. """ @@ -51,7 +52,7 @@ def transform_children(child_dict, modname=None): supers.append(sname) obj.name += '({})'.format(', '.join(supers)) obs.append(obj) - return sorted(obs, key=lambda o: o.lineno) + return obs class ModuleBrowser: diff --git a/Lib/idlelib/idle_test/test_browser.py b/Lib/idlelib/idle_test/test_browser.py index dfbab6dd6b5e..25d6dc663036 100644 --- a/Lib/idlelib/idle_test/test_browser.py +++ b/Lib/idlelib/idle_test/test_browser.py @@ -61,16 +61,16 @@ 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' -f0 = mb.Function(module, 'f0', fname, 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(module, 'C0', ['base'], fname, 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) -mock_pyclbr_tree = {'f0': f0, 'C0': C0} +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) +mock_pyclbr_tree = {'C0': C0, 'f0': f0} # Adjust C0.name, C1.name so tests do not depend on order. browser.transform_children(mock_pyclbr_tree, 'test') # C0(base) @@ -87,12 +87,12 @@ def test_transform_module_children(self): transform = browser.transform_children # Parameter matches tree module. tcl = list(transform(mock_pyclbr_tree, 'test')) - eq(tcl, [f0, C0]) - eq(tcl[0].name, 'f0') - eq(tcl[1].name, 'C0(base)') + eq(tcl, [C0, f0]) + eq(tcl[0].name, 'C0(base)') + eq(tcl[1].name, 'f0') # Check that second call does not change suffix. tcl = list(transform(mock_pyclbr_tree, 'test')) - eq(tcl[1].name, 'C0(base)') + eq(tcl[0].name, 'C0(base)') # Nothing to traverse if parameter name isn't same as tree module. tcl = list(transform(mock_pyclbr_tree, 'different name')) eq(tcl, []) diff --git a/Misc/NEWS.d/next/IDLE/2017-12-25-18-48-50.bpo-32411.vNwDhe.rst b/Misc/NEWS.d/next/IDLE/2017-12-25-18-48-50.bpo-32411.vNwDhe.rst new file mode 100644 index 000000000000..a5522012923a --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2017-12-25-18-48-50.bpo-32411.vNwDhe.rst @@ -0,0 +1,2 @@ +In browser.py, remove extraneous sorting by line number since dictionary was +created in line number order. From webhook-mailer at python.org Sat Jun 1 20:13:38 2019 From: webhook-mailer at python.org (Ivan Levkivskyi) Date: Sun, 02 Jun 2019 00:13:38 -0000 Subject: [Python-checkins] Improve version added references in `typing` module docs (GH-13457) Message-ID: https://github.com/python/cpython/commit/b7daabd711274a009e70556020efeae502a85f0b commit: b7daabd711274a009e70556020efeae502a85f0b branch: master author: Anthony Sottile committer: Ivan Levkivskyi date: 2019-06-02T01:13:25+01:00 summary: Improve version added references in `typing` module docs (GH-13457) files: A Misc/NEWS.d/next/Documentation/2019-05-20-22-21-17.bpo-36984.IjZlmS.rst M Doc/library/typing.rst diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 2575a995817d..1a766c29a57a 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -637,7 +637,7 @@ The module defines the following classes, functions and decorators: A generic version of :class:`collections.abc.Collection` - .. versionadded:: 3.6 + .. versionadded:: 3.6.0 .. class:: AbstractSet(Sized, Collection[T_co]) @@ -681,6 +681,7 @@ The module defines the following classes, functions and decorators: A generic version of :class:`collections.deque`. + .. versionadded:: 3.5.4 .. versionadded:: 3.6.1 .. class:: List(list, MutableSequence[T]) @@ -730,6 +731,8 @@ The module defines the following classes, functions and decorators: A generic version of :class:`collections.abc.Awaitable`. + .. versionadded:: 3.5.2 + .. class:: Coroutine(Awaitable[V_co], Generic[T_co T_contra, V_co]) A generic version of :class:`collections.abc.Coroutine`. @@ -743,25 +746,33 @@ The module defines the following classes, functions and decorators: async def bar() -> None: x = await c # type: int + .. versionadded:: 3.5.3 + .. class:: AsyncIterable(Generic[T_co]) A generic version of :class:`collections.abc.AsyncIterable`. + .. versionadded:: 3.5.2 + .. class:: AsyncIterator(AsyncIterable[T_co]) A generic version of :class:`collections.abc.AsyncIterator`. + .. versionadded:: 3.5.2 + .. class:: ContextManager(Generic[T_co]) A generic version of :class:`contextlib.AbstractContextManager`. - .. versionadded:: 3.6 + .. versionadded:: 3.5.4 + .. versionadded:: 3.6.0 .. class:: AsyncContextManager(Generic[T_co]) A generic version of :class:`contextlib.AbstractAsyncContextManager`. - .. versionadded:: 3.6 + .. versionadded:: 3.5.4 + .. versionadded:: 3.6.2 .. class:: Dict(dict, MutableMapping[KT, VT]) @@ -790,12 +801,14 @@ The module defines the following classes, functions and decorators: A generic version of :class:`collections.Counter`. + .. versionadded:: 3.5.4 .. versionadded:: 3.6.1 .. class:: ChainMap(collections.ChainMap, MutableMapping[KT, VT]) A generic version of :class:`collections.ChainMap`. + .. versionadded:: 3.5.4 .. versionadded:: 3.6.1 .. class:: Generator(Iterator[T_co], Generic[T_co, T_contra, V_co]) @@ -860,7 +873,7 @@ The module defines the following classes, functions and decorators: yield start start = await increment(start) - .. versionadded:: 3.5.4 + .. versionadded:: 3.6.1 .. class:: Text @@ -1166,6 +1179,7 @@ The module defines the following classes, functions and decorators: raise RuntimeError('no way') .. versionadded:: 3.5.4 + .. versionadded:: 3.6.2 .. data:: Union diff --git a/Misc/NEWS.d/next/Documentation/2019-05-20-22-21-17.bpo-36984.IjZlmS.rst b/Misc/NEWS.d/next/Documentation/2019-05-20-22-21-17.bpo-36984.IjZlmS.rst new file mode 100644 index 000000000000..b26eeadb924a --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2019-05-20-22-21-17.bpo-36984.IjZlmS.rst @@ -0,0 +1 @@ +Improve version added references in ``typing`` module - by Anthony Sottile. From webhook-mailer at python.org Sat Jun 1 20:23:44 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 02 Jun 2019 00:23:44 -0000 Subject: [Python-checkins] Improve version added references in `typing` module docs (GH-13457) Message-ID: https://github.com/python/cpython/commit/c76add7afd68387aa2481d672e1c0d7e7b4c9afc commit: c76add7afd68387aa2481d672e1c0d7e7b4c9afc branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-01T17:23:40-07:00 summary: Improve version added references in `typing` module docs (GH-13457) (cherry picked from commit b7daabd711274a009e70556020efeae502a85f0b) Co-authored-by: Anthony Sottile files: A Misc/NEWS.d/next/Documentation/2019-05-20-22-21-17.bpo-36984.IjZlmS.rst M Doc/library/typing.rst diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 21258a58d0aa..12f4c03f4232 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -555,7 +555,7 @@ The module defines the following classes, functions and decorators: A generic version of :class:`collections.abc.Collection` - .. versionadded:: 3.6 + .. versionadded:: 3.6.0 .. class:: AbstractSet(Sized, Collection[T_co]) @@ -599,6 +599,7 @@ The module defines the following classes, functions and decorators: A generic version of :class:`collections.deque`. + .. versionadded:: 3.5.4 .. versionadded:: 3.6.1 .. class:: List(list, MutableSequence[T]) @@ -648,6 +649,8 @@ The module defines the following classes, functions and decorators: A generic version of :class:`collections.abc.Awaitable`. + .. versionadded:: 3.5.2 + .. class:: Coroutine(Awaitable[V_co], Generic[T_co T_contra, V_co]) A generic version of :class:`collections.abc.Coroutine`. @@ -661,25 +664,33 @@ The module defines the following classes, functions and decorators: async def bar() -> None: x = await c # type: int + .. versionadded:: 3.5.3 + .. class:: AsyncIterable(Generic[T_co]) A generic version of :class:`collections.abc.AsyncIterable`. + .. versionadded:: 3.5.2 + .. class:: AsyncIterator(AsyncIterable[T_co]) A generic version of :class:`collections.abc.AsyncIterator`. + .. versionadded:: 3.5.2 + .. class:: ContextManager(Generic[T_co]) A generic version of :class:`contextlib.AbstractContextManager`. - .. versionadded:: 3.6 + .. versionadded:: 3.5.4 + .. versionadded:: 3.6.0 .. class:: AsyncContextManager(Generic[T_co]) A generic version of :class:`contextlib.AbstractAsyncContextManager`. - .. versionadded:: 3.6 + .. versionadded:: 3.5.4 + .. versionadded:: 3.6.2 .. class:: Dict(dict, MutableMapping[KT, VT]) @@ -708,12 +719,14 @@ The module defines the following classes, functions and decorators: A generic version of :class:`collections.Counter`. + .. versionadded:: 3.5.4 .. versionadded:: 3.6.1 .. class:: ChainMap(collections.ChainMap, MutableMapping[KT, VT]) A generic version of :class:`collections.ChainMap`. + .. versionadded:: 3.5.4 .. versionadded:: 3.6.1 .. class:: Generator(Iterator[T_co], Generic[T_co, T_contra, V_co]) @@ -778,7 +791,7 @@ The module defines the following classes, functions and decorators: yield start start = await increment(start) - .. versionadded:: 3.5.4 + .. versionadded:: 3.6.1 .. class:: Text @@ -977,6 +990,7 @@ The module defines the following classes, functions and decorators: raise RuntimeError('no way') .. versionadded:: 3.5.4 + .. versionadded:: 3.6.2 .. data:: Union diff --git a/Misc/NEWS.d/next/Documentation/2019-05-20-22-21-17.bpo-36984.IjZlmS.rst b/Misc/NEWS.d/next/Documentation/2019-05-20-22-21-17.bpo-36984.IjZlmS.rst new file mode 100644 index 000000000000..b26eeadb924a --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2019-05-20-22-21-17.bpo-36984.IjZlmS.rst @@ -0,0 +1 @@ +Improve version added references in ``typing`` module - by Anthony Sottile. From webhook-mailer at python.org Sun Jun 2 02:04:04 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Sun, 02 Jun 2019 06:04:04 -0000 Subject: [Python-checkins] Add more tests for preserving identity in marshal. (GH-13736) Message-ID: https://github.com/python/cpython/commit/d71f3170ac9c850f6d1f9bffaa628dc473df5e75 commit: d71f3170ac9c850f6d1f9bffaa628dc473df5e75 branch: master author: Serhiy Storchaka committer: GitHub date: 2019-06-02T09:03:59+03:00 summary: Add more tests for preserving identity in marshal. (GH-13736) files: M Lib/test/test_marshal.py diff --git a/Lib/test/test_marshal.py b/Lib/test/test_marshal.py index a3bd350c77b9..ace1593999d4 100644 --- a/Lib/test/test_marshal.py +++ b/Lib/test/test_marshal.py @@ -383,10 +383,7 @@ def CollectObjectIDs(ids, obj): return len(ids) class InstancingTestCase(unittest.TestCase, HelperMixin): - intobj = 123321 - floatobj = 1.2345 - strobj = "abcde"*3 - dictobj = {"hello":floatobj, "goodbye":floatobj, floatobj:"hello"} + keys = (123, 1.2345, 'abc', (123, 'abc'), frozenset({123, 'abc'})) def helper3(self, rsample, recursive=False, simple=False): #we have two instances @@ -394,11 +391,12 @@ def helper3(self, rsample, recursive=False, simple=False): n0 = CollectObjectIDs(set(), sample) - s3 = marshal.dumps(sample, 3) - n3 = CollectObjectIDs(set(), marshal.loads(s3)) + for v in range(3, marshal.version + 1): + s3 = marshal.dumps(sample, v) + n3 = CollectObjectIDs(set(), marshal.loads(s3)) - #same number of instances generated - self.assertEqual(n3, n0) + #same number of instances generated + self.assertEqual(n3, n0) if not recursive: #can compare with version 2 @@ -414,20 +412,54 @@ def helper3(self, rsample, recursive=False, simple=False): self.assertGreaterEqual(len(s2), len(s3)) def testInt(self): - self.helper(self.intobj) - self.helper3(self.intobj, simple=True) + intobj = 123321 + self.helper(intobj) + self.helper3(intobj, simple=True) def testFloat(self): - self.helper(self.floatobj) - self.helper3(self.floatobj) + floatobj = 1.2345 + self.helper(floatobj) + self.helper3(floatobj) def testStr(self): - self.helper(self.strobj) - self.helper3(self.strobj) + strobj = "abcde"*3 + self.helper(strobj) + self.helper3(strobj) + + def testBytes(self): + bytesobj = b"abcde"*3 + self.helper(bytesobj) + self.helper3(bytesobj) + + def testList(self): + for obj in self.keys: + listobj = [obj, obj] + self.helper(listobj) + self.helper3(listobj) + + def testTuple(self): + for obj in self.keys: + tupleobj = (obj, obj) + self.helper(tupleobj) + self.helper3(tupleobj) + + def testSet(self): + for obj in self.keys: + setobj = {(obj, 1), (obj, 2)} + self.helper(setobj) + self.helper3(setobj) + + def testFrozenSet(self): + for obj in self.keys: + frozensetobj = frozenset({(obj, 1), (obj, 2)}) + self.helper(frozensetobj) + self.helper3(frozensetobj) def testDict(self): - self.helper(self.dictobj) - self.helper3(self.dictobj) + for obj in self.keys: + dictobj = {"hello": obj, "goodbye": obj, obj: "hello"} + self.helper(dictobj) + self.helper3(dictobj) def testModule(self): with open(__file__, "rb") as f: @@ -438,10 +470,11 @@ def testModule(self): self.helper3(code) def testRecursion(self): - d = dict(self.dictobj) + obj = 1.2345 + d = {"hello": obj, "goodbye": obj, obj: "hello"} d["self"] = d self.helper3(d, recursive=True) - l = [self.dictobj] + l = [obj, obj] l.append(l) self.helper3(l, recursive=True) From webhook-mailer at python.org Sun Jun 2 04:17:05 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Sun, 02 Jun 2019 08:17:05 -0000 Subject: [Python-checkins] bpo-37128: Add math.perm(). (GH-13731) Message-ID: https://github.com/python/cpython/commit/5ae299ac78abb628803ab7dee0997364547f5cc8 commit: 5ae299ac78abb628803ab7dee0997364547f5cc8 branch: master author: Serhiy Storchaka committer: GitHub date: 2019-06-02T11:16:49+03:00 summary: bpo-37128: Add math.perm(). (GH-13731) files: A Misc/NEWS.d/next/Library/2019-06-01-22-54-03.bpo-37128.oGXBWN.rst M Doc/library/math.rst M Lib/test/test_math.py M Modules/clinic/mathmodule.c.h M Modules/mathmodule.c diff --git a/Doc/library/math.rst b/Doc/library/math.rst index 8c6837050319..c5a77f1fab9f 100644 --- a/Doc/library/math.rst +++ b/Doc/library/math.rst @@ -207,6 +207,19 @@ Number-theoretic and representation functions of *x* and are floats. +.. function:: perm(n, k) + + Return the number of ways to choose *k* items from *n* items + without repetition and with order. + + It is mathematically equal to the expression ``n! / (n - k)!``. + + Raises :exc:`TypeError` if the arguments not integers. + Raises :exc:`ValueError` if the arguments are negative or if *k* > *n*. + + .. versionadded:: 3.8 + + .. function:: prod(iterable, *, start=1) Calculate the product of all the elements in the input *iterable*. diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index e27092eefd6e..96e0cf2fe671 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -240,6 +240,9 @@ def result_check(expected, got, ulp_tol=5, abs_tol=0.0): else: return None +class IntSubclass(int): + pass + # Class providing an __index__ method. class MyIndexable(object): def __init__(self, value): @@ -1862,6 +1865,64 @@ def test_fractions(self): self.assertAllClose(fraction_examples, rel_tol=1e-8) self.assertAllNotClose(fraction_examples, rel_tol=1e-9) + def testPerm(self): + perm = math.perm + factorial = math.factorial + # Test if factorial defintion is satisfied + for n in range(100): + for k in range(n + 1): + self.assertEqual(perm(n, k), + factorial(n) // factorial(n - k)) + + # Test for Pascal's identity + for n in range(1, 100): + for k in range(1, n): + self.assertEqual(perm(n, k), perm(n - 1, k - 1) * k + perm(n - 1, k)) + + # Test corner cases + for n in range(1, 100): + self.assertEqual(perm(n, 0), 1) + self.assertEqual(perm(n, 1), n) + self.assertEqual(perm(n, n), factorial(n)) + + # Raises TypeError if any argument is non-integer or argument count is + # not 2 + self.assertRaises(TypeError, perm, 10, 1.0) + self.assertRaises(TypeError, perm, 10, decimal.Decimal(1.0)) + self.assertRaises(TypeError, perm, 10, "1") + self.assertRaises(TypeError, perm, 10.0, 1) + self.assertRaises(TypeError, perm, decimal.Decimal(10.0), 1) + self.assertRaises(TypeError, perm, "10", 1) + + self.assertRaises(TypeError, perm, 10) + self.assertRaises(TypeError, perm, 10, 1, 3) + self.assertRaises(TypeError, perm) + + # Raises Value error if not k or n are negative numbers + self.assertRaises(ValueError, perm, -1, 1) + self.assertRaises(ValueError, perm, -2**1000, 1) + self.assertRaises(ValueError, perm, 1, -1) + self.assertRaises(ValueError, perm, 1, -2**1000) + + # Raises value error if k is greater than n + self.assertRaises(ValueError, perm, 1, 2) + self.assertRaises(ValueError, perm, 1, 2**1000) + + n = 2**1000 + self.assertEqual(perm(n, 0), 1) + self.assertEqual(perm(n, 1), n) + self.assertEqual(perm(n, 2), n * (n-1)) + self.assertRaises((OverflowError, MemoryError), perm, n, n) + + for n, k in (True, True), (True, False), (False, False): + self.assertEqual(perm(n, k), 1) + self.assertIs(type(perm(n, k)), int) + self.assertEqual(perm(IntSubclass(5), IntSubclass(2)), 20) + self.assertEqual(perm(MyIndexable(5), MyIndexable(2)), 20) + for k in range(3): + self.assertIs(type(perm(IntSubclass(5), IntSubclass(k))), int) + self.assertIs(type(perm(MyIndexable(5), MyIndexable(k))), int) + def testComb(self): comb = math.comb factorial = math.factorial @@ -1925,8 +1986,11 @@ def testComb(self): for n, k in (True, True), (True, False), (False, False): self.assertEqual(comb(n, k), 1) self.assertIs(type(comb(n, k)), int) + self.assertEqual(comb(IntSubclass(5), IntSubclass(2)), 10) self.assertEqual(comb(MyIndexable(5), MyIndexable(2)), 10) - self.assertIs(type(comb(MyIndexable(5), MyIndexable(2))), int) + for k in range(3): + self.assertIs(type(comb(IntSubclass(5), IntSubclass(k))), int) + self.assertIs(type(comb(MyIndexable(5), MyIndexable(k))), int) def test_main(): diff --git a/Misc/NEWS.d/next/Library/2019-06-01-22-54-03.bpo-37128.oGXBWN.rst b/Misc/NEWS.d/next/Library/2019-06-01-22-54-03.bpo-37128.oGXBWN.rst new file mode 100644 index 000000000000..f1b825890231 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-01-22-54-03.bpo-37128.oGXBWN.rst @@ -0,0 +1 @@ +Added :func:`math.perm`. diff --git a/Modules/clinic/mathmodule.c.h b/Modules/clinic/mathmodule.c.h index 92ec4bec9bf1..0efe5cc409ce 100644 --- a/Modules/clinic/mathmodule.c.h +++ b/Modules/clinic/mathmodule.c.h @@ -638,6 +638,41 @@ math_prod(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *k return return_value; } +PyDoc_STRVAR(math_perm__doc__, +"perm($module, n, k, /)\n" +"--\n" +"\n" +"Number of ways to choose k items from n items without repetition and with order.\n" +"\n" +"It is mathematically equal to the expression n! / (n - k)!.\n" +"\n" +"Raises TypeError if the arguments are not integers.\n" +"Raises ValueError if the arguments are negative or if k > n."); + +#define MATH_PERM_METHODDEF \ + {"perm", (PyCFunction)(void(*)(void))math_perm, METH_FASTCALL, math_perm__doc__}, + +static PyObject * +math_perm_impl(PyObject *module, PyObject *n, PyObject *k); + +static PyObject * +math_perm(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + PyObject *n; + PyObject *k; + + if (!_PyArg_CheckPositional("perm", nargs, 2, 2)) { + goto exit; + } + n = args[0]; + k = args[1]; + return_value = math_perm_impl(module, n, k); + +exit: + return return_value; +} + PyDoc_STRVAR(math_comb__doc__, "comb($module, n, k, /)\n" "--\n" @@ -674,4 +709,4 @@ math_comb(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: return return_value; } -/*[clinic end generated code: output=6709521e5e1d90ec input=a9049054013a1b77]*/ +/*[clinic end generated code: output=a82b0e705b6d0ec0 input=a9049054013a1b77]*/ diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index bea4607b9be1..6e1099321c54 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -2998,6 +2998,120 @@ math_prod_impl(PyObject *module, PyObject *iterable, PyObject *start) } +/*[clinic input] +math.perm + + n: object + k: object + / + +Number of ways to choose k items from n items without repetition and with order. + +It is mathematically equal to the expression n! / (n - k)!. + +Raises TypeError if the arguments are not integers. +Raises ValueError if the arguments are negative or if k > n. +[clinic start generated code]*/ + +static PyObject * +math_perm_impl(PyObject *module, PyObject *n, PyObject *k) +/*[clinic end generated code: output=e021a25469653e23 input=f71ee4f6ff26be24]*/ +{ + PyObject *result = NULL, *factor = NULL; + int overflow, cmp; + long long i, factors; + + n = PyNumber_Index(n); + if (n == NULL) { + return NULL; + } + if (!PyLong_CheckExact(n)) { + Py_SETREF(n, _PyLong_Copy((PyLongObject *)n)); + if (n == NULL) { + return NULL; + } + } + k = PyNumber_Index(k); + if (k == NULL) { + Py_DECREF(n); + return NULL; + } + if (!PyLong_CheckExact(k)) { + Py_SETREF(k, _PyLong_Copy((PyLongObject *)k)); + if (k == NULL) { + Py_DECREF(n); + return NULL; + } + } + + if (Py_SIZE(n) < 0) { + PyErr_SetString(PyExc_ValueError, + "n must be a non-negative integer"); + goto error; + } + cmp = PyObject_RichCompareBool(n, k, Py_LT); + if (cmp != 0) { + if (cmp > 0) { + PyErr_SetString(PyExc_ValueError, + "k must be an integer less than or equal to n"); + } + goto error; + } + + factors = PyLong_AsLongLongAndOverflow(k, &overflow); + if (overflow > 0) { + PyErr_Format(PyExc_OverflowError, + "k must not exceed %lld", + LLONG_MAX); + goto error; + } + else if (overflow < 0 || factors < 0) { + if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_ValueError, + "k must be a non-negative integer"); + } + goto error; + } + + if (factors == 0) { + result = PyLong_FromLong(1); + goto done; + } + + result = n; + Py_INCREF(result); + if (factors == 1) { + goto done; + } + + factor = n; + Py_INCREF(factor); + for (i = 1; i < factors; ++i) { + Py_SETREF(factor, PyNumber_Subtract(factor, _PyLong_One)); + if (factor == NULL) { + goto error; + } + Py_SETREF(result, PyNumber_Multiply(result, factor)); + if (result == NULL) { + goto error; + } + } + Py_DECREF(factor); + +done: + Py_DECREF(n); + Py_DECREF(k); + return result; + +error: + Py_XDECREF(factor); + Py_XDECREF(result); + Py_DECREF(n); + Py_DECREF(k); + return NULL; +} + + /*[clinic input] math.comb @@ -3028,11 +3142,24 @@ math_comb_impl(PyObject *module, PyObject *n, PyObject *k) if (n == NULL) { return NULL; } + if (!PyLong_CheckExact(n)) { + Py_SETREF(n, _PyLong_Copy((PyLongObject *)n)); + if (n == NULL) { + return NULL; + } + } k = PyNumber_Index(k); if (k == NULL) { Py_DECREF(n); return NULL; } + if (!PyLong_CheckExact(k)) { + Py_SETREF(k, _PyLong_Copy((PyLongObject *)k)); + if (k == NULL) { + Py_DECREF(n); + return NULL; + } + } if (Py_SIZE(n) < 0) { PyErr_SetString(PyExc_ValueError, @@ -3050,7 +3177,7 @@ math_comb_impl(PyObject *module, PyObject *n, PyObject *k) "k must be an integer less than or equal to n"); goto error; } - cmp = PyObject_RichCompareBool(k, temp, Py_GT); + cmp = PyObject_RichCompareBool(temp, k, Py_LT); if (cmp > 0) { Py_SETREF(k, temp); } @@ -3174,6 +3301,7 @@ static PyMethodDef math_methods[] = { {"tanh", math_tanh, METH_O, math_tanh_doc}, MATH_TRUNC_METHODDEF MATH_PROD_METHODDEF + MATH_PERM_METHODDEF MATH_COMB_METHODDEF {NULL, NULL} /* sentinel */ }; From webhook-mailer at python.org Sun Jun 2 05:24:09 2019 From: webhook-mailer at python.org (Mark Dickinson) Date: Sun, 02 Jun 2019 09:24:09 -0000 Subject: [Python-checkins] bpo-36027: Extend three-argument pow to negative second argument (GH-13266) Message-ID: https://github.com/python/cpython/commit/c52996785a45d4693857ea219e040777a14584f8 commit: c52996785a45d4693857ea219e040777a14584f8 branch: master author: Mark Dickinson committer: GitHub date: 2019-06-02T10:24:06+01:00 summary: bpo-36027: Extend three-argument pow to negative second argument (GH-13266) files: A Misc/NEWS.d/next/Core and Builtins/2019-05-12-18-46-50.bpo-36027.Q4YatQ.rst M Doc/library/functions.rst M Doc/whatsnew/3.8.rst M Lib/test/test_builtin.py M Lib/test/test_pow.py M Objects/longobject.c diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index d5c9f18c79b7..415a65b4946f 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -1277,9 +1277,24 @@ are always available. They are listed here in alphabetical order. operands, the result has the same type as the operands (after coercion) unless the second argument is negative; in that case, all arguments are converted to float and a float result is delivered. For example, ``10**2`` - returns ``100``, but ``10**-2`` returns ``0.01``. If the second argument is - negative, the third argument must be omitted. If *z* is present, *x* and *y* - must be of integer types, and *y* must be non-negative. + returns ``100``, but ``10**-2`` returns ``0.01``. + + For :class:`int` operands *x* and *y*, if *z* is present, *z* must also be + of integer type and *z* must be nonzero. If *z* is present and *y* is + negative, *x* must be relatively prime to *z*. In that case, ``pow(inv_x, + -y, z)`` is returned, where *inv_x* is an inverse to *x* modulo *z*. + + Here's an example of computing an inverse for ``38`` modulo ``97``:: + + >>> pow(38, -1, 97) + 23 + >>> 23 * 38 % 97 == 1 + True + + .. versionchanged:: 3.8 + For :class:`int` operands, the three-argument form of ``pow`` now allows + the second argument to be negative, permitting computation of modular + inverses. .. function:: print(*objects, sep=' ', end='\\n', file=sys.stdout, flush=False) diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 591b45488372..74d0079a53db 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -304,6 +304,12 @@ Other Language Changes * Added new ``replace()`` method to the code type (:class:`types.CodeType`). (Contributed by Victor Stinner in :issue:`37032`.) +* For integers, the three-argument form of the :func:`pow` function now permits + the exponent to be negative in the case where the base is relatively prime to + the modulus. It then computes a modular inverse to the base when the exponent + is ``-1``, and a suitable power of that inverse for other negative exponents. + (Contributed by Mark Dickinson in :issue:`36027`.) + New Modules =========== diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index e32fb75d8191..b536cec06487 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -1195,7 +1195,8 @@ def test_pow(self): self.assertAlmostEqual(pow(-1, 0.5), 1j) self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j) - self.assertRaises(ValueError, pow, -1, -2, 3) + # See test_pow for additional tests for three-argument pow. + self.assertEqual(pow(-1, -2, 3), 1) self.assertRaises(ValueError, pow, 1, 2, 0) self.assertRaises(TypeError, pow) diff --git a/Lib/test/test_pow.py b/Lib/test/test_pow.py index cac1ae5ea2d8..660ff80bbf52 100644 --- a/Lib/test/test_pow.py +++ b/Lib/test/test_pow.py @@ -1,3 +1,4 @@ +import math import unittest class PowTest(unittest.TestCase): @@ -119,5 +120,30 @@ def test_bug705231(self): eq(pow(a, -fiveto), expected) eq(expected, 1.0) # else we didn't push fiveto to evenness + def test_negative_exponent(self): + for a in range(-50, 50): + for m in range(-50, 50): + with self.subTest(a=a, m=m): + if m != 0 and math.gcd(a, m) == 1: + # Exponent -1 should give an inverse, with the + # same sign as m. + inv = pow(a, -1, m) + self.assertEqual(inv, inv % m) + self.assertEqual((inv * a - 1) % m, 0) + + # Larger exponents + self.assertEqual(pow(a, -2, m), pow(inv, 2, m)) + self.assertEqual(pow(a, -3, m), pow(inv, 3, m)) + self.assertEqual(pow(a, -1001, m), pow(inv, 1001, m)) + + else: + with self.assertRaises(ValueError): + pow(a, -1, m) + with self.assertRaises(ValueError): + pow(a, -2, m) + with self.assertRaises(ValueError): + pow(a, -1001, m) + + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-12-18-46-50.bpo-36027.Q4YatQ.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-12-18-46-50.bpo-36027.Q4YatQ.rst new file mode 100644 index 000000000000..866309cddc68 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-12-18-46-50.bpo-36027.Q4YatQ.rst @@ -0,0 +1,3 @@ +Allow computation of modular inverses via three-argument ``pow``: the second +argument is now permitted to be negative in the case where the first and +third arguments are relatively prime. diff --git a/Objects/longobject.c b/Objects/longobject.c index 5d2b595621f3..49f1420bf64f 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -4174,6 +4174,98 @@ long_divmod(PyObject *a, PyObject *b) return z; } + +/* Compute an inverse to a modulo n, or raise ValueError if a is not + invertible modulo n. Assumes n is positive. The inverse returned + is whatever falls out of the extended Euclidean algorithm: it may + be either positive or negative, but will be smaller than n in + absolute value. + + Pure Python equivalent for long_invmod: + + def invmod(a, n): + b, c = 1, 0 + while n: + q, r = divmod(a, n) + a, b, c, n = n, c, b - q*c, r + + # at this point a is the gcd of the original inputs + if a == 1: + return b + raise ValueError("Not invertible") +*/ + +static PyLongObject * +long_invmod(PyLongObject *a, PyLongObject *n) +{ + PyLongObject *b, *c; + + /* Should only ever be called for positive n */ + assert(Py_SIZE(n) > 0); + + b = (PyLongObject *)PyLong_FromLong(1L); + if (b == NULL) { + return NULL; + } + c = (PyLongObject *)PyLong_FromLong(0L); + if (c == NULL) { + Py_DECREF(b); + return NULL; + } + Py_INCREF(a); + Py_INCREF(n); + + /* references now owned: a, b, c, n */ + while (Py_SIZE(n) != 0) { + PyLongObject *q, *r, *s, *t; + + if (l_divmod(a, n, &q, &r) == -1) { + goto Error; + } + Py_DECREF(a); + a = n; + n = r; + t = (PyLongObject *)long_mul(q, c); + Py_DECREF(q); + if (t == NULL) { + goto Error; + } + s = (PyLongObject *)long_sub(b, t); + Py_DECREF(t); + if (s == NULL) { + goto Error; + } + Py_DECREF(b); + b = c; + c = s; + } + /* references now owned: a, b, c, n */ + + Py_DECREF(c); + Py_DECREF(n); + if (long_compare(a, _PyLong_One)) { + /* a != 1; we don't have an inverse. */ + Py_DECREF(a); + Py_DECREF(b); + PyErr_SetString(PyExc_ValueError, + "base is not invertible for the given modulus"); + return NULL; + } + else { + /* a == 1; b gives an inverse modulo n */ + Py_DECREF(a); + return b; + } + + Error: + Py_DECREF(a); + Py_DECREF(b); + Py_DECREF(c); + Py_DECREF(n); + return NULL; +} + + /* pow(v, w, x) */ static PyObject * long_pow(PyObject *v, PyObject *w, PyObject *x) @@ -4207,20 +4299,14 @@ long_pow(PyObject *v, PyObject *w, PyObject *x) Py_RETURN_NOTIMPLEMENTED; } - if (Py_SIZE(b) < 0) { /* if exponent is negative */ - if (c) { - PyErr_SetString(PyExc_ValueError, "pow() 2nd argument " - "cannot be negative when 3rd argument specified"); - goto Error; - } - else { - /* else return a float. This works because we know + if (Py_SIZE(b) < 0 && c == NULL) { + /* if exponent is negative and there's no modulus: + return a float. This works because we know that this calls float_pow() which converts its arguments to double. */ - Py_DECREF(a); - Py_DECREF(b); - return PyFloat_Type.tp_as_number->nb_power(v, w, x); - } + Py_DECREF(a); + Py_DECREF(b); + return PyFloat_Type.tp_as_number->nb_power(v, w, x); } if (c) { @@ -4255,6 +4341,26 @@ long_pow(PyObject *v, PyObject *w, PyObject *x) goto Done; } + /* if exponent is negative, negate the exponent and + replace the base with a modular inverse */ + if (Py_SIZE(b) < 0) { + temp = (PyLongObject *)_PyLong_Copy(b); + if (temp == NULL) + goto Error; + Py_DECREF(b); + b = temp; + temp = NULL; + _PyLong_Negate(&b); + if (b == NULL) + goto Error; + + temp = long_invmod(a, c); + if (temp == NULL) + goto Error; + Py_DECREF(a); + a = temp; + } + /* Reduce base by modulus in some cases: 1. If base < 0. Forcing the base non-negative makes things easier. 2. If base is obviously larger than the modulus. The "small From webhook-mailer at python.org Sun Jun 2 06:56:42 2019 From: webhook-mailer at python.org (Andrew Svetlov) Date: Sun, 02 Jun 2019 10:56:42 -0000 Subject: [Python-checkins] bpo-35621: Support running subprocesses in asyncio when loop is executed in non-main thread (#13630) Message-ID: https://github.com/python/cpython/commit/13ed07998ad93dbdd94991ba0451b9b559f07972 commit: 13ed07998ad93dbdd94991ba0451b9b559f07972 branch: master author: Andrew Svetlov committer: GitHub date: 2019-06-02T13:56:38+03:00 summary: bpo-35621: Support running subprocesses in asyncio when loop is executed in non-main thread (#13630) files: A Misc/NEWS.d/next/Library/2019-05-28-19-03-46.bpo-35621.Abc1lf.rst M Lib/asyncio/unix_events.py M Lib/test/test_asyncio/test_subprocess.py M Lib/test/test_asyncio/test_unix_events.py diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py index 28128d2977df..6714542e4e33 100644 --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -2,6 +2,7 @@ import errno import io +import itertools import os import selectors import signal @@ -29,7 +30,9 @@ __all__ = ( 'SelectorEventLoop', 'AbstractChildWatcher', 'SafeChildWatcher', - 'FastChildWatcher', 'DefaultEventLoopPolicy', + 'FastChildWatcher', + 'MultiLoopChildWatcher', 'ThreadedChildWatcher', + 'DefaultEventLoopPolicy', ) @@ -184,6 +187,13 @@ def _make_write_pipe_transport(self, pipe, protocol, waiter=None, stdin, stdout, stderr, bufsize, extra=None, **kwargs): with events.get_child_watcher() as watcher: + if not watcher.is_active(): + # Check early. + # Raising exception before process creation + # prevents subprocess execution if the watcher + # is not ready to handle it. + raise RuntimeError("asyncio.get_child_watcher() is not activated, " + "subproccess support is not installed.") waiter = self.create_future() transp = _UnixSubprocessTransport(self, protocol, args, shell, stdin, stdout, stderr, bufsize, @@ -838,6 +848,15 @@ def close(self): """ raise NotImplementedError() + def is_active(self): + """Watcher status. + + Return True if the watcher is installed and ready to handle process exit + notifications. + + """ + raise NotImplementedError() + def __enter__(self): """Enter the watcher's context and allow starting new processes @@ -849,6 +868,20 @@ def __exit__(self, a, b, c): raise NotImplementedError() +def _compute_returncode(status): + if os.WIFSIGNALED(status): + # The child process died because of a signal. + return -os.WTERMSIG(status) + elif os.WIFEXITED(status): + # The child process exited (e.g sys.exit()). + return os.WEXITSTATUS(status) + else: + # The child exited, but we don't understand its status. + # This shouldn't happen, but if it does, let's just + # return that status; perhaps that helps debug it. + return status + + class BaseChildWatcher(AbstractChildWatcher): def __init__(self): @@ -858,6 +891,9 @@ def __init__(self): def close(self): self.attach_loop(None) + def is_active(self): + return self._loop is not None and self._loop.is_running() + def _do_waitpid(self, expected_pid): raise NotImplementedError() @@ -898,19 +934,6 @@ def _sig_chld(self): 'exception': exc, }) - def _compute_returncode(self, status): - if os.WIFSIGNALED(status): - # The child process died because of a signal. - return -os.WTERMSIG(status) - elif os.WIFEXITED(status): - # The child process exited (e.g sys.exit()). - return os.WEXITSTATUS(status) - else: - # The child exited, but we don't understand its status. - # This shouldn't happen, but if it does, let's just - # return that status; perhaps that helps debug it. - return status - class SafeChildWatcher(BaseChildWatcher): """'Safe' child watcher implementation. @@ -934,11 +957,6 @@ def __exit__(self, a, b, c): pass def add_child_handler(self, pid, callback, *args): - if self._loop is None: - raise RuntimeError( - "Cannot add child handler, " - "the child watcher does not have a loop attached") - self._callbacks[pid] = (callback, args) # Prevent a race condition in case the child is already terminated. @@ -974,7 +992,7 @@ def _do_waitpid(self, expected_pid): # The child process is still alive. return - returncode = self._compute_returncode(status) + returncode = _compute_returncode(status) if self._loop.get_debug(): logger.debug('process %s exited with returncode %s', expected_pid, returncode) @@ -1035,11 +1053,6 @@ def __exit__(self, a, b, c): def add_child_handler(self, pid, callback, *args): assert self._forks, "Must use the context manager" - if self._loop is None: - raise RuntimeError( - "Cannot add child handler, " - "the child watcher does not have a loop attached") - with self._lock: try: returncode = self._zombies.pop(pid) @@ -1072,7 +1085,7 @@ def _do_waitpid_all(self): # A child process is still alive. return - returncode = self._compute_returncode(status) + returncode = _compute_returncode(status) with self._lock: try: @@ -1101,6 +1114,177 @@ def _do_waitpid_all(self): callback(pid, returncode, *args) +class MultiLoopChildWatcher(AbstractChildWatcher): + # The class keeps compatibility with AbstractChildWatcher ABC + # To achieve this it has empty attach_loop() method + # and doesn't accept explicit loop argument + # for add_child_handler()/remove_child_handler() + # but retrieves the current loop by get_running_loop() + + def __init__(self): + self._callbacks = {} + self._saved_sighandler = None + + def is_active(self): + return self._saved_sighandler is not None + + def close(self): + self._callbacks.clear() + if self._saved_sighandler is not None: + handler = signal.getsignal(signal.SIGCHLD) + if handler != self._sig_chld: + logger.warning("SIGCHLD handler was changed by outside code") + else: + signal.signal(signal.SIGCHLD, self._saved_sighandler) + self._saved_sighandler = None + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + pass + + def add_child_handler(self, pid, callback, *args): + loop = events.get_running_loop() + self._callbacks[pid] = (loop, callback, args) + + # Prevent a race condition in case the child is already terminated. + self._do_waitpid(pid) + + def remove_child_handler(self, pid): + try: + del self._callbacks[pid] + return True + except KeyError: + return False + + def attach_loop(self, loop): + # Don't save the loop but initialize itself if called first time + # The reason to do it here is that attach_loop() is called from + # unix policy only for the main thread. + # Main thread is required for subscription on SIGCHLD signal + if self._saved_sighandler is None: + self._saved_sighandler = signal.signal(signal.SIGCHLD, self._sig_chld) + if self._saved_sighandler is None: + logger.warning("Previous SIGCHLD handler was set by non-Python code, " + "restore to default handler on watcher close.") + self._saved_sighandler = signal.SIG_DFL + + # Set SA_RESTART to limit EINTR occurrences. + signal.siginterrupt(signal.SIGCHLD, False) + + def _do_waitpid_all(self): + for pid in list(self._callbacks): + self._do_waitpid(pid) + + def _do_waitpid(self, expected_pid): + assert expected_pid > 0 + + try: + pid, status = os.waitpid(expected_pid, os.WNOHANG) + except ChildProcessError: + # The child process is already reaped + # (may happen if waitpid() is called elsewhere). + pid = expected_pid + returncode = 255 + logger.warning( + "Unknown child process pid %d, will report returncode 255", + pid) + debug_log = False + else: + if pid == 0: + # The child process is still alive. + return + + returncode = _compute_returncode(status) + debug_log = True + try: + loop, callback, args = self._callbacks.pop(pid) + except KeyError: # pragma: no cover + # May happen if .remove_child_handler() is called + # after os.waitpid() returns. + logger.warning("Child watcher got an unexpected pid: %r", + pid, exc_info=True) + else: + if loop.is_closed(): + logger.warning("Loop %r that handles pid %r is closed", loop, pid) + else: + if debug_log and loop.get_debug(): + logger.debug('process %s exited with returncode %s', + expected_pid, returncode) + loop.call_soon_threadsafe(callback, pid, returncode, *args) + + def _sig_chld(self, signum, frame): + try: + self._do_waitpid_all() + except (SystemExit, KeyboardInterrupt): + raise + except BaseException: + logger.warning('Unknown exception in SIGCHLD handler', exc_info=True) + + +class ThreadedChildWatcher(AbstractChildWatcher): + # The watcher uses a thread per process + # for waiting for the process finish. + # It doesn't require subscription on POSIX signal + + def __init__(self): + self._pid_counter = itertools.count(0) + + def is_active(self): + return True + + def close(self): + pass + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + pass + + def add_child_handler(self, pid, callback, *args): + loop = events.get_running_loop() + thread = threading.Thread(target=self._do_waitpid, + name=f"waitpid-{next(self._pid_counter)}", + args=(loop, pid, callback, args), + daemon=True) + thread.start() + + def remove_child_handler(self, pid): + # asyncio never calls remove_child_handler() !!! + # The method is no-op but is implemented because + # abstract base classe requires it + return True + + def attach_loop(self, loop): + pass + + def _do_waitpid(self, loop, expected_pid, callback, args): + assert expected_pid > 0 + + try: + pid, status = os.waitpid(expected_pid, 0) + except ChildProcessError: + # The child process is already reaped + # (may happen if waitpid() is called elsewhere). + pid = expected_pid + returncode = 255 + logger.warning( + "Unknown child process pid %d, will report returncode 255", + pid) + else: + returncode = _compute_returncode(status) + if loop.get_debug(): + logger.debug('process %s exited with returncode %s', + expected_pid, returncode) + + if loop.is_closed(): + logger.warning("Loop %r that handles pid %r is closed", loop, pid) + else: + loop.call_soon_threadsafe(callback, pid, returncode, *args) + + class _UnixDefaultEventLoopPolicy(events.BaseDefaultEventLoopPolicy): """UNIX event loop policy with a watcher for child processes.""" _loop_factory = _UnixSelectorEventLoop @@ -1112,7 +1296,7 @@ def __init__(self): def _init_watcher(self): with events._lock: if self._watcher is None: # pragma: no branch - self._watcher = SafeChildWatcher() + self._watcher = ThreadedChildWatcher() if isinstance(threading.current_thread(), threading._MainThread): self._watcher.attach_loop(self._local._loop) @@ -1134,7 +1318,7 @@ def set_event_loop(self, loop): def get_child_watcher(self): """Get the watcher for child processes. - If not yet set, a SafeChildWatcher object is automatically created. + If not yet set, a ThreadedChildWatcher object is automatically created. """ if self._watcher is None: self._init_watcher() diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py index 7d72e6cde4e7..582e17202460 100644 --- a/Lib/test/test_asyncio/test_subprocess.py +++ b/Lib/test/test_asyncio/test_subprocess.py @@ -633,6 +633,7 @@ def test_create_subprocess_exec_with_path(self): self.assertIsNone(self.loop.run_until_complete(execute())) + if sys.platform != 'win32': # Unix class SubprocessWatcherMixin(SubprocessMixin): @@ -648,7 +649,24 @@ def setUp(self): watcher = self.Watcher() watcher.attach_loop(self.loop) policy.set_child_watcher(watcher) - self.addCleanup(policy.set_child_watcher, None) + + def tearDown(self): + super().setUp() + policy = asyncio.get_event_loop_policy() + watcher = policy.get_child_watcher() + policy.set_child_watcher(None) + watcher.attach_loop(None) + watcher.close() + + class SubprocessThreadedWatcherTests(SubprocessWatcherMixin, + test_utils.TestCase): + + Watcher = unix_events.ThreadedChildWatcher + + class SubprocessMultiLoopWatcherTests(SubprocessWatcherMixin, + test_utils.TestCase): + + Watcher = unix_events.MultiLoopChildWatcher class SubprocessSafeWatcherTests(SubprocessWatcherMixin, test_utils.TestCase): @@ -670,5 +688,25 @@ def setUp(self): self.set_event_loop(self.loop) +class GenericWatcherTests: + + def test_create_subprocess_fails_with_inactive_watcher(self): + + async def execute(): + watcher = mock.create_authspec(asyncio.AbstractChildWatcher) + watcher.is_active.return_value = False + asyncio.set_child_watcher(watcher) + + with self.assertRaises(RuntimeError): + await subprocess.create_subprocess_exec( + support.FakePath(sys.executable), '-c', 'pass') + + watcher.add_child_handler.assert_not_called() + + self.assertIsNone(self.loop.run_until_complete(execute())) + + + + if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_asyncio/test_unix_events.py b/Lib/test/test_asyncio/test_unix_events.py index ac84304ec99d..f7f992fcea49 100644 --- a/Lib/test/test_asyncio/test_unix_events.py +++ b/Lib/test/test_asyncio/test_unix_events.py @@ -1082,6 +1082,8 @@ def test_not_implemented(self): NotImplementedError, watcher.attach_loop, f) self.assertRaises( NotImplementedError, watcher.close) + self.assertRaises( + NotImplementedError, watcher.is_active) self.assertRaises( NotImplementedError, watcher.__enter__) self.assertRaises( @@ -1784,15 +1786,6 @@ def test_close(self, m): if isinstance(self.watcher, asyncio.FastChildWatcher): self.assertFalse(self.watcher._zombies) - @waitpid_mocks - def test_add_child_handler_with_no_loop_attached(self, m): - callback = mock.Mock() - with self.create_watcher() as watcher: - with self.assertRaisesRegex( - RuntimeError, - 'the child watcher does not have a loop attached'): - watcher.add_child_handler(100, callback) - class SafeChildWatcherTests (ChildWatcherTestsMixin, test_utils.TestCase): def create_watcher(self): @@ -1809,17 +1802,16 @@ class PolicyTests(unittest.TestCase): def create_policy(self): return asyncio.DefaultEventLoopPolicy() - def test_get_child_watcher(self): + def test_get_default_child_watcher(self): policy = self.create_policy() self.assertIsNone(policy._watcher) watcher = policy.get_child_watcher() - self.assertIsInstance(watcher, asyncio.SafeChildWatcher) + self.assertIsInstance(watcher, asyncio.ThreadedChildWatcher) self.assertIs(policy._watcher, watcher) self.assertIs(watcher, policy.get_child_watcher()) - self.assertIsNone(watcher._loop) def test_get_child_watcher_after_set(self): policy = self.create_policy() @@ -1829,18 +1821,6 @@ def test_get_child_watcher_after_set(self): self.assertIs(policy._watcher, watcher) self.assertIs(watcher, policy.get_child_watcher()) - def test_get_child_watcher_with_mainloop_existing(self): - policy = self.create_policy() - loop = policy.get_event_loop() - - self.assertIsNone(policy._watcher) - watcher = policy.get_child_watcher() - - self.assertIsInstance(watcher, asyncio.SafeChildWatcher) - self.assertIs(watcher._loop, loop) - - loop.close() - def test_get_child_watcher_thread(self): def f(): @@ -1865,7 +1845,11 @@ def test_child_watcher_replace_mainloop_existing(self): policy = self.create_policy() loop = policy.get_event_loop() - watcher = policy.get_child_watcher() + # Explicitly setup SafeChildWatcher, + # default ThreadedChildWatcher has no _loop property + watcher = asyncio.SafeChildWatcher() + policy.set_child_watcher(watcher) + watcher.attach_loop(loop) self.assertIs(watcher._loop, loop) diff --git a/Misc/NEWS.d/next/Library/2019-05-28-19-03-46.bpo-35621.Abc1lf.rst b/Misc/NEWS.d/next/Library/2019-05-28-19-03-46.bpo-35621.Abc1lf.rst new file mode 100644 index 000000000000..c492e1de6d5c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-28-19-03-46.bpo-35621.Abc1lf.rst @@ -0,0 +1,2 @@ +Support running asyncio subprocesses when execution event loop in a thread +on UNIX. From webhook-mailer at python.org Sun Jun 2 10:45:19 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Sun, 02 Jun 2019 14:45:19 -0000 Subject: [Python-checkins] bpo-37126: Allow structseq objects to be tracked by the GC (GH-13729) Message-ID: https://github.com/python/cpython/commit/7ffcf848df214135abeea7f6c6faa4135fd0928f commit: 7ffcf848df214135abeea7f6c6faa4135fd0928f branch: master author: Pablo Galindo committer: GitHub date: 2019-06-02T15:45:13+01:00 summary: bpo-37126: Allow structseq objects to be tracked by the GC (GH-13729) files: A Misc/NEWS.d/next/Core and Builtins/2019-06-01-20-03-13.bpo-37126.tP6lL4.rst M Objects/structseq.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-06-01-20-03-13.bpo-37126.tP6lL4.rst b/Misc/NEWS.d/next/Core and Builtins/2019-06-01-20-03-13.bpo-37126.tP6lL4.rst new file mode 100644 index 000000000000..069b064dfa61 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-06-01-20-03-13.bpo-37126.tP6lL4.rst @@ -0,0 +1,2 @@ +All structseq objects are now tracked by the garbage collector. Patch by +Pablo Galindo. diff --git a/Objects/structseq.c b/Objects/structseq.c index a5046c42cbc3..3d857f734be8 100644 --- a/Objects/structseq.c +++ b/Objects/structseq.c @@ -3,6 +3,7 @@ #include "Python.h" #include "pycore_tupleobject.h" +#include "pycore_object.h" #include "structmember.h" static const char visible_length_key[] = "n_sequence_fields"; @@ -59,6 +60,18 @@ PyStructSequence_GetItem(PyObject* op, Py_ssize_t i) return PyStructSequence_GET_ITEM(op, i); } + +static int +structseq_traverse(PyStructSequence *obj, visitproc visit, void *arg) +{ + Py_ssize_t i, size; + size = REAL_SIZE(obj); + for (i = 0; i < size; ++i) { + Py_VISIT(obj->ob_item[i]); + } + return 0; +} + static void structseq_dealloc(PyStructSequence *obj) { @@ -166,6 +179,7 @@ structseq_new_impl(PyTypeObject *type, PyObject *arg, PyObject *dict) } Py_DECREF(arg); + _PyObject_GC_TRACK(res); return (PyObject*) res; } @@ -388,6 +402,7 @@ PyStructSequence_InitType2(PyTypeObject *type, PyStructSequence_Desc *desc) type->tp_methods = structseq_methods; type->tp_new = structseq_new; type->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC; + type->tp_traverse = (traverseproc) structseq_traverse; n_members = count_members(desc, &n_unnamed_members); members = PyMem_NEW(PyMemberDef, n_members - n_unnamed_members + 1); @@ -426,7 +441,7 @@ PyStructSequence_NewType(PyStructSequence_Desc *desc) PyMemberDef *members; PyObject *bases; PyTypeObject *type; - PyType_Slot slots[7]; + PyType_Slot slots[8]; PyType_Spec spec; Py_ssize_t n_members, n_unnamed_members; @@ -446,7 +461,8 @@ PyStructSequence_NewType(PyStructSequence_Desc *desc) slots[3] = (PyType_Slot){Py_tp_methods, structseq_methods}; slots[4] = (PyType_Slot){Py_tp_new, structseq_new}; slots[5] = (PyType_Slot){Py_tp_members, members}; - slots[6] = (PyType_Slot){0, 0}; + slots[6] = (PyType_Slot){Py_tp_traverse, (traverseproc)structseq_traverse}; + slots[7] = (PyType_Slot){0, 0}; /* Initialize Spec */ /* The name in this PyType_Spec is statically allocated so it is */ From webhook-mailer at python.org Sun Jun 2 12:58:14 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Sun, 02 Jun 2019 16:58:14 -0000 Subject: [Python-checkins] Add description to the command line help of the argument clinic (GH-8518) Message-ID: https://github.com/python/cpython/commit/5df4025f42b30aca72f441899b361f748c304c57 commit: 5df4025f42b30aca72f441899b361f748c304c57 branch: master author: Tim Hoffmann <2836374+timhoffm at users.noreply.github.com> committer: Pablo Galindo date: 2019-06-02T17:58:10+01:00 summary: Add description to the command line help of the argument clinic (GH-8518) files: M Tools/clinic/clinic.py diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py index cb2ded4649dc..9880b3951339 100755 --- a/Tools/clinic/clinic.py +++ b/Tools/clinic/clinic.py @@ -4900,7 +4900,14 @@ def main(argv): sys.exit("Error: clinic.py requires Python 3.3 or greater.") import argparse - cmdline = argparse.ArgumentParser() + cmdline = argparse.ArgumentParser( + description="""Preprocessor for CPython C files. + +The purpose of the Argument Clinic is automating all the boilerplate involved +with writing argument parsing code for builtins and providing introspection +signatures ("docstrings") for CPython builtins. + +For more information see https://docs.python.org/3/howto/clinic.html""") cmdline.add_argument("-f", "--force", action='store_true') cmdline.add_argument("-o", "--output", type=str) cmdline.add_argument("-v", "--verbose", action='store_true') From webhook-mailer at python.org Sun Jun 2 14:56:51 2019 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Sun, 02 Jun 2019 18:56:51 -0000 Subject: [Python-checkins] bpo-35610: IDLE - Replace .context_use_ps1 with .prompt_last_line (GH-11307) Message-ID: https://github.com/python/cpython/commit/6bdc4dee01788599808c7858e2fe9fdd72cf6792 commit: 6bdc4dee01788599808c7858e2fe9fdd72cf6792 branch: master author: Cheryl Sabella committer: Terry Jan Reedy date: 2019-06-02T14:56:47-04:00 summary: bpo-35610: IDLE - Replace .context_use_ps1 with .prompt_last_line (GH-11307) Changes in bpo- 31858 made the less informative 'context_use_ps1' redundant. files: A Misc/NEWS.d/next/IDLE/2019-06-02-14-10-52.bpo-35610.0w_v6Y.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/editor.py M Lib/idlelib/hyperparser.py M Lib/idlelib/idle_test/test_autocomplete.py M Lib/idlelib/idle_test/test_hyperparser.py M Lib/idlelib/idle_test/test_parenmatch.py M Lib/idlelib/pyshell.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index b260d4e5ef1b..982af7767251 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,9 @@ Released on 2019-10-20? ====================================== +bpo-35610: Replace now redundant editor.context_use_ps1 with +.prompt_last_line. This finishes change started in bpo-31858. + bpo-32411: Stop sorting dict created with desired line order. bpo-37038: Make idlelib.run runnable; add test clause. diff --git a/Lib/idlelib/editor.py b/Lib/idlelib/editor.py index 83260329640e..89b7239a96ea 100644 --- a/Lib/idlelib/editor.py +++ b/Lib/idlelib/editor.py @@ -228,10 +228,6 @@ def __init__(self, flist=None, filename=None, key=None, root=None): self.indentwidth = self.tabwidth self.set_notabs_indentwidth() - # If context_use_ps1 is true, parsing searches back for a ps1 line; - # else searches for a popular (if, def, ...) Python stmt. - self.context_use_ps1 = False - # When searching backwards for a reliable place to begin parsing, # first start num_context_lines[0] lines back, then # num_context_lines[1] lines back if that didn't work, and so on. @@ -1337,14 +1333,13 @@ def newline_and_indent_event(self, event): # open/close first need to find the last stmt lno = index2line(text.index('insert')) y = pyparse.Parser(self.indentwidth, self.tabwidth) - if not self.context_use_ps1: + if not self.prompt_last_line: for context in self.num_context_lines: startat = max(lno - context, 1) startatindex = repr(startat) + ".0" rawtext = text.get(startatindex, "insert") y.set_code(rawtext) bod = y.find_good_parse_start( - self.context_use_ps1, self._build_char_in_string_func(startatindex)) if bod is not None or startat == 1: break diff --git a/Lib/idlelib/hyperparser.py b/Lib/idlelib/hyperparser.py index 7e7e0ae80247..77baca782b3f 100644 --- a/Lib/idlelib/hyperparser.py +++ b/Lib/idlelib/hyperparser.py @@ -35,7 +35,7 @@ def index2line(index): return int(float(index)) lno = index2line(text.index(index)) - if not editwin.context_use_ps1: + if not editwin.prompt_last_line: for context in editwin.num_context_lines: startat = max(lno - context, 1) startatindex = repr(startat) + ".0" diff --git a/Lib/idlelib/idle_test/test_autocomplete.py b/Lib/idlelib/idle_test/test_autocomplete.py index 398cb359e093..6181b29ec250 100644 --- a/Lib/idlelib/idle_test/test_autocomplete.py +++ b/Lib/idlelib/idle_test/test_autocomplete.py @@ -19,7 +19,7 @@ def __init__(self, root, text): self.text = text self.indentwidth = 8 self.tabwidth = 8 - self.context_use_ps1 = True + self.prompt_last_line = '>>>' # Currently not used by autocomplete. class AutoCompleteTest(unittest.TestCase): diff --git a/Lib/idlelib/idle_test/test_hyperparser.py b/Lib/idlelib/idle_test/test_hyperparser.py index 8dbfc63779d3..343843c4166e 100644 --- a/Lib/idlelib/idle_test/test_hyperparser.py +++ b/Lib/idlelib/idle_test/test_hyperparser.py @@ -11,7 +11,7 @@ def __init__(self, text): self.text = text self.indentwidth = 8 self.tabwidth = 8 - self.context_use_ps1 = True + self.prompt_last_line = '>>>' self.num_context_lines = 50, 500, 1000 _build_char_in_string_func = EditorWindow._build_char_in_string_func @@ -53,7 +53,7 @@ def setUp(self): def tearDown(self): self.text.delete('1.0', 'end') - self.editwin.context_use_ps1 = True + self.editwin.prompt_last_line = '>>>' def get_parser(self, index): """ @@ -71,7 +71,7 @@ def test_init(self): self.assertIn('precedes', str(ve.exception)) # test without ps1 - self.editwin.context_use_ps1 = False + self.editwin.prompt_last_line = '' # number of lines lesser than 50 p = self.get_parser('end') diff --git a/Lib/idlelib/idle_test/test_parenmatch.py b/Lib/idlelib/idle_test/test_parenmatch.py index f58819abf112..4a41d8433d54 100644 --- a/Lib/idlelib/idle_test/test_parenmatch.py +++ b/Lib/idlelib/idle_test/test_parenmatch.py @@ -17,7 +17,7 @@ def __init__(self, text): self.text = text self.indentwidth = 8 self.tabwidth = 8 - self.context_use_ps1 = True + self.prompt_last_line = '>>>' # Currently not used by parenmatch. class ParenMatchTest(unittest.TestCase): diff --git a/Lib/idlelib/pyshell.py b/Lib/idlelib/pyshell.py index 2de42658b01c..6e0707d68bb6 100755 --- a/Lib/idlelib/pyshell.py +++ b/Lib/idlelib/pyshell.py @@ -881,7 +881,7 @@ def __init__(self, flist=None): self.usetabs = True # indentwidth must be 8 when using tabs. See note in EditorWindow: self.indentwidth = 8 - self.context_use_ps1 = True + self.sys_ps1 = sys.ps1 if hasattr(sys, 'ps1') else '>>> ' self.prompt_last_line = self.sys_ps1.split('\n')[-1] self.prompt = self.sys_ps1 # Changes when debug active diff --git a/Misc/NEWS.d/next/IDLE/2019-06-02-14-10-52.bpo-35610.0w_v6Y.rst b/Misc/NEWS.d/next/IDLE/2019-06-02-14-10-52.bpo-35610.0w_v6Y.rst new file mode 100644 index 000000000000..0042ab70497a --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-06-02-14-10-52.bpo-35610.0w_v6Y.rst @@ -0,0 +1,2 @@ +Replace now redundant .context_use_ps1 with .prompt_last_line. This finishes +change started in bpo-31858. From webhook-mailer at python.org Sun Jun 2 15:35:56 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 02 Jun 2019 19:35:56 -0000 Subject: [Python-checkins] bpo-35610: IDLE - Replace .context_use_ps1 with .prompt_last_line (GH-11307) Message-ID: https://github.com/python/cpython/commit/b4e0bfd4778e142f037f50c19c4bb5bd123b4641 commit: b4e0bfd4778e142f037f50c19c4bb5bd123b4641 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-02T12:35:53-07:00 summary: bpo-35610: IDLE - Replace .context_use_ps1 with .prompt_last_line (GH-11307) Changes in bpo- 31858 made the less informative 'context_use_ps1' redundant. (cherry picked from commit 6bdc4dee01788599808c7858e2fe9fdd72cf6792) Co-authored-by: Cheryl Sabella files: A Misc/NEWS.d/next/IDLE/2019-06-02-14-10-52.bpo-35610.0w_v6Y.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/editor.py M Lib/idlelib/hyperparser.py M Lib/idlelib/idle_test/test_autocomplete.py M Lib/idlelib/idle_test/test_hyperparser.py M Lib/idlelib/idle_test/test_parenmatch.py M Lib/idlelib/pyshell.py diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 808c236bb590..172fdc00d237 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,9 @@ Released on 2019-06-24? ====================================== +bpo-35610: Replace now redundant editor.context_use_ps1 with +.prompt_last_line. This finishes change started in bpo-31858. + bpo-32411: Stop sorting dict created with desired line order. bpo-37038: Make idlelib.run runnable; add test clause. diff --git a/Lib/idlelib/editor.py b/Lib/idlelib/editor.py index 83260329640e..89b7239a96ea 100644 --- a/Lib/idlelib/editor.py +++ b/Lib/idlelib/editor.py @@ -228,10 +228,6 @@ def __init__(self, flist=None, filename=None, key=None, root=None): self.indentwidth = self.tabwidth self.set_notabs_indentwidth() - # If context_use_ps1 is true, parsing searches back for a ps1 line; - # else searches for a popular (if, def, ...) Python stmt. - self.context_use_ps1 = False - # When searching backwards for a reliable place to begin parsing, # first start num_context_lines[0] lines back, then # num_context_lines[1] lines back if that didn't work, and so on. @@ -1337,14 +1333,13 @@ def newline_and_indent_event(self, event): # open/close first need to find the last stmt lno = index2line(text.index('insert')) y = pyparse.Parser(self.indentwidth, self.tabwidth) - if not self.context_use_ps1: + if not self.prompt_last_line: for context in self.num_context_lines: startat = max(lno - context, 1) startatindex = repr(startat) + ".0" rawtext = text.get(startatindex, "insert") y.set_code(rawtext) bod = y.find_good_parse_start( - self.context_use_ps1, self._build_char_in_string_func(startatindex)) if bod is not None or startat == 1: break diff --git a/Lib/idlelib/hyperparser.py b/Lib/idlelib/hyperparser.py index 7e7e0ae80247..77baca782b3f 100644 --- a/Lib/idlelib/hyperparser.py +++ b/Lib/idlelib/hyperparser.py @@ -35,7 +35,7 @@ def index2line(index): return int(float(index)) lno = index2line(text.index(index)) - if not editwin.context_use_ps1: + if not editwin.prompt_last_line: for context in editwin.num_context_lines: startat = max(lno - context, 1) startatindex = repr(startat) + ".0" diff --git a/Lib/idlelib/idle_test/test_autocomplete.py b/Lib/idlelib/idle_test/test_autocomplete.py index 398cb359e093..6181b29ec250 100644 --- a/Lib/idlelib/idle_test/test_autocomplete.py +++ b/Lib/idlelib/idle_test/test_autocomplete.py @@ -19,7 +19,7 @@ def __init__(self, root, text): self.text = text self.indentwidth = 8 self.tabwidth = 8 - self.context_use_ps1 = True + self.prompt_last_line = '>>>' # Currently not used by autocomplete. class AutoCompleteTest(unittest.TestCase): diff --git a/Lib/idlelib/idle_test/test_hyperparser.py b/Lib/idlelib/idle_test/test_hyperparser.py index 8dbfc63779d3..343843c4166e 100644 --- a/Lib/idlelib/idle_test/test_hyperparser.py +++ b/Lib/idlelib/idle_test/test_hyperparser.py @@ -11,7 +11,7 @@ def __init__(self, text): self.text = text self.indentwidth = 8 self.tabwidth = 8 - self.context_use_ps1 = True + self.prompt_last_line = '>>>' self.num_context_lines = 50, 500, 1000 _build_char_in_string_func = EditorWindow._build_char_in_string_func @@ -53,7 +53,7 @@ def setUp(self): def tearDown(self): self.text.delete('1.0', 'end') - self.editwin.context_use_ps1 = True + self.editwin.prompt_last_line = '>>>' def get_parser(self, index): """ @@ -71,7 +71,7 @@ def test_init(self): self.assertIn('precedes', str(ve.exception)) # test without ps1 - self.editwin.context_use_ps1 = False + self.editwin.prompt_last_line = '' # number of lines lesser than 50 p = self.get_parser('end') diff --git a/Lib/idlelib/idle_test/test_parenmatch.py b/Lib/idlelib/idle_test/test_parenmatch.py index f58819abf112..4a41d8433d54 100644 --- a/Lib/idlelib/idle_test/test_parenmatch.py +++ b/Lib/idlelib/idle_test/test_parenmatch.py @@ -17,7 +17,7 @@ def __init__(self, text): self.text = text self.indentwidth = 8 self.tabwidth = 8 - self.context_use_ps1 = True + self.prompt_last_line = '>>>' # Currently not used by parenmatch. class ParenMatchTest(unittest.TestCase): diff --git a/Lib/idlelib/pyshell.py b/Lib/idlelib/pyshell.py index 2de42658b01c..6e0707d68bb6 100755 --- a/Lib/idlelib/pyshell.py +++ b/Lib/idlelib/pyshell.py @@ -881,7 +881,7 @@ def __init__(self, flist=None): self.usetabs = True # indentwidth must be 8 when using tabs. See note in EditorWindow: self.indentwidth = 8 - self.context_use_ps1 = True + self.sys_ps1 = sys.ps1 if hasattr(sys, 'ps1') else '>>> ' self.prompt_last_line = self.sys_ps1.split('\n')[-1] self.prompt = self.sys_ps1 # Changes when debug active diff --git a/Misc/NEWS.d/next/IDLE/2019-06-02-14-10-52.bpo-35610.0w_v6Y.rst b/Misc/NEWS.d/next/IDLE/2019-06-02-14-10-52.bpo-35610.0w_v6Y.rst new file mode 100644 index 000000000000..0042ab70497a --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-06-02-14-10-52.bpo-35610.0w_v6Y.rst @@ -0,0 +1,2 @@ +Replace now redundant .context_use_ps1 with .prompt_last_line. This finishes +change started in bpo-31858. From webhook-mailer at python.org Sun Jun 2 16:36:25 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Sun, 02 Jun 2019 20:36:25 -0000 Subject: [Python-checkins] bpo-37124: Fix reference leak in test_msilib (GH-13750) Message-ID: https://github.com/python/cpython/commit/c0295dba259accc4b247beb22a0b2cc2f31d9850 commit: c0295dba259accc4b247beb22a0b2cc2f31d9850 branch: master author: Pablo Galindo committer: GitHub date: 2019-06-02T21:36:21+01:00 summary: bpo-37124: Fix reference leak in test_msilib (GH-13750) files: M Lib/test/test_msilib.py diff --git a/Lib/test/test_msilib.py b/Lib/test/test_msilib.py index fa0be581613d..f9bd0da7498e 100644 --- a/Lib/test/test_msilib.py +++ b/Lib/test/test_msilib.py @@ -87,6 +87,7 @@ def test_directory_start_component_keyfile(self): db, db_path = init_database() self.addCleanup(unlink, db_path) self.addCleanup(db.Close) + self.addCleanup(msilib._directories.clear) feature = msilib.Feature(db, 0, 'Feature', 'A feature', 'Python') cab = msilib.CAB('CAB') dir = msilib.Directory(db, cab, None, TESTFN, 'TARGETDIR', From webhook-mailer at python.org Sun Jun 2 16:52:53 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Sun, 02 Jun 2019 20:52:53 -0000 Subject: [Python-checkins] Call PyObject_GC_UnTrack in structseq dealloc (GH-13751) Message-ID: https://github.com/python/cpython/commit/3caf4de6f05f68c3a175f4d8ce870d7a0016622a commit: 3caf4de6f05f68c3a175f4d8ce870d7a0016622a branch: master author: Pablo Galindo committer: GitHub date: 2019-06-02T21:52:49+01:00 summary: Call PyObject_GC_UnTrack in structseq dealloc (GH-13751) files: M Objects/structseq.c diff --git a/Objects/structseq.c b/Objects/structseq.c index 3d857f734be8..2c25e1646a2a 100644 --- a/Objects/structseq.c +++ b/Objects/structseq.c @@ -77,6 +77,7 @@ structseq_dealloc(PyStructSequence *obj) { Py_ssize_t i, size; PyTypeObject *tp; + PyObject_GC_UnTrack(obj); tp = (PyTypeObject *) Py_TYPE(obj); size = REAL_SIZE(obj); From webhook-mailer at python.org Sun Jun 2 17:01:53 2019 From: webhook-mailer at python.org (Ezio Melotti) Date: Sun, 02 Jun 2019 21:01:53 -0000 Subject: [Python-checkins] bpo-37014: Update docstring and Documentation of fileinput.FileInput(). (GH-13545) Message-ID: https://github.com/python/cpython/commit/aca273e2401ca3151e15e984f400233b7f255e15 commit: aca273e2401ca3151e15e984f400233b7f255e15 branch: master author: Michele Angrisano committer: Ezio Melotti date: 2019-06-02T23:01:49+02:00 summary: bpo-37014: Update docstring and Documentation of fileinput.FileInput(). (GH-13545) * bpo-37014: Update docstring and Documentation of fileinput.FileInput() * Explain the behavior of fileinput.FileInput() when reading stdin. * Update blurb. * bpo-37014: Fix typo in the docstring and documentation. files: M Doc/library/fileinput.rst M Lib/fileinput.py M Misc/ACKS diff --git a/Doc/library/fileinput.rst b/Doc/library/fileinput.rst index 14be492f55a6..f5e5280a1363 100644 --- a/Doc/library/fileinput.rst +++ b/Doc/library/fileinput.rst @@ -23,8 +23,9 @@ The typical use is:: This iterates over the lines of all files listed in ``sys.argv[1:]``, defaulting to ``sys.stdin`` if the list is empty. If a filename is ``'-'``, it is also -replaced by ``sys.stdin``. To specify an alternative list of filenames, pass it -as the first argument to :func:`.input`. A single file name is also allowed. +replaced by ``sys.stdin`` and the optional arguments *mode* and *openhook* +are ignored. To specify an alternative list of filenames, pass it as the +first argument to :func:`.input`. A single file name is also allowed. All files are opened in text mode by default, but you can override this by specifying the *mode* parameter in the call to :func:`.input` or diff --git a/Lib/fileinput.py b/Lib/fileinput.py index d868e74cd5e9..c1b0ec9a8ed0 100644 --- a/Lib/fileinput.py +++ b/Lib/fileinput.py @@ -8,9 +8,9 @@ This iterates over the lines of all files listed in sys.argv[1:], defaulting to sys.stdin if the list is empty. If a filename is '-' it -is also replaced by sys.stdin. To specify an alternative list of -filenames, pass it as the argument to input(). A single file name is -also allowed. +is also replaced by sys.stdin and the optional arguments mode and +openhook are ignored. To specify an alternative list of filenames, +pass it as the argument to input(). A single file name is also allowed. Functions filename(), lineno() return the filename and cumulative line number of the line that has just been read; filelineno() returns its diff --git a/Misc/ACKS b/Misc/ACKS index 5c23df8c5899..082fa567f23a 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -55,6 +55,7 @@ Juancarlo A?ez Chris Angelico J?r?my Anger Jon Anglin +Michele Angrisano Ankur Ankan Heidi Annexstad Ramchandra Apte From webhook-mailer at python.org Sun Jun 2 17:08:44 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Sun, 02 Jun 2019 21:08:44 -0000 Subject: [Python-checkins] bpo-36829: test_threading: Fix a ref cycle (GH-13752) Message-ID: https://github.com/python/cpython/commit/cdce0574d03005e27b843fc110c54c99c7a76412 commit: cdce0574d03005e27b843fc110c54c99c7a76412 branch: master author: Victor Stinner committer: GitHub date: 2019-06-02T23:08:41+02:00 summary: bpo-36829: test_threading: Fix a ref cycle (GH-13752) files: M Lib/test/test_threading.py diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index 8c8cc128b051..6ac4ea9623de 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -1140,7 +1140,11 @@ def test_excepthook_thread_None(self): raise ValueError("bug") except Exception as exc: args = threading.ExceptHookArgs([*sys.exc_info(), None]) - threading.excepthook(args) + try: + threading.excepthook(args) + finally: + # Explicitly break a reference cycle + args = None stderr = stderr.getvalue().strip() self.assertIn(f'Exception in thread {threading.get_ident()}:\n', stderr) From webhook-mailer at python.org Sun Jun 2 17:11:27 2019 From: webhook-mailer at python.org (Petr Viktorin) Date: Sun, 02 Jun 2019 21:11:27 -0000 Subject: [Python-checkins] test_gdb.test_pycfunction: test more calling conventions (GH-13668) Message-ID: https://github.com/python/cpython/commit/64e2c64f7f0111c52834155becc0c6134f9d8750 commit: 64e2c64f7f0111c52834155becc0c6134f9d8750 branch: master author: Petr Viktorin committer: GitHub date: 2019-06-02T23:11:24+02:00 summary: test_gdb.test_pycfunction: test more calling conventions (GH-13668) As the code paths for various METH_* conventions are diverging due to optimizations, we should check they continue to be covered by GDB integration. files: M Lib/test/test_gdb.py diff --git a/Lib/test/test_gdb.py b/Lib/test/test_gdb.py index 3127e69ca9ba..f57e348b6c14 100644 --- a/Lib/test/test_gdb.py +++ b/Lib/test/test_gdb.py @@ -867,27 +867,40 @@ def test_gc(self): # unless we add LD_PRELOAD=PATH-TO-libpthread.so.1 as a workaround def test_pycfunction(self): 'Verify that "py-bt" displays invocations of PyCFunction instances' - # Tested function must not be defined with METH_NOARGS or METH_O, - # otherwise call_function() doesn't call PyCFunction_Call() - cmd = ('from time import gmtime\n' - 'def foo():\n' - ' gmtime(1)\n' - 'def bar():\n' - ' foo()\n' - 'bar()\n') - # Verify with "py-bt": - gdb_output = self.get_stack_trace(cmd, - breakpoint='time_gmtime', - cmds_after_breakpoint=['bt', 'py-bt'], - ) - self.assertIn(' https://github.com/python/cpython/commit/e1179a5096fb12297ececd7a1c79969aa5747e28 commit: e1179a5096fb12297ececd7a1c79969aa5747e28 branch: master author: Michele Angrisano committer: Ezio Melotti date: 2019-06-02T23:34:12+02:00 summary: bpo-19184: Update the documentation of dis module. (GH-13652) * bpo-19184: Update the documentation of dis module * Explain the behavior of the number of arguments of RAISE_VARGARGS opcode. * bpo-19184: Update blurb. * bpo-19184: Fix typo in the dis Documentation. * bpo-19184: Address review comments and improve the doc * bpo-19184: Remove news file. files: M Doc/library/dis.rst diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index 060d4bb6997a..15e707ae49f8 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -1113,9 +1113,13 @@ All of the following opcodes use their arguments. .. opcode:: RAISE_VARARGS (argc) - Raises an exception. *argc* indicates the number of arguments to the raise - statement, ranging from 0 to 3. The handler will find the traceback as TOS2, - the parameter as TOS1, and the exception as TOS. + Raises an exception using one of the 3 forms of the ``raise`` statement, + depending on the value of *argc*: + + * 0: ``raise`` (re-raise previous exception) + * 1: ``raise TOS`` (raise exception instance or type at ``TOS``) + * 2: ``raise TOS1 from TOS`` (raise exception instance or type at ``TOS1`` + with ``__cause__`` set to ``TOS``) .. opcode:: CALL_FUNCTION (argc) From webhook-mailer at python.org Sun Jun 2 17:36:38 2019 From: webhook-mailer at python.org (Ezio Melotti) Date: Sun, 02 Jun 2019 21:36:38 -0000 Subject: [Python-checkins] bpo-37014: Update docstring and Documentation of fileinput.FileInput(). (GH-13545) (GH-13753) Message-ID: https://github.com/python/cpython/commit/6bd438e137a0618b8db949a4751304f541b6674d commit: 6bd438e137a0618b8db949a4751304f541b6674d branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Ezio Melotti date: 2019-06-02T23:36:34+02:00 summary: bpo-37014: Update docstring and Documentation of fileinput.FileInput(). (GH-13545) (GH-13753) * bpo-37014: Update docstring and Documentation of fileinput.FileInput() * Explain the behavior of fileinput.FileInput() when reading stdin. * Update blurb. * bpo-37014: Fix typo in the docstring and documentation. (cherry picked from commit aca273e2401ca3151e15e984f400233b7f255e15) Co-authored-by: Michele Angrisano files: M Doc/library/fileinput.rst M Lib/fileinput.py M Misc/ACKS diff --git a/Doc/library/fileinput.rst b/Doc/library/fileinput.rst index 1fc11ffce25e..bf81749f9456 100644 --- a/Doc/library/fileinput.rst +++ b/Doc/library/fileinput.rst @@ -23,8 +23,9 @@ The typical use is:: This iterates over the lines of all files listed in ``sys.argv[1:]``, defaulting to ``sys.stdin`` if the list is empty. If a filename is ``'-'``, it is also -replaced by ``sys.stdin``. To specify an alternative list of filenames, pass it -as the first argument to :func:`.input`. A single file name is also allowed. +replaced by ``sys.stdin`` and the optional arguments *mode* and *openhook* +are ignored. To specify an alternative list of filenames, pass it as the +first argument to :func:`.input`. A single file name is also allowed. All files are opened in text mode by default, but you can override this by specifying the *mode* parameter in the call to :func:`.input` or diff --git a/Lib/fileinput.py b/Lib/fileinput.py index c6fc9a1981a1..c8b8b23674c9 100644 --- a/Lib/fileinput.py +++ b/Lib/fileinput.py @@ -8,9 +8,9 @@ This iterates over the lines of all files listed in sys.argv[1:], defaulting to sys.stdin if the list is empty. If a filename is '-' it -is also replaced by sys.stdin. To specify an alternative list of -filenames, pass it as the argument to input(). A single file name is -also allowed. +is also replaced by sys.stdin and the optional arguments mode and +openhook are ignored. To specify an alternative list of filenames, +pass it as the argument to input(). A single file name is also allowed. Functions filename(), lineno() return the filename and cumulative line number of the line that has just been read; filelineno() returns its diff --git a/Misc/ACKS b/Misc/ACKS index 40e799088645..f7fc70afd173 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -55,6 +55,7 @@ Juancarlo A?ez Chris Angelico J?r?my Anger Jon Anglin +Michele Angrisano Ankur Ankan Heidi Annexstad Ramchandra Apte From webhook-mailer at python.org Sun Jun 2 17:52:23 2019 From: webhook-mailer at python.org (Petr Viktorin) Date: Sun, 02 Jun 2019 21:52:23 -0000 Subject: [Python-checkins] bpo-36974: Make tp_call=PyVectorcall_Call work for inherited types (GH-13699) Message-ID: https://github.com/python/cpython/commit/fb9423fd0a85f06affb8c3a8f25dd598a649aa42 commit: fb9423fd0a85f06affb8c3a8f25dd598a649aa42 branch: master author: Petr Viktorin committer: GitHub date: 2019-06-02T23:52:20+02:00 summary: bpo-36974: Make tp_call=PyVectorcall_Call work for inherited types (GH-13699) When inheriting a heap subclass from a vectorcall class that sets `.tp_call=PyVectorcall_Call` (as recommended in PEP 590), the subclass does not inherit `_Py_TPFLAGS_HAVE_VECTORCALL`, and thus `PyVectorcall_Call` does not work for it. This attempts to solve the issue by: * always inheriting `tp_vectorcall_offset` unless `tp_call` is overridden in the subclass * inheriting _Py_TPFLAGS_HAVE_VECTORCALL for static types, unless `tp_call` is overridden * making `PyVectorcall_Call` ignore `_Py_TPFLAGS_HAVE_VECTORCALL` This means it'll be ever more important to only call `PyVectorcall_Call` on classes that support vectorcall. In `PyVectorcall_Call`'s intended role as `tp_call` filler, that's not a problem. files: M Lib/test/test_capi.py M Modules/_testcapimodule.c M Objects/call.c M Objects/typeobject.c diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index fabc821e5c3a..88bda057ed6a 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -515,9 +515,10 @@ def test_vectorcall_override(self): def test_vectorcall(self): # Test a bunch of different ways to call objects: - # 1. normal call - # 2. vectorcall using _PyObject_Vectorcall() - # 3. vectorcall using PyVectorcall_Call() + # 1. vectorcall using PyVectorcall_Call() + # (only for objects that support vectorcall directly) + # 2. normal call + # 3. vectorcall using _PyObject_Vectorcall() # 4. call as bound method # 5. call using functools.partial @@ -541,6 +542,27 @@ def vectorcall(func, args, kwargs): kwnames = tuple(kwargs) return pyobject_vectorcall(func, args, kwnames) + for (func, args, kwargs, expected) in calls: + with self.subTest(str(func)): + if not kwargs: + self.assertEqual(expected, pyvectorcall_call(func, args)) + self.assertEqual(expected, pyvectorcall_call(func, args, kwargs)) + + # Add derived classes (which do not support vectorcall directly, + # but do support all other ways of calling). + + class MethodDescriptorHeap(_testcapi.MethodDescriptorBase): + pass + + class MethodDescriptorOverridden(_testcapi.MethodDescriptorBase): + def __call__(self, n): + return 'new' + + calls += [ + (MethodDescriptorHeap(), (0,), {}, True), + (MethodDescriptorOverridden(), (0,), {}, 'new'), + ] + for (func, args, kwargs, expected) in calls: with self.subTest(str(func)): args1 = args[1:] @@ -549,12 +571,10 @@ def vectorcall(func, args, kwargs): if not kwargs: self.assertEqual(expected, func(*args)) self.assertEqual(expected, pyobject_vectorcall(func, args, None)) - self.assertEqual(expected, pyvectorcall_call(func, args)) self.assertEqual(expected, meth(*args1)) self.assertEqual(expected, wrapped(*args)) self.assertEqual(expected, func(*args, **kwargs)) self.assertEqual(expected, vectorcall(func, args, kwargs)) - self.assertEqual(expected, pyvectorcall_call(func, args, kwargs)) self.assertEqual(expected, meth(*args1, **kwargs)) self.assertEqual(expected, wrapped(*args, **kwargs)) diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index bf20e81a4ce8..eed34c9802c3 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -5854,7 +5854,7 @@ MethodDescriptor_vectorcall(PyObject *callable, PyObject *const *args, static PyObject * MethodDescriptor_new(PyTypeObject* type, PyObject* args, PyObject *kw) { - MethodDescriptorObject *op = PyObject_New(MethodDescriptorObject, type); + MethodDescriptorObject *op = type->tp_alloc(type, 0); op->vectorcall = MethodDescriptor_vectorcall; return (PyObject *)op; } diff --git a/Objects/call.c b/Objects/call.c index c0d14567e430..578e1b3ab619 100644 --- a/Objects/call.c +++ b/Objects/call.c @@ -173,12 +173,22 @@ _PyObject_MakeTpCall(PyObject *callable, PyObject *const *args, Py_ssize_t nargs PyObject * PyVectorcall_Call(PyObject *callable, PyObject *tuple, PyObject *kwargs) { - vectorcallfunc func = _PyVectorcall_Function(callable); + /* get vectorcallfunc as in _PyVectorcall_Function, but without + * the _Py_TPFLAGS_HAVE_VECTORCALL check */ + Py_ssize_t offset = Py_TYPE(callable)->tp_vectorcall_offset; + if ((offset <= 0) || (!Py_TYPE(callable)->tp_call)) { + PyErr_Format(PyExc_TypeError, "'%.200s' object does not support vectorcall", + Py_TYPE(callable)->tp_name); + return NULL; + } + vectorcallfunc func = *(vectorcallfunc *)(((char *)callable) + offset); if (func == NULL) { PyErr_Format(PyExc_TypeError, "'%.200s' object does not support vectorcall", Py_TYPE(callable)->tp_name); return NULL; } + + /* Convert arguments & call */ PyObject *const *args; Py_ssize_t nargs = PyTuple_GET_SIZE(tuple); PyObject *kwnames; diff --git a/Objects/typeobject.c b/Objects/typeobject.c index b6d925c1442e..76e06aa31d64 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -5145,17 +5145,21 @@ inherit_slots(PyTypeObject *type, PyTypeObject *base) } COPYSLOT(tp_repr); /* tp_hash see tp_richcompare */ - COPYSLOT(tp_call); - /* Inherit tp_vectorcall_offset and _Py_TPFLAGS_HAVE_VECTORCALL if tp_call - * was inherited, but only for extension types */ - if ((base->tp_flags & _Py_TPFLAGS_HAVE_VECTORCALL) && - !(type->tp_flags & _Py_TPFLAGS_HAVE_VECTORCALL) && - !(type->tp_flags & Py_TPFLAGS_HEAPTYPE) && - base->tp_call && - type->tp_call == base->tp_call) { - type->tp_vectorcall_offset = base->tp_vectorcall_offset; - type->tp_flags |= _Py_TPFLAGS_HAVE_VECTORCALL; + /* Inherit tp_vectorcall_offset only if tp_call is not overridden */ + if (!type->tp_call) { + COPYSLOT(tp_vectorcall_offset); + } + /* Inherit_Py_TPFLAGS_HAVE_VECTORCALL for non-heap types + * if tp_call is not overridden */ + if (!type->tp_call && + (base->tp_flags & _Py_TPFLAGS_HAVE_VECTORCALL) && + !(type->tp_flags & _Py_TPFLAGS_HAVE_VECTORCALL) && + !(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) + { + type->tp_flags |= _Py_TPFLAGS_HAVE_VECTORCALL; + } + COPYSLOT(tp_call); } COPYSLOT(tp_str); { From webhook-mailer at python.org Sun Jun 2 18:45:57 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 02 Jun 2019 22:45:57 -0000 Subject: [Python-checkins] bpo-35621: Fix tests when SafeChildWatcher is expected instead of ThreadedChildWatcher (GH-13754) Message-ID: https://github.com/python/cpython/commit/c6789d6c85a290a35f3839efb52a3d34536dcebe commit: c6789d6c85a290a35f3839efb52a3d34536dcebe branch: master author: Andrew Svetlov committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-06-02T15:45:54-07:00 summary: bpo-35621: Fix tests when SafeChildWatcher is expected instead of ThreadedChildWatcher (GH-13754) https://bugs.python.org/issue35621 files: M Lib/test/test_asyncio/test_unix_events.py diff --git a/Lib/test/test_asyncio/test_unix_events.py b/Lib/test/test_asyncio/test_unix_events.py index f7f992fcea49..462a8b3c7859 100644 --- a/Lib/test/test_asyncio/test_unix_events.py +++ b/Lib/test/test_asyncio/test_unix_events.py @@ -1836,6 +1836,7 @@ def f(): policy.get_event_loop().close() policy = self.create_policy() + policy.set_child_watcher(asyncio.SafeChildWatcher()) th = threading.Thread(target=f) th.start() From webhook-mailer at python.org Sun Jun 2 19:08:18 2019 From: webhook-mailer at python.org (Petr Viktorin) Date: Sun, 02 Jun 2019 23:08:18 -0000 Subject: [Python-checkins] bpo-36027 bpo-36974: Fix "incompatible pointer type" compiler warnings (GH-13758) Message-ID: https://github.com/python/cpython/commit/e584cbff1ea78e700cf9943d50467e3b58301ccc commit: e584cbff1ea78e700cf9943d50467e3b58301ccc branch: master author: Petr Viktorin committer: GitHub date: 2019-06-03T01:08:14+02:00 summary: bpo-36027 bpo-36974: Fix "incompatible pointer type" compiler warnings (GH-13758) files: M Modules/_testcapimodule.c M Objects/longobject.c diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index eed34c9802c3..40e0826ce126 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -5854,7 +5854,7 @@ MethodDescriptor_vectorcall(PyObject *callable, PyObject *const *args, static PyObject * MethodDescriptor_new(PyTypeObject* type, PyObject* args, PyObject *kw) { - MethodDescriptorObject *op = type->tp_alloc(type, 0); + MethodDescriptorObject *op = (MethodDescriptorObject *)type->tp_alloc(type, 0); op->vectorcall = MethodDescriptor_vectorcall; return (PyObject *)op; } diff --git a/Objects/longobject.c b/Objects/longobject.c index 49f1420bf64f..858e256ac0b4 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -4243,7 +4243,7 @@ long_invmod(PyLongObject *a, PyLongObject *n) Py_DECREF(c); Py_DECREF(n); - if (long_compare(a, _PyLong_One)) { + if (long_compare(a, (PyObject *)_PyLong_One)) { /* a != 1; we don't have an inverse. */ Py_DECREF(a); Py_DECREF(b); From webhook-mailer at python.org Sun Jun 2 19:12:36 2019 From: webhook-mailer at python.org (Petr Viktorin) Date: Sun, 02 Jun 2019 23:12:36 -0000 Subject: [Python-checkins] Fix typos in docs and docstrings (GH-13745) Message-ID: https://github.com/python/cpython/commit/0d70227e419ab78c44d81b4ea6ae8aaf769470e6 commit: 0d70227e419ab78c44d81b4ea6ae8aaf769470e6 branch: master author: Xtreak committer: Petr Viktorin date: 2019-06-03T01:12:33+02:00 summary: Fix typos in docs and docstrings (GH-13745) files: M Doc/library/dis.rst M Doc/using/windows.rst M Doc/whatsnew/3.8.rst M Lib/asyncio/unix_events.py M Lib/bdb.py M Lib/distutils/ccompiler.py M Lib/email/_header_value_parser.py M Lib/encodings/__init__.py M Lib/lib2to3/fixes/fix_metaclass.py M Lib/pstats.py M Lib/pyclbr.py M Lib/ssl.py M Lib/turtle.py M Lib/turtledemo/paint.py M Lib/zipfile.py diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index 15e707ae49f8..2a3ffb5e8271 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -708,7 +708,7 @@ iterations of the loop. Cleans up the value stack and the block stack. If *preserve_tos* is not ``0`` TOS first is popped from the stack and pushed on the stack after - perfoming other stack operations: + performing other stack operations: * If TOS is ``NULL`` or an integer (pushed by :opcode:`BEGIN_FINALLY` or :opcode:`CALL_FINALLY`) it is popped from the stack. diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index a1b25ffd25f0..462e4c2b6c63 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -815,7 +815,7 @@ Customizing default Python versions In some cases, a version qualifier can be included in a command to dictate which version of Python will be used by the command. A version qualifier starts with a major version number and can optionally be followed by a period -('.') and a minor version specifier. Furthermore it is possible to specifiy +('.') and a minor version specifier. Furthermore it is possible to specify if a 32 or 64 bit implementation shall be requested by adding "-32" or "-64". For example, a shebang line of ``#!python`` has no version qualifier, while diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 74d0079a53db..e9c9c814c69a 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -1286,7 +1286,7 @@ Changes in the C API (Contributed by Zackery Spytz in :issue:`33407`.) * The interpreter does not pretend to support binary compatibility of - extension types accross feature releases, anymore. A :c:type:`PyTypeObject` + extension types across feature releases, anymore. A :c:type:`PyTypeObject` exported by a third-party extension module is supposed to have all the slots expected in the current Python version, including :c:member:`~PyTypeObject.tp_finalize` (:const:`Py_TPFLAGS_HAVE_FINALIZE` diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py index 6714542e4e33..b943845d9363 100644 --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -193,7 +193,7 @@ def _make_write_pipe_transport(self, pipe, protocol, waiter=None, # prevents subprocess execution if the watcher # is not ready to handle it. raise RuntimeError("asyncio.get_child_watcher() is not activated, " - "subproccess support is not installed.") + "subprocess support is not installed.") waiter = self.create_future() transp = _UnixSubprocessTransport(self, protocol, args, shell, stdin, stdout, stderr, bufsize, diff --git a/Lib/bdb.py b/Lib/bdb.py index 69174364c46a..96e7d18d718d 100644 --- a/Lib/bdb.py +++ b/Lib/bdb.py @@ -384,7 +384,7 @@ def set_break(self, filename, lineno, temporary=False, cond=None, return None def _prune_breaks(self, filename, lineno): - """Prune breakpoints for filname:lineno. + """Prune breakpoints for filename:lineno. A list of breakpoints is maintained in the Bdb instance and in the Breakpoint class. If a breakpoint in the Bdb instance no diff --git a/Lib/distutils/ccompiler.py b/Lib/distutils/ccompiler.py index b71d1d39bcda..1a411ed11132 100644 --- a/Lib/distutils/ccompiler.py +++ b/Lib/distutils/ccompiler.py @@ -545,7 +545,7 @@ def compile(self, sources, output_dir=None, macros=None, 'extra_preargs' and 'extra_postargs' are implementation- dependent. On platforms that have the notion of a command-line (e.g. Unix, DOS/Windows), they are most likely lists of strings: extra - command-line arguments to prepand/append to the compiler command + command-line arguments to prepend/append to the compiler command line. On other platforms, consult the implementation class documentation. In any event, they are intended as an escape hatch for those occasions when the abstract compiler framework doesn't diff --git a/Lib/email/_header_value_parser.py b/Lib/email/_header_value_parser.py index 649f1539fa02..14cc00c61e07 100644 --- a/Lib/email/_header_value_parser.py +++ b/Lib/email/_header_value_parser.py @@ -2385,7 +2385,7 @@ def parse_mime_parameters(value): the formal RFC grammar, but it is more convenient for us for the set of parameters to be treated as its own TokenList. - This is 'parse' routine because it consumes the reminaing value, but it + This is 'parse' routine because it consumes the remaining value, but it would never be called to parse a full header. Instead it is called to parse everything after the non-parameter value of a specific MIME header. diff --git a/Lib/encodings/__init__.py b/Lib/encodings/__init__.py index d737d5339dce..ddd5afdcf2da 100644 --- a/Lib/encodings/__init__.py +++ b/Lib/encodings/__init__.py @@ -12,7 +12,7 @@ * getregentry() -> codecs.CodecInfo object The getregentry() API must return a CodecInfo object with encoder, decoder, incrementalencoder, incrementaldecoder, streamwriter and streamreader - atttributes which adhere to the Python Codec Interface Standard. + attributes which adhere to the Python Codec Interface Standard. In addition, a module may optionally also define the following APIs which are then used by the package's codec search function: diff --git a/Lib/lib2to3/fixes/fix_metaclass.py b/Lib/lib2to3/fixes/fix_metaclass.py index 8e34463bd8ab..d1cd10d32758 100644 --- a/Lib/lib2to3/fixes/fix_metaclass.py +++ b/Lib/lib2to3/fixes/fix_metaclass.py @@ -1,6 +1,6 @@ """Fixer for __metaclass__ = X -> (metaclass=X) methods. - The various forms of classef (inherits nothing, inherits once, inherints + The various forms of classef (inherits nothing, inherits once, inherits many) don't parse the same in the CST so we look at ALL classes for a __metaclass__ and if we find one normalize the inherits to all be an arglist. diff --git a/Lib/pstats.py b/Lib/pstats.py index b7649ebc6f1c..4b419a8ecdb6 100644 --- a/Lib/pstats.py +++ b/Lib/pstats.py @@ -632,12 +632,12 @@ def do_EOF(self, line): print("", file=self.stream) return 1 def help_EOF(self): - print("Leave the profile brower.", file=self.stream) + print("Leave the profile browser.", file=self.stream) def do_quit(self, line): return 1 def help_quit(self): - print("Leave the profile brower.", file=self.stream) + print("Leave the profile browser.", file=self.stream) def do_read(self, line): if line: diff --git a/Lib/pyclbr.py b/Lib/pyclbr.py index 8fd0523b7e3b..99a17343fb61 100644 --- a/Lib/pyclbr.py +++ b/Lib/pyclbr.py @@ -50,7 +50,7 @@ class _Object: - "Informaton about Python class or function." + "Information about Python class or function." def __init__(self, module, name, file, lineno, parent): self.module = module self.name = name diff --git a/Lib/ssl.py b/Lib/ssl.py index f5fa6aeec2d2..4afa46e5da5c 100644 --- a/Lib/ssl.py +++ b/Lib/ssl.py @@ -862,7 +862,7 @@ def server_side(self): @property def server_hostname(self): """The currently set server hostname (for SNI), or ``None`` if no - server hostame is set.""" + server hostname is set.""" return self._sslobj.server_hostname def read(self, len=1024, buffer=None): diff --git a/Lib/turtle.py b/Lib/turtle.py index 044d91cf6d83..ee67a351b54f 100644 --- a/Lib/turtle.py +++ b/Lib/turtle.py @@ -833,7 +833,7 @@ def numinput(self, title, prompt, default=None, minval=None, maxval=None): Arguments: title is the title of the dialog window, prompt is a text mostly describing what numerical information to input. default: default value - minval: minimum value for imput + minval: minimum value for input maxval: maximum value for input The number input must be in the range minval .. maxval if these are diff --git a/Lib/turtledemo/paint.py b/Lib/turtledemo/paint.py index dde16912dfed..fc6852a20082 100755 --- a/Lib/turtledemo/paint.py +++ b/Lib/turtledemo/paint.py @@ -7,7 +7,7 @@ - left mouse button moves turtle - middle mouse button changes color -- right mouse button toogles betweem pen up +- right mouse button toggles between pen up (no line drawn when the turtle moves) and pen down (line is drawn). If pen up follows at least two pen-down moves, the polygon that diff --git a/Lib/zipfile.py b/Lib/zipfile.py index 5496f6eb1867..62f2fd27d3ce 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -2163,7 +2163,7 @@ class Path: >>> (b / 'missing.txt').exists() False - Coersion to string: + Coercion to string: >>> str(c) 'abcde.zip/b/c.txt' From webhook-mailer at python.org Sun Jun 2 19:18:54 2019 From: webhook-mailer at python.org (Ezio Melotti) Date: Sun, 02 Jun 2019 23:18:54 -0000 Subject: [Python-checkins] bpo-19184: Update the documentation of dis module. (GH-13652) (GH-13755) Message-ID: https://github.com/python/cpython/commit/9390e98c3ed9eb9fa414030a2feec1926193af94 commit: 9390e98c3ed9eb9fa414030a2feec1926193af94 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Ezio Melotti date: 2019-06-03T01:18:50+02:00 summary: bpo-19184: Update the documentation of dis module. (GH-13652) (GH-13755) * bpo-19184: Update the documentation of dis module * Explain the behavior of the number of arguments of RAISE_VARGARGS opcode. * bpo-19184: Update blurb. * bpo-19184: Fix typo in the dis Documentation. * bpo-19184: Address review comments and improve the doc * bpo-19184: Remove news file. (cherry picked from commit e1179a5096fb12297ececd7a1c79969aa5747e28) Co-authored-by: Michele Angrisano files: M Doc/library/dis.rst diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index 6bbef3844de5..b8cf4463d935 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -1059,9 +1059,13 @@ All of the following opcodes use their arguments. .. opcode:: RAISE_VARARGS (argc) - Raises an exception. *argc* indicates the number of arguments to the raise - statement, ranging from 0 to 3. The handler will find the traceback as TOS2, - the parameter as TOS1, and the exception as TOS. + Raises an exception using one of the 3 forms of the ``raise`` statement, + depending on the value of *argc*: + + * 0: ``raise`` (re-raise previous exception) + * 1: ``raise TOS`` (raise exception instance or type at ``TOS``) + * 2: ``raise TOS1 from TOS`` (raise exception instance or type at ``TOS1`` + with ``__cause__`` set to ``TOS``) .. opcode:: CALL_FUNCTION (argc) From webhook-mailer at python.org Sun Jun 2 19:31:16 2019 From: webhook-mailer at python.org (Petr Viktorin) Date: Sun, 02 Jun 2019 23:31:16 -0000 Subject: [Python-checkins] bpo-37012: Clean up special cases in PyType_FromSpecWithBases slot assignments (GH-13496) Message-ID: https://github.com/python/cpython/commit/7f4ae1b2cc60cb69938e7c88793b9e9a2dd36d93 commit: 7f4ae1b2cc60cb69938e7c88793b9e9a2dd36d93 branch: master author: Petr Viktorin committer: GitHub date: 2019-06-03T01:31:12+02:00 summary: bpo-37012: Clean up special cases in PyType_FromSpecWithBases slot assignments (GH-13496) The main slot assignment loop is now if-else if ladder, making the control flow clearer. Based on suggestion by Victor Stinner in: https://github.com/python/cpython/pull/10304/#issuecomment-491123026 files: M Objects/typeobject.c diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 76e06aa31d64..beb0ddd82400 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -2941,14 +2941,13 @@ PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) PyErr_SetString(PyExc_RuntimeError, "invalid slot offset"); goto fail; } - if (slot->slot == Py_tp_base || slot->slot == Py_tp_bases) + else if (slot->slot == Py_tp_base || slot->slot == Py_tp_bases) { /* Processed above */ continue; - *(void**)(res_start + slotoffsets[slot->slot]) = slot->pfunc; - - /* need to make a copy of the docstring slot, which usually - points to a static string literal */ - if (slot->slot == Py_tp_doc) { + } + else if (slot->slot == Py_tp_doc) { + /* For the docstring slot, which usually points to a static string + literal, we need to make a copy */ const char *old_doc = _PyType_DocWithoutSignature(type->tp_name, slot->pfunc); size_t len = strlen(old_doc)+1; char *tp_doc = PyObject_MALLOC(len); @@ -2960,13 +2959,16 @@ PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) memcpy(tp_doc, old_doc, len); type->tp_doc = tp_doc; } - - /* Move the slots to the heap type itself */ - if (slot->slot == Py_tp_members) { + else if (slot->slot == Py_tp_members) { + /* Move the slots to the heap type itself */ size_t len = Py_TYPE(type)->tp_itemsize * nmembers; memcpy(PyHeapType_GET_MEMBERS(res), slot->pfunc, len); type->tp_members = PyHeapType_GET_MEMBERS(res); } + else { + /* Copy other slots directly */ + *(void**)(res_start + slotoffsets[slot->slot]) = slot->pfunc; + } } if (type->tp_dealloc == NULL) { /* It's a heap type, so needs the heap types' dealloc. From webhook-mailer at python.org Sun Jun 2 19:35:40 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Sun, 02 Jun 2019 23:35:40 -0000 Subject: [Python-checkins] bpo-37100: Fix test_coroutines with -Werror (GH-13756) Message-ID: https://github.com/python/cpython/commit/3cf7ea1272fbc921a89acdbe40ca152813028cb5 commit: 3cf7ea1272fbc921a89acdbe40ca152813028cb5 branch: master author: Victor Stinner committer: GitHub date: 2019-06-03T01:35:37+02:00 summary: bpo-37100: Fix test_coroutines with -Werror (GH-13756) test_coroutines: test_unawaited_warning_when_module_broken() now uses support.check_warnings() to catch expected RuntimeWarning. files: M Lib/test/test_coroutines.py diff --git a/Lib/test/test_coroutines.py b/Lib/test/test_coroutines.py index 0e7eb3a1af47..b406b1c3ebf8 100644 --- a/Lib/test/test_coroutines.py +++ b/Lib/test/test_coroutines.py @@ -2250,7 +2250,8 @@ def test_unawaited_warning_when_module_broken(self): try: warnings._warn_unawaited_coroutine = lambda coro: 1/0 with support.catch_unraisable_exception() as cm, \ - support.captured_stderr() as stream: + support.check_warnings((r'coroutine .* was never awaited', + RuntimeWarning)): # only store repr() to avoid keeping the coroutine alive coro = corofn() coro_repr = repr(coro) @@ -2261,13 +2262,12 @@ def test_unawaited_warning_when_module_broken(self): self.assertEqual(repr(cm.unraisable.object), coro_repr) self.assertEqual(cm.unraisable.exc_type, ZeroDivisionError) - self.assertIn("was never awaited", stream.getvalue()) del warnings._warn_unawaited_coroutine - with support.captured_stderr() as stream: + with support.check_warnings((r'coroutine .* was never awaited', + RuntimeWarning)): corofn() support.gc_collect() - self.assertIn("was never awaited", stream.getvalue()) finally: warnings._warn_unawaited_coroutine = orig_wuc From webhook-mailer at python.org Sun Jun 2 19:41:03 2019 From: webhook-mailer at python.org (Ivan Levkivskyi) Date: Sun, 02 Jun 2019 23:41:03 -0000 Subject: [Python-checkins] Update the annotated assignment docs (GH-13757) Message-ID: https://github.com/python/cpython/commit/82eac26a73107ded733110cf11e59e95f41c197e commit: 82eac26a73107ded733110cf11e59e95f41c197e branch: master author: Ivan Levkivskyi committer: GitHub date: 2019-06-03T00:41:00+01:00 summary: Update the annotated assignment docs (GH-13757) files: M Doc/reference/simple_stmts.rst diff --git a/Doc/reference/simple_stmts.rst b/Doc/reference/simple_stmts.rst index af7c0caff627..9c0430da1fb2 100644 --- a/Doc/reference/simple_stmts.rst +++ b/Doc/reference/simple_stmts.rst @@ -329,7 +329,8 @@ Annotated assignment statements statement, of a variable or attribute annotation and an optional assignment statement: .. productionlist:: - annotated_assignment_stmt: `augtarget` ":" `expression` ["=" `expression`] + annotated_assignment_stmt: `augtarget` ":" `expression` + : ["=" (`expression_list` | `yield_expression`)] The difference from normal :ref:`assignment` is that only single target and only single right hand side value is allowed. @@ -366,6 +367,11 @@ target, then the interpreter evaluates the target except for the last syntax for type annotations that can be used in static analysis tools and IDEs. +.. versionchanged:: 3.8 + Now annotated assignments allow same expressions in the right hand side as + the augmented assignments. Previously, some expressions (like un-parenthesized + tuple expressions) caused a syntax error. + .. _assert: From webhook-mailer at python.org Sun Jun 2 19:43:17 2019 From: webhook-mailer at python.org (Petr Viktorin) Date: Sun, 02 Jun 2019 23:43:17 -0000 Subject: [Python-checkins] bpo-36974: document PEP 590 (GH-13450) Message-ID: https://github.com/python/cpython/commit/9e3e06e582accec82eb29cf665c3b4c7d84d2eb0 commit: 9e3e06e582accec82eb29cf665c3b4c7d84d2eb0 branch: master author: Jeroen Demeyer committer: Petr Viktorin date: 2019-06-03T01:43:13+02:00 summary: bpo-36974: document PEP 590 (GH-13450) files: M Doc/c-api/object.rst M Doc/c-api/typeobj.rst M Doc/includes/typestruct.h M Doc/whatsnew/3.8.rst diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst index ffc35241e7a4..ce0d05942f4e 100644 --- a/Doc/c-api/object.rst +++ b/Doc/c-api/object.rst @@ -335,6 +335,83 @@ Object Protocol *NULL* on failure. +.. c:function:: PyObject* _PyObject_Vectorcall(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwnames) + + Call a callable Python object *callable*, using + :c:data:`vectorcall ` if possible. + + *args* is a C array with the positional arguments. + + *nargsf* is the number of positional arguments plus optionally the flag + :const:`PY_VECTORCALL_ARGUMENTS_OFFSET` (see below). + To get actual number of arguments, use + :c:func:`PyVectorcall_NARGS(nargsf) `. + + *kwnames* can be either NULL (no keyword arguments) or a tuple of keyword + names. In the latter case, the values of the keyword arguments are stored + in *args* after the positional arguments. + The number of keyword arguments does not influence *nargsf*. + + *kwnames* must contain only objects of type ``str`` (not a subclass), + and all keys must be unique. + + Return the result of the call on success, or *NULL* on failure. + + This uses the vectorcall protocol if the callable supports it; + otherwise, the arguments are converted to use + :c:member:`~PyTypeObject.tp_call`. + + .. note:: + + This function is provisional and expected to become public in Python 3.9, + with a different name and, possibly, changed semantics. + If you use the function, plan for updating your code for Python 3.9. + + .. versionadded:: 3.8 + +.. c:var:: PY_VECTORCALL_ARGUMENTS_OFFSET + + If set in a vectorcall *nargsf* argument, the callee is allowed to + temporarily change ``args[-1]``. In other words, *args* points to + argument 1 (not 0) in the allocated vector. + The callee must restore the value of ``args[-1]`` before returning. + + Whenever they can do so cheaply (without additional allocation), callers + are encouraged to use :const:`PY_VECTORCALL_ARGUMENTS_OFFSET`. + Doing so will allow callables such as bound methods to make their onward + calls (which include a prepended *self* argument) cheaply. + + .. versionadded:: 3.8 + +.. c:function:: Py_ssize_t PyVectorcall_NARGS(size_t nargsf) + + Given a vectorcall *nargsf* argument, return the actual number of + arguments. + Currently equivalent to ``nargsf & ~PY_VECTORCALL_ARGUMENTS_OFFSET``. + + .. versionadded:: 3.8 + +.. c:function:: PyObject* _PyObject_FastCallDict(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwdict) + + Same as :c:func:`_PyObject_Vectorcall` except that the keyword arguments + are passed as a dictionary in *kwdict*. This may be *NULL* if there + are no keyword arguments. + + For callables supporting :c:data:`vectorcall `, + the arguments are internally converted to the vectorcall convention. + Therefore, this function adds some overhead compared to + :c:func:`_PyObject_Vectorcall`. + It should only be used if the caller already has a dictionary ready to use. + + .. note:: + + This function is provisional and expected to become public in Python 3.9, + with a different name and, possibly, changed semantics. + If you use the function, plan for updating your code for Python 3.9. + + .. versionadded:: 3.8 + + .. c:function:: Py_hash_t PyObject_Hash(PyObject *o) .. index:: builtin: hash diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst index e2f8f54be79a..83fcc5abed70 100644 --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -36,115 +36,115 @@ Quick Reference .. table:: :widths: 18,18,18,1,1,1,1 - +---------------------------------------------+-----------------------------------+-------------------+---------------+ - | PyTypeObject Slot [#slots]_ | :ref:`Type ` | special | Info [#cols]_ | - | | | methods/attrs +---+---+---+---+ - | | | | O | T | D | I | - +=============================================+===================================+===================+===+===+===+===+ - | :c:member:`~PyTypeObject.tp_name` | const char * | __name__ | X | X | | | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_basicsize` | Py_ssize_t | | X | X | | X | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_itemsize` | Py_ssize_t | | | X | | X | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_dealloc` | :c:type:`destructor` | | X | X | | X | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | (:c:member:`~PyTypeObject.tp_print`) | | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | (:c:member:`~PyTypeObject.tp_getattr`) | :c:type:`getattrfunc` | __getattribute__, | | | | G | - | | | __getattr__ | | | | | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | (:c:member:`~PyTypeObject.tp_setattr`) | :c:type:`setattrfunc` | __setattr__, | | | | G | - | | | __delattr__ | | | | | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_as_async` | :c:type:`PyAsyncMethods` * | :ref:`sub-slots` | | | | % | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_repr` | :c:type:`reprfunc` | __repr__ | X | X | | X | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_as_number` | :c:type:`PyNumberMethods` * | :ref:`sub-slots` | | | | % | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_as_sequence` | :c:type:`PySequenceMethods` * | :ref:`sub-slots` | | | | % | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_as_mapping` | :c:type:`PyMappingMethods` * | :ref:`sub-slots` | | | | % | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_hash` | :c:type:`hashfunc` | __hash__ | X | | | G | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_call` | :c:type:`ternaryfunc` | __call__ | | X | | X | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_str` | :c:type:`reprfunc` | __str__ | X | | | X | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_getattro` | :c:type:`getattrofunc` | __getattribute__, | X | X | | G | - | | | __getattr__ | | | | | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_setattro` | :c:type:`setattrofunc` | __setattr__, | X | X | | G | - | | | __delattr__ | | | | | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_as_buffer` | :c:type:`PyBufferProcs` * | | | | | % | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_flags` | unsigned long | | X | X | | ? | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_doc` | const char * | __doc__ | X | X | | | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_traverse` | :c:type:`traverseproc` | | | X | | G | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_clear` | :c:type:`inquiry` | | | X | | G | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_richcompare` | :c:type:`richcmpfunc` | __lt__, | X | | | G | - | | | __le__, | | | | | - | | | __eq__, | | | | | - | | | __ne__, | | | | | - | | | __gt__, | | | | | - | | | __ge__ | | | | | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_weaklistoffset` | Py_ssize_t | | | X | | ? | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_iter` | :c:type:`getiterfunc` | __iter__ | | | | X | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_iternext` | :c:type:`iternextfunc` | __next__ | | | | X | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_methods` | :c:type:`PyMethodDef` [] | | X | X | | | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_members` | :c:type:`PyMemberDef` [] | | | X | | | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_getset` | :c:type:`PyGetSetDef` [] | | X | X | | | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_base` | :c:type:`PyTypeObject` * | __base__ | | | X | | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_dict` | :c:type:`PyObject` * | __dict__ | | | ? | | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_descr_get` | :c:type:`descrgetfunc` | __get__ | | | | X | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_descr_set` | :c:type:`descrsetfunc` | __set__, | | | | X | - | | | __delete__ | | | | | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_dictoffset` | Py_ssize_t | | | X | | ? | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_init` | :c:type:`initproc` | __init__ | X | X | | X | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_alloc` | :c:type:`allocfunc` | | X | | ? | ? | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_new` | :c:type:`newfunc` | __new__ | X | X | ? | ? | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_free` | :c:type:`freefunc` | | X | X | ? | ? | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_is_gc` | :c:type:`inquiry` | | | X | | X | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | <:c:member:`~PyTypeObject.tp_bases`> | :c:type:`PyObject` * | __bases__ | | | ~ | | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | <:c:member:`~PyTypeObject.tp_mro`> | :c:type:`PyObject` * | __mro__ | | | ~ | | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | [:c:member:`~PyTypeObject.tp_cache`] | :c:type:`PyObject` * | | | | | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | [:c:member:`~PyTypeObject.tp_subclasses`] | :c:type:`PyObject` * | __subclasses__ | | | | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | [:c:member:`~PyTypeObject.tp_weaklist`] | :c:type:`PyObject` * | | | | | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | (:c:member:`~PyTypeObject.tp_del`) | :c:type:`destructor` | | | | | | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | [:c:member:`~PyTypeObject.tp_version_tag`] | unsigned int | | | | | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_finalize` | :c:type:`destructor` | __del__ | | | | X | - +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + +------------------------------------------------+-----------------------------------+-------------------+---------------+ + | PyTypeObject Slot [#slots]_ | :ref:`Type ` | special | Info [#cols]_ | + | | | methods/attrs +---+---+---+---+ + | | | | O | T | D | I | + +================================================+===================================+===================+===+===+===+===+ + | :c:member:`~PyTypeObject.tp_name` | const char * | __name__ | X | X | | | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_basicsize` | Py_ssize_t | | X | X | | X | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_itemsize` | Py_ssize_t | | | X | | X | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_dealloc` | :c:type:`destructor` | | X | X | | X | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_vectorcall_offset` | Py_ssize_t | | | | | ? | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | (:c:member:`~PyTypeObject.tp_getattr`) | :c:type:`getattrfunc` | __getattribute__, | | | | G | + | | | __getattr__ | | | | | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | (:c:member:`~PyTypeObject.tp_setattr`) | :c:type:`setattrfunc` | __setattr__, | | | | G | + | | | __delattr__ | | | | | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_as_async` | :c:type:`PyAsyncMethods` * | :ref:`sub-slots` | | | | % | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_repr` | :c:type:`reprfunc` | __repr__ | X | X | | X | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_as_number` | :c:type:`PyNumberMethods` * | :ref:`sub-slots` | | | | % | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_as_sequence` | :c:type:`PySequenceMethods` * | :ref:`sub-slots` | | | | % | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_as_mapping` | :c:type:`PyMappingMethods` * | :ref:`sub-slots` | | | | % | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_hash` | :c:type:`hashfunc` | __hash__ | X | | | G | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_call` | :c:type:`ternaryfunc` | __call__ | | X | | X | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_str` | :c:type:`reprfunc` | __str__ | X | | | X | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_getattro` | :c:type:`getattrofunc` | __getattribute__, | X | X | | G | + | | | __getattr__ | | | | | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_setattro` | :c:type:`setattrofunc` | __setattr__, | X | X | | G | + | | | __delattr__ | | | | | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_as_buffer` | :c:type:`PyBufferProcs` * | | | | | % | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_flags` | unsigned long | | X | X | | ? | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_doc` | const char * | __doc__ | X | X | | | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_traverse` | :c:type:`traverseproc` | | | X | | G | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_clear` | :c:type:`inquiry` | | | X | | G | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_richcompare` | :c:type:`richcmpfunc` | __lt__, | X | | | G | + | | | __le__, | | | | | + | | | __eq__, | | | | | + | | | __ne__, | | | | | + | | | __gt__, | | | | | + | | | __ge__ | | | | | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_weaklistoffset` | Py_ssize_t | | | X | | ? | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_iter` | :c:type:`getiterfunc` | __iter__ | | | | X | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_iternext` | :c:type:`iternextfunc` | __next__ | | | | X | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_methods` | :c:type:`PyMethodDef` [] | | X | X | | | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_members` | :c:type:`PyMemberDef` [] | | | X | | | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_getset` | :c:type:`PyGetSetDef` [] | | X | X | | | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_base` | :c:type:`PyTypeObject` * | __base__ | | | X | | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_dict` | :c:type:`PyObject` * | __dict__ | | | ? | | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_descr_get` | :c:type:`descrgetfunc` | __get__ | | | | X | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_descr_set` | :c:type:`descrsetfunc` | __set__, | | | | X | + | | | __delete__ | | | | | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_dictoffset` | Py_ssize_t | | | X | | ? | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_init` | :c:type:`initproc` | __init__ | X | X | | X | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_alloc` | :c:type:`allocfunc` | | X | | ? | ? | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_new` | :c:type:`newfunc` | __new__ | X | X | ? | ? | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_free` | :c:type:`freefunc` | | X | X | ? | ? | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_is_gc` | :c:type:`inquiry` | | | X | | X | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | <:c:member:`~PyTypeObject.tp_bases`> | :c:type:`PyObject` * | __bases__ | | | ~ | | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | <:c:member:`~PyTypeObject.tp_mro`> | :c:type:`PyObject` * | __mro__ | | | ~ | | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | [:c:member:`~PyTypeObject.tp_cache`] | :c:type:`PyObject` * | | | | | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | [:c:member:`~PyTypeObject.tp_subclasses`] | :c:type:`PyObject` * | __subclasses__ | | | | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | [:c:member:`~PyTypeObject.tp_weaklist`] | :c:type:`PyObject` * | | | | | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | (:c:member:`~PyTypeObject.tp_del`) | :c:type:`destructor` | | | | | | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | [:c:member:`~PyTypeObject.tp_version_tag`] | unsigned int | | | | | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ + | :c:member:`~PyTypeObject.tp_finalize` | :c:type:`destructor` | __del__ | | | | X | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ If :const:`COUNT_ALLOCS` is defined then the following (internal-only) fields exist as well: @@ -364,12 +364,6 @@ slot typedefs +-----------------------------+-----------------------------+----------------------+ | :c:type:`reprfunc` | :c:type:`PyObject` * | :c:type:`PyObject` * | +-----------------------------+-----------------------------+----------------------+ -| :c:type:`printfunc` | .. line-block:: | int | -| | | | -| | :c:type:`PyObject` * | | -| | FILE * | | -| | int | | -+-----------------------------+-----------------------------+----------------------+ | :c:type:`getattrfunc` | .. line-block:: | :c:type:`PyObject` * | | | | | | | :c:type:`PyObject` * | | @@ -675,9 +669,66 @@ and :c:type:`PyType_Type` effectively act as defaults.) This field is inherited by subtypes. -.. c:member:: printfunc PyTypeObject.tp_print +.. c:member:: Py_ssize_t PyTypeObject.tp_vectorcall_offset + + An optional offset to a per-instance function that implements calling + the object using the *vectorcall* protocol, a more efficient alternative + of the simpler :c:member:`~PyTypeObject.tp_call`. + + This field is only used if the flag :const:`_Py_TPFLAGS_HAVE_VECTORCALL` + is set. If so, this must be a positive integer containing the offset in the + instance of a :c:type:`vectorcallfunc` pointer. + The signature is the same as for :c:func:`_PyObject_Vectorcall`:: + + PyObject *vectorcallfunc(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwnames) + + The *vectorcallfunc* pointer may be zero, in which case the instance behaves + as if :const:`_Py_TPFLAGS_HAVE_VECTORCALL` was not set: calling the instance + falls back to :c:member:`~PyTypeObject.tp_call`. + + Any class that sets ``_Py_TPFLAGS_HAVE_VECTORCALL`` must also set + :c:member:`~PyTypeObject.tp_call` and make sure its behaviour is consistent + with the *vectorcallfunc* function. + This can be done by setting *tp_call* to ``PyVectorcall_Call``: + + .. c:function:: PyObject *PyVectorcall_Call(PyObject *callable, PyObject *tuple, PyObject *dict) + + Call *callable*'s *vectorcallfunc* with positional and keyword + arguments given in a tuple and dict, respectively. + + This function is intended to be used in the ``tp_call`` slot. + It does not fall back to ``tp_call`` and it currently does not check the + ``_Py_TPFLAGS_HAVE_VECTORCALL`` flag. + To call an object, use one of the :c:func:`PyObject_Call ` + functions instead. + + .. note:: + + It is not recommended for :ref:`heap types ` to implement + the vectorcall protocol. + When a user sets ``__call__`` in Python code, only ``tp_call`` is updated, + possibly making it inconsistent with the vectorcall function. + + .. note:: + + The semantics of the ``tp_vectorcall_offset`` slot are provisional and + expected to be finalized in Python 3.9. + If you use vectorcall, plan for updating your code for Python 3.9. + + .. versionchanged:: 3.8 + + This slot was used for print formatting in Python 2.x. + In Python 3.0 to 3.7, it was reserved and named ``tp_print``. - Reserved slot, formerly used for print formatting in Python 2.x. + **Inheritance:** + + This field is inherited by subtypes together with + :c:member:`~PyTypeObject.tp_call`: a subtype inherits + :c:member:`~PyTypeObject.tp_vectorcall_offset` from its base type when + the subtype?s :c:member:`~PyTypeObject.tp_call` is NULL. + + Note that `heap types`_ (including subclasses defined in Python) do not + inherit the :const:`_Py_TPFLAGS_HAVE_VECTORCALL` flag. .. c:member:: getattrfunc PyTypeObject.tp_getattr @@ -1104,6 +1155,28 @@ and :c:type:`PyType_Type` effectively act as defaults.) :c:member:`~PyTypeObject.tp_finalize` slot is always present in the type structure. + .. data:: _Py_TPFLAGS_HAVE_VECTORCALL + + This bit is set when the class implements the vectorcall protocol. + See :c:member:`~PyTypeObject.tp_vectorcall_offset` for details. + + **Inheritance:** + + This bit is set on *static* subtypes if ``tp_flags`` is not overridden: + a subtype inherits ``_Py_TPFLAGS_HAVE_VECTORCALL`` from its base type + when the subtype?s :c:member:`~PyTypeObject.tp_call` is NULL + and the subtype's ``Py_TPFLAGS_HEAPTYPE`` is not set. + + `Heap types`_ do not inherit ``_Py_TPFLAGS_HAVE_VECTORCALL``. + + .. note:: + + This flag is provisional and expected to become public in Python 3.9, + with a different name and, possibly, changed semantics. + If you use vectorcall, plan for updating your code for Python 3.9. + + .. versionadded:: 3.8 + .. c:member:: const char* PyTypeObject.tp_doc @@ -2286,6 +2359,14 @@ Slot Type typedefs .. c:type:: void (*destructor)(PyObject *) +.. c:type:: PyObject *(*vectorcallfunc)(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwnames) + + See :c:member:`~PyTypeObject.tp_vectorcall_offset`. + + Arguments to ``vectorcallfunc`` are the same as for :c:func:`_PyObject_Vectorcall`. + + .. versionadded:: 3.8 + .. c:type:: void (*freefunc)(void *) See :c:member:`~PyTypeObject.tp_free`. @@ -2302,10 +2383,6 @@ Slot Type typedefs See :c:member:`~PyTypeObject.tp_repr`. -.. c:type:: int (*printfunc)(PyObject *, FILE *, int) - - This is hidden if :const:`PY_LIMITED_API` is set. - .. c:type:: PyObject *(*getattrfunc)(PyObject *self, char *attr) Return the value of the named attribute for the object. @@ -2409,7 +2486,7 @@ with a more verbose initializer:: sizeof(MyObject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)myobj_dealloc, /* tp_dealloc */ - 0, /* tp_print */ + 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_as_async */ diff --git a/Doc/includes/typestruct.h b/Doc/includes/typestruct.h index 9f47899a198e..9ada03cfc4a4 100644 --- a/Doc/includes/typestruct.h +++ b/Doc/includes/typestruct.h @@ -6,7 +6,7 @@ typedef struct _typeobject { /* Methods to implement standard operations */ destructor tp_dealloc; - printfunc tp_print; + Py_ssize_t tp_vectorcall_offset; getattrfunc tp_getattr; setattrfunc tp_setattr; PyAsyncMethods *tp_as_async; /* formerly known as tp_compare (Python 2) diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index e9c9c814c69a..9474a2f4aafe 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -238,6 +238,22 @@ See :pep:`587` for a full description. (Contributed by Victor Stinner in :issue:`36763`.) +Vectorcall: a fast calling protocol for CPython +----------------------------------------------- + +The "vectorcall" protocol is added to the Python/C API. +It is meant to formalize existing optimizations which were already done +for various classes. +Any extension type implementing a callable can use this protocol. + +This is currently provisional, +the aim is to make it fully public in Python 3.9. + +See :pep:`590` for a full description. + +(Contributed by Jeroen Demeyer and Mark Shannon in :issue:`36974`.) + + Other Language Changes ====================== From webhook-mailer at python.org Sun Jun 2 19:57:26 2019 From: webhook-mailer at python.org (Petr Viktorin) Date: Sun, 02 Jun 2019 23:57:26 -0000 Subject: [Python-checkins] bpo-36974: add some assertions for PEP 590 (GH-13682) Message-ID: https://github.com/python/cpython/commit/be718c33f06b3496faa61142df24fb071fd5d1f1 commit: be718c33f06b3496faa61142df24fb071fd5d1f1 branch: master author: Jeroen Demeyer committer: Petr Viktorin date: 2019-06-03T01:57:22+02:00 summary: bpo-36974: add some assertions for PEP 590 (GH-13682) files: M Objects/typeobject.c diff --git a/Objects/typeobject.c b/Objects/typeobject.c index beb0ddd82400..006df8d1f090 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -5233,6 +5233,20 @@ PyType_Ready(PyTypeObject *type) _PyObject_ASSERT((PyObject *)type, (type->tp_flags & Py_TPFLAGS_READYING) == 0); + /* Consistency checks for PEP 590: + * - Py_TPFLAGS_METHOD_DESCRIPTOR requires tp_descr_get + * - _Py_TPFLAGS_HAVE_VECTORCALL requires tp_call and + * tp_vectorcall_offset > 0 + * To avoid mistakes, we require this before inheriting. + */ + if (type->tp_flags & Py_TPFLAGS_METHOD_DESCRIPTOR) { + _PyObject_ASSERT((PyObject *)type, type->tp_descr_get != NULL); + } + if (type->tp_flags & _Py_TPFLAGS_HAVE_VECTORCALL) { + _PyObject_ASSERT((PyObject *)type, type->tp_vectorcall_offset > 0); + _PyObject_ASSERT((PyObject *)type, type->tp_call != NULL); + } + type->tp_flags |= Py_TPFLAGS_READYING; #ifdef Py_TRACE_REFS From webhook-mailer at python.org Sun Jun 2 20:28:33 2019 From: webhook-mailer at python.org (Petr Viktorin) Date: Mon, 03 Jun 2019 00:28:33 -0000 Subject: [Python-checkins] bpo-36027: Really fix "incompatible pointer type" compiler warning (GH-13761) Message-ID: https://github.com/python/cpython/commit/1e375c6269e9de4f3d05d4aa6d6d74e00f522d63 commit: 1e375c6269e9de4f3d05d4aa6d6d74e00f522d63 branch: master author: Petr Viktorin committer: GitHub date: 2019-06-03T02:28:29+02:00 summary: bpo-36027: Really fix "incompatible pointer type" compiler warning (GH-13761) Apologies for the earlier hasty attempt. files: M Objects/longobject.c diff --git a/Objects/longobject.c b/Objects/longobject.c index 858e256ac0b4..a1103f697c73 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -4243,7 +4243,7 @@ long_invmod(PyLongObject *a, PyLongObject *n) Py_DECREF(c); Py_DECREF(n); - if (long_compare(a, (PyObject *)_PyLong_One)) { + if (long_compare(a, (PyLongObject *)_PyLong_One)) { /* a != 1; we don't have an inverse. */ Py_DECREF(a); Py_DECREF(b); From webhook-mailer at python.org Sun Jun 2 20:43:25 2019 From: webhook-mailer at python.org (Petr Viktorin) Date: Mon, 03 Jun 2019 00:43:25 -0000 Subject: [Python-checkins] bpo-36896: Clarify that some types constructors are unstable (GH-13271) Message-ID: https://github.com/python/cpython/commit/13136e83a637a9f1cfbada7e93097005296659b4 commit: 13136e83a637a9f1cfbada7e93097005296659b4 branch: master author: Matthias Bussonnier committer: Petr Viktorin date: 2019-06-03T02:43:21+02:00 summary: bpo-36896: Clarify that some types constructors are unstable (GH-13271) files: A Misc/NEWS.d/next/Documentation/2019-05-31-10-46-36.bpo-36896.wkXTW9.rst M Doc/library/types.rst diff --git a/Doc/library/types.rst b/Doc/library/types.rst index e629c2935f27..a21fb44dda5d 100644 --- a/Doc/library/types.rst +++ b/Doc/library/types.rst @@ -98,6 +98,9 @@ the types that arise only incidentally during processing such as the Typical use of these names is for :func:`isinstance` or :func:`issubclass` checks. + +If you instantiate any of these types, note that signatures may vary between Python versions. + Standard names are defined for the following types: .. data:: FunctionType diff --git a/Misc/NEWS.d/next/Documentation/2019-05-31-10-46-36.bpo-36896.wkXTW9.rst b/Misc/NEWS.d/next/Documentation/2019-05-31-10-46-36.bpo-36896.wkXTW9.rst new file mode 100644 index 000000000000..d75fccad6c0f --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2019-05-31-10-46-36.bpo-36896.wkXTW9.rst @@ -0,0 +1,2 @@ +Clarify that some types have unstable constructor signature between Python +versions. From webhook-mailer at python.org Sun Jun 2 21:51:35 2019 From: webhook-mailer at python.org (Gregory P. Smith) Date: Mon, 03 Jun 2019 01:51:35 -0000 Subject: [Python-checkins] [3.7] bpo-27987: align PyGC_Head to alignof(long double) (GH-13335) (GH-13581) Message-ID: https://github.com/python/cpython/commit/8766cb74e186d3820db0a855ccd780d6d84461f7 commit: 8766cb74e186d3820db0a855ccd780d6d84461f7 branch: 3.7 author: Inada Naoki committer: Gregory P. Smith date: 2019-06-02T18:51:31-07:00 summary: [3.7] bpo-27987: align PyGC_Head to alignof(long double) (GH-13335) (GH-13581) This reverts commit 2156fec1f7a8f9972e90cdbaf404e3fd9eaccb35. Now that https://github.com/python/cpython/commit/1b85f4ec45a5d63188ee3866bd55eb29fdec7fbf is in, this change makes sense. files: A Misc/NEWS.d/next/Core and Builtins/2019-05-15-18-28-43.bpo-27987.FaxuLy.rst M Include/objimpl.h diff --git a/Include/objimpl.h b/Include/objimpl.h index 057bb50cbda9..0436ba7899d9 100644 --- a/Include/objimpl.h +++ b/Include/objimpl.h @@ -255,7 +255,11 @@ typedef union _gc_head { union _gc_head *gc_prev; Py_ssize_t gc_refs; } gc; - double dummy; /* force worst-case alignment */ + long double dummy; /* force worst-case alignment */ + // malloc returns memory block aligned for any built-in types and + // long double is the largest standard C type. + // On amd64 linux, long double requires 16 byte alignment. + // See bpo-27987 for more discussion. } PyGC_Head; extern PyGC_Head *_PyGC_generation0; diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-15-18-28-43.bpo-27987.FaxuLy.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-15-18-28-43.bpo-27987.FaxuLy.rst new file mode 100644 index 000000000000..98073471ca7e --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-15-18-28-43.bpo-27987.FaxuLy.rst @@ -0,0 +1,2 @@ +``PyGC_Head`` structure is aligned to ``long double``. This is needed to +ensure GC-ed objects are aligned properly. Patch by Inada Naoki. From webhook-mailer at python.org Sun Jun 2 21:51:46 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 03 Jun 2019 01:51:46 -0000 Subject: [Python-checkins] bpo-37069: tests use catch_unraisable_exception() (GH-13762) Message-ID: https://github.com/python/cpython/commit/0025350294959594e7f57aef4fc9579c77a0ed1c commit: 0025350294959594e7f57aef4fc9579c77a0ed1c branch: master author: Victor Stinner committer: GitHub date: 2019-06-03T03:51:43+02:00 summary: bpo-37069: tests use catch_unraisable_exception() (GH-13762) Modify test_coroutines, test_cprofile, test_generators, test_raise, test_ssl and test_yield_from to use support.catch_unraisable_exception() rather than support.captured_stderr(). test_thread: remove test_save_exception_state_on_error() which is now updated. test_unraisable_exception() checks that sys.unraisablehook() is called to handle _thread.start_new_thread() exception. test_cprofile now rely on unittest for test discovery: replace support.run_unittest() with unittest.main(). files: A Misc/NEWS.d/next/Tests/2019-06-03-02-30-36.bpo-37069.rVtdLk.rst M Lib/test/test_coroutines.py M Lib/test/test_cprofile.py M Lib/test/test_generators.py M Lib/test/test_raise.py M Lib/test/test_ssl.py M Lib/test/test_thread.py M Lib/test/test_yield_from.py diff --git a/Lib/test/test_coroutines.py b/Lib/test/test_coroutines.py index b406b1c3ebf8..208b5c2ccf5c 100644 --- a/Lib/test/test_coroutines.py +++ b/Lib/test/test_coroutines.py @@ -2032,11 +2032,17 @@ def test_pickle(self): def test_fatal_coro_warning(self): # Issue 27811 async def func(): pass - with warnings.catch_warnings(), support.captured_stderr() as stderr: + with warnings.catch_warnings(), \ + support.catch_unraisable_exception() as cm: warnings.filterwarnings("error") - func() + coro = func() + # only store repr() to avoid keeping the coroutine alive + coro_repr = repr(coro) + coro = None support.gc_collect() - self.assertIn("was never awaited", stderr.getvalue()) + + self.assertIn("was never awaited", str(cm.unraisable.exc_value)) + self.assertEqual(repr(cm.unraisable.object), coro_repr) def test_for_assign_raising_stop_async_iteration(self): class BadTarget: diff --git a/Lib/test/test_cprofile.py b/Lib/test/test_cprofile.py index efcf6bc92803..5c70037f39a2 100644 --- a/Lib/test/test_cprofile.py +++ b/Lib/test/test_cprofile.py @@ -1,13 +1,13 @@ """Test suite for the cProfile module.""" import sys -from test.support import run_unittest, TESTFN, unlink import unittest # rip off all interesting stuff from test_profile import cProfile from test.test_profile import ProfileTest, regenerate_expected_output from test.support.script_helper import assert_python_failure, assert_python_ok +from test import support class CProfileTest(ProfileTest): @@ -18,24 +18,18 @@ class CProfileTest(ProfileTest): def get_expected_output(self): return _ProfileOutput - # Issue 3895. def test_bad_counter_during_dealloc(self): + # bpo-3895 import _lsprof - # Must use a file as StringIO doesn't trigger the bug. - orig_stderr = sys.stderr - try: - with open(TESTFN, 'w') as file: - sys.stderr = file - try: - obj = _lsprof.Profiler(lambda: int) - obj.enable() - obj = _lsprof.Profiler(1) - obj.disable() - obj.clear() - finally: - sys.stderr = orig_stderr - finally: - unlink(TESTFN) + + with support.catch_unraisable_exception() as cm: + obj = _lsprof.Profiler(lambda: int) + obj.enable() + obj = _lsprof.Profiler(1) + obj.disable() + obj.clear() + + self.assertEqual(cm.unraisable.exc_type, TypeError) def test_profile_enable_disable(self): prof = self.profilerclass() @@ -70,12 +64,10 @@ def test_sort(self): self.assertGreater(rc, 0) self.assertIn(b"option -s: invalid choice: 'demo'", err) -def test_main(): - run_unittest(CProfileTest, TestCommandLine) def main(): if '-r' not in sys.argv: - test_main() + unittest.main() else: regenerate_expected_output(__file__, CProfileTest) diff --git a/Lib/test/test_generators.py b/Lib/test/test_generators.py index 7f1472fa03ac..a34e4ec2eda7 100644 --- a/Lib/test/test_generators.py +++ b/Lib/test/test_generators.py @@ -2051,15 +2051,17 @@ def printsolution(self, x): Our ill-behaved code should be invoked during GC: ->>> import sys, io ->>> old, sys.stderr = sys.stderr, io.StringIO() ->>> g = f() ->>> next(g) ->>> del g ->>> "RuntimeError: generator ignored GeneratorExit" in sys.stderr.getvalue() +>>> with support.catch_unraisable_exception() as cm: +... g = f() +... next(g) +... del g +... +... cm.unraisable.exc_type == RuntimeError +... "generator ignored GeneratorExit" in str(cm.unraisable.exc_value) +... cm.unraisable.exc_traceback is not None +True +True True ->>> sys.stderr = old - And errors thrown during closing should propagate: diff --git a/Lib/test/test_raise.py b/Lib/test/test_raise.py index c1ef154a9a9f..57da0e15a756 100644 --- a/Lib/test/test_raise.py +++ b/Lib/test/test_raise.py @@ -459,9 +459,12 @@ def f(): self.assertNotEqual(e.__context__, None) self.assertIsInstance(e.__context__, AttributeError) - with support.captured_output("stderr"): + with support.catch_unraisable_exception() as cm: f() + self.assertEqual(ZeroDivisionError, cm.unraisable.exc_type) + + class TestRemovedFunctionality(unittest.TestCase): def test_tuples(self): try: diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index f368906c8a94..a72d79132181 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -4051,13 +4051,15 @@ def cb_raising(ssl_sock, server_name, initial_context): 1/0 server_context.set_servername_callback(cb_raising) - with self.assertRaises(ssl.SSLError) as cm, \ - support.captured_stderr() as stderr: - stats = server_params_test(client_context, server_context, - chatty=False, - sni_name='supermessage') - self.assertEqual(cm.exception.reason, 'SSLV3_ALERT_HANDSHAKE_FAILURE') - self.assertIn("ZeroDivisionError", stderr.getvalue()) + with support.catch_unraisable_exception() as catch: + with self.assertRaises(ssl.SSLError) as cm: + stats = server_params_test(client_context, server_context, + chatty=False, + sni_name='supermessage') + + self.assertEqual(cm.exception.reason, + 'SSLV3_ALERT_HANDSHAKE_FAILURE') + self.assertEqual(catch.unraisable.exc_type, ZeroDivisionError) @needs_sni def test_sni_callback_wrong_return_type(self): @@ -4069,13 +4071,15 @@ def cb_wrong_return_type(ssl_sock, server_name, initial_context): return "foo" server_context.set_servername_callback(cb_wrong_return_type) - with self.assertRaises(ssl.SSLError) as cm, \ - support.captured_stderr() as stderr: - stats = server_params_test(client_context, server_context, - chatty=False, - sni_name='supermessage') - self.assertEqual(cm.exception.reason, 'TLSV1_ALERT_INTERNAL_ERROR') - self.assertIn("TypeError", stderr.getvalue()) + with support.catch_unraisable_exception() as catch: + with self.assertRaises(ssl.SSLError) as cm: + stats = server_params_test(client_context, server_context, + chatty=False, + sni_name='supermessage') + + + self.assertEqual(cm.exception.reason, 'TLSV1_ALERT_INTERNAL_ERROR') + self.assertEqual(catch.unraisable.exc_type, TypeError) def test_shared_ciphers(self): client_context, server_context, hostname = testing_context() diff --git a/Lib/test/test_thread.py b/Lib/test/test_thread.py index f946f7bc8399..9f4801f47e3a 100644 --- a/Lib/test/test_thread.py +++ b/Lib/test/test_thread.py @@ -133,27 +133,6 @@ def task(): time.sleep(POLL_SLEEP) self.assertEqual(thread._count(), orig) - def test_save_exception_state_on_error(self): - # See issue #14474 - def task(): - started.release() - raise SyntaxError - def mywrite(self, *args): - try: - raise ValueError - except ValueError: - pass - real_write(self, *args) - started = thread.allocate_lock() - with support.captured_output("stderr") as stderr: - real_write = stderr.write - stderr.write = mywrite - started.acquire() - with support.wait_threads_exit(): - thread.start_new_thread(task, ()) - started.acquire() - self.assertIn("Traceback", stderr.getvalue()) - def test_unraisable_exception(self): def task(): started.release() diff --git a/Lib/test/test_yield_from.py b/Lib/test/test_yield_from.py index ce21c3df8140..4735ef4bee3b 100644 --- a/Lib/test/test_yield_from.py +++ b/Lib/test/test_yield_from.py @@ -11,6 +11,7 @@ import inspect from test.support import captured_stderr, disable_gc, gc_collect +from test import support class TestPEP380Operation(unittest.TestCase): """ @@ -562,11 +563,12 @@ def g(): self.assertEqual(next(gi), 1) gi.throw(AttributeError) - with captured_stderr() as output: + with support.catch_unraisable_exception() as cm: gi = g() self.assertEqual(next(gi), 1) gi.close() - self.assertIn('ZeroDivisionError', output.getvalue()) + + self.assertEqual(ZeroDivisionError, cm.unraisable.exc_type) def test_exception_in_initial_next_call(self): """ diff --git a/Misc/NEWS.d/next/Tests/2019-06-03-02-30-36.bpo-37069.rVtdLk.rst b/Misc/NEWS.d/next/Tests/2019-06-03-02-30-36.bpo-37069.rVtdLk.rst new file mode 100644 index 000000000000..566ff5150d5f --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-06-03-02-30-36.bpo-37069.rVtdLk.rst @@ -0,0 +1,3 @@ +Modify test_coroutines, test_cprofile, test_generators, test_raise, test_ssl +and test_yield_from to use :func:`test.support.catch_unraisable_exception` +rather than :func:`test.support.captured_stderr`. From webhook-mailer at python.org Sun Jun 2 22:14:55 2019 From: webhook-mailer at python.org (Eric V. Smith) Date: Mon, 03 Jun 2019 02:14:55 -0000 Subject: [Python-checkins] bpo-33569 Preserve type information with dataclasses.InitVar (GH-8927) Message-ID: https://github.com/python/cpython/commit/01ee12ba35a333e8a6a25c4153c4a21838e9585c commit: 01ee12ba35a333e8a6a25c4153c4a21838e9585c branch: master author: Augusto Hack committer: Eric V. Smith date: 2019-06-02T22:14:48-04:00 summary: bpo-33569 Preserve type information with dataclasses.InitVar (GH-8927) files: A Misc/NEWS.d/next/Library/2018-08-28-03-00-12.bpo-33569.45YlGG.rst M Lib/dataclasses.py M Lib/test/test_dataclasses.py diff --git a/Lib/dataclasses.py b/Lib/dataclasses.py index 75113f123b3a..b035cbb809f8 100644 --- a/Lib/dataclasses.py +++ b/Lib/dataclasses.py @@ -201,10 +201,16 @@ def __repr__(self): class _InitVarMeta(type): def __getitem__(self, params): - return self + return InitVar(params) class InitVar(metaclass=_InitVarMeta): - pass + __slots__ = ('type', ) + + def __init__(self, type): + self.type = type + + def __repr__(self): + return f'dataclasses.InitVar[{self.type.__name__}]' # Instances of Field are only ever created from within this module, @@ -586,7 +592,8 @@ def _is_classvar(a_type, typing): def _is_initvar(a_type, dataclasses): # The module we're checking against is the module we're # currently in (dataclasses.py). - return a_type is dataclasses.InitVar + return (a_type is dataclasses.InitVar + or type(a_type) is dataclasses.InitVar) def _is_type(annotation, cls, a_module, a_type, is_type_predicate): diff --git a/Lib/test/test_dataclasses.py b/Lib/test/test_dataclasses.py index 867210688f57..53e8443c2adf 100755 --- a/Lib/test/test_dataclasses.py +++ b/Lib/test/test_dataclasses.py @@ -1097,6 +1097,12 @@ def __post_init__(self, init_param): c = C(init_param=10) self.assertEqual(c.x, 20) + def test_init_var_preserve_type(self): + self.assertEqual(InitVar[int].type, int) + + # Make sure the repr is correct. + self.assertEqual(repr(InitVar[int]), 'dataclasses.InitVar[int]') + def test_init_var_inheritance(self): # Note that this deliberately tests that a dataclass need not # have a __post_init__ function if it has an InitVar field. diff --git a/Misc/NEWS.d/next/Library/2018-08-28-03-00-12.bpo-33569.45YlGG.rst b/Misc/NEWS.d/next/Library/2018-08-28-03-00-12.bpo-33569.45YlGG.rst new file mode 100644 index 000000000000..adafa2803ae3 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-08-28-03-00-12.bpo-33569.45YlGG.rst @@ -0,0 +1 @@ +dataclasses.InitVar: Exposes the type used to create the init var. From webhook-mailer at python.org Sun Jun 2 23:19:48 2019 From: webhook-mailer at python.org (Ned Deily) Date: Mon, 03 Jun 2019 03:19:48 -0000 Subject: [Python-checkins] Fix variable name copy/paste error in build-installer.py (GH-13038) Message-ID: https://github.com/python/cpython/commit/d337169156933eaf732566bf29eb968549ada5e8 commit: d337169156933eaf732566bf29eb968549ada5e8 branch: master author: cclauss committer: Ned Deily date: 2019-06-02T23:19:44-04:00 summary: Fix variable name copy/paste error in build-installer.py (GH-13038) files: M Mac/BuildScript/build-installer.py diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py index fb43da5478f7..60e28fee055d 100755 --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -1540,7 +1540,7 @@ def buildDMG(): print(" -- retrying hdiutil create") time.sleep(5) else: - raise RuntimeError("command failed: %s"%(commandline,)) + raise RuntimeError("command failed: %s"%(cmd,)) if not os.path.exists(os.path.join(WORKDIR, "mnt")): os.mkdir(os.path.join(WORKDIR, "mnt")) From webhook-mailer at python.org Sun Jun 2 23:36:39 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 03 Jun 2019 03:36:39 -0000 Subject: [Python-checkins] Fix variable name copy/paste error in build-installer.py (GH-13038) Message-ID: https://github.com/python/cpython/commit/4a941e69822c042c1ef41ad34e89a6acd436490b commit: 4a941e69822c042c1ef41ad34e89a6acd436490b branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-02T20:36:33-07:00 summary: Fix variable name copy/paste error in build-installer.py (GH-13038) (cherry picked from commit d337169156933eaf732566bf29eb968549ada5e8) Co-authored-by: cclauss files: M Mac/BuildScript/build-installer.py diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py index 2e3a61ec71d1..3ee2fba82688 100755 --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -1538,7 +1538,7 @@ def buildDMG(): print(" -- retrying hdiutil create") time.sleep(5) else: - raise RuntimeError("command failed: %s"%(commandline,)) + raise RuntimeError("command failed: %s"%(cmd,)) if not os.path.exists(os.path.join(WORKDIR, "mnt")): os.mkdir(os.path.join(WORKDIR, "mnt")) From webhook-mailer at python.org Sun Jun 2 23:39:41 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 03 Jun 2019 03:39:41 -0000 Subject: [Python-checkins] Fix variable name copy/paste error in build-installer.py (GH-13038) Message-ID: https://github.com/python/cpython/commit/74bede0d503d0508e9590f4ad65ee48b0ab93db6 commit: 74bede0d503d0508e9590f4ad65ee48b0ab93db6 branch: 2.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-02T20:39:38-07:00 summary: Fix variable name copy/paste error in build-installer.py (GH-13038) (cherry picked from commit d337169156933eaf732566bf29eb968549ada5e8) Co-authored-by: cclauss files: M Mac/BuildScript/build-installer.py diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py index 74d1e84f4a9b..bf038797c5e9 100755 --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -1553,7 +1553,7 @@ def buildDMG(): print(" -- retrying hdiutil create") time.sleep(5) else: - raise RuntimeError("command failed: %s"%(commandline,)) + raise RuntimeError("command failed: %s"%(cmd,)) if not os.path.exists(os.path.join(WORKDIR, "mnt")): os.mkdir(os.path.join(WORKDIR, "mnt")) From webhook-mailer at python.org Mon Jun 3 00:07:50 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Mon, 03 Jun 2019 04:07:50 -0000 Subject: [Python-checkins] bpo-36546: Add design notes to aid future discussions (GH-13769) Message-ID: https://github.com/python/cpython/commit/cba9f84725353455b0995bd47d0fa8cb1724464b commit: cba9f84725353455b0995bd47d0fa8cb1724464b branch: master author: Raymond Hettinger committer: GitHub date: 2019-06-02T21:07:43-07:00 summary: bpo-36546: Add design notes to aid future discussions (GH-13769) files: M Lib/statistics.py diff --git a/Lib/statistics.py b/Lib/statistics.py index 19db8e828010..012845b8d2ef 100644 --- a/Lib/statistics.py +++ b/Lib/statistics.py @@ -564,6 +564,45 @@ def multimode(data): maxcount, mode_items = next(groupby(counts, key=itemgetter(1)), (0, [])) return list(map(itemgetter(0), mode_items)) +# Notes on methods for computing quantiles +# ---------------------------------------- +# +# There is no one perfect way to compute quantiles. Here we offer +# two methods that serve common needs. Most other packages +# surveyed offered at least one or both of these two, making them +# "standard" in the sense of "widely-adopted and reproducible". +# They are also easy to explain, easy to compute manually, and have +# straight-forward interpretations that aren't surprising. + +# The default method is known as "R6", "PERCENTILE.EXC", or "expected +# value of rank order statistics". The alternative method is known as +# "R7", "PERCENTILE.INC", or "mode of rank order statistics". + +# For sample data where there is a positive probability for values +# beyond the range of the data, the R6 exclusive method is a +# reasonable choice. Consider a random sample of nine values from a +# population with a uniform distribution from 0.0 to 100.0. The +# distribution of the third ranked sample point is described by +# betavariate(alpha=3, beta=7) which has mode=0.250, median=0.286, and +# mean=0.300. Only the latter (which corresponds with R6) gives the +# desired cut point with 30% of the population falling below that +# value, making it comparable to a result from an inv_cdf() function. + +# For describing population data where the end points are known to +# be included in the data, the R7 inclusive method is a reasonable +# choice. Instead of the mean, it uses the mode of the beta +# distribution for the interior points. Per Hyndman & Fan, "One nice +# property is that the vertices of Q7(p) divide the range into n - 1 +# intervals, and exactly 100p% of the intervals lie to the left of +# Q7(p) and 100(1 - p)% of the intervals lie to the right of Q7(p)." + +# If the need arises, we could add method="median" for a median +# unbiased, distribution-free alternative. Also if needed, the +# distribution-free approaches could be augmented by adding +# method='normal'. However, for now, the position is that fewer +# options make for easier choices and that external packages can be +# used for anything more advanced. + def quantiles(dist, *, n=4, method='exclusive'): '''Divide *dist* into *n* continuous intervals with equal probability. From webhook-mailer at python.org Mon Jun 3 00:21:20 2019 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Mon, 03 Jun 2019 04:21:20 -0000 Subject: [Python-checkins] IDLE: Fix typos in docs and comments (GH-13749) Message-ID: https://github.com/python/cpython/commit/d9677f36fe486e86bb86f2cd59cb7fc3804bdac1 commit: d9677f36fe486e86bb86f2cd59cb7fc3804bdac1 branch: master author: Xtreak committer: Terry Jan Reedy date: 2019-06-03T00:21:15-04:00 summary: IDLE: Fix typos in docs and comments (GH-13749) files: M Lib/idlelib/config.py M Lib/idlelib/configdialog.py M Lib/idlelib/delegator.py M Lib/idlelib/editor.py M Lib/idlelib/idle_test/htest.py M Lib/idlelib/idle_test/mock_tk.py M Lib/idlelib/idle_test/test_pyparse.py M Lib/idlelib/search.py M Lib/idlelib/searchbase.py M Lib/idlelib/squeezer.py M Lib/idlelib/undo.py diff --git a/Lib/idlelib/config.py b/Lib/idlelib/config.py index aa94d6535be6..12113c19c086 100644 --- a/Lib/idlelib/config.py +++ b/Lib/idlelib/config.py @@ -12,7 +12,7 @@ there are separate dicts for default and user values. Each has config-type keys 'main', 'extensions', 'highlight', and 'keys'. The value for each key is a ConfigParser instance that maps section and item -to values. For 'main' and 'extenstons', user values override +to values. For 'main' and 'extensions', user values override default values. For 'highlight' and 'keys', user sections augment the default sections (and must, therefore, have distinct names). diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py index 4aaec1321f7d..807ff60413d1 100644 --- a/Lib/idlelib/configdialog.py +++ b/Lib/idlelib/configdialog.py @@ -199,7 +199,7 @@ def destroy(self): def help(self): """Create textview for config dialog help. - Attrbutes accessed: + Attributes accessed: note Methods: diff --git a/Lib/idlelib/delegator.py b/Lib/idlelib/delegator.py index dc2a1aaeeab7..55c95da8532f 100644 --- a/Lib/idlelib/delegator.py +++ b/Lib/idlelib/delegator.py @@ -14,7 +14,7 @@ def __getattr__(self, name): def resetcache(self): "Removes added attributes while leaving original attributes." - # Function is really about resetting delagator dict + # Function is really about resetting delegator dict # to original state. Cache is just a means for key in self.__cache: try: diff --git a/Lib/idlelib/editor.py b/Lib/idlelib/editor.py index 89b7239a96ea..a6674728cd93 100644 --- a/Lib/idlelib/editor.py +++ b/Lib/idlelib/editor.py @@ -315,7 +315,7 @@ def __init__(self, flist=None, filename=None, key=None, root=None): self.CodeContext(self).toggle_code_context_event) def _filename_to_unicode(self, filename): - """Return filename as BMP unicode so diplayable in Tk.""" + """Return filename as BMP unicode so displayable in Tk.""" # Decode bytes to unicode. if isinstance(filename, bytes): try: diff --git a/Lib/idlelib/idle_test/htest.py b/Lib/idlelib/idle_test/htest.py index 429081f7ef25..6e3398ed0bc8 100644 --- a/Lib/idlelib/idle_test/htest.py +++ b/Lib/idlelib/idle_test/htest.py @@ -12,7 +12,7 @@ The first parameter of X must be 'parent'. When called, the parent argument will be the root window. X must create a child Toplevel window (or subclass thereof). The Toplevel may be a test widget or -dialog, in which case the callable is the corresonding class. Or the +dialog, in which case the callable is the corresponding class. Or the Toplevel may contain the widget to be tested or set up a context in which a test widget is invoked. In this latter case, the callable is a wrapper function that sets up the Toplevel and other objects. Wrapper diff --git a/Lib/idlelib/idle_test/mock_tk.py b/Lib/idlelib/idle_test/mock_tk.py index a54f51f1949c..576f7d5d609e 100644 --- a/Lib/idlelib/idle_test/mock_tk.py +++ b/Lib/idlelib/idle_test/mock_tk.py @@ -37,7 +37,7 @@ class Mbox_func: """Generic mock for messagebox functions, which all have the same signature. Instead of displaying a message box, the mock's call method saves the - arguments as instance attributes, which test functions can then examime. + arguments as instance attributes, which test functions can then examine. The test can set the result returned to ask function """ def __init__(self, result=None): diff --git a/Lib/idlelib/idle_test/test_pyparse.py b/Lib/idlelib/idle_test/test_pyparse.py index 0534301b3610..479b84a216b0 100644 --- a/Lib/idlelib/idle_test/test_pyparse.py +++ b/Lib/idlelib/idle_test/test_pyparse.py @@ -160,7 +160,7 @@ def test_study1(self): TestInfo('\n def function1(self, a,\n', [0, 1, 2], BRACKET), TestInfo('())\n', [0, 1], NONE), # Extra closer. TestInfo(')(\n', [0, 1], BRACKET), # Extra closer. - # For the mismatched example, it doesn't look like contination. + # For the mismatched example, it doesn't look like continuation. TestInfo('{)(]\n', [0, 1], NONE), # Mismatched. ) diff --git a/Lib/idlelib/search.py b/Lib/idlelib/search.py index 5bbe9d6b5dc8..b35f3b59c3d2 100644 --- a/Lib/idlelib/search.py +++ b/Lib/idlelib/search.py @@ -80,7 +80,7 @@ def find_again(self, text): If no search was previously run, open a new search dialog. In this case, no search is done. - If a seach was previously run, the search dialog won't be + If a search was previously run, the search dialog won't be shown and the options from the previous search (including the search pattern) will be used to find the next occurrence of the pattern. Next is relative based on direction. diff --git a/Lib/idlelib/searchbase.py b/Lib/idlelib/searchbase.py index 74ba8538512b..4ed94f186b04 100644 --- a/Lib/idlelib/searchbase.py +++ b/Lib/idlelib/searchbase.py @@ -36,7 +36,7 @@ def __init__(self, root, engine): text (Text searched): set in open(), only used in subclasses(). ent (ry): created in make_entry() called from create_entry(). row (of grid): 0 in create_widgets(), +1 in make_entry/frame(). - default_command: set in subclasses, used in create_widgers(). + default_command: set in subclasses, used in create_widgets(). title (of dialog): class attribute, override in subclasses. icon (of dialog): ditto, use unclear if cannot minimize dialog. diff --git a/Lib/idlelib/squeezer.py b/Lib/idlelib/squeezer.py index 869498d753a2..032401f2abc7 100644 --- a/Lib/idlelib/squeezer.py +++ b/Lib/idlelib/squeezer.py @@ -6,7 +6,7 @@ completely unusable. This extension will automatically replace long texts with a small button. -Double-cliking this button will remove it and insert the original text instead. +Double-clicking this button will remove it and insert the original text instead. Middle-clicking will copy the text to the clipboard. Right-clicking will open the text in a separate viewing window. diff --git a/Lib/idlelib/undo.py b/Lib/idlelib/undo.py index f048994b7d15..85ecffecb4cb 100644 --- a/Lib/idlelib/undo.py +++ b/Lib/idlelib/undo.py @@ -2,7 +2,7 @@ from idlelib.delegator import Delegator -# tkintter import not needed because module does not create widgets, +# tkinter import not needed because module does not create widgets, # although many methods operate on text widget arguments. #$ event <> From webhook-mailer at python.org Mon Jun 3 00:39:37 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 03 Jun 2019 04:39:37 -0000 Subject: [Python-checkins] IDLE: Fix typos in docs and comments (GH-13749) Message-ID: https://github.com/python/cpython/commit/ab4d42a33e204026cc3eb3a15de54a14f224fdbb commit: ab4d42a33e204026cc3eb3a15de54a14f224fdbb branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-02T21:39:32-07:00 summary: IDLE: Fix typos in docs and comments (GH-13749) (cherry picked from commit d9677f36fe486e86bb86f2cd59cb7fc3804bdac1) Co-authored-by: Xtreak files: M Lib/idlelib/config.py M Lib/idlelib/configdialog.py M Lib/idlelib/delegator.py M Lib/idlelib/editor.py M Lib/idlelib/idle_test/htest.py M Lib/idlelib/idle_test/mock_tk.py M Lib/idlelib/idle_test/test_pyparse.py M Lib/idlelib/search.py M Lib/idlelib/searchbase.py M Lib/idlelib/squeezer.py M Lib/idlelib/undo.py diff --git a/Lib/idlelib/config.py b/Lib/idlelib/config.py index aa94d6535be6..12113c19c086 100644 --- a/Lib/idlelib/config.py +++ b/Lib/idlelib/config.py @@ -12,7 +12,7 @@ there are separate dicts for default and user values. Each has config-type keys 'main', 'extensions', 'highlight', and 'keys'. The value for each key is a ConfigParser instance that maps section and item -to values. For 'main' and 'extenstons', user values override +to values. For 'main' and 'extensions', user values override default values. For 'highlight' and 'keys', user sections augment the default sections (and must, therefore, have distinct names). diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py index 4aaec1321f7d..807ff60413d1 100644 --- a/Lib/idlelib/configdialog.py +++ b/Lib/idlelib/configdialog.py @@ -199,7 +199,7 @@ def destroy(self): def help(self): """Create textview for config dialog help. - Attrbutes accessed: + Attributes accessed: note Methods: diff --git a/Lib/idlelib/delegator.py b/Lib/idlelib/delegator.py index dc2a1aaeeab7..55c95da8532f 100644 --- a/Lib/idlelib/delegator.py +++ b/Lib/idlelib/delegator.py @@ -14,7 +14,7 @@ def __getattr__(self, name): def resetcache(self): "Removes added attributes while leaving original attributes." - # Function is really about resetting delagator dict + # Function is really about resetting delegator dict # to original state. Cache is just a means for key in self.__cache: try: diff --git a/Lib/idlelib/editor.py b/Lib/idlelib/editor.py index 89b7239a96ea..a6674728cd93 100644 --- a/Lib/idlelib/editor.py +++ b/Lib/idlelib/editor.py @@ -315,7 +315,7 @@ def __init__(self, flist=None, filename=None, key=None, root=None): self.CodeContext(self).toggle_code_context_event) def _filename_to_unicode(self, filename): - """Return filename as BMP unicode so diplayable in Tk.""" + """Return filename as BMP unicode so displayable in Tk.""" # Decode bytes to unicode. if isinstance(filename, bytes): try: diff --git a/Lib/idlelib/idle_test/htest.py b/Lib/idlelib/idle_test/htest.py index 429081f7ef25..6e3398ed0bc8 100644 --- a/Lib/idlelib/idle_test/htest.py +++ b/Lib/idlelib/idle_test/htest.py @@ -12,7 +12,7 @@ The first parameter of X must be 'parent'. When called, the parent argument will be the root window. X must create a child Toplevel window (or subclass thereof). The Toplevel may be a test widget or -dialog, in which case the callable is the corresonding class. Or the +dialog, in which case the callable is the corresponding class. Or the Toplevel may contain the widget to be tested or set up a context in which a test widget is invoked. In this latter case, the callable is a wrapper function that sets up the Toplevel and other objects. Wrapper diff --git a/Lib/idlelib/idle_test/mock_tk.py b/Lib/idlelib/idle_test/mock_tk.py index a54f51f1949c..576f7d5d609e 100644 --- a/Lib/idlelib/idle_test/mock_tk.py +++ b/Lib/idlelib/idle_test/mock_tk.py @@ -37,7 +37,7 @@ class Mbox_func: """Generic mock for messagebox functions, which all have the same signature. Instead of displaying a message box, the mock's call method saves the - arguments as instance attributes, which test functions can then examime. + arguments as instance attributes, which test functions can then examine. The test can set the result returned to ask function """ def __init__(self, result=None): diff --git a/Lib/idlelib/idle_test/test_pyparse.py b/Lib/idlelib/idle_test/test_pyparse.py index 0534301b3610..479b84a216b0 100644 --- a/Lib/idlelib/idle_test/test_pyparse.py +++ b/Lib/idlelib/idle_test/test_pyparse.py @@ -160,7 +160,7 @@ def test_study1(self): TestInfo('\n def function1(self, a,\n', [0, 1, 2], BRACKET), TestInfo('())\n', [0, 1], NONE), # Extra closer. TestInfo(')(\n', [0, 1], BRACKET), # Extra closer. - # For the mismatched example, it doesn't look like contination. + # For the mismatched example, it doesn't look like continuation. TestInfo('{)(]\n', [0, 1], NONE), # Mismatched. ) diff --git a/Lib/idlelib/search.py b/Lib/idlelib/search.py index 5bbe9d6b5dc8..b35f3b59c3d2 100644 --- a/Lib/idlelib/search.py +++ b/Lib/idlelib/search.py @@ -80,7 +80,7 @@ def find_again(self, text): If no search was previously run, open a new search dialog. In this case, no search is done. - If a seach was previously run, the search dialog won't be + If a search was previously run, the search dialog won't be shown and the options from the previous search (including the search pattern) will be used to find the next occurrence of the pattern. Next is relative based on direction. diff --git a/Lib/idlelib/searchbase.py b/Lib/idlelib/searchbase.py index 74ba8538512b..4ed94f186b04 100644 --- a/Lib/idlelib/searchbase.py +++ b/Lib/idlelib/searchbase.py @@ -36,7 +36,7 @@ def __init__(self, root, engine): text (Text searched): set in open(), only used in subclasses(). ent (ry): created in make_entry() called from create_entry(). row (of grid): 0 in create_widgets(), +1 in make_entry/frame(). - default_command: set in subclasses, used in create_widgers(). + default_command: set in subclasses, used in create_widgets(). title (of dialog): class attribute, override in subclasses. icon (of dialog): ditto, use unclear if cannot minimize dialog. diff --git a/Lib/idlelib/squeezer.py b/Lib/idlelib/squeezer.py index 869498d753a2..032401f2abc7 100644 --- a/Lib/idlelib/squeezer.py +++ b/Lib/idlelib/squeezer.py @@ -6,7 +6,7 @@ completely unusable. This extension will automatically replace long texts with a small button. -Double-cliking this button will remove it and insert the original text instead. +Double-clicking this button will remove it and insert the original text instead. Middle-clicking will copy the text to the clipboard. Right-clicking will open the text in a separate viewing window. diff --git a/Lib/idlelib/undo.py b/Lib/idlelib/undo.py index f048994b7d15..85ecffecb4cb 100644 --- a/Lib/idlelib/undo.py +++ b/Lib/idlelib/undo.py @@ -2,7 +2,7 @@ from idlelib.delegator import Delegator -# tkintter import not needed because module does not create widgets, +# tkinter import not needed because module does not create widgets, # although many methods operate on text widget arguments. #$ event <> From webhook-mailer at python.org Mon Jun 3 03:34:34 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Mon, 03 Jun 2019 07:34:34 -0000 Subject: [Python-checkins] bpo-35814: Allow unpacking in r.h.s of annotated assignment expressions (GH-13760) Message-ID: https://github.com/python/cpython/commit/8565f6b6db0fa9f65449b532a5056a98bad3dc37 commit: 8565f6b6db0fa9f65449b532a5056a98bad3dc37 branch: master author: Pablo Galindo committer: GitHub date: 2019-06-03T08:34:20+01:00 summary: bpo-35814: Allow unpacking in r.h.s of annotated assignment expressions (GH-13760) files: A Misc/NEWS.d/next/Core and Builtins/2019-06-03-00-51-02.bpo-35814.Cf7sGY.rst M Grammar/Grammar M Lib/test/test_grammar.py M Python/ast.c M Python/graminit.c diff --git a/Grammar/Grammar b/Grammar/Grammar index 0cacfb648e9a..21f7e1a89115 100644 --- a/Grammar/Grammar +++ b/Grammar/Grammar @@ -84,7 +84,7 @@ small_stmt: (expr_stmt | del_stmt | pass_stmt | flow_stmt | import_stmt | global_stmt | nonlocal_stmt | assert_stmt) expr_stmt: testlist_star_expr (annassign | augassign (yield_expr|testlist) | [('=' (yield_expr|testlist_star_expr))+ [TYPE_COMMENT]] ) -annassign: ':' test ['=' (yield_expr|testlist)] +annassign: ':' test ['=' (yield_expr|testlist_star_expr)] testlist_star_expr: (test|star_expr) (',' (test|star_expr))* [','] augassign: ('+=' | '-=' | '*=' | '@=' | '/=' | '%=' | '&=' | '|=' | '^=' | '<<=' | '>>=' | '**=' | '//=') diff --git a/Lib/test/test_grammar.py b/Lib/test/test_grammar.py index 2a3b71fac4a5..78d94593c7f3 100644 --- a/Lib/test/test_grammar.py +++ b/Lib/test/test_grammar.py @@ -454,6 +454,10 @@ def test_var_annot_rhs(self): exec(stmt, ns) self.assertEqual(list(ns['f']()), [None]) + ns = {"a": 1, 'b': (2, 3, 4), "c":5, "Tuple": typing.Tuple} + exec('x: Tuple[int, ...] = a,*b,c', ns) + self.assertEqual(ns['x'], (1, 2, 3, 4, 5)) + def test_funcdef(self): ### [decorators] 'def' NAME parameters ['->' test] ':' suite ### decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-06-03-00-51-02.bpo-35814.Cf7sGY.rst b/Misc/NEWS.d/next/Core and Builtins/2019-06-03-00-51-02.bpo-35814.Cf7sGY.rst new file mode 100644 index 000000000000..2b9f00a6d9e7 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-06-03-00-51-02.bpo-35814.Cf7sGY.rst @@ -0,0 +1,2 @@ +Allow unpacking in the right hand side of annotated assignments. In +particular, ``t: Tuple[int, ...] = x, y, *z`` is now allowed. diff --git a/Python/ast.c b/Python/ast.c index b77552274d24..df9242977e3f 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -3398,7 +3398,7 @@ ast_for_expr_stmt(struct compiling *c, const node *n) } else { ch = CHILD(ann, 3); - if (TYPE(ch) == testlist) { + if (TYPE(ch) == testlist_star_expr) { expr3 = ast_for_testlist(c, ch); } else { diff --git a/Python/graminit.c b/Python/graminit.c index 0587b1c0fc10..7c40ce933c1d 100644 --- a/Python/graminit.c +++ b/Python/graminit.c @@ -742,7 +742,7 @@ static const arc arcs_17_2[2] = { {0, 2}, }; static const arc arcs_17_3[2] = { - {47, 4}, + {81, 4}, {84, 4}, }; static const arc arcs_17_4[1] = { From webhook-mailer at python.org Mon Jun 3 06:34:52 2019 From: webhook-mailer at python.org (Ned Deily) Date: Mon, 03 Jun 2019 10:34:52 -0000 Subject: [Python-checkins] bpo-36231: Support building on macOS without /usr/include (GH-13773) Message-ID: https://github.com/python/cpython/commit/0288dd6a5192074fcd5aa0db5d3513c3880209ca commit: 0288dd6a5192074fcd5aa0db5d3513c3880209ca branch: master author: Ned Deily committer: GitHub date: 2019-06-03T06:34:48-04:00 summary: bpo-36231: Support building on macOS without /usr/include (GH-13773) files: A Misc/NEWS.d/next/macOS/2019-06-03-05-49-49.bpo-36231.RfmW_p.rst M setup.py diff --git a/Misc/NEWS.d/next/macOS/2019-06-03-05-49-49.bpo-36231.RfmW_p.rst b/Misc/NEWS.d/next/macOS/2019-06-03-05-49-49.bpo-36231.RfmW_p.rst new file mode 100644 index 000000000000..c82e54c12c89 --- /dev/null +++ b/Misc/NEWS.d/next/macOS/2019-06-03-05-49-49.bpo-36231.RfmW_p.rst @@ -0,0 +1,3 @@ +Support building Python on macOS without /usr/include installed. As of macOS +10.14, system header files are only available within an SDK provided by +either the Command Line Tools or the Xcode app. diff --git a/setup.py b/setup.py index 7852c2dfa27e..598f5819f8f3 100644 --- a/setup.py +++ b/setup.py @@ -125,19 +125,57 @@ def sysroot_paths(make_vars, subdirs): break return dirs +MACOS_SDK_ROOT = None def macosx_sdk_root(): + """Return the directory of the current macOS SDK. + + If no SDK was explicitly configured, call the compiler to find which + include files paths are being searched by default. Use '/' if the + compiler is searching /usr/include (meaning system header files are + installed) or use the root of an SDK if that is being searched. + (The SDK may be supplied via Xcode or via the Command Line Tools). + The SDK paths used by Apple-supplied tool chains depend on the + setting of various variables; see the xcrun man page for more info. """ - Return the directory of the current OSX SDK, - or '/' if no SDK was specified. - """ + global MACOS_SDK_ROOT + + # If already called, return cached result. + if MACOS_SDK_ROOT: + return MACOS_SDK_ROOT + cflags = sysconfig.get_config_var('CFLAGS') m = re.search(r'-isysroot\s+(\S+)', cflags) - if m is None: - sysroot = '/' + if m is not None: + MACOS_SDK_ROOT = m.group(1) else: - sysroot = m.group(1) - return sysroot + MACOS_SDK_ROOT = '/' + cc = sysconfig.get_config_var('CC') + tmpfile = '/tmp/setup_sdk_root.%d' % os.getpid() + try: + os.unlink(tmpfile) + except: + pass + ret = os.system('%s -E -v - %s 1>/dev/null' % (cc, tmpfile)) + in_incdirs = False + try: + if ret >> 8 == 0: + with open(tmpfile) as fp: + for line in fp.readlines(): + if line.startswith("#include <...>"): + in_incdirs = True + elif line.startswith("End of search list"): + in_incdirs = False + elif in_incdirs: + line = line.strip() + if line == '/usr/include': + MACOS_SDK_ROOT = '/' + elif line.endswith(".sdk/usr/include"): + MACOS_SDK_ROOT = line[:-12] + finally: + os.unlink(tmpfile) + + return MACOS_SDK_ROOT def is_macosx_sdk_path(path): From webhook-mailer at python.org Mon Jun 3 08:00:34 2019 From: webhook-mailer at python.org (Ned Deily) Date: Mon, 03 Jun 2019 12:00:34 -0000 Subject: [Python-checkins] Pin macOS installer Sphinx to v2.0.1 (GH-13774) Message-ID: https://github.com/python/cpython/commit/29ec4228106ed5f970d1c3666614f4a51bad192c commit: 29ec4228106ed5f970d1c3666614f4a51bad192c branch: master author: Ned Deily committer: GitHub date: 2019-06-03T08:00:25-04:00 summary: Pin macOS installer Sphinx to v2.0.1 (GH-13774) files: M Mac/BuildScript/build-installer.py diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py index 60e28fee055d..2c606b9df674 100755 --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -1058,6 +1058,7 @@ def buildPythonDocs(): runCommand('make clean') # Create virtual environment for docs builds with blurb and sphinx runCommand('make venv') + runCommand('venv/bin/python3 -m pip install -U Sphinx==2.0.1') runCommand('make html PYTHON=venv/bin/python') os.chdir(curDir) if not os.path.exists(docdir): From webhook-mailer at python.org Mon Jun 3 08:31:13 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Mon, 03 Jun 2019 12:31:13 -0000 Subject: [Python-checkins] bpo-26219: per opcode cache for LOAD_GLOBAL (GH-12884) Message-ID: https://github.com/python/cpython/commit/91234a16367b56ca03ee289f7c03a34d4cfec4c8 commit: 91234a16367b56ca03ee289f7c03a34d4cfec4c8 branch: master author: Inada Naoki committer: GitHub date: 2019-06-03T21:30:58+09:00 summary: bpo-26219: per opcode cache for LOAD_GLOBAL (GH-12884) This patch implements per opcode cache mechanism, and use it in only LOAD_GLOBAL opcode. Based on Yury's opcache3.patch in bpo-26219. files: A Include/internal/pycore_code.h A Misc/NEWS.d/next/Core and Builtins/2019-05-29-22-03-09.bpo-26219.Ovf1Qs.rst M Doc/whatsnew/3.8.rst M Include/code.h M Include/internal/pycore_ceval.h M Lib/test/test_dict_version.py M Makefile.pre.in M Objects/codeobject.c M Objects/dictobject.c M PCbuild/pythoncore.vcxproj M PCbuild/pythoncore.vcxproj.filters M Python/ceval.c M Python/pylifecycle.c diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 9474a2f4aafe..da97a7285099 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -860,6 +860,10 @@ Optimizations methods up to 20--50%. (Contributed by Serhiy Storchaka in :issue:`23867`, :issue:`35582` and :issue:`36127`.) +* ``LOAD_GLOBAL`` instruction now uses new "per opcode cache" mechanism. + It is about 40% faster now. (Contributed by Yury Selivanov and Inada Naoki in + :issue:`26219`.) + Build and C API Changes ======================= diff --git a/Include/code.h b/Include/code.h index 933de97d0782..b79d977394e0 100644 --- a/Include/code.h +++ b/Include/code.h @@ -17,6 +17,8 @@ typedef uint16_t _Py_CODEUNIT; # define _Py_OPARG(word) ((word) >> 8) #endif +typedef struct _PyOpcache _PyOpcache; + /* Bytecode object */ typedef struct { PyObject_HEAD @@ -49,6 +51,21 @@ typedef struct { Type is a void* to keep the format private in codeobject.c to force people to go through the proper APIs. */ void *co_extra; + + /* Per opcodes just-in-time cache + * + * To reduce cache size, we use indirect mapping from opcode index to + * cache object: + * cache = co_opcache[co_opcache_map[next_instr - first_instr] - 1] + */ + + // co_opcache_map is indexed by (next_instr - first_instr). + // * 0 means there is no cache for this opcode. + // * n > 0 means there is cache in co_opcache[n-1]. + unsigned char *co_opcache_map; + _PyOpcache *co_opcache; + int co_opcache_flag; // used to determine when create a cache. + unsigned char co_opcache_size; // length of co_opcache. } PyCodeObject; /* Masks for co_flags above */ diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index d44afdf4fa46..2c6df9a9af9e 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -31,6 +31,9 @@ PyAPI_FUNC(void) _PyEval_SignalAsyncExc( PyAPI_FUNC(void) _PyEval_ReInitThreads( _PyRuntimeState *runtime); +/* Private function */ +void _PyEval_Fini(void); + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h new file mode 100644 index 000000000000..88956f109b4f --- /dev/null +++ b/Include/internal/pycore_code.h @@ -0,0 +1,27 @@ +#ifndef Py_INTERNAL_CODE_H +#define Py_INTERNAL_CODE_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + PyObject *ptr; /* Cached pointer (borrowed reference) */ + uint64_t globals_ver; /* ma_version of global dict */ + uint64_t builtins_ver; /* ma_version of builtin dict */ +} _PyOpcache_LoadGlobal; + +struct _PyOpcache { + union { + _PyOpcache_LoadGlobal lg; + } u; + char optimized; +}; + +/* Private API */ +int _PyCode_InitOpcache(PyCodeObject *co); + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_CODE_H */ diff --git a/Lib/test/test_dict_version.py b/Lib/test/test_dict_version.py index 5671f9fc7c22..cb79e7434c29 100644 --- a/Lib/test/test_dict_version.py +++ b/Lib/test/test_dict_version.py @@ -80,14 +80,14 @@ def test_setitem_same_value(self): # setting a key to the same value with dict.__setitem__ # must change the version - self.check_version_changed(d, d.__setitem__, 'key', value) + self.check_version_dont_change(d, d.__setitem__, 'key', value) # setting a key to the same value with dict.update # must change the version - self.check_version_changed(d, d.update, key=value) + self.check_version_dont_change(d, d.update, key=value) d2 = self.new_dict(key=value) - self.check_version_changed(d, d.update, d2) + self.check_version_dont_change(d, d.update, d2) def test_setitem_equal(self): class AlwaysEqual: diff --git a/Makefile.pre.in b/Makefile.pre.in index 0bf5df4b68e5..a0bc9c1f1cc8 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1070,6 +1070,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/internal/pycore_accu.h \ $(srcdir)/Include/internal/pycore_atomic.h \ $(srcdir)/Include/internal/pycore_ceval.h \ + $(srcdir)/Include/internal/pycore_code.h \ $(srcdir)/Include/internal/pycore_condvar.h \ $(srcdir)/Include/internal/pycore_context.h \ $(srcdir)/Include/internal/pycore_fileutils.h \ diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-29-22-03-09.bpo-26219.Ovf1Qs.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-29-22-03-09.bpo-26219.Ovf1Qs.rst new file mode 100644 index 000000000000..a4ee7b580bc8 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-29-22-03-09.bpo-26219.Ovf1Qs.rst @@ -0,0 +1,3 @@ +Implemented per opcode cache mechanism and ``LOAD_GLOBAL`` instruction use +it. ``LOAD_GLOBAL`` is now about 40% faster. Contributed by Yury Selivanov, +and Inada Naoki. diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 233307562a55..0d9e5d16e768 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -2,7 +2,9 @@ #include "Python.h" #include "code.h" +#include "opcode.h" #include "structmember.h" +#include "pycore_code.h" #include "pycore_pystate.h" #include "pycore_tupleobject.h" #include "clinic/codeobject.c.h" @@ -233,9 +235,56 @@ PyCode_New(int argcount, int posonlyargcount, int kwonlyargcount, co->co_zombieframe = NULL; co->co_weakreflist = NULL; co->co_extra = NULL; + + co->co_opcache_map = NULL; + co->co_opcache = NULL; + co->co_opcache_flag = 0; + co->co_opcache_size = 0; return co; } +int +_PyCode_InitOpcache(PyCodeObject *co) +{ + Py_ssize_t co_size = PyBytes_Size(co->co_code) / sizeof(_Py_CODEUNIT); + co->co_opcache_map = (unsigned char *)PyMem_Calloc(co_size, 1); + if (co->co_opcache_map == NULL) { + return -1; + } + + _Py_CODEUNIT *opcodes = (_Py_CODEUNIT*)PyBytes_AS_STRING(co->co_code); + Py_ssize_t opts = 0; + + for (Py_ssize_t i = 0; i < co_size;) { + unsigned char opcode = _Py_OPCODE(opcodes[i]); + i++; // 'i' is now aligned to (next_instr - first_instr) + + // TODO: LOAD_METHOD, LOAD_ATTR + if (opcode == LOAD_GLOBAL) { + co->co_opcache_map[i] = ++opts; + if (opts > 254) { + break; + } + } + } + + if (opts) { + co->co_opcache = (_PyOpcache *)PyMem_Calloc(opts, sizeof(_PyOpcache)); + if (co->co_opcache == NULL) { + PyMem_FREE(co->co_opcache_map); + return -1; + } + } + else { + PyMem_FREE(co->co_opcache_map); + co->co_opcache_map = NULL; + co->co_opcache = NULL; + } + + co->co_opcache_size = opts; + return 0; +} + PyCodeObject * PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno) { @@ -458,6 +507,15 @@ code_new(PyTypeObject *type, PyObject *args, PyObject *kw) static void code_dealloc(PyCodeObject *co) { + if (co->co_opcache != NULL) { + PyMem_FREE(co->co_opcache); + } + if (co->co_opcache_map != NULL) { + PyMem_FREE(co->co_opcache_map); + } + co->co_opcache_flag = 0; + co->co_opcache_size = 0; + if (co->co_extra != NULL) { PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); _PyCodeObjectExtra *co_extra = co->co_extra; @@ -504,6 +562,13 @@ code_sizeof(PyCodeObject *co, PyObject *Py_UNUSED(args)) res += sizeof(_PyCodeObjectExtra) + (co_extra->ce_size-1) * sizeof(co_extra->ce_extras[0]); } + if (co->co_opcache != NULL) { + assert(co->co_opcache_map != NULL); + // co_opcache_map + res += PyBytes_GET_SIZE(co->co_code) / sizeof(_Py_CODEUNIT); + // co_opcache + res += co->co_opcache_size * sizeof(_PyOpcache); + } return PyLong_FromSsize_t(res); } diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 2b04b0b67965..0cc144375006 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -1080,20 +1080,21 @@ insertdict(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value) return 0; } - if (_PyDict_HasSplitTable(mp)) { - mp->ma_values[ix] = value; - if (old_value == NULL) { - /* pending state */ - assert(ix == mp->ma_used); - mp->ma_used++; + if (old_value != value) { + if (_PyDict_HasSplitTable(mp)) { + mp->ma_values[ix] = value; + if (old_value == NULL) { + /* pending state */ + assert(ix == mp->ma_used); + mp->ma_used++; + } } + else { + assert(old_value != NULL); + DK_ENTRIES(mp->ma_keys)[ix].me_value = value; + } + mp->ma_version_tag = DICT_NEXT_VERSION(); } - else { - assert(old_value != NULL); - DK_ENTRIES(mp->ma_keys)[ix].me_value = value; - } - - mp->ma_version_tag = DICT_NEXT_VERSION(); Py_XDECREF(old_value); /* which **CAN** re-enter (see issue #22653) */ ASSERT_CONSISTENT(mp); Py_DECREF(key); diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 329f9feb2bdf..89625da944e1 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -158,6 +158,7 @@ + diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index d80d05fb15a0..63ab88b4a01d 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -177,6 +177,9 @@ Include + + Include + Include diff --git a/Python/ceval.c b/Python/ceval.c index a092a2355641..411ba3d73c5f 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -11,6 +11,7 @@ #include "Python.h" #include "pycore_ceval.h" +#include "pycore_code.h" #include "pycore_object.h" #include "pycore_pyerrors.h" #include "pycore_pylifecycle.h" @@ -101,6 +102,20 @@ static long dxp[256]; #endif #endif +/* per opcode cache */ +#define OPCACHE_MIN_RUNS 1024 /* create opcache when code executed this time */ +#define OPCACHE_STATS 0 /* Enable stats */ + +#if OPCACHE_STATS +static size_t opcache_code_objects = 0; +static size_t opcache_code_objects_extra_mem = 0; + +static size_t opcache_global_opts = 0; +static size_t opcache_global_hits = 0; +static size_t opcache_global_misses = 0; +#endif + + /* This can set eval_breaker to 0 even though gil_drop_request became 1. We believe this is all right because the eval loop will release the GIL eventually anyway. */ @@ -225,6 +240,35 @@ exit_thread_if_finalizing(PyThreadState *tstate) } } +void +_PyEval_Fini(void) +{ +#if OPCACHE_STATS + fprintf(stderr, "-- Opcode cache number of objects = %zd\n", + opcache_code_objects); + + fprintf(stderr, "-- Opcode cache total extra mem = %zd\n", + opcache_code_objects_extra_mem); + + fprintf(stderr, "\n"); + + fprintf(stderr, "-- Opcode cache LOAD_GLOBAL hits = %zd (%d%%)\n", + opcache_global_hits, + (int) (100.0 * opcache_global_hits / + (opcache_global_hits + opcache_global_misses))); + + fprintf(stderr, "-- Opcode cache LOAD_GLOBAL misses = %zd (%d%%)\n", + opcache_global_misses, + (int) (100.0 * opcache_global_misses / + (opcache_global_hits + opcache_global_misses))); + + fprintf(stderr, "-- Opcode cache LOAD_GLOBAL opts = %zd\n", + opcache_global_opts); + + fprintf(stderr, "\n"); +#endif +} + void PyEval_AcquireLock(void) { @@ -799,6 +843,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) const _Py_CODEUNIT *first_instr; PyObject *names; PyObject *consts; + _PyOpcache *co_opcache; #ifdef LLTRACE _Py_IDENTIFIER(__ltrace__); @@ -1061,6 +1106,49 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) Py_XDECREF(traceback); \ } while(0) + /* macros for opcode cache */ +#define OPCACHE_CHECK() \ + do { \ + co_opcache = NULL; \ + if (co->co_opcache != NULL) { \ + unsigned char co_opt_offset = \ + co->co_opcache_map[next_instr - first_instr]; \ + if (co_opt_offset > 0) { \ + assert(co_opt_offset <= co->co_opcache_size); \ + co_opcache = &co->co_opcache[co_opt_offset - 1]; \ + assert(co_opcache != NULL); \ + if (co_opcache->optimized < 0) { \ + co_opcache = NULL; \ + } \ + } \ + } \ + } while (0) + +#if OPCACHE_STATS + +#define OPCACHE_STAT_GLOBAL_HIT() \ + do { \ + if (co->co_opcache != NULL) opcache_global_hits++; \ + } while (0) + +#define OPCACHE_STAT_GLOBAL_MISS() \ + do { \ + if (co->co_opcache != NULL) opcache_global_misses++; \ + } while (0) + +#define OPCACHE_STAT_GLOBAL_OPT() \ + do { \ + if (co->co_opcache != NULL) opcache_global_opts++; \ + } while (0) + +#else /* OPCACHE_STATS */ + +#define OPCACHE_STAT_GLOBAL_HIT() +#define OPCACHE_STAT_GLOBAL_MISS() +#define OPCACHE_STAT_GLOBAL_OPT() + +#endif + /* Start of code */ /* push frame */ @@ -1142,6 +1230,20 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */ f->f_executing = 1; + if (co->co_opcache_flag < OPCACHE_MIN_RUNS) { + co->co_opcache_flag++; + if (co->co_opcache_flag == OPCACHE_MIN_RUNS) { + if (_PyCode_InitOpcache(co) < 0) { + return NULL; + } +#if OPCACHE_STATS + opcache_code_objects_extra_mem += + PyBytes_Size(co->co_code) / sizeof(_Py_CODEUNIT) + + sizeof(_PyOpcache) * co->co_opcache_size; + opcache_code_objects++; +#endif + } + } #ifdef LLTRACE lltrace = _PyDict_GetItemId(f->f_globals, &PyId___ltrace__) != NULL; @@ -2451,11 +2553,30 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) } case TARGET(LOAD_GLOBAL): { - PyObject *name = GETITEM(names, oparg); + PyObject *name; PyObject *v; if (PyDict_CheckExact(f->f_globals) && PyDict_CheckExact(f->f_builtins)) { + OPCACHE_CHECK(); + if (co_opcache != NULL && co_opcache->optimized > 0) { + _PyOpcache_LoadGlobal *lg = &co_opcache->u.lg; + + if (lg->globals_ver == + ((PyDictObject *)f->f_globals)->ma_version_tag + && lg->builtins_ver == + ((PyDictObject *)f->f_builtins)->ma_version_tag) + { + PyObject *ptr = lg->ptr; + OPCACHE_STAT_GLOBAL_HIT(); + assert(ptr != NULL); + Py_INCREF(ptr); + PUSH(ptr); + DISPATCH(); + } + } + + name = GETITEM(names, oparg); v = _PyDict_LoadGlobal((PyDictObject *)f->f_globals, (PyDictObject *)f->f_builtins, name); @@ -2468,12 +2589,32 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) } goto error; } + + if (co_opcache != NULL) { + _PyOpcache_LoadGlobal *lg = &co_opcache->u.lg; + + if (co_opcache->optimized == 0) { + /* Wasn't optimized before. */ + OPCACHE_STAT_GLOBAL_OPT(); + } else { + OPCACHE_STAT_GLOBAL_MISS(); + } + + co_opcache->optimized = 1; + lg->globals_ver = + ((PyDictObject *)f->f_globals)->ma_version_tag; + lg->builtins_ver = + ((PyDictObject *)f->f_builtins)->ma_version_tag; + lg->ptr = v; /* borrowed */ + } + Py_INCREF(v); } else { /* Slow-path if globals or builtins is not a dict */ /* namespace 1: globals */ + name = GETITEM(names, oparg); v = PyObject_GetItem(f->f_globals, name); if (v == NULL) { if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) { diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 3de5528811ae..fc7e5510b2cd 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1242,6 +1242,9 @@ Py_FinalizeEx(void) /* Destroy all modules */ PyImport_Cleanup(); + /* Print debug stats if any */ + _PyEval_Fini(); + /* Flush sys.stdout and sys.stderr (again, in case more was printed) */ if (flush_std_files() < 0) { status = -1; From webhook-mailer at python.org Mon Jun 3 09:34:35 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Mon, 03 Jun 2019 13:34:35 -0000 Subject: [Python-checkins] bpo-26219: remove unused code (GH-13775) Message-ID: https://github.com/python/cpython/commit/395420e2a35937fa9777fc3c8b0086629db95e27 commit: 395420e2a35937fa9777fc3c8b0086629db95e27 branch: master author: Inada Naoki committer: GitHub date: 2019-06-03T22:34:15+09:00 summary: bpo-26219: remove unused code (GH-13775) This code was for deoptimization, which is removed from PR-12884. files: M Python/ceval.c diff --git a/Python/ceval.c b/Python/ceval.c index 411ba3d73c5f..cb0275c4183d 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1117,9 +1117,6 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) assert(co_opt_offset <= co->co_opcache_size); \ co_opcache = &co->co_opcache[co_opt_offset - 1]; \ assert(co_opcache != NULL); \ - if (co_opcache->optimized < 0) { \ - co_opcache = NULL; \ - } \ } \ } \ } while (0) From webhook-mailer at python.org Mon Jun 3 10:28:14 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 03 Jun 2019 14:28:14 -0000 Subject: [Python-checkins] Add credits to What's New in Python 3.8 (GH-13776) Message-ID: https://github.com/python/cpython/commit/01ae897efddb31f622999abf4479b2f0fd2f37ff commit: 01ae897efddb31f622999abf4479b2f0fd2f37ff branch: master author: Victor Stinner committer: GitHub date: 2019-06-03T16:28:01+02:00 summary: Add credits to What's New in Python 3.8 (GH-13776) * Credit myself and others. * Complete asyncio changes. files: M Doc/whatsnew/3.8.rst diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index da97a7285099..f060f4b3f7c4 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -341,6 +341,15 @@ asyncio ------- On Windows, the default event loop is now :class:`~asyncio.ProactorEventLoop`. +(Contributed by Victor Stinner in :issue:`34687`.) + +:class:`~asyncio.ProactorEventLoop` now also supports UDP. +(Contributed by Adam Meily and Andrew Svetlov in :issue:`29883`.) + +:class:`~asyncio.ProactorEventLoop` can now be interrupted by +:exc:`KeyboardInterrupt` ("CTRL+C"). +(Contributed by Vladimir Matveev in :issue:`23057`.) + builtins -------- @@ -672,6 +681,7 @@ how "unraisable exceptions" are handled. It is called when an exception has occurred but there is no way for Python to handle it. For example, when a destructor raises an exception or during garbage collection (:func:`gc.collect`). +(Contributed by Victor Stinner in :issue:`36829`.) tarfile @@ -740,7 +750,7 @@ unicodedata unittest -------- -* XXX Added :class:`AsyncMock` to support an asynchronous version of :class:`Mock`. +* Added :class:`AsyncMock` to support an asynchronous version of :class:`Mock`. Appropriate new assert functions for testing have been added as well. (Contributed by Lisa Roach in :issue:`26467`). @@ -801,6 +811,8 @@ Optimizations are not set; * the *executable* path contains a directory. + (Contributed by Joannah Nanjekye and Victor Stinner in :issue:`35537`.) + * :func:`shutil.copyfile`, :func:`shutil.copy`, :func:`shutil.copy2`, :func:`shutil.copytree` and :func:`shutil.move` use platform-specific "fast-copy" syscalls on Linux and macOS in order to copy the file @@ -1006,10 +1018,12 @@ The following features and APIs have been removed from Python 3.8: * The function :func:`platform.popen` has been removed, it was deprecated since Python 3.3: use :func:`os.popen` instead. + (Contributed by Victor Stinner in :issue:`35345`.) * The function :func:`time.clock` has been removed, it was deprecated since Python 3.3: use :func:`time.perf_counter` or :func:`time.process_time` instead, depending on your requirements, to have a well defined behavior. + (Contributed by Matthias Bussonnier in :issue:`36895`.) * The ``pyvenv`` script has been removed in favor of ``python3.8 -m venv`` to help eliminate confusion as to what Python interpreter the ``pyvenv`` @@ -1100,12 +1114,14 @@ Changes in the Python API Emulation, Popen constructor using :func:`os.posix_spawn` no longer raise an exception on errors like missing program, but the child process fails with a non-zero :attr:`~Popen.returncode`. + (Contributed by Joannah Nanjekye and Victor Stinner in :issue:`35537`.) * The :meth:`imap.IMAP4.logout` method no longer ignores silently arbitrary exceptions. * The function :func:`platform.popen` has been removed, it was deprecated since Python 3.3: use :func:`os.popen` instead. + (Contributed by Victor Stinner in :issue:`35345`.) * The :func:`statistics.mode` function no longer raises an exception when given multimodal data. Instead, it returns the first mode @@ -1232,6 +1248,7 @@ Changes in the C API ``RTLD_LOCAL``, it was already not possible to load C extensions which were not linked to ``libpython``, like C extensions of the standard library built by the ``*shared*`` section of ``Modules/Setup``. + (Contributed by Victor Stinner in :issue:`21536`.) * Use of ``#`` variants of formats in parsing or building value (e.g. :c:func:`PyArg_ParseTuple`, :c:func:`Py_BuildValue`, :c:func:`PyObject_CallFunction`, From webhook-mailer at python.org Mon Jun 3 11:17:12 2019 From: webhook-mailer at python.org (Julien Palard) Date: Mon, 03 Jun 2019 15:17:12 -0000 Subject: [Python-checkins] Doc fix: duplicate object description of email.message (GH-13742) Message-ID: https://github.com/python/cpython/commit/141da44bb45bc182886303fce92cbbae5631cb4c commit: 141da44bb45bc182886303fce92cbbae5631cb4c branch: master author: Julien Palard committer: GitHub date: 2019-06-03T17:17:03+02:00 summary: Doc fix: duplicate object description of email.message (GH-13742) files: M Doc/library/email.compat32-message.rst diff --git a/Doc/library/email.compat32-message.rst b/Doc/library/email.compat32-message.rst index f02b35b910a0..09ea64a5a01a 100644 --- a/Doc/library/email.compat32-message.rst +++ b/Doc/library/email.compat32-message.rst @@ -6,6 +6,7 @@ .. module:: email.message :synopsis: The base class representing email messages in a fashion backward compatible with Python 3.2 + :noindex: The :class:`Message` class is very similar to the From webhook-mailer at python.org Mon Jun 3 11:26:02 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 03 Jun 2019 15:26:02 -0000 Subject: [Python-checkins] Doc fix: duplicate object description of email.message (GH-13742) Message-ID: https://github.com/python/cpython/commit/15bde92e47e824369ee71e30b07f1624396f5cdc commit: 15bde92e47e824369ee71e30b07f1624396f5cdc branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-03T08:25:52-07:00 summary: Doc fix: duplicate object description of email.message (GH-13742) (cherry picked from commit 141da44bb45bc182886303fce92cbbae5631cb4c) Co-authored-by: Julien Palard files: M Doc/library/email.compat32-message.rst diff --git a/Doc/library/email.compat32-message.rst b/Doc/library/email.compat32-message.rst index f02b35b910a0..09ea64a5a01a 100644 --- a/Doc/library/email.compat32-message.rst +++ b/Doc/library/email.compat32-message.rst @@ -6,6 +6,7 @@ .. module:: email.message :synopsis: The base class representing email messages in a fashion backward compatible with Python 3.2 + :noindex: The :class:`Message` class is very similar to the From webhook-mailer at python.org Mon Jun 3 11:43:44 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 03 Jun 2019 15:43:44 -0000 Subject: [Python-checkins] bpo-37087: Adding native ID support for OpenBSD (GH-13654) Message-ID: https://github.com/python/cpython/commit/0b9956e9162d8723c2a30ff316ecc25e54459fb1 commit: 0b9956e9162d8723c2a30ff316ecc25e54459fb1 branch: master author: David Carlier committer: Victor Stinner date: 2019-06-03T17:43:33+02:00 summary: bpo-37087: Adding native ID support for OpenBSD (GH-13654) files: A Misc/NEWS.d/next/Core and Builtins/2019-05-30-17-33-55.bpo-37087.vElenE.rst M Doc/library/_thread.rst M Doc/library/threading.rst M Include/pythread.h M Python/thread_pthread.h diff --git a/Doc/library/_thread.rst b/Doc/library/_thread.rst index 48d36e85c9e5..26568dcbf8f5 100644 --- a/Doc/library/_thread.rst +++ b/Doc/library/_thread.rst @@ -106,7 +106,7 @@ This module defines the following constants and functions: Its value may be used to uniquely identify this particular thread system-wide (until the thread terminates, after which the value may be recycled by the OS). - .. availability:: Windows, FreeBSD, Linux, macOS. + .. availability:: Windows, FreeBSD, Linux, macOS, OpenBSD. .. versionadded:: 3.8 diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst index ffe6d04258aa..7fb9ac9979e4 100644 --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -82,7 +82,7 @@ This module defines the following functions: Its value may be used to uniquely identify this particular thread system-wide (until the thread terminates, after which the value may be recycled by the OS). - .. availability:: Windows, FreeBSD, Linux, macOS. + .. availability:: Windows, FreeBSD, Linux, macOS, OpenBSD. .. versionadded:: 3.8 @@ -355,7 +355,7 @@ since it is impossible to detect the termination of alien threads. system-wide) from the time the thread is created until the thread has been terminated. - .. availability:: Windows, FreeBSD, Linux, macOS. + .. availability:: Require :func:`get_native_id` function. .. versionadded:: 3.8 diff --git a/Include/pythread.h b/Include/pythread.h index c0f1eb9789b3..84b79c876425 100644 --- a/Include/pythread.h +++ b/Include/pythread.h @@ -26,7 +26,7 @@ PyAPI_FUNC(unsigned long) PyThread_start_new_thread(void (*)(void *), void *); PyAPI_FUNC(void) _Py_NO_RETURN PyThread_exit_thread(void); PyAPI_FUNC(unsigned long) PyThread_get_thread_ident(void); -#if defined(__APPLE__) || defined(__linux__) || defined(__FreeBSD__) || defined(_WIN32) +#if defined(__APPLE__) || defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(_WIN32) #define PY_HAVE_THREAD_NATIVE_ID PyAPI_FUNC(unsigned long) PyThread_get_thread_native_id(void); #endif diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-30-17-33-55.bpo-37087.vElenE.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-30-17-33-55.bpo-37087.vElenE.rst new file mode 100644 index 000000000000..a45330fed999 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-30-17-33-55.bpo-37087.vElenE.rst @@ -0,0 +1 @@ +Add native thread ID (TID) support to OpenBSD. \ No newline at end of file diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h index f57a1e7bb78b..740b521b9446 100644 --- a/Python/thread_pthread.h +++ b/Python/thread_pthread.h @@ -16,6 +16,8 @@ # include /* syscall(SYS_gettid) */ #elif defined(__FreeBSD__) # include /* pthread_getthreadid_np() */ +#elif defined(__OpenBSD__) +# include /* getthrid() */ #endif /* The POSIX spec requires that use of pthread_attr_setstacksize @@ -323,6 +325,9 @@ PyThread_get_thread_native_id(void) #elif defined(__FreeBSD__) int native_id; native_id = pthread_getthreadid_np(); +#elif defined(__OpenBSD__) + pid_t native_id; + native_id = getthrid(); #endif return (unsigned long) native_id; } From webhook-mailer at python.org Mon Jun 3 11:49:11 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 03 Jun 2019 15:49:11 -0000 Subject: [Python-checkins] bpo-37137: Fix test_asyncio: use TestCase.set_event_loop() (GH-13779) Message-ID: https://github.com/python/cpython/commit/49a7e347976c9b39149ac7505b11ad6e9e2bdeec commit: 49a7e347976c9b39149ac7505b11ad6e9e2bdeec branch: master author: Victor Stinner committer: GitHub date: 2019-06-03T17:49:04+02:00 summary: bpo-37137: Fix test_asyncio: use TestCase.set_event_loop() (GH-13779) Replace asyncio.set_event_loop() with TestCase.set_event_loop() of test_asyncio.utils: this method calls TestCase.close_loop() which waits until the executor completes, to avoid leaking dangling threads. Inherit from test_asyncio.utils.TestCase rather than unittest.TestCase. files: M Lib/test/test_asyncio/test_tasks.py diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py index 74ce25908a33..22a49077d5e7 100644 --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -2775,7 +2775,7 @@ def test__unregister_task_not_registered(self): self.assertEqual(asyncio.all_tasks(loop), set()) -class PyIntrospectionTests(unittest.TestCase, BaseTaskIntrospectionTests): +class PyIntrospectionTests(test_utils.TestCase, BaseTaskIntrospectionTests): _register_task = staticmethod(tasks._py_register_task) _unregister_task = staticmethod(tasks._py_unregister_task) _enter_task = staticmethod(tasks._py_enter_task) @@ -2784,7 +2784,7 @@ class PyIntrospectionTests(unittest.TestCase, BaseTaskIntrospectionTests): @unittest.skipUnless(hasattr(tasks, '_c_register_task'), 'requires the C _asyncio module') -class CIntrospectionTests(unittest.TestCase, BaseTaskIntrospectionTests): +class CIntrospectionTests(test_utils.TestCase, BaseTaskIntrospectionTests): if hasattr(tasks, '_c_register_task'): _register_task = staticmethod(tasks._c_register_task) _unregister_task = staticmethod(tasks._c_unregister_task) @@ -2799,12 +2799,7 @@ class BaseCurrentLoopTests: def setUp(self): super().setUp() self.loop = asyncio.new_event_loop() - asyncio.set_event_loop(self.loop) - - def tearDown(self): - self.loop.close() - asyncio.set_event_loop(None) - super().tearDown() + self.set_event_loop(self.loop) def new_task(self, coro): raise NotImplementedError @@ -2828,7 +2823,7 @@ def test_current_task_with_implicit_loop(self): self.assertIsNone(asyncio.current_task(loop=self.loop)) -class PyCurrentLoopTests(BaseCurrentLoopTests, unittest.TestCase): +class PyCurrentLoopTests(BaseCurrentLoopTests, test_utils.TestCase): def new_task(self, coro): return tasks._PyTask(coro, loop=self.loop) @@ -2836,7 +2831,7 @@ def new_task(self, coro): @unittest.skipUnless(hasattr(tasks, '_CTask'), 'requires the C _asyncio module') -class CCurrentLoopTests(BaseCurrentLoopTests, unittest.TestCase): +class CCurrentLoopTests(BaseCurrentLoopTests, test_utils.TestCase): def new_task(self, coro): return getattr(tasks, '_CTask')(coro, loop=self.loop) @@ -3245,7 +3240,7 @@ class SleepTests(test_utils.TestCase): def setUp(self): super().setUp() self.loop = asyncio.new_event_loop() - asyncio.set_event_loop(None) + self.set_event_loop(self.loop) def tearDown(self): self.loop.close() @@ -3279,7 +3274,7 @@ class WaitTests(test_utils.TestCase): def setUp(self): super().setUp() self.loop = asyncio.new_event_loop() - asyncio.set_event_loop(None) + self.set_event_loop(self.loop) def tearDown(self): self.loop.close() @@ -3306,7 +3301,7 @@ class CompatibilityTests(test_utils.TestCase): def setUp(self): super().setUp() self.loop = asyncio.new_event_loop() - asyncio.set_event_loop(None) + self.set_event_loop(self.loop) def tearDown(self): self.loop.close() From webhook-mailer at python.org Mon Jun 3 12:14:41 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 03 Jun 2019 16:14:41 -0000 Subject: [Python-checkins] Revert "bpo-33608: Factor out a private, per-interpreter _Py_AddPendingCall(). (gh-13714)" (GH-13780) Message-ID: https://github.com/python/cpython/commit/e225bebc1409bcf68db74a35ed3c31222883bf8f commit: e225bebc1409bcf68db74a35ed3c31222883bf8f branch: master author: Victor Stinner committer: GitHub date: 2019-06-03T18:14:24+02:00 summary: Revert "bpo-33608: Factor out a private, per-interpreter _Py_AddPendingCall(). (gh-13714)" (GH-13780) This reverts commit 6a150bcaeb190d1731b38ab9c7a5d1a352847ddc. files: D Misc/NEWS.d/next/Core and Builtins/2018-09-15-12-13-46.bpo-33608.avmvVP.rst M Include/internal/pycore_ceval.h M Include/internal/pycore_pystate.h M Lib/test/test_capi.py M Modules/_testcapimodule.c M Modules/signalmodule.c M Python/ceval.c M Python/ceval_gil.h M Python/pylifecycle.c M Python/pystate.c diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index 2c6df9a9af9e..4c1c0e2439ee 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -12,22 +12,19 @@ extern "C" { #include "pycore_pystate.h" #include "pythread.h" +PyAPI_FUNC(void) _Py_FinishPendingCalls(_PyRuntimeState *runtime); PyAPI_FUNC(void) _PyEval_Initialize(struct _ceval_runtime_state *); PyAPI_FUNC(void) _PyEval_FiniThreads( - struct _ceval_runtime_state *); + struct _ceval_runtime_state *ceval); PyAPI_FUNC(void) _PyEval_SignalReceived( - struct _ceval_runtime_state *); + struct _ceval_runtime_state *ceval); PyAPI_FUNC(int) _PyEval_AddPendingCall( PyThreadState *tstate, - struct _ceval_runtime_state *, - struct _ceval_interpreter_state *, - unsigned long thread_id, + struct _ceval_runtime_state *ceval, int (*func)(void *), void *arg); -PyAPI_FUNC(void) _PyEval_FinishPendingCalls(PyInterpreterState *); PyAPI_FUNC(void) _PyEval_SignalAsyncExc( - struct _ceval_runtime_state *, - struct _ceval_interpreter_state *); + struct _ceval_runtime_state *ceval); PyAPI_FUNC(void) _PyEval_ReInitThreads( _PyRuntimeState *runtime); diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index aca5533022e3..520a74b8a61f 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -25,7 +25,7 @@ struct pyruntimestate; /* ceval state */ -struct _ceval_pending_calls { +struct _pending_calls { int finishing; PyThread_type_lock lock; /* Request for running pending calls. */ @@ -36,7 +36,6 @@ struct _ceval_pending_calls { int async_exc; #define NPENDINGCALLS 32 struct { - unsigned long thread_id; int (*func)(void *); void *arg; } calls[NPENDINGCALLS]; @@ -54,21 +53,15 @@ struct _ceval_runtime_state { int tracing_possible; /* This single variable consolidates all requests to break out of the fast path in the eval loop. */ - // XXX This can move to _ceval_interpreter_state once all parts - // from COMPUTE_EVAL_BREAKER have moved under PyInterpreterState. _Py_atomic_int eval_breaker; /* Request for dropping the GIL */ _Py_atomic_int gil_drop_request; + struct _pending_calls pending; /* Request for checking signals. */ _Py_atomic_int signals_pending; struct _gil_runtime_state gil; }; -struct _ceval_interpreter_state { - struct _ceval_pending_calls pending; -}; - - /* interpreter state */ typedef PyObject* (*_PyFrameEvalFunction)(struct _frame *, int); @@ -143,7 +136,6 @@ struct _is { uint64_t tstate_next_unique_id; - struct _ceval_interpreter_state ceval; struct _warnings_runtime_state warnings; PyObject *audit_hooks; diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index 88bda057ed6a..43d7a08da944 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -431,7 +431,7 @@ def pendingcalls_wait(self, l, n, context = None): def test_pendingcalls_threaded(self): #do every callback on a separate thread - n = 32 #total callbacks (see NPENDINGCALLS in pycore_ceval.h) + n = 32 #total callbacks threads = [] class foo(object):pass context = foo() diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-09-15-12-13-46.bpo-33608.avmvVP.rst b/Misc/NEWS.d/next/Core and Builtins/2018-09-15-12-13-46.bpo-33608.avmvVP.rst deleted file mode 100644 index 73a01a1f46bd..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2018-09-15-12-13-46.bpo-33608.avmvVP.rst +++ /dev/null @@ -1,5 +0,0 @@ -We added a new internal _Py_AddPendingCall() that operates relative to the -provided interpreter. This allows us to use the existing implementation to -ask another interpreter to do work that cannot be done in the current -interpreter, like decref an object the other interpreter owns. The existing -Py_AddPendingCall() only operates relative to the main interpreter. diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 40e0826ce126..f059b4df11b7 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -2677,7 +2677,6 @@ pending_threadfunc(PyObject *self, PyObject *arg) Py_INCREF(callable); Py_BEGIN_ALLOW_THREADS - /* XXX Use the internal _Py_AddPendingCall(). */ r = Py_AddPendingCall(&_pending_callback, callable); Py_END_ALLOW_THREADS diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index 1964646da252..7698984ff3af 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -21,7 +21,6 @@ #include #endif #endif -#include "internal/pycore_pystate.h" #ifdef HAVE_SIGNAL_H #include @@ -260,7 +259,6 @@ trip_signal(int sig_num) /* Notify ceval.c */ _PyRuntimeState *runtime = &_PyRuntime; PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); - PyInterpreterState *interp = runtime->interpreters.main; _PyEval_SignalReceived(&runtime->ceval); /* And then write to the wakeup fd *after* setting all the globals and @@ -301,10 +299,7 @@ trip_signal(int sig_num) { /* Py_AddPendingCall() isn't signal-safe, but we still use it for this exceptional case. */ - _PyEval_AddPendingCall(tstate, - &runtime->ceval, - &interp->ceval, - runtime->main_thread, + _PyEval_AddPendingCall(tstate, &runtime->ceval, report_wakeup_send_error, (void *)(intptr_t) last_error); } @@ -323,10 +318,7 @@ trip_signal(int sig_num) { /* Py_AddPendingCall() isn't signal-safe, but we still use it for this exceptional case. */ - _PyEval_AddPendingCall(tstate, - &runtime->ceval, - &interp->ceval, - runtime->main_thread, + _PyEval_AddPendingCall(tstate, &runtime->ceval, report_wakeup_write_error, (void *)(intptr_t)errno); } diff --git a/Python/ceval.c b/Python/ceval.c index cb0275c4183d..0a4af915d6ff 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -115,65 +115,66 @@ static size_t opcache_global_hits = 0; static size_t opcache_global_misses = 0; #endif +#define GIL_REQUEST _Py_atomic_load_relaxed(&ceval->gil_drop_request) /* This can set eval_breaker to 0 even though gil_drop_request became 1. We believe this is all right because the eval loop will release the GIL eventually anyway. */ -#define COMPUTE_EVAL_BREAKER(ceval_r, ceval_i) \ +#define COMPUTE_EVAL_BREAKER(ceval) \ _Py_atomic_store_relaxed( \ - &(ceval_r)->eval_breaker, \ - _Py_atomic_load_relaxed(&(ceval_r)->gil_drop_request) | \ - _Py_atomic_load_relaxed(&(ceval_r)->signals_pending) | \ - _Py_atomic_load_relaxed(&(ceval_i)->pending.calls_to_do) | \ - (ceval_i)->pending.async_exc) + &(ceval)->eval_breaker, \ + GIL_REQUEST | \ + _Py_atomic_load_relaxed(&(ceval)->signals_pending) | \ + _Py_atomic_load_relaxed(&(ceval)->pending.calls_to_do) | \ + (ceval)->pending.async_exc) -#define SET_GIL_DROP_REQUEST(ceval_r) \ +#define SET_GIL_DROP_REQUEST(ceval) \ do { \ - _Py_atomic_store_relaxed(&(ceval_r)->gil_drop_request, 1); \ - _Py_atomic_store_relaxed(&(ceval_r)->eval_breaker, 1); \ + _Py_atomic_store_relaxed(&(ceval)->gil_drop_request, 1); \ + _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \ } while (0) -#define RESET_GIL_DROP_REQUEST(ceval_r, ceval_i) \ +#define RESET_GIL_DROP_REQUEST(ceval) \ do { \ - _Py_atomic_store_relaxed(&(ceval_r)->gil_drop_request, 0); \ - COMPUTE_EVAL_BREAKER(ceval_r, ceval_i); \ + _Py_atomic_store_relaxed(&(ceval)->gil_drop_request, 0); \ + COMPUTE_EVAL_BREAKER(ceval); \ } while (0) /* Pending calls are only modified under pending_lock */ -#define SIGNAL_PENDING_CALLS(ceval_r, ceval_i) \ +#define SIGNAL_PENDING_CALLS(ceval) \ do { \ - _Py_atomic_store_relaxed(&(ceval_i)->pending.calls_to_do, 1); \ - _Py_atomic_store_relaxed(&(ceval_r)->eval_breaker, 1); \ + _Py_atomic_store_relaxed(&(ceval)->pending.calls_to_do, 1); \ + _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \ } while (0) -#define UNSIGNAL_PENDING_CALLS(ceval_r, ceval_i) \ +#define UNSIGNAL_PENDING_CALLS(ceval) \ do { \ - _Py_atomic_store_relaxed(&(ceval_i)->pending.calls_to_do, 0); \ - COMPUTE_EVAL_BREAKER(ceval_r, ceval_i); \ + _Py_atomic_store_relaxed(&(ceval)->pending.calls_to_do, 0); \ + COMPUTE_EVAL_BREAKER(ceval); \ } while (0) -#define SIGNAL_PENDING_SIGNALS(ceval_r) \ +#define SIGNAL_PENDING_SIGNALS(ceval) \ do { \ - _Py_atomic_store_relaxed(&(ceval_r)->signals_pending, 1); \ - _Py_atomic_store_relaxed(&(ceval_r)->eval_breaker, 1); \ + _Py_atomic_store_relaxed(&(ceval)->signals_pending, 1); \ + _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \ } while (0) -#define UNSIGNAL_PENDING_SIGNALS(ceval_r, ceval_i) \ +#define UNSIGNAL_PENDING_SIGNALS(ceval) \ do { \ - _Py_atomic_store_relaxed(&(ceval_r)->signals_pending, 0); \ - COMPUTE_EVAL_BREAKER(ceval_r, ceval_i); \ + _Py_atomic_store_relaxed(&(ceval)->signals_pending, 0); \ + COMPUTE_EVAL_BREAKER(ceval); \ } while (0) -#define SIGNAL_ASYNC_EXC(ceval_r, ceval_i) \ +#define SIGNAL_ASYNC_EXC(ceval) \ do { \ - (ceval_i)->pending.async_exc = 1; \ - _Py_atomic_store_relaxed(&(ceval_r)->eval_breaker, 1); \ + (ceval)->pending.async_exc = 1; \ + _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \ } while (0) -#define UNSIGNAL_ASYNC_EXC(ceval_r, ceval_i) \ +#define UNSIGNAL_ASYNC_EXC(ceval) \ do { \ - (ceval_i)->pending.async_exc = 0; \ - COMPUTE_EVAL_BREAKER(ceval_r, ceval_i); \ + (ceval)->pending.async_exc = 0; \ + COMPUTE_EVAL_BREAKER(ceval); \ } while (0) @@ -193,8 +194,8 @@ void PyEval_InitThreads(void) { _PyRuntimeState *runtime = &_PyRuntime; - struct _ceval_runtime_state *ceval_r = &runtime->ceval; - struct _gil_runtime_state *gil = &ceval_r->gil; + struct _ceval_runtime_state *ceval = &runtime->ceval; + struct _gil_runtime_state *gil = &ceval->gil; if (gil_created(gil)) { return; } @@ -202,15 +203,19 @@ PyEval_InitThreads(void) PyThread_init_thread(); create_gil(gil); PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); - take_gil(ceval_r, tstate); + take_gil(ceval, tstate); - // The pending calls mutex is initialized in PyInterpreterState_New(). + struct _pending_calls *pending = &ceval->pending; + pending->lock = PyThread_allocate_lock(); + if (pending->lock == NULL) { + Py_FatalError("Can't initialize threads for pending calls"); + } } void -_PyEval_FiniThreads(struct _ceval_runtime_state *ceval_r) +_PyEval_FiniThreads(struct _ceval_runtime_state *ceval) { - struct _gil_runtime_state *gil = &ceval_r->gil; + struct _gil_runtime_state *gil = &ceval->gil; if (!gil_created(gil)) { return; } @@ -218,24 +223,20 @@ _PyEval_FiniThreads(struct _ceval_runtime_state *ceval_r) destroy_gil(gil); assert(!gil_created(gil)); - // The pending calls mutex is freed in PyInterpreterState_Delete(). + struct _pending_calls *pending = &ceval->pending; + if (pending->lock != NULL) { + PyThread_free_lock(pending->lock); + pending->lock = NULL; + } } static inline void exit_thread_if_finalizing(PyThreadState *tstate) { - PyInterpreterState *interp = tstate->interp; - // Stop if thread/interpreter inalization already stated. - if (interp == NULL) { - return; - } - _PyRuntimeState *runtime = interp->runtime; - if (runtime == NULL) { - return; - } - // Don't exit if the main thread (i.e. of the main interpreter). + _PyRuntimeState *runtime = tstate->interp->runtime; + /* _Py_Finalizing is protected by the GIL */ if (runtime->finalizing != NULL && !_Py_CURRENTLY_FINALIZING(runtime, tstate)) { - drop_gil(&runtime->ceval, &interp->ceval, tstate); + drop_gil(&runtime->ceval, tstate); PyThread_exit_thread(); } } @@ -273,12 +274,12 @@ void PyEval_AcquireLock(void) { _PyRuntimeState *runtime = &_PyRuntime; - struct _ceval_runtime_state *ceval_r = &runtime->ceval; + struct _ceval_runtime_state *ceval = &runtime->ceval; PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); if (tstate == NULL) { Py_FatalError("PyEval_AcquireLock: current thread state is NULL"); } - take_gil(ceval_r, tstate); + take_gil(ceval, tstate); exit_thread_if_finalizing(tstate); } @@ -286,21 +287,12 @@ void PyEval_ReleaseLock(void) { _PyRuntimeState *runtime = &_PyRuntime; + PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); /* This function must succeed when the current thread state is NULL. We therefore avoid PyThreadState_Get() which dumps a fatal error in debug mode. */ - PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); - // Fall back to the main interpreter if there is not active Python - // thread. This only affects the eval_breaker. - PyInterpreterState *interp = runtime->interpreters.main; - if (tstate != NULL) { - interp = tstate->interp; - if (interp == NULL) { - Py_FatalError("PyEval_ReleaseLock: NULL interpreter state"); - } - } - drop_gil(&runtime->ceval, &interp->ceval, tstate); + drop_gil(&runtime->ceval, tstate); } void @@ -309,19 +301,14 @@ PyEval_AcquireThread(PyThreadState *tstate) if (tstate == NULL) { Py_FatalError("PyEval_AcquireThread: NULL new thread state"); } - PyInterpreterState *interp = tstate->interp; - if (interp == NULL) { - Py_FatalError("PyEval_AcquireThread: NULL interpreter state"); - } - _PyRuntimeState *runtime = interp->runtime; - if (runtime == NULL) { - Py_FatalError("PyEval_AcquireThread: NULL runtime state"); - } - struct _ceval_runtime_state *ceval_r = &runtime->ceval; + assert(tstate->interp != NULL); + + _PyRuntimeState *runtime = tstate->interp->runtime; + struct _ceval_runtime_state *ceval = &runtime->ceval; /* Check someone has called PyEval_InitThreads() to create the lock */ - assert(gil_created(&ceval_r->gil)); - take_gil(ceval_r, tstate); + assert(gil_created(&ceval->gil)); + take_gil(ceval, tstate); exit_thread_if_finalizing(tstate); if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) { Py_FatalError("PyEval_AcquireThread: non-NULL old thread state"); @@ -334,20 +321,14 @@ PyEval_ReleaseThread(PyThreadState *tstate) if (tstate == NULL) { Py_FatalError("PyEval_ReleaseThread: NULL thread state"); } - PyInterpreterState *interp = tstate->interp; - if (interp == NULL) { - Py_FatalError("PyEval_ReleaseThread: NULL interpreter state"); - } - _PyRuntimeState *runtime = interp->runtime; - if (runtime == NULL) { - Py_FatalError("PyEval_ReleaseThread: NULL runtime state"); - } + assert(tstate->interp != NULL); + _PyRuntimeState *runtime = tstate->interp->runtime; PyThreadState *new_tstate = _PyThreadState_Swap(&runtime->gilstate, NULL); if (new_tstate != tstate) { Py_FatalError("PyEval_ReleaseThread: wrong thread state"); } - drop_gil(&runtime->ceval, &interp->ceval, tstate); + drop_gil(&runtime->ceval, tstate); } /* This function is called from PyOS_AfterFork_Child to destroy all threads @@ -358,17 +339,15 @@ PyEval_ReleaseThread(PyThreadState *tstate) void _PyEval_ReInitThreads(_PyRuntimeState *runtime) { - struct _ceval_runtime_state *ceval_r = &runtime->ceval; - if (!gil_created(&ceval_r->gil)) { + struct _ceval_runtime_state *ceval = &runtime->ceval; + if (!gil_created(&ceval->gil)) { return; } - recreate_gil(&ceval_r->gil); + recreate_gil(&ceval->gil); PyThreadState *current_tstate = _PyRuntimeState_GetThreadState(runtime); - take_gil(ceval_r, current_tstate); + take_gil(ceval, current_tstate); - // Only the main interpreter remains, so ignore the rest. - PyInterpreterState *interp = _PyRuntime.interpreters.main; - struct _ceval_pending_calls *pending = &interp->ceval.pending; + struct _pending_calls *pending = &ceval->pending; pending->lock = PyThread_allocate_lock(); if (pending->lock == NULL) { Py_FatalError("Can't initialize threads for pending calls"); @@ -382,28 +361,22 @@ _PyEval_ReInitThreads(_PyRuntimeState *runtime) raised. */ void -_PyEval_SignalAsyncExc(struct _ceval_runtime_state *ceval_r, - struct _ceval_interpreter_state *ceval_i) +_PyEval_SignalAsyncExc(struct _ceval_runtime_state *ceval) { - SIGNAL_ASYNC_EXC(ceval_r, ceval_i); + SIGNAL_ASYNC_EXC(ceval); } PyThreadState * PyEval_SaveThread(void) { _PyRuntimeState *runtime = &_PyRuntime; - struct _ceval_runtime_state *ceval_r = &runtime->ceval; + struct _ceval_runtime_state *ceval = &runtime->ceval; PyThreadState *tstate = _PyThreadState_Swap(&runtime->gilstate, NULL); if (tstate == NULL) { Py_FatalError("PyEval_SaveThread: NULL tstate"); } - PyInterpreterState *interp = tstate->interp; - if (interp == NULL) { - Py_FatalError("PyEval_SaveThread: NULL interpreter state"); - } - - assert(gil_created(&ceval_r->gil)); - drop_gil(ceval_r, &interp->ceval, tstate); + assert(gil_created(&ceval->gil)); + drop_gil(ceval, tstate); return tstate; } @@ -413,20 +386,14 @@ PyEval_RestoreThread(PyThreadState *tstate) if (tstate == NULL) { Py_FatalError("PyEval_RestoreThread: NULL tstate"); } - PyInterpreterState *interp = tstate->interp; - if (interp == NULL) { - Py_FatalError("PyEval_RestoreThread: NULL interpreter state"); - } - _PyRuntimeState *runtime = interp->runtime; - if (runtime == NULL) { - Py_FatalError("PyEval_RestoreThread: NULL runtime state"); - } - struct _ceval_runtime_state *ceval_r = &runtime->ceval; + assert(tstate->interp != NULL); - assert(gil_created(&ceval_r->gil)); + _PyRuntimeState *runtime = tstate->interp->runtime; + struct _ceval_runtime_state *ceval = &runtime->ceval; + assert(gil_created(&ceval->gil)); int err = errno; - take_gil(ceval_r, tstate); + take_gil(ceval, tstate); exit_thread_if_finalizing(tstate); errno = err; @@ -457,17 +424,17 @@ PyEval_RestoreThread(PyThreadState *tstate) */ void -_PyEval_SignalReceived(struct _ceval_runtime_state *ceval_r) +_PyEval_SignalReceived(struct _ceval_runtime_state *ceval) { /* bpo-30703: Function called when the C signal handler of Python gets a signal. We cannot queue a callback using Py_AddPendingCall() since that function is not async-signal-safe. */ - SIGNAL_PENDING_SIGNALS(ceval_r); + SIGNAL_PENDING_SIGNALS(ceval); } /* Push one item onto the queue while holding the lock. */ static int -_push_pending_call(struct _ceval_pending_calls *pending, unsigned long thread_id, +_push_pending_call(struct _pending_calls *pending, int (*func)(void *), void *arg) { int i = pending->last; @@ -475,7 +442,6 @@ _push_pending_call(struct _ceval_pending_calls *pending, unsigned long thread_id if (j == pending->first) { return -1; /* Queue full */ } - pending->calls[i].thread_id = thread_id; pending->calls[i].func = func; pending->calls[i].arg = arg; pending->last = j; @@ -484,7 +450,7 @@ _push_pending_call(struct _ceval_pending_calls *pending, unsigned long thread_id /* Pop one item off the queue while holding the lock. */ static void -_pop_pending_call(struct _ceval_pending_calls *pending, unsigned long *thread_id, +_pop_pending_call(struct _pending_calls *pending, int (**func)(void *), void **arg) { int i = pending->first; @@ -494,7 +460,6 @@ _pop_pending_call(struct _ceval_pending_calls *pending, unsigned long *thread_id *func = pending->calls[i].func; *arg = pending->calls[i].arg; - *thread_id = pending->calls[i].thread_id; pending->first = (i + 1) % NPENDINGCALLS; } @@ -505,12 +470,10 @@ _pop_pending_call(struct _ceval_pending_calls *pending, unsigned long *thread_id int _PyEval_AddPendingCall(PyThreadState *tstate, - struct _ceval_runtime_state *ceval_r, - struct _ceval_interpreter_state *ceval_i, - unsigned long thread_id, + struct _ceval_runtime_state *ceval, int (*func)(void *), void *arg) { - struct _ceval_pending_calls *pending = &ceval_i->pending; + struct _pending_calls *pending = &ceval->pending; PyThread_acquire_lock(pending->lock, WAIT_LOCK); if (pending->finishing) { @@ -525,27 +488,20 @@ _PyEval_AddPendingCall(PyThreadState *tstate, _PyErr_Restore(tstate, exc, val, tb); return -1; } - int result = _push_pending_call(pending, thread_id, func, arg); - - /* signal loop */ - SIGNAL_PENDING_CALLS(ceval_r, ceval_i); + int result = _push_pending_call(pending, func, arg); PyThread_release_lock(pending->lock); + /* signal main loop */ + SIGNAL_PENDING_CALLS(ceval); return result; } -/* Py_AddPendingCall() is a simple wrapper for the sake - of backward-compatibility. */ int Py_AddPendingCall(int (*func)(void *), void *arg) { _PyRuntimeState *runtime = &_PyRuntime; - PyInterpreterState *interp = runtime->interpreters.main; PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); - return _PyEval_AddPendingCall(tstate, - &runtime->ceval, &interp->ceval, - runtime->main_thread, - func, arg); + return _PyEval_AddPendingCall(tstate, &runtime->ceval, func, arg); } static int @@ -566,69 +522,47 @@ handle_signals(_PyRuntimeState *runtime) return 0; } - struct _ceval_runtime_state *ceval_r = &runtime->ceval; - struct _ceval_interpreter_state *ceval_i = &interp->ceval; - UNSIGNAL_PENDING_SIGNALS(ceval_r, ceval_i); + struct _ceval_runtime_state *ceval = &runtime->ceval; + UNSIGNAL_PENDING_SIGNALS(ceval); if (_PyErr_CheckSignals() < 0) { - SIGNAL_PENDING_SIGNALS(ceval_r); /* We're not done yet */ + SIGNAL_PENDING_SIGNALS(ceval); /* We're not done yet */ return -1; } return 0; } static int -make_pending_calls(PyInterpreterState *interp) +make_pending_calls(_PyRuntimeState *runtime) { - if (interp == NULL) { - Py_FatalError("make_pending_calls: NULL interpreter state"); - } - _PyRuntimeState *runtime = interp->runtime; - if (runtime == NULL) { - Py_FatalError("make_pending_calls: NULL runtime state"); - } - PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); - if (tstate == NULL) { - Py_FatalError("make_pending_calls: NULL thread state"); - } - if (tstate->interp == NULL || tstate->interp != interp) { - Py_FatalError("make_pending_calls: thread state mismatch"); - } static int busy = 0; + /* only service pending calls on main thread */ + if (PyThread_get_thread_ident() != runtime->main_thread) { + return 0; + } + /* don't perform recursive pending calls */ if (busy) { return 0; } busy = 1; - struct _ceval_runtime_state *ceval_r = &runtime->ceval; - struct _ceval_interpreter_state *ceval_i = &interp->ceval; + struct _ceval_runtime_state *ceval = &runtime->ceval; /* unsignal before starting to call callbacks, so that any callback added in-between re-signals */ - UNSIGNAL_PENDING_CALLS(ceval_r, ceval_i); + UNSIGNAL_PENDING_CALLS(ceval); int res = 0; /* perform a bounded number of calls, in case of recursion */ - struct _ceval_pending_calls *pending = &ceval_i->pending; - unsigned long thread_id = 0; + struct _pending_calls *pending = &ceval->pending; for (int i=0; ilock, WAIT_LOCK); - _pop_pending_call(pending, &thread_id, &func, &arg); + _pop_pending_call(pending, &func, &arg); PyThread_release_lock(pending->lock); - if (thread_id && PyThread_get_thread_ident() != thread_id) { - // Thread mismatch, so move it to the end of the list - // and start over. - _PyEval_AddPendingCall(tstate, - &runtime->ceval, &interp->ceval, - thread_id, - func, arg); - goto error; - } - /* having released the lock, perform the callback */ if (func == NULL) { break; @@ -644,16 +578,17 @@ make_pending_calls(PyInterpreterState *interp) error: busy = 0; - SIGNAL_PENDING_CALLS(ceval_r, ceval_i); + SIGNAL_PENDING_CALLS(ceval); return res; } void -_PyEval_FinishPendingCalls(PyInterpreterState *interp) +_Py_FinishPendingCalls(_PyRuntimeState *runtime) { assert(PyGILState_Check()); - struct _ceval_pending_calls *pending = &interp->ceval.pending; + PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); + struct _pending_calls *pending = &runtime->ceval.pending; PyThread_acquire_lock(pending->lock, WAIT_LOCK); pending->finishing = 1; @@ -663,19 +598,12 @@ _PyEval_FinishPendingCalls(PyInterpreterState *interp) return; } - if (make_pending_calls(interp) < 0) { - _PyRuntimeState *runtime = interp->runtime; - if (runtime == NULL) { - runtime = &_PyRuntime; - } - PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); - if (tstate != NULL) { - PyObject *exc, *val, *tb; - _PyErr_Fetch(tstate, &exc, &val, &tb); - PyErr_BadInternalCall(); - _PyErr_ChainExceptions(exc, val, tb); - _PyErr_Print(tstate); - } + if (make_pending_calls(runtime) < 0) { + PyObject *exc, *val, *tb; + _PyErr_Fetch(tstate, &exc, &val, &tb); + PyErr_BadInternalCall(); + _PyErr_ChainExceptions(exc, val, tb); + _PyErr_Print(tstate); } } @@ -694,8 +622,7 @@ Py_MakePendingCalls(void) return res; } - PyInterpreterState *interp = _PyRuntime.interpreters.main; - res = make_pending_calls(interp); + res = make_pending_calls(runtime); if (res != 0) { return res; } @@ -712,11 +639,11 @@ Py_MakePendingCalls(void) int _Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT; void -_PyEval_Initialize(struct _ceval_runtime_state *ceval_r) +_PyEval_Initialize(struct _ceval_runtime_state *state) { - ceval_r->recursion_limit = Py_DEFAULT_RECURSION_LIMIT; + state->recursion_limit = Py_DEFAULT_RECURSION_LIMIT; _Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT; - _gil_initialize(&ceval_r->gil); + _gil_initialize(&state->gil); } int @@ -728,9 +655,9 @@ Py_GetRecursionLimit(void) void Py_SetRecursionLimit(int new_limit) { - struct _ceval_runtime_state *ceval_r = &_PyRuntime.ceval; - ceval_r->recursion_limit = new_limit; - _Py_CheckRecursionLimit = ceval_r->recursion_limit; + struct _ceval_runtime_state *ceval = &_PyRuntime.ceval; + ceval->recursion_limit = new_limit; + _Py_CheckRecursionLimit = ceval->recursion_limit; } /* the macro Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall() @@ -779,7 +706,7 @@ _Py_CheckRecursiveCall(const char *where) static int do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause); static int unpack_iterable(PyThreadState *, PyObject *, int, int, PyObject **); -#define _Py_TracingPossible(ceval_r) ((ceval_r)->tracing_possible) +#define _Py_TracingPossible(ceval) ((ceval)->tracing_possible) PyObject * @@ -825,10 +752,8 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) PyObject *retval = NULL; /* Return value */ _PyRuntimeState * const runtime = &_PyRuntime; PyThreadState * const tstate = _PyRuntimeState_GetThreadState(runtime); - PyInterpreterState * const interp = tstate->interp; - struct _ceval_runtime_state * const ceval_r = &runtime->ceval; - struct _ceval_interpreter_state * const ceval_i = &interp->ceval; - _Py_atomic_int * const eval_breaker = &ceval_r->eval_breaker; + struct _ceval_runtime_state * const ceval = &runtime->ceval; + _Py_atomic_int * const eval_breaker = &ceval->eval_breaker; PyCodeObject *co; /* when tracing we set things up so that @@ -916,7 +841,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) #ifdef LLTRACE #define FAST_DISPATCH() \ { \ - if (!lltrace && !_Py_TracingPossible(ceval_r) && !PyDTrace_LINE_ENABLED()) { \ + if (!lltrace && !_Py_TracingPossible(ceval) && !PyDTrace_LINE_ENABLED()) { \ f->f_lasti = INSTR_OFFSET(); \ NEXTOPARG(); \ goto *opcode_targets[opcode]; \ @@ -926,7 +851,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) #else #define FAST_DISPATCH() \ { \ - if (!_Py_TracingPossible(ceval_r) && !PyDTrace_LINE_ENABLED()) { \ + if (!_Py_TracingPossible(ceval) && !PyDTrace_LINE_ENABLED()) { \ f->f_lasti = INSTR_OFFSET(); \ NEXTOPARG(); \ goto *opcode_targets[opcode]; \ @@ -1295,27 +1220,27 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) goto fast_next_opcode; } - if (_Py_atomic_load_relaxed(&ceval_r->signals_pending)) { + if (_Py_atomic_load_relaxed(&ceval->signals_pending)) { if (handle_signals(runtime) != 0) { goto error; } } - if (_Py_atomic_load_relaxed(&ceval_i->pending.calls_to_do)) { - if (make_pending_calls(interp) != 0) { + if (_Py_atomic_load_relaxed(&ceval->pending.calls_to_do)) { + if (make_pending_calls(runtime) != 0) { goto error; } } - if (_Py_atomic_load_relaxed(&ceval_r->gil_drop_request)) { + if (_Py_atomic_load_relaxed(&ceval->gil_drop_request)) { /* Give another thread a chance */ if (_PyThreadState_Swap(&runtime->gilstate, NULL) != tstate) { Py_FatalError("ceval: tstate mix-up"); } - drop_gil(ceval_r, ceval_i, tstate); + drop_gil(ceval, tstate); /* Other threads may run now */ - take_gil(ceval_r, tstate); + take_gil(ceval, tstate); /* Check if we should make a quick exit. */ exit_thread_if_finalizing(tstate); @@ -1328,7 +1253,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) if (tstate->async_exc != NULL) { PyObject *exc = tstate->async_exc; tstate->async_exc = NULL; - UNSIGNAL_ASYNC_EXC(ceval_r, ceval_i); + UNSIGNAL_ASYNC_EXC(ceval); _PyErr_SetNone(tstate, exc); Py_DECREF(exc); goto error; @@ -1343,7 +1268,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) /* line-by-line tracing support */ - if (_Py_TracingPossible(ceval_r) && + if (_Py_TracingPossible(ceval) && tstate->c_tracefunc != NULL && !tstate->tracing) { int err; /* see maybe_call_line_trace diff --git a/Python/ceval_gil.h b/Python/ceval_gil.h index b44d0abad36b..34d48c990c44 100644 --- a/Python/ceval_gil.h +++ b/Python/ceval_gil.h @@ -141,11 +141,9 @@ static void recreate_gil(struct _gil_runtime_state *gil) } static void -drop_gil(struct _ceval_runtime_state *ceval_r, - struct _ceval_interpreter_state *ceval_i, - PyThreadState *tstate) +drop_gil(struct _ceval_runtime_state *ceval, PyThreadState *tstate) { - struct _gil_runtime_state *gil = &ceval_r->gil; + struct _gil_runtime_state *gil = &ceval->gil; if (!_Py_atomic_load_relaxed(&gil->locked)) { Py_FatalError("drop_gil: GIL is not locked"); } @@ -165,12 +163,12 @@ drop_gil(struct _ceval_runtime_state *ceval_r, MUTEX_UNLOCK(gil->mutex); #ifdef FORCE_SWITCHING - if (_Py_atomic_load_relaxed(&ceval_r->gil_drop_request) && tstate != NULL) { + if (_Py_atomic_load_relaxed(&ceval->gil_drop_request) && tstate != NULL) { MUTEX_LOCK(gil->switch_mutex); /* Not switched yet => wait */ if (((PyThreadState*)_Py_atomic_load_relaxed(&gil->last_holder)) == tstate) { - RESET_GIL_DROP_REQUEST(ceval_r, ceval_i); + RESET_GIL_DROP_REQUEST(ceval); /* NOTE: if COND_WAIT does not atomically start waiting when releasing the mutex, another thread can run through, take the GIL and drop it again, and reset the condition @@ -183,19 +181,13 @@ drop_gil(struct _ceval_runtime_state *ceval_r, } static void -take_gil(struct _ceval_runtime_state *ceval_r, - PyThreadState *tstate) +take_gil(struct _ceval_runtime_state *ceval, PyThreadState *tstate) { if (tstate == NULL) { Py_FatalError("take_gil: NULL tstate"); } - PyInterpreterState *interp = tstate->interp; - if (interp == NULL) { - Py_FatalError("take_gil: NULL interp"); - } - struct _ceval_interpreter_state *ceval_i = &interp->ceval; - struct _gil_runtime_state *gil = &ceval_r->gil; + struct _gil_runtime_state *gil = &ceval->gil; int err = errno; MUTEX_LOCK(gil->mutex); @@ -218,7 +210,7 @@ take_gil(struct _ceval_runtime_state *ceval_r, _Py_atomic_load_relaxed(&gil->locked) && gil->switch_number == saved_switchnum) { - SET_GIL_DROP_REQUEST(ceval_r); + SET_GIL_DROP_REQUEST(ceval); } } _ready: @@ -240,11 +232,11 @@ take_gil(struct _ceval_runtime_state *ceval_r, COND_SIGNAL(gil->switch_cond); MUTEX_UNLOCK(gil->switch_mutex); #endif - if (_Py_atomic_load_relaxed(&ceval_r->gil_drop_request)) { - RESET_GIL_DROP_REQUEST(ceval_r, ceval_i); + if (_Py_atomic_load_relaxed(&ceval->gil_drop_request)) { + RESET_GIL_DROP_REQUEST(ceval); } if (tstate->async_exc != NULL) { - _PyEval_SignalAsyncExc(ceval_r, ceval_i); + _PyEval_SignalAsyncExc(ceval); } MUTEX_UNLOCK(gil->mutex); diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index fc7e5510b2cd..fca2ee655191 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1147,31 +1147,15 @@ Py_FinalizeEx(void) return status; } - /* Get current thread state and interpreter pointer */ - PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); - PyInterpreterState *interp = tstate->interp; - // Wrap up existing "threading"-module-created, non-daemon threads. wait_for_thread_shutdown(); // Make any remaining pending calls. - /* XXX For the moment we are going to ignore lingering pending calls. - * We've seen sporadic on some of the buildbots during finalization - * with the changes for per-interpreter pending calls (see bpo-33608), - * meaning the previous _PyEval_FinishPendincCalls() call here is - * a trigger, if not responsible. - * - * Ignoring pending calls at this point in the runtime lifecycle - * is okay (for now) for the following reasons: - * - * * pending calls are still not a widely-used feature - * * this only affects runtime finalization, where the process is - * likely to end soon anyway (except for some embdding cases) - * - * See bpo-37127 about resolving the problem. Ultimately the call - * here should be re-enabled. - */ - //_PyEval_FinishPendingCalls(interp); + _Py_FinishPendingCalls(runtime); + + /* Get current thread state and interpreter pointer */ + PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); + PyInterpreterState *interp = tstate->interp; /* The interpreter is still entirely intact at this point, and the * exit funcs may be relying on that. In particular, if some thread @@ -1599,9 +1583,6 @@ Py_EndInterpreter(PyThreadState *tstate) // Wrap up existing "threading"-module-created, non-daemon threads. wait_for_thread_shutdown(); - // Make any remaining pending calls. - _PyEval_FinishPendingCalls(interp); - call_py_exitfuncs(interp); if (tstate != interp->tstate_head || tstate->next != NULL) diff --git a/Python/pystate.c b/Python/pystate.c index a9f3389a0d83..2b7db0e48deb 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -218,13 +218,6 @@ PyInterpreterState_New(void) return NULL; } - interp->ceval.pending.lock = PyThread_allocate_lock(); - if (interp->ceval.pending.lock == NULL) { - PyErr_SetString(PyExc_RuntimeError, - "failed to create interpreter ceval pending mutex"); - return NULL; - } - interp->eval_frame = _PyEval_EvalFrameDefault; #ifdef HAVE_DLOPEN #if HAVE_DECL_RTLD_NOW @@ -352,10 +345,6 @@ PyInterpreterState_Delete(PyInterpreterState *interp) if (interp->id_mutex != NULL) { PyThread_free_lock(interp->id_mutex); } - if (interp->ceval.pending.lock != NULL) { - PyThread_free_lock(interp->ceval.pending.lock); - interp->ceval.pending.lock = NULL; - } PyMem_RawFree(interp); } @@ -1025,7 +1014,7 @@ PyThreadState_SetAsyncExc(unsigned long id, PyObject *exc) p->async_exc = exc; HEAD_UNLOCK(runtime); Py_XDECREF(old_exc); - _PyEval_SignalAsyncExc(&runtime->ceval, &interp->ceval); + _PyEval_SignalAsyncExc(&runtime->ceval); return 1; } } @@ -1455,7 +1444,7 @@ _PyObject_GetCrossInterpreterData(PyObject *obj, _PyCrossInterpreterData *data) return 0; } -static int +static void _release_xidata(void *arg) { _PyCrossInterpreterData *data = (_PyCrossInterpreterData *)arg; @@ -1463,21 +1452,42 @@ _release_xidata(void *arg) data->free(data->data); } Py_XDECREF(data->obj); - PyMem_Free(data); - return 0; +} + +static void +_call_in_interpreter(struct _gilstate_runtime_state *gilstate, + PyInterpreterState *interp, + void (*func)(void *), void *arg) +{ + /* We would use Py_AddPendingCall() if it weren't specific to the + * main interpreter (see bpo-33608). In the meantime we take a + * naive approach. + */ + PyThreadState *save_tstate = NULL; + if (interp != _PyRuntimeGILState_GetThreadState(gilstate)->interp) { + // XXX Using the "head" thread isn't strictly correct. + PyThreadState *tstate = PyInterpreterState_ThreadHead(interp); + // XXX Possible GILState issues? + save_tstate = _PyThreadState_Swap(gilstate, tstate); + } + + func(arg); + + // Switch back. + if (save_tstate != NULL) { + _PyThreadState_Swap(gilstate, save_tstate); + } } void _PyCrossInterpreterData_Release(_PyCrossInterpreterData *data) { - _PyRuntimeState *runtime = &_PyRuntime; - if (data->data == NULL && data->obj == NULL) { // Nothing to release! return; } - // Get the original interpreter. + // Switch to the original interpreter. PyInterpreterState *interp = _PyInterpreterState_LookUpID(data->interp); if (interp == NULL) { // The intepreter was already destroyed. @@ -1486,28 +1496,10 @@ _PyCrossInterpreterData_Release(_PyCrossInterpreterData *data) } return; } - // XXX There's an ever-so-slight race here... - if (interp->finalizing) { - // XXX Someone leaked some memory... - return; - } // "Release" the data and/or the object. - _PyCrossInterpreterData *copied = PyMem_Malloc(sizeof(_PyCrossInterpreterData)); - if (copied == NULL) { - PyErr_SetString(PyExc_MemoryError, - "Not enough memory to preserve cross-interpreter data"); - PyErr_Print(); - return; - } - memcpy(copied, data, sizeof(_PyCrossInterpreterData)); - PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); - int res = _PyEval_AddPendingCall(tstate, - &runtime->ceval, &interp->ceval, - 0, _release_xidata, copied); - if (res != 0) { - // XXX Queue full or couldn't get lock. Try again somehow? - } + struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate; + _call_in_interpreter(gilstate, interp, _release_xidata, data); } PyObject * From webhook-mailer at python.org Mon Jun 3 14:10:26 2019 From: webhook-mailer at python.org (Christian Heimes) Date: Mon, 03 Jun 2019 18:10:26 -0000 Subject: [Python-checkins] bpo-37081: Test with OpenSSL 1.1.1c (GH-13631) Message-ID: https://github.com/python/cpython/commit/06651ee418b5e4e013195d6b702763a1220706a7 commit: 06651ee418b5e4e013195d6b702763a1220706a7 branch: master author: Christian Heimes committer: GitHub date: 2019-06-03T20:10:19+02:00 summary: bpo-37081: Test with OpenSSL 1.1.1c (GH-13631) Signed-off-by: Christian Heimes files: A Misc/NEWS.d/next/Tests/2019-05-28-17-48-22.bpo-37081.qxB-1l.rst M .azure-pipelines/ci.yml M .azure-pipelines/pr.yml M .travis.yml M Tools/ssl/multissltests.py diff --git a/.azure-pipelines/ci.yml b/.azure-pipelines/ci.yml index 1576599379c4..fcfac85ed9c4 100644 --- a/.azure-pipelines/ci.yml +++ b/.azure-pipelines/ci.yml @@ -59,7 +59,7 @@ jobs: variables: testRunTitle: '$(build.sourceBranchName)-linux' testRunPlatform: linux - openssl_version: 1.1.1b + openssl_version: 1.1.1c steps: - template: ./posix-steps.yml @@ -116,7 +116,7 @@ jobs: variables: testRunTitle: '$(Build.SourceBranchName)-linux-coverage' testRunPlatform: linux-coverage - openssl_version: 1.1.1b + openssl_version: 1.1.1c steps: - template: ./posix-steps.yml diff --git a/.azure-pipelines/pr.yml b/.azure-pipelines/pr.yml index 0bd7921bcbef..2486f88a63fb 100644 --- a/.azure-pipelines/pr.yml +++ b/.azure-pipelines/pr.yml @@ -59,7 +59,7 @@ jobs: variables: testRunTitle: '$(system.pullRequest.TargetBranch)-linux' testRunPlatform: linux - openssl_version: 1.1.0j + openssl_version: 1.1.1c steps: - template: ./posix-steps.yml @@ -116,7 +116,7 @@ jobs: variables: testRunTitle: '$(Build.SourceBranchName)-linux-coverage' testRunPlatform: linux-coverage - openssl_version: 1.1.0j + openssl_version: 1.1.1c steps: - template: ./posix-steps.yml diff --git a/.travis.yml b/.travis.yml index c1efe24b646b..02de997750ab 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,7 +11,7 @@ cache: env: global: - - OPENSSL=1.1.0i + - OPENSSL=1.1.1c - OPENSSL_DIR="$HOME/multissl/openssl/${OPENSSL}" - PATH="${OPENSSL_DIR}/bin:$PATH" # Use -O3 because we don't use debugger on Travis-CI diff --git a/Misc/NEWS.d/next/Tests/2019-05-28-17-48-22.bpo-37081.qxB-1l.rst b/Misc/NEWS.d/next/Tests/2019-05-28-17-48-22.bpo-37081.qxB-1l.rst new file mode 100644 index 000000000000..df5b8f2482d3 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-05-28-17-48-22.bpo-37081.qxB-1l.rst @@ -0,0 +1 @@ +Test with OpenSSL 1.1.1c diff --git a/Tools/ssl/multissltests.py b/Tools/ssl/multissltests.py index 759f5f4a3e78..07bd9b016d97 100755 --- a/Tools/ssl/multissltests.py +++ b/Tools/ssl/multissltests.py @@ -45,9 +45,9 @@ ] OPENSSL_RECENT_VERSIONS = [ - "1.0.2p", - "1.1.0i", - "1.1.1", + "1.0.2s", + "1.1.0k", + "1.1.1c", ] LIBRESSL_OLD_VERSIONS = [ From webhook-mailer at python.org Mon Jun 3 14:40:02 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 03 Jun 2019 18:40:02 -0000 Subject: [Python-checkins] [3.7] bpo-37081: Test with OpenSSL 1.1.1c (GH-13631) (GH-13782) Message-ID: https://github.com/python/cpython/commit/3344197040fe1b05a3244bdb16d429f4647f35b8 commit: 3344197040fe1b05a3244bdb16d429f4647f35b8 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-03T11:39:57-07:00 summary: [3.7] bpo-37081: Test with OpenSSL 1.1.1c (GH-13631) (GH-13782) Signed-off-by: Christian Heimes (cherry picked from commit 06651ee418b5e4e013195d6b702763a1220706a7) Co-authored-by: Christian Heimes https://bugs.python.org/issue37081 files: A Misc/NEWS.d/next/Tests/2019-05-28-17-48-22.bpo-37081.qxB-1l.rst M .azure-pipelines/ci.yml M .azure-pipelines/pr.yml M .travis.yml M Tools/ssl/multissltests.py diff --git a/.azure-pipelines/ci.yml b/.azure-pipelines/ci.yml index 1576599379c4..fcfac85ed9c4 100644 --- a/.azure-pipelines/ci.yml +++ b/.azure-pipelines/ci.yml @@ -59,7 +59,7 @@ jobs: variables: testRunTitle: '$(build.sourceBranchName)-linux' testRunPlatform: linux - openssl_version: 1.1.1b + openssl_version: 1.1.1c steps: - template: ./posix-steps.yml @@ -116,7 +116,7 @@ jobs: variables: testRunTitle: '$(Build.SourceBranchName)-linux-coverage' testRunPlatform: linux-coverage - openssl_version: 1.1.1b + openssl_version: 1.1.1c steps: - template: ./posix-steps.yml diff --git a/.azure-pipelines/pr.yml b/.azure-pipelines/pr.yml index 0bd7921bcbef..2486f88a63fb 100644 --- a/.azure-pipelines/pr.yml +++ b/.azure-pipelines/pr.yml @@ -59,7 +59,7 @@ jobs: variables: testRunTitle: '$(system.pullRequest.TargetBranch)-linux' testRunPlatform: linux - openssl_version: 1.1.0j + openssl_version: 1.1.1c steps: - template: ./posix-steps.yml @@ -116,7 +116,7 @@ jobs: variables: testRunTitle: '$(Build.SourceBranchName)-linux-coverage' testRunPlatform: linux-coverage - openssl_version: 1.1.0j + openssl_version: 1.1.1c steps: - template: ./posix-steps.yml diff --git a/.travis.yml b/.travis.yml index 07d26412333c..378f3e5eb733 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,7 +11,7 @@ cache: env: global: - - OPENSSL=1.1.0i + - OPENSSL=1.1.1c - OPENSSL_DIR="$HOME/multissl/openssl/${OPENSSL}" - PATH="${OPENSSL_DIR}/bin:$PATH" # Use -O3 because we don't use debugger on Travis-CI diff --git a/Misc/NEWS.d/next/Tests/2019-05-28-17-48-22.bpo-37081.qxB-1l.rst b/Misc/NEWS.d/next/Tests/2019-05-28-17-48-22.bpo-37081.qxB-1l.rst new file mode 100644 index 000000000000..df5b8f2482d3 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-05-28-17-48-22.bpo-37081.qxB-1l.rst @@ -0,0 +1 @@ +Test with OpenSSL 1.1.1c diff --git a/Tools/ssl/multissltests.py b/Tools/ssl/multissltests.py index 759f5f4a3e78..07bd9b016d97 100755 --- a/Tools/ssl/multissltests.py +++ b/Tools/ssl/multissltests.py @@ -45,9 +45,9 @@ ] OPENSSL_RECENT_VERSIONS = [ - "1.0.2p", - "1.1.0i", - "1.1.1", + "1.0.2s", + "1.1.0k", + "1.1.1c", ] LIBRESSL_OLD_VERSIONS = [ From webhook-mailer at python.org Mon Jun 3 14:40:19 2019 From: webhook-mailer at python.org (Christian Heimes) Date: Mon, 03 Jun 2019 18:40:19 -0000 Subject: [Python-checkins] bpo-34271: Fix compatibility with 1.0.2 (GH-13728) Message-ID: https://github.com/python/cpython/commit/e35d1ba9eab07a59b98b700c5e18ceb13b2561a6 commit: e35d1ba9eab07a59b98b700c5e18ceb13b2561a6 branch: master author: Christian Heimes committer: GitHub date: 2019-06-03T20:40:15+02:00 summary: bpo-34271: Fix compatibility with 1.0.2 (GH-13728) Fix various compatibility issues with LibreSSL and OpenSSL 1.0.2 introduced by bpo-34271. Signed-off-by: Christian Heimes files: M Lib/ssl.py M Lib/test/test_ssl.py M Modules/_ssl/debughelpers.c M Tools/ssl/multissltests.py diff --git a/Lib/ssl.py b/Lib/ssl.py index 4afa46e5da5c..61bd775f759b 100644 --- a/Lib/ssl.py +++ b/Lib/ssl.py @@ -658,12 +658,12 @@ def _msg_callback(self, callback): def inner(conn, direction, version, content_type, msg_type, data): try: version = TLSVersion(version) - except TypeError: + except ValueError: pass try: content_type = _TLSContentType(content_type) - except TypeError: + except ValueError: pass if content_type == _TLSContentType.HEADER: @@ -674,7 +674,7 @@ def inner(conn, direction, version, content_type, msg_type, data): msg_enum = _TLSMessageType try: msg_type = msg_enum(msg_type) - except TypeError: + except ValueError: pass return callback(conn, direction, version, diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index a72d79132181..455a12ea7f2f 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -3703,7 +3703,7 @@ def test_min_max_version(self): # client 1.0, server 1.2 (mismatch) server_context.minimum_version = ssl.TLSVersion.TLSv1_2 server_context.maximum_version = ssl.TLSVersion.TLSv1_2 - client_context.minimum_version = ssl.TLSVersion.TLSv1 + client_context.maximum_version = ssl.TLSVersion.TLSv1 client_context.maximum_version = ssl.TLSVersion.TLSv1 with ThreadedEchoServer(context=server_context) as server: with client_context.wrap_socket(socket.socket(), @@ -4529,50 +4529,16 @@ def msg_cb(conn, direction, version, content_type, msg_type, data): server_hostname=hostname) as s: s.connect((HOST, server.port)) - self.assertEqual(msg, [ - ("write", TLSVersion.TLSv1, _TLSContentType.HEADER, - _TLSMessageType.CERTIFICATE_STATUS), - ("write", TLSVersion.TLSv1_2, _TLSContentType.HANDSHAKE, - _TLSMessageType.CLIENT_HELLO), - ("read", TLSVersion.TLSv1_2, _TLSContentType.HEADER, - _TLSMessageType.CERTIFICATE_STATUS), - ("read", TLSVersion.TLSv1_2, _TLSContentType.HANDSHAKE, - _TLSMessageType.SERVER_HELLO), - ("read", TLSVersion.TLSv1_2, _TLSContentType.HEADER, - _TLSMessageType.CERTIFICATE_STATUS), - ("read", TLSVersion.TLSv1_2, _TLSContentType.HANDSHAKE, - _TLSMessageType.CERTIFICATE), - ("read", TLSVersion.TLSv1_2, _TLSContentType.HEADER, - _TLSMessageType.CERTIFICATE_STATUS), + self.assertIn( ("read", TLSVersion.TLSv1_2, _TLSContentType.HANDSHAKE, _TLSMessageType.SERVER_KEY_EXCHANGE), - ("read", TLSVersion.TLSv1_2, _TLSContentType.HEADER, - _TLSMessageType.CERTIFICATE_STATUS), - ("read", TLSVersion.TLSv1_2, _TLSContentType.HANDSHAKE, - _TLSMessageType.SERVER_DONE), - ("write", TLSVersion.TLSv1_2, _TLSContentType.HEADER, - _TLSMessageType.CERTIFICATE_STATUS), - ("write", TLSVersion.TLSv1_2, _TLSContentType.HANDSHAKE, - _TLSMessageType.CLIENT_KEY_EXCHANGE), - ("write", TLSVersion.TLSv1_2, _TLSContentType.HEADER, - _TLSMessageType.FINISHED), + msg + ) + self.assertIn( ("write", TLSVersion.TLSv1_2, _TLSContentType.CHANGE_CIPHER_SPEC, _TLSMessageType.CHANGE_CIPHER_SPEC), - ("write", TLSVersion.TLSv1_2, _TLSContentType.HEADER, - _TLSMessageType.CERTIFICATE_STATUS), - ("write", TLSVersion.TLSv1_2, _TLSContentType.HANDSHAKE, - _TLSMessageType.FINISHED), - ("read", TLSVersion.TLSv1_2, _TLSContentType.HEADER, - _TLSMessageType.CERTIFICATE_STATUS), - ("read", TLSVersion.TLSv1_2, _TLSContentType.HANDSHAKE, - _TLSMessageType.NEWSESSION_TICKET), - ("read", TLSVersion.TLSv1_2, _TLSContentType.HEADER, - _TLSMessageType.FINISHED), - ("read", TLSVersion.TLSv1_2, _TLSContentType.HEADER, - _TLSMessageType.CERTIFICATE_STATUS), - ("read", TLSVersion.TLSv1_2, _TLSContentType.HANDSHAKE, - _TLSMessageType.FINISHED), - ]) + msg + ) def test_main(verbose=False): diff --git a/Modules/_ssl/debughelpers.c b/Modules/_ssl/debughelpers.c index 53b966749328..858b3d7955c9 100644 --- a/Modules/_ssl/debughelpers.c +++ b/Modules/_ssl/debughelpers.c @@ -1,5 +1,12 @@ /* Debug helpers */ +#ifndef SSL3_MT_CHANGE_CIPHER_SPEC +/* Dummy message type for handling CCS like a normal handshake message + * not defined in OpenSSL 1.0.2 + */ +#define SSL3_MT_CHANGE_CIPHER_SPEC 0x0101 +#endif + static void _PySSL_msg_callback(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg) @@ -41,11 +48,13 @@ _PySSL_msg_callback(int write_p, int version, int content_type, case SSL3_RT_HANDSHAKE: msg_type = (int)cbuf[0]; break; +#ifdef SSL3_RT_HEADER case SSL3_RT_HEADER: /* frame header encodes version in bytes 1..2 */ version = cbuf[1] << 8 | cbuf[2]; msg_type = (int)cbuf[0]; break; +#endif #ifdef SSL3_RT_INNER_CONTENT_TYPE case SSL3_RT_INNER_CONTENT_TYPE: msg_type = (int)cbuf[0]; @@ -210,4 +219,4 @@ _PySSLContext_set_keylog_filename(PySSLContext *self, PyObject *arg, void *c) { return 0; } -#endif \ No newline at end of file +#endif diff --git a/Tools/ssl/multissltests.py b/Tools/ssl/multissltests.py index 07bd9b016d97..7fda4df55a67 100755 --- a/Tools/ssl/multissltests.py +++ b/Tools/ssl/multissltests.py @@ -51,10 +51,11 @@ ] LIBRESSL_OLD_VERSIONS = [ + "2.9.2", ] LIBRESSL_RECENT_VERSIONS = [ - "2.7.4", + "2.8.3", ] # store files in ../multissl From webhook-mailer at python.org Mon Jun 3 14:51:31 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 03 Jun 2019 18:51:31 -0000 Subject: [Python-checkins] bpo-36868: Fix what's new for SSLContext.hostname_checks_common_name (GH-13248) Message-ID: https://github.com/python/cpython/commit/47eb2234061524562a4b484e3a395f4fdd6c1b76 commit: 47eb2234061524562a4b484e3a395f4fdd6c1b76 branch: master author: Christian Heimes committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-06-03T11:51:27-07:00 summary: bpo-36868: Fix what's new for SSLContext.hostname_checks_common_name (GH-13248) What's new now mentions SSLContext.hostname_checks_common_name instead of SSLContext.host_flags. https://bugs.python.org/issue36868 files: A Misc/NEWS.d/next/Documentation/2019-05-11-17-42-15.bpo-36868.yioL0R.rst M Doc/whatsnew/3.7.rst diff --git a/Doc/whatsnew/3.7.rst b/Doc/whatsnew/3.7.rst index 93d3e62b75d2..fc867ac15a5f 100644 --- a/Doc/whatsnew/3.7.rst +++ b/Doc/whatsnew/3.7.rst @@ -1307,7 +1307,7 @@ including failing the host name check now raises :exc:`~ssl.SSLCertVerificationError` and aborts the handshake with a proper TLS Alert message. The new exception contains additional information. Host name validation can be customized with -:attr:`SSLContext.host_flags `. +:attr:`SSLContext.hostname_checks_common_name `. (Contributed by Christian Heimes in :issue:`31399`.) .. note:: @@ -1320,8 +1320,7 @@ The ``ssl`` module no longer sends IP addresses in SNI TLS extension. (Contributed by Christian Heimes in :issue:`32185`.) :func:`~ssl.match_hostname` no longer supports partial wildcards like -``www*.example.org``. :attr:`SSLContext.host_flags ` -has partial wildcard matching disabled by default. +``www*.example.org``. (Contributed by Mandeep Singh in :issue:`23033` and Christian Heimes in :issue:`31399`.) diff --git a/Misc/NEWS.d/next/Documentation/2019-05-11-17-42-15.bpo-36868.yioL0R.rst b/Misc/NEWS.d/next/Documentation/2019-05-11-17-42-15.bpo-36868.yioL0R.rst new file mode 100644 index 000000000000..ad9ed5baf167 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2019-05-11-17-42-15.bpo-36868.yioL0R.rst @@ -0,0 +1,2 @@ +What's new now mentions SSLContext.hostname_checks_common_name instead of +SSLContext.host_flags. From webhook-mailer at python.org Mon Jun 3 15:00:14 2019 From: webhook-mailer at python.org (Christian Heimes) Date: Mon, 03 Jun 2019 19:00:14 -0000 Subject: [Python-checkins] bpo-37120: Add SSLContext.num_tickets (GH-13719) Message-ID: https://github.com/python/cpython/commit/78c7d527799dacca91b9ed67057cb996efe526b0 commit: 78c7d527799dacca91b9ed67057cb996efe526b0 branch: master author: Christian Heimes committer: GitHub date: 2019-06-03T21:00:10+02:00 summary: bpo-37120: Add SSLContext.num_tickets (GH-13719) Signed-off-by: Christian Heimes files: A Misc/NEWS.d/next/Library/2019-06-01-09-03-32.bpo-37120.FOKQLU.rst M Doc/library/ssl.rst M Lib/test/test_ssl.py M Modules/_ssl.c diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst index be09f38f7dfa..279af5728913 100644 --- a/Doc/library/ssl.rst +++ b/Doc/library/ssl.rst @@ -1959,6 +1959,19 @@ to speed up repeated connections from the same clients. .. versionadded:: 3.7 +.. attribute:: SSLContext.num_tickets + + Control the number of TLS 1.3 session tickets of a + :attr:`TLS_PROTOCOL_SERVER` context. The setting has no impact on TLS + 1.0 to 1.2 connections. + + .. note:: + + This attribute is not available unless the ssl module is compiled + with OpenSSL 1.1.1 or newer. + + .. versionadded:: 3.8 + .. attribute:: SSLContext.options An integer representing the set of SSL options enabled on this context. diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index 455a12ea7f2f..7ba8156eef5d 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -1634,6 +1634,24 @@ class MySSLObject(ssl.SSLObject): obj = ctx.wrap_bio(ssl.MemoryBIO(), ssl.MemoryBIO()) self.assertIsInstance(obj, MySSLObject) + @unittest.skipUnless(IS_OPENSSL_1_1_1, "Test requires OpenSSL 1.1.1") + def test_num_tickest(self): + ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) + self.assertEqual(ctx.num_tickets, 2) + ctx.num_tickets = 1 + self.assertEqual(ctx.num_tickets, 1) + ctx.num_tickets = 0 + self.assertEqual(ctx.num_tickets, 0) + with self.assertRaises(ValueError): + ctx.num_tickets = -1 + with self.assertRaises(TypeError): + ctx.num_tickets = None + + ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) + self.assertEqual(ctx.num_tickets, 2) + with self.assertRaises(ValueError): + ctx.num_tickets = 1 + class SSLErrorTests(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Library/2019-06-01-09-03-32.bpo-37120.FOKQLU.rst b/Misc/NEWS.d/next/Library/2019-06-01-09-03-32.bpo-37120.FOKQLU.rst new file mode 100644 index 000000000000..6bea492e6a55 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-01-09-03-32.bpo-37120.FOKQLU.rst @@ -0,0 +1 @@ +Add SSLContext.num_tickets to control the number of TLSv1.3 session tickets. diff --git a/Modules/_ssl.c b/Modules/_ssl.c index f40127d3d932..2331c58ad77d 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -3617,6 +3617,39 @@ set_maximum_version(PySSLContext *self, PyObject *arg, void *c) } #endif /* SSL_CTRL_GET_MAX_PROTO_VERSION */ +#if (OPENSSL_VERSION_NUMBER >= 0x10101000L) && !defined(LIBRESSL_VERSION_NUMBER) +static PyObject * +get_num_tickets(PySSLContext *self, void *c) +{ + return PyLong_FromLong(SSL_CTX_get_num_tickets(self->ctx)); +} + +static int +set_num_tickets(PySSLContext *self, PyObject *arg, void *c) +{ + long num; + if (!PyArg_Parse(arg, "l", &num)) + return -1; + if (num < 0) { + PyErr_SetString(PyExc_ValueError, "value must be non-negative"); + return -1; + } + if (self->protocol != PY_SSL_VERSION_TLS_SERVER) { + PyErr_SetString(PyExc_ValueError, + "SSLContext is not a server context."); + return -1; + } + if (SSL_CTX_set_num_tickets(self->ctx, num) != 1) { + PyErr_SetString(PyExc_ValueError, "failed to set num tickets."); + return -1; + } + return 0; +} + +PyDoc_STRVAR(PySSLContext_num_tickets_doc, +"Control the number of TLSv1.3 session tickets"); +#endif /* OpenSSL 1.1.1 */ + static PyObject * get_options(PySSLContext *self, void *c) { @@ -4654,6 +4687,10 @@ static PyGetSetDef context_getsetlist[] = { (setter) _PySSLContext_set_msg_callback, NULL}, {"sni_callback", (getter) get_sni_callback, (setter) set_sni_callback, PySSLContext_sni_callback_doc}, +#if (OPENSSL_VERSION_NUMBER >= 0x10101000L) && !defined(LIBRESSL_VERSION_NUMBER) + {"num_tickets", (getter) get_num_tickets, + (setter) set_num_tickets, PySSLContext_num_tickets_doc}, +#endif {"options", (getter) get_options, (setter) set_options, NULL}, {"post_handshake_auth", (getter) get_post_handshake_auth, From webhook-mailer at python.org Mon Jun 3 15:02:15 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 03 Jun 2019 19:02:15 -0000 Subject: [Python-checkins] bpo-36868: Fix what's new for SSLContext.hostname_checks_common_name (GH-13248) Message-ID: https://github.com/python/cpython/commit/cad4ff65eb12649cd650059b15d8e12f2ae951ef commit: cad4ff65eb12649cd650059b15d8e12f2ae951ef branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-03T12:02:11-07:00 summary: bpo-36868: Fix what's new for SSLContext.hostname_checks_common_name (GH-13248) What's new now mentions SSLContext.hostname_checks_common_name instead of SSLContext.host_flags. https://bugs.python.org/issue36868 (cherry picked from commit 47eb2234061524562a4b484e3a395f4fdd6c1b76) Co-authored-by: Christian Heimes files: A Misc/NEWS.d/next/Documentation/2019-05-11-17-42-15.bpo-36868.yioL0R.rst M Doc/whatsnew/3.7.rst diff --git a/Doc/whatsnew/3.7.rst b/Doc/whatsnew/3.7.rst index e8572ec0b492..e78af225d385 100644 --- a/Doc/whatsnew/3.7.rst +++ b/Doc/whatsnew/3.7.rst @@ -1307,7 +1307,7 @@ including failing the host name check now raises :exc:`~ssl.SSLCertVerificationError` and aborts the handshake with a proper TLS Alert message. The new exception contains additional information. Host name validation can be customized with -:attr:`SSLContext.host_flags `. +:attr:`SSLContext.hostname_checks_common_name `. (Contributed by Christian Heimes in :issue:`31399`.) .. note:: @@ -1320,8 +1320,7 @@ The ``ssl`` module no longer sends IP addresses in SNI TLS extension. (Contributed by Christian Heimes in :issue:`32185`.) :func:`~ssl.match_hostname` no longer supports partial wildcards like -``www*.example.org``. :attr:`SSLContext.host_flags ` -has partial wildcard matching disabled by default. +``www*.example.org``. (Contributed by Mandeep Singh in :issue:`23033` and Christian Heimes in :issue:`31399`.) diff --git a/Misc/NEWS.d/next/Documentation/2019-05-11-17-42-15.bpo-36868.yioL0R.rst b/Misc/NEWS.d/next/Documentation/2019-05-11-17-42-15.bpo-36868.yioL0R.rst new file mode 100644 index 000000000000..ad9ed5baf167 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2019-05-11-17-42-15.bpo-36868.yioL0R.rst @@ -0,0 +1,2 @@ +What's new now mentions SSLContext.hostname_checks_common_name instead of +SSLContext.host_flags. From webhook-mailer at python.org Mon Jun 3 17:31:28 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 03 Jun 2019 21:31:28 -0000 Subject: [Python-checkins] bpo-34037, asyncio: add BaseEventLoop.wait_executor_on_close (GH-13786) Message-ID: https://github.com/python/cpython/commit/0f0a30f4da4b529e0f7df857b9f575b231b32758 commit: 0f0a30f4da4b529e0f7df857b9f575b231b32758 branch: master author: Victor Stinner committer: GitHub date: 2019-06-03T23:31:04+02:00 summary: bpo-34037, asyncio: add BaseEventLoop.wait_executor_on_close (GH-13786) Add BaseEventLoop.wait_executor_on_close attribute: true by default. loop.close() now waits for the default executor to finish by default. Set loop.wait_executor_on_close attribute to False to not wait for the executor. files: A Misc/NEWS.d/next/Library/2019-06-03-22-54-15.bpo-34037.fKNAbH.rst M Doc/library/asyncio-eventloop.rst M Lib/asyncio/base_events.py diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst index 8673f84e9638..f75ca9a966b6 100644 --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -140,12 +140,18 @@ Running and stopping the loop The loop must not be running when this function is called. Any pending callbacks will be discarded. - This method clears all queues and shuts down the executor, but does - not wait for the executor to finish. + This method clears all queues and shuts down the default executor. By + default, it waits for the default executor to finish. Set + *loop.wait_executor_on_close* to ``False`` to not wait for the executor. This method is idempotent and irreversible. No other methods should be called after the event loop is closed. + .. versionchanged:: 3.8 + The method now waits for the default executor to finish by default. + Added *loop.wait_executor_on_close* attribute. + + .. coroutinemethod:: loop.shutdown_asyncgens() Schedule all currently open :term:`asynchronous generator` objects to diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index e0025397fa8a..b1a7f88f4116 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -380,6 +380,8 @@ def close(self): class BaseEventLoop(events.AbstractEventLoop): def __init__(self): + # If true, close() waits for the default executor to finish + self.wait_executor_on_close = True self._timer_cancelled_count = 0 self._closed = False self._stopping = False @@ -635,7 +637,7 @@ def close(self): executor = self._default_executor if executor is not None: self._default_executor = None - executor.shutdown(wait=False) + executor.shutdown(wait=self.wait_executor_on_close) def is_closed(self): """Returns True if the event loop was closed.""" diff --git a/Misc/NEWS.d/next/Library/2019-06-03-22-54-15.bpo-34037.fKNAbH.rst b/Misc/NEWS.d/next/Library/2019-06-03-22-54-15.bpo-34037.fKNAbH.rst new file mode 100644 index 000000000000..fb2f7a5fa36e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-03-22-54-15.bpo-34037.fKNAbH.rst @@ -0,0 +1,4 @@ +:mod:`asyncio`: ``loop.close()`` now waits for the default executor to +finish by default. Set ``loop.wait_executor_on_close`` attribute to +``False`` to opt-in for Python 3.7 behavior (not wait for the executor to +finish). From webhook-mailer at python.org Mon Jun 3 18:38:14 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 03 Jun 2019 22:38:14 -0000 Subject: [Python-checkins] bpo-37146: disable opcache when Py_DEBUG is defined (GH-13787) Message-ID: https://github.com/python/cpython/commit/eddef861b49f1635222a9e1771231c34a807debf commit: eddef861b49f1635222a9e1771231c34a807debf branch: master author: Inada Naoki committer: Victor Stinner date: 2019-06-04T00:38:09+02:00 summary: bpo-37146: disable opcache when Py_DEBUG is defined (GH-13787) --with-pydebug is commonly used to find memory leaks. But opcache makes it harder. So disable opcache when Py_DEBUG is defined. files: M Python/ceval.c diff --git a/Python/ceval.c b/Python/ceval.c index 0a4af915d6ff..2590ce6575a1 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -103,7 +103,14 @@ static long dxp[256]; #endif /* per opcode cache */ +#ifdef Py_DEBUG +// --with-pydebug is used to find memory leak. opcache makes it harder. +// So we disable opcache when Py_DEBUG is defined. +// See bpo-37146 +#define OPCACHE_MIN_RUNS 0 /* disable opcache */ +#else #define OPCACHE_MIN_RUNS 1024 /* create opcache when code executed this time */ +#endif #define OPCACHE_STATS 0 /* Enable stats */ #if OPCACHE_STATS From webhook-mailer at python.org Mon Jun 3 20:09:23 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 04 Jun 2019 00:09:23 -0000 Subject: [Python-checkins] Revert "bpo-35621: Support running subprocesses in asyncio when loop is executed in non-main thread (#13630)" (GH-13793) Message-ID: https://github.com/python/cpython/commit/9535aff9421f0a5639f6e4c4bb0f07a743ea8dba commit: 9535aff9421f0a5639f6e4c4bb0f07a743ea8dba branch: master author: Andrew Svetlov committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-06-03T17:09:19-07:00 summary: Revert "bpo-35621: Support running subprocesses in asyncio when loop is executed in non-main thread (#13630)" (GH-13793) https://bugs.python.org/issue35621 files: D Misc/NEWS.d/next/Library/2019-05-28-19-03-46.bpo-35621.Abc1lf.rst M Lib/asyncio/unix_events.py M Lib/test/test_asyncio/test_subprocess.py M Lib/test/test_asyncio/test_unix_events.py diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py index b943845d9363..28128d2977df 100644 --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -2,7 +2,6 @@ import errno import io -import itertools import os import selectors import signal @@ -30,9 +29,7 @@ __all__ = ( 'SelectorEventLoop', 'AbstractChildWatcher', 'SafeChildWatcher', - 'FastChildWatcher', - 'MultiLoopChildWatcher', 'ThreadedChildWatcher', - 'DefaultEventLoopPolicy', + 'FastChildWatcher', 'DefaultEventLoopPolicy', ) @@ -187,13 +184,6 @@ def _make_write_pipe_transport(self, pipe, protocol, waiter=None, stdin, stdout, stderr, bufsize, extra=None, **kwargs): with events.get_child_watcher() as watcher: - if not watcher.is_active(): - # Check early. - # Raising exception before process creation - # prevents subprocess execution if the watcher - # is not ready to handle it. - raise RuntimeError("asyncio.get_child_watcher() is not activated, " - "subprocess support is not installed.") waiter = self.create_future() transp = _UnixSubprocessTransport(self, protocol, args, shell, stdin, stdout, stderr, bufsize, @@ -848,15 +838,6 @@ def close(self): """ raise NotImplementedError() - def is_active(self): - """Watcher status. - - Return True if the watcher is installed and ready to handle process exit - notifications. - - """ - raise NotImplementedError() - def __enter__(self): """Enter the watcher's context and allow starting new processes @@ -868,20 +849,6 @@ def __exit__(self, a, b, c): raise NotImplementedError() -def _compute_returncode(status): - if os.WIFSIGNALED(status): - # The child process died because of a signal. - return -os.WTERMSIG(status) - elif os.WIFEXITED(status): - # The child process exited (e.g sys.exit()). - return os.WEXITSTATUS(status) - else: - # The child exited, but we don't understand its status. - # This shouldn't happen, but if it does, let's just - # return that status; perhaps that helps debug it. - return status - - class BaseChildWatcher(AbstractChildWatcher): def __init__(self): @@ -891,9 +858,6 @@ def __init__(self): def close(self): self.attach_loop(None) - def is_active(self): - return self._loop is not None and self._loop.is_running() - def _do_waitpid(self, expected_pid): raise NotImplementedError() @@ -934,6 +898,19 @@ def _sig_chld(self): 'exception': exc, }) + def _compute_returncode(self, status): + if os.WIFSIGNALED(status): + # The child process died because of a signal. + return -os.WTERMSIG(status) + elif os.WIFEXITED(status): + # The child process exited (e.g sys.exit()). + return os.WEXITSTATUS(status) + else: + # The child exited, but we don't understand its status. + # This shouldn't happen, but if it does, let's just + # return that status; perhaps that helps debug it. + return status + class SafeChildWatcher(BaseChildWatcher): """'Safe' child watcher implementation. @@ -957,6 +934,11 @@ def __exit__(self, a, b, c): pass def add_child_handler(self, pid, callback, *args): + if self._loop is None: + raise RuntimeError( + "Cannot add child handler, " + "the child watcher does not have a loop attached") + self._callbacks[pid] = (callback, args) # Prevent a race condition in case the child is already terminated. @@ -992,7 +974,7 @@ def _do_waitpid(self, expected_pid): # The child process is still alive. return - returncode = _compute_returncode(status) + returncode = self._compute_returncode(status) if self._loop.get_debug(): logger.debug('process %s exited with returncode %s', expected_pid, returncode) @@ -1053,6 +1035,11 @@ def __exit__(self, a, b, c): def add_child_handler(self, pid, callback, *args): assert self._forks, "Must use the context manager" + if self._loop is None: + raise RuntimeError( + "Cannot add child handler, " + "the child watcher does not have a loop attached") + with self._lock: try: returncode = self._zombies.pop(pid) @@ -1085,7 +1072,7 @@ def _do_waitpid_all(self): # A child process is still alive. return - returncode = _compute_returncode(status) + returncode = self._compute_returncode(status) with self._lock: try: @@ -1114,177 +1101,6 @@ def _do_waitpid_all(self): callback(pid, returncode, *args) -class MultiLoopChildWatcher(AbstractChildWatcher): - # The class keeps compatibility with AbstractChildWatcher ABC - # To achieve this it has empty attach_loop() method - # and doesn't accept explicit loop argument - # for add_child_handler()/remove_child_handler() - # but retrieves the current loop by get_running_loop() - - def __init__(self): - self._callbacks = {} - self._saved_sighandler = None - - def is_active(self): - return self._saved_sighandler is not None - - def close(self): - self._callbacks.clear() - if self._saved_sighandler is not None: - handler = signal.getsignal(signal.SIGCHLD) - if handler != self._sig_chld: - logger.warning("SIGCHLD handler was changed by outside code") - else: - signal.signal(signal.SIGCHLD, self._saved_sighandler) - self._saved_sighandler = None - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - pass - - def add_child_handler(self, pid, callback, *args): - loop = events.get_running_loop() - self._callbacks[pid] = (loop, callback, args) - - # Prevent a race condition in case the child is already terminated. - self._do_waitpid(pid) - - def remove_child_handler(self, pid): - try: - del self._callbacks[pid] - return True - except KeyError: - return False - - def attach_loop(self, loop): - # Don't save the loop but initialize itself if called first time - # The reason to do it here is that attach_loop() is called from - # unix policy only for the main thread. - # Main thread is required for subscription on SIGCHLD signal - if self._saved_sighandler is None: - self._saved_sighandler = signal.signal(signal.SIGCHLD, self._sig_chld) - if self._saved_sighandler is None: - logger.warning("Previous SIGCHLD handler was set by non-Python code, " - "restore to default handler on watcher close.") - self._saved_sighandler = signal.SIG_DFL - - # Set SA_RESTART to limit EINTR occurrences. - signal.siginterrupt(signal.SIGCHLD, False) - - def _do_waitpid_all(self): - for pid in list(self._callbacks): - self._do_waitpid(pid) - - def _do_waitpid(self, expected_pid): - assert expected_pid > 0 - - try: - pid, status = os.waitpid(expected_pid, os.WNOHANG) - except ChildProcessError: - # The child process is already reaped - # (may happen if waitpid() is called elsewhere). - pid = expected_pid - returncode = 255 - logger.warning( - "Unknown child process pid %d, will report returncode 255", - pid) - debug_log = False - else: - if pid == 0: - # The child process is still alive. - return - - returncode = _compute_returncode(status) - debug_log = True - try: - loop, callback, args = self._callbacks.pop(pid) - except KeyError: # pragma: no cover - # May happen if .remove_child_handler() is called - # after os.waitpid() returns. - logger.warning("Child watcher got an unexpected pid: %r", - pid, exc_info=True) - else: - if loop.is_closed(): - logger.warning("Loop %r that handles pid %r is closed", loop, pid) - else: - if debug_log and loop.get_debug(): - logger.debug('process %s exited with returncode %s', - expected_pid, returncode) - loop.call_soon_threadsafe(callback, pid, returncode, *args) - - def _sig_chld(self, signum, frame): - try: - self._do_waitpid_all() - except (SystemExit, KeyboardInterrupt): - raise - except BaseException: - logger.warning('Unknown exception in SIGCHLD handler', exc_info=True) - - -class ThreadedChildWatcher(AbstractChildWatcher): - # The watcher uses a thread per process - # for waiting for the process finish. - # It doesn't require subscription on POSIX signal - - def __init__(self): - self._pid_counter = itertools.count(0) - - def is_active(self): - return True - - def close(self): - pass - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - pass - - def add_child_handler(self, pid, callback, *args): - loop = events.get_running_loop() - thread = threading.Thread(target=self._do_waitpid, - name=f"waitpid-{next(self._pid_counter)}", - args=(loop, pid, callback, args), - daemon=True) - thread.start() - - def remove_child_handler(self, pid): - # asyncio never calls remove_child_handler() !!! - # The method is no-op but is implemented because - # abstract base classe requires it - return True - - def attach_loop(self, loop): - pass - - def _do_waitpid(self, loop, expected_pid, callback, args): - assert expected_pid > 0 - - try: - pid, status = os.waitpid(expected_pid, 0) - except ChildProcessError: - # The child process is already reaped - # (may happen if waitpid() is called elsewhere). - pid = expected_pid - returncode = 255 - logger.warning( - "Unknown child process pid %d, will report returncode 255", - pid) - else: - returncode = _compute_returncode(status) - if loop.get_debug(): - logger.debug('process %s exited with returncode %s', - expected_pid, returncode) - - if loop.is_closed(): - logger.warning("Loop %r that handles pid %r is closed", loop, pid) - else: - loop.call_soon_threadsafe(callback, pid, returncode, *args) - - class _UnixDefaultEventLoopPolicy(events.BaseDefaultEventLoopPolicy): """UNIX event loop policy with a watcher for child processes.""" _loop_factory = _UnixSelectorEventLoop @@ -1296,7 +1112,7 @@ def __init__(self): def _init_watcher(self): with events._lock: if self._watcher is None: # pragma: no branch - self._watcher = ThreadedChildWatcher() + self._watcher = SafeChildWatcher() if isinstance(threading.current_thread(), threading._MainThread): self._watcher.attach_loop(self._local._loop) @@ -1318,7 +1134,7 @@ def set_event_loop(self, loop): def get_child_watcher(self): """Get the watcher for child processes. - If not yet set, a ThreadedChildWatcher object is automatically created. + If not yet set, a SafeChildWatcher object is automatically created. """ if self._watcher is None: self._init_watcher() diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py index 582e17202460..7d72e6cde4e7 100644 --- a/Lib/test/test_asyncio/test_subprocess.py +++ b/Lib/test/test_asyncio/test_subprocess.py @@ -633,7 +633,6 @@ def test_create_subprocess_exec_with_path(self): self.assertIsNone(self.loop.run_until_complete(execute())) - if sys.platform != 'win32': # Unix class SubprocessWatcherMixin(SubprocessMixin): @@ -649,24 +648,7 @@ def setUp(self): watcher = self.Watcher() watcher.attach_loop(self.loop) policy.set_child_watcher(watcher) - - def tearDown(self): - super().setUp() - policy = asyncio.get_event_loop_policy() - watcher = policy.get_child_watcher() - policy.set_child_watcher(None) - watcher.attach_loop(None) - watcher.close() - - class SubprocessThreadedWatcherTests(SubprocessWatcherMixin, - test_utils.TestCase): - - Watcher = unix_events.ThreadedChildWatcher - - class SubprocessMultiLoopWatcherTests(SubprocessWatcherMixin, - test_utils.TestCase): - - Watcher = unix_events.MultiLoopChildWatcher + self.addCleanup(policy.set_child_watcher, None) class SubprocessSafeWatcherTests(SubprocessWatcherMixin, test_utils.TestCase): @@ -688,25 +670,5 @@ def setUp(self): self.set_event_loop(self.loop) -class GenericWatcherTests: - - def test_create_subprocess_fails_with_inactive_watcher(self): - - async def execute(): - watcher = mock.create_authspec(asyncio.AbstractChildWatcher) - watcher.is_active.return_value = False - asyncio.set_child_watcher(watcher) - - with self.assertRaises(RuntimeError): - await subprocess.create_subprocess_exec( - support.FakePath(sys.executable), '-c', 'pass') - - watcher.add_child_handler.assert_not_called() - - self.assertIsNone(self.loop.run_until_complete(execute())) - - - - if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_asyncio/test_unix_events.py b/Lib/test/test_asyncio/test_unix_events.py index 462a8b3c7859..5c610cdd67ba 100644 --- a/Lib/test/test_asyncio/test_unix_events.py +++ b/Lib/test/test_asyncio/test_unix_events.py @@ -1082,8 +1082,6 @@ def test_not_implemented(self): NotImplementedError, watcher.attach_loop, f) self.assertRaises( NotImplementedError, watcher.close) - self.assertRaises( - NotImplementedError, watcher.is_active) self.assertRaises( NotImplementedError, watcher.__enter__) self.assertRaises( @@ -1786,6 +1784,15 @@ def test_close(self, m): if isinstance(self.watcher, asyncio.FastChildWatcher): self.assertFalse(self.watcher._zombies) + @waitpid_mocks + def test_add_child_handler_with_no_loop_attached(self, m): + callback = mock.Mock() + with self.create_watcher() as watcher: + with self.assertRaisesRegex( + RuntimeError, + 'the child watcher does not have a loop attached'): + watcher.add_child_handler(100, callback) + class SafeChildWatcherTests (ChildWatcherTestsMixin, test_utils.TestCase): def create_watcher(self): @@ -1802,16 +1809,17 @@ class PolicyTests(unittest.TestCase): def create_policy(self): return asyncio.DefaultEventLoopPolicy() - def test_get_default_child_watcher(self): + def test_get_child_watcher(self): policy = self.create_policy() self.assertIsNone(policy._watcher) watcher = policy.get_child_watcher() - self.assertIsInstance(watcher, asyncio.ThreadedChildWatcher) + self.assertIsInstance(watcher, asyncio.SafeChildWatcher) self.assertIs(policy._watcher, watcher) self.assertIs(watcher, policy.get_child_watcher()) + self.assertIsNone(watcher._loop) def test_get_child_watcher_after_set(self): policy = self.create_policy() @@ -1821,6 +1829,18 @@ def test_get_child_watcher_after_set(self): self.assertIs(policy._watcher, watcher) self.assertIs(watcher, policy.get_child_watcher()) + def test_get_child_watcher_with_mainloop_existing(self): + policy = self.create_policy() + loop = policy.get_event_loop() + + self.assertIsNone(policy._watcher) + watcher = policy.get_child_watcher() + + self.assertIsInstance(watcher, asyncio.SafeChildWatcher) + self.assertIs(watcher._loop, loop) + + loop.close() + def test_get_child_watcher_thread(self): def f(): @@ -1846,11 +1866,7 @@ def test_child_watcher_replace_mainloop_existing(self): policy = self.create_policy() loop = policy.get_event_loop() - # Explicitly setup SafeChildWatcher, - # default ThreadedChildWatcher has no _loop property - watcher = asyncio.SafeChildWatcher() - policy.set_child_watcher(watcher) - watcher.attach_loop(loop) + watcher = policy.get_child_watcher() self.assertIs(watcher._loop, loop) diff --git a/Misc/NEWS.d/next/Library/2019-05-28-19-03-46.bpo-35621.Abc1lf.rst b/Misc/NEWS.d/next/Library/2019-05-28-19-03-46.bpo-35621.Abc1lf.rst deleted file mode 100644 index c492e1de6d5c..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-28-19-03-46.bpo-35621.Abc1lf.rst +++ /dev/null @@ -1,2 +0,0 @@ -Support running asyncio subprocesses when execution event loop in a thread -on UNIX. From webhook-mailer at python.org Mon Jun 3 21:15:12 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 04 Jun 2019 01:15:12 -0000 Subject: [Python-checkins] Revert "bpo-36818: Add PyInterpreterState.runtime field. (gh-13129)" (GH-13795) Message-ID: https://github.com/python/cpython/commit/0fd2c300c2a85b3b227a907b2a39ef79fa86d850 commit: 0fd2c300c2a85b3b227a907b2a39ef79fa86d850 branch: master author: Victor Stinner committer: GitHub date: 2019-06-04T03:15:09+02:00 summary: Revert "bpo-36818: Add PyInterpreterState.runtime field. (gh-13129)" (GH-13795) This reverts commit 396e0a8d9dc65453cb9d53500d0a620602656cfe. files: D Misc/NEWS.d/next/Core and Builtins/2019-05-06-14-46-48.bpo-36818.5UDDLj.rst M Include/cpython/pystate.h M Include/internal/pycore_object.h M Include/internal/pycore_pylifecycle.h M Include/internal/pycore_pystate.h M Modules/_threadmodule.c M Python/ceval.c M Python/import.c M Python/pylifecycle.c M Python/pystate.c M Python/sysmodule.c diff --git a/Include/cpython/pystate.h b/Include/cpython/pystate.h index 74e7fc96bec9..94b0809cd4f0 100644 --- a/Include/cpython/pystate.h +++ b/Include/cpython/pystate.h @@ -110,9 +110,9 @@ struct _ts { * if the thread holds the last reference to the lock, decref'ing the * lock will delete the lock, and that may trigger arbitrary Python code * if there's a weakref, with a callback, to the lock. But by this time - * _PyRuntimeState.gilstate.tstate_current is already NULL, so only the - * simplest of C code can be allowed to run (in particular it must not be - * possible to release the GIL). + * _PyRuntime.gilstate.tstate_current is already NULL, so only the simplest + * of C code can be allowed to run (in particular it must not be possible to + * release the GIL). * So instead of holding the lock directly, the tstate holds a weakref to * the lock: that's the value of on_delete_data below. Decref'ing a * weakref is harmless. diff --git a/Include/internal/pycore_object.h b/Include/internal/pycore_object.h index 1c5beb01f458..81548f819198 100644 --- a/Include/internal/pycore_object.h +++ b/Include/internal/pycore_object.h @@ -19,10 +19,9 @@ PyAPI_FUNC(int) _PyDict_CheckConsistency(PyObject *mp, int check_content); * NB: While the object is tracked by the collector, it must be safe to call the * ob_traverse method. * - * Internal note: _PyRuntimeState.gc.generation0->_gc_prev doesn't have - * any bit flags because it's not object header. So we don't use - * _PyGCHead_PREV() and _PyGCHead_SET_PREV() for it to avoid unnecessary - * bitwise operations. + * Internal note: _PyRuntime.gc.generation0->_gc_prev doesn't have any bit flags + * because it's not object header. So we don't use _PyGCHead_PREV() and + * _PyGCHead_SET_PREV() for it to avoid unnecessary bitwise operations. * * The PyObject_GC_Track() function is the public version of this macro. */ diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index e30341710c20..8a692ea16495 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -39,10 +39,13 @@ extern PyStatus _PyFaulthandler_Init(int enable); extern int _PyTraceMalloc_Init(int enable); extern PyObject * _PyBuiltin_Init(void); extern PyStatus _PySys_Create( + _PyRuntimeState *runtime, PyInterpreterState *interp, PyObject **sysmod_p); extern PyStatus _PySys_SetPreliminaryStderr(PyObject *sysdict); -extern int _PySys_InitMain(PyInterpreterState *interp); +extern int _PySys_InitMain( + _PyRuntimeState *runtime, + PyInterpreterState *interp); extern PyStatus _PyImport_Init(PyInterpreterState *interp); extern PyStatus _PyExc_Init(void); extern PyStatus _PyErr_Init(void); @@ -83,7 +86,10 @@ extern void _PyHash_Fini(void); extern int _PyTraceMalloc_Fini(void); extern void _PyWarnings_Fini(PyInterpreterState *interp); -extern void _PyGILState_Init(PyThreadState *tstate); +extern void _PyGILState_Init( + _PyRuntimeState *runtime, + PyInterpreterState *interp, + PyThreadState *tstate); extern void _PyGILState_Fini(_PyRuntimeState *runtime); PyAPI_FUNC(void) _PyGC_DumpShutdownStats(_PyRuntimeState *runtime); diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index 520a74b8a61f..3ab4009770c9 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -19,9 +19,6 @@ extern "C" { #include "pycore_pymem.h" #include "pycore_warnings.h" -// forward -struct pyruntimestate; - /* ceval state */ @@ -71,7 +68,6 @@ struct _is { struct _is *next; struct _ts *tstate_head; - struct pyruntimestate *runtime; int64_t id; int64_t id_refcount; @@ -300,8 +296,12 @@ PyAPI_FUNC(void) _PyRuntime_Finalize(void); /* Other */ -PyAPI_FUNC(void) _PyThreadState_Init(PyThreadState *tstate); -PyAPI_FUNC(void) _PyThreadState_DeleteExcept(PyThreadState *tstate); +PyAPI_FUNC(void) _PyThreadState_Init( + _PyRuntimeState *runtime, + PyThreadState *tstate); +PyAPI_FUNC(void) _PyThreadState_DeleteExcept( + _PyRuntimeState *runtime, + PyThreadState *tstate); PyAPI_FUNC(PyThreadState *) _PyThreadState_Swap( struct _gilstate_runtime_state *gilstate, diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-06-14-46-48.bpo-36818.5UDDLj.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-06-14-46-48.bpo-36818.5UDDLj.rst deleted file mode 100644 index bb6c56a628e9..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-05-06-14-46-48.bpo-36818.5UDDLj.rst +++ /dev/null @@ -1 +0,0 @@ -Add PyInterpreterState.runtime (and use it). diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index 099afd86d055..d5e40ef999e3 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -996,7 +996,7 @@ t_bootstrap(void *boot_raw) tstate = boot->tstate; tstate->thread_id = PyThread_get_thread_ident(); - _PyThreadState_Init(tstate); + _PyThreadState_Init(&_PyRuntime, tstate); PyEval_AcquireThread(tstate); tstate->interp->num_threads++; res = PyObject_Call(boot->func, boot->args, boot->keyw); diff --git a/Python/ceval.c b/Python/ceval.c index 2590ce6575a1..7063647d584f 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -238,9 +238,8 @@ _PyEval_FiniThreads(struct _ceval_runtime_state *ceval) } static inline void -exit_thread_if_finalizing(PyThreadState *tstate) +exit_thread_if_finalizing(_PyRuntimeState *runtime, PyThreadState *tstate) { - _PyRuntimeState *runtime = tstate->interp->runtime; /* _Py_Finalizing is protected by the GIL */ if (runtime->finalizing != NULL && !_Py_CURRENTLY_FINALIZING(runtime, tstate)) { drop_gil(&runtime->ceval, tstate); @@ -287,7 +286,7 @@ PyEval_AcquireLock(void) Py_FatalError("PyEval_AcquireLock: current thread state is NULL"); } take_gil(ceval, tstate); - exit_thread_if_finalizing(tstate); + exit_thread_if_finalizing(runtime, tstate); } void @@ -308,15 +307,14 @@ PyEval_AcquireThread(PyThreadState *tstate) if (tstate == NULL) { Py_FatalError("PyEval_AcquireThread: NULL new thread state"); } - assert(tstate->interp != NULL); - _PyRuntimeState *runtime = tstate->interp->runtime; + _PyRuntimeState *runtime = &_PyRuntime; struct _ceval_runtime_state *ceval = &runtime->ceval; /* Check someone has called PyEval_InitThreads() to create the lock */ assert(gil_created(&ceval->gil)); take_gil(ceval, tstate); - exit_thread_if_finalizing(tstate); + exit_thread_if_finalizing(runtime, tstate); if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) { Py_FatalError("PyEval_AcquireThread: non-NULL old thread state"); } @@ -328,9 +326,8 @@ PyEval_ReleaseThread(PyThreadState *tstate) if (tstate == NULL) { Py_FatalError("PyEval_ReleaseThread: NULL thread state"); } - assert(tstate->interp != NULL); - _PyRuntimeState *runtime = tstate->interp->runtime; + _PyRuntimeState *runtime = &_PyRuntime; PyThreadState *new_tstate = _PyThreadState_Swap(&runtime->gilstate, NULL); if (new_tstate != tstate) { Py_FatalError("PyEval_ReleaseThread: wrong thread state"); @@ -361,7 +358,7 @@ _PyEval_ReInitThreads(_PyRuntimeState *runtime) } /* Destroy all threads except the current one */ - _PyThreadState_DeleteExcept(current_tstate); + _PyThreadState_DeleteExcept(runtime, current_tstate); } /* This function is used to signal that async exceptions are waiting to be @@ -390,18 +387,17 @@ PyEval_SaveThread(void) void PyEval_RestoreThread(PyThreadState *tstate) { + _PyRuntimeState *runtime = &_PyRuntime; + struct _ceval_runtime_state *ceval = &runtime->ceval; + if (tstate == NULL) { Py_FatalError("PyEval_RestoreThread: NULL tstate"); } - assert(tstate->interp != NULL); - - _PyRuntimeState *runtime = tstate->interp->runtime; - struct _ceval_runtime_state *ceval = &runtime->ceval; assert(gil_created(&ceval->gil)); int err = errno; take_gil(ceval, tstate); - exit_thread_if_finalizing(tstate); + exit_thread_if_finalizing(runtime, tstate); errno = err; _PyThreadState_Swap(&runtime->gilstate, tstate); @@ -1250,7 +1246,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) take_gil(ceval, tstate); /* Check if we should make a quick exit. */ - exit_thread_if_finalizing(tstate); + exit_thread_if_finalizing(runtime, tstate); if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) { Py_FatalError("ceval: orphan tstate"); diff --git a/Python/import.c b/Python/import.c index 68d1f4003abc..ab7db6bc17f6 100644 --- a/Python/import.c +++ b/Python/import.c @@ -541,8 +541,7 @@ PyImport_Cleanup(void) _PyGC_CollectNoFail(); /* Dump GC stats before it's too late, since it uses the warnings machinery. */ - _PyRuntimeState *runtime = interp->runtime; - _PyGC_DumpShutdownStats(runtime); + _PyGC_DumpShutdownStats(&_PyRuntime); /* Now, if there are any modules left alive, clear their globals to minimize potential leaks. All C extension modules actually end diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index fca2ee655191..751c4d6d1d63 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -545,7 +545,7 @@ pycore_create_interpreter(_PyRuntimeState *runtime, _PyEval_FiniThreads(&runtime->ceval); /* Auto-thread-state API */ - _PyGILState_Init(tstate); + _PyGILState_Init(runtime, interp, tstate); /* Create the GIL */ PyEval_InitThreads(); @@ -683,7 +683,7 @@ pyinit_config(_PyRuntimeState *runtime, } PyObject *sysmod; - status = _PySys_Create(interp, &sysmod); + status = _PySys_Create(runtime, interp, &sysmod); if (_PyStatus_EXCEPTION(status)) { return status; } @@ -892,9 +892,8 @@ _Py_ReconfigureMainInterpreter(PyInterpreterState *interp) * non-zero return code. */ static PyStatus -pyinit_main(PyInterpreterState *interp) +pyinit_main(_PyRuntimeState *runtime, PyInterpreterState *interp) { - _PyRuntimeState *runtime = interp->runtime; if (!runtime->core_initialized) { return _PyStatus_ERR("runtime core not initialized"); } @@ -920,7 +919,7 @@ pyinit_main(PyInterpreterState *interp) return _PyStatus_ERR("can't initialize time"); } - if (_PySys_InitMain(interp) < 0) { + if (_PySys_InitMain(runtime, interp) < 0) { return _PyStatus_ERR("can't finish initializing sys"); } @@ -1000,7 +999,7 @@ _Py_InitializeMain(void) _PyRuntimeState *runtime = &_PyRuntime; PyInterpreterState *interp = _PyRuntimeState_GetThreadState(runtime)->interp; - return pyinit_main(interp); + return pyinit_main(runtime, interp); } @@ -1027,7 +1026,7 @@ Py_InitializeFromConfig(const PyConfig *config) config = &interp->config; if (config->_init_main) { - status = pyinit_main(interp); + status = pyinit_main(runtime, interp); if (_PyStatus_EXCEPTION(status)) { return status; } @@ -1457,7 +1456,7 @@ new_interpreter(PyThreadState **tstate_p) } Py_INCREF(interp->sysdict); PyDict_SetItemString(interp->sysdict, "modules", modules); - if (_PySys_InitMain(interp) < 0) { + if (_PySys_InitMain(runtime, interp) < 0) { return _PyStatus_ERR("can't finish initializing sys"); } } diff --git a/Python/pystate.c b/Python/pystate.c index 2b7db0e48deb..833e0fb30dcb 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -39,6 +39,7 @@ extern "C" { /* Forward declarations */ static PyThreadState *_PyGILState_GetThisThreadState(struct _gilstate_runtime_state *gilstate); +static void _PyThreadState_Delete(_PyRuntimeState *runtime, PyThreadState *tstate); static PyStatus @@ -191,8 +192,6 @@ _PyInterpreterState_Enable(_PyRuntimeState *runtime) PyInterpreterState * PyInterpreterState_New(void) { - _PyRuntimeState *runtime = &_PyRuntime; - if (PySys_Audit("cpython.PyInterpreterState_New", NULL) < 0) { return NULL; } @@ -203,9 +202,6 @@ PyInterpreterState_New(void) } memset(interp, 0, sizeof(*interp)); - - interp->runtime = runtime; - interp->id_refcount = -1; interp->check_interval = 100; @@ -227,6 +223,7 @@ PyInterpreterState_New(void) #endif #endif + _PyRuntimeState *runtime = &_PyRuntime; struct pyinterpreters *interpreters = &runtime->interpreters; HEAD_LOCK(runtime); @@ -260,11 +257,9 @@ PyInterpreterState_New(void) } -void -PyInterpreterState_Clear(PyInterpreterState *interp) +static void +_PyInterpreterState_Clear(_PyRuntimeState *runtime, PyInterpreterState *interp) { - _PyRuntimeState *runtime = interp->runtime; - if (PySys_Audit("cpython.PyInterpreterState_Clear", NULL) < 0) { PyErr_Clear(); } @@ -302,25 +297,31 @@ PyInterpreterState_Clear(PyInterpreterState *interp) // objects have been cleaned up at the point. } +void +PyInterpreterState_Clear(PyInterpreterState *interp) +{ + _PyInterpreterState_Clear(&_PyRuntime, interp); +} + static void -zapthreads(PyInterpreterState *interp) +zapthreads(_PyRuntimeState *runtime, PyInterpreterState *interp) { - PyThreadState *ts; + PyThreadState *p; /* No need to lock the mutex here because this should only happen when the threads are all really dead (XXX famous last words). */ - while ((ts = interp->tstate_head) != NULL) { - PyThreadState_Delete(ts); + while ((p = interp->tstate_head) != NULL) { + _PyThreadState_Delete(runtime, p); } } -void -PyInterpreterState_Delete(PyInterpreterState *interp) +static void +_PyInterpreterState_Delete(_PyRuntimeState *runtime, + PyInterpreterState *interp) { - _PyRuntimeState *runtime = interp->runtime; struct pyinterpreters *interpreters = &runtime->interpreters; - zapthreads(interp); + zapthreads(runtime, interp); HEAD_LOCK(runtime); PyInterpreterState **p; for (p = &interpreters->head; ; p = &(*p)->next) { @@ -349,6 +350,13 @@ PyInterpreterState_Delete(PyInterpreterState *interp) } +void +PyInterpreterState_Delete(PyInterpreterState *interp) +{ + _PyInterpreterState_Delete(&_PyRuntime, interp); +} + + /* * Delete all interpreter states except the main interpreter. If there * is a current interpreter state, it *must* be the main interpreter. @@ -375,8 +383,8 @@ _PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime) continue; } - PyInterpreterState_Clear(interp); // XXX must activate? - zapthreads(interp); + _PyInterpreterState_Clear(runtime, interp); // XXX must activate? + zapthreads(runtime, interp); if (interp->id_mutex != NULL) { PyThread_free_lock(interp->id_mutex); } @@ -489,8 +497,7 @@ _PyInterpreterState_IDDecref(PyInterpreterState *interp) if (interp->id_mutex == NULL) { return; } - _PyRuntimeState *runtime = interp->runtime; - struct _gilstate_runtime_state *gilstate = &runtime->gilstate; + struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate; PyThread_acquire_lock(interp->id_mutex, WAIT_LOCK); assert(interp->id_refcount != 0); interp->id_refcount -= 1; @@ -552,7 +559,7 @@ threadstate_getframe(PyThreadState *self) static PyThreadState * new_threadstate(PyInterpreterState *interp, int init) { - _PyRuntimeState *runtime = interp->runtime; + _PyRuntimeState *runtime = &_PyRuntime; PyThreadState *tstate = (PyThreadState *)PyMem_RawMalloc(sizeof(PyThreadState)); if (tstate == NULL) { return NULL; @@ -608,7 +615,7 @@ new_threadstate(PyInterpreterState *interp, int init) tstate->id = ++interp->tstate_next_unique_id; if (init) { - _PyThreadState_Init(tstate); + _PyThreadState_Init(runtime, tstate); } HEAD_LOCK(runtime); @@ -635,9 +642,8 @@ _PyThreadState_Prealloc(PyInterpreterState *interp) } void -_PyThreadState_Init(PyThreadState *tstate) +_PyThreadState_Init(_PyRuntimeState *runtime, PyThreadState *tstate) { - _PyRuntimeState *runtime = tstate->interp->runtime; _PyGILState_NoteThreadState(&runtime->gilstate, tstate); } @@ -802,7 +808,7 @@ PyThreadState_Clear(PyThreadState *tstate) /* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */ static void -tstate_delete_common(PyThreadState *tstate) +tstate_delete_common(_PyRuntimeState *runtime, PyThreadState *tstate) { if (tstate == NULL) { Py_FatalError("PyThreadState_Delete: NULL tstate"); @@ -811,7 +817,6 @@ tstate_delete_common(PyThreadState *tstate) if (interp == NULL) { Py_FatalError("PyThreadState_Delete: NULL interp"); } - _PyRuntimeState *runtime = interp->runtime; HEAD_LOCK(runtime); if (tstate->prev) tstate->prev->next = tstate->next; @@ -827,10 +832,9 @@ tstate_delete_common(PyThreadState *tstate) } -void -PyThreadState_Delete(PyThreadState *tstate) +static void +_PyThreadState_Delete(_PyRuntimeState *runtime, PyThreadState *tstate) { - _PyRuntimeState *runtime = tstate->interp->runtime; struct _gilstate_runtime_state *gilstate = &runtime->gilstate; if (tstate == _PyRuntimeGILState_GetThreadState(gilstate)) { Py_FatalError("PyThreadState_Delete: tstate is still current"); @@ -840,7 +844,14 @@ PyThreadState_Delete(PyThreadState *tstate) { PyThread_tss_set(&gilstate->autoTSSkey, NULL); } - tstate_delete_common(tstate); + tstate_delete_common(runtime, tstate); +} + + +void +PyThreadState_Delete(PyThreadState *tstate) +{ + _PyThreadState_Delete(&_PyRuntime, tstate); } @@ -852,7 +863,7 @@ _PyThreadState_DeleteCurrent(_PyRuntimeState *runtime) if (tstate == NULL) Py_FatalError( "PyThreadState_DeleteCurrent: no current tstate"); - tstate_delete_common(tstate); + tstate_delete_common(runtime, tstate); if (gilstate->autoInterpreterState && PyThread_tss_get(&gilstate->autoTSSkey) == tstate) { @@ -877,10 +888,9 @@ PyThreadState_DeleteCurrent() * be kept in those other interpreteres. */ void -_PyThreadState_DeleteExcept(PyThreadState *tstate) +_PyThreadState_DeleteExcept(_PyRuntimeState *runtime, PyThreadState *tstate) { PyInterpreterState *interp = tstate->interp; - _PyRuntimeState *runtime = interp->runtime; PyThreadState *p, *next, *garbage; HEAD_LOCK(runtime); /* Remove all thread states, except tstate, from the linked list of @@ -1119,9 +1129,8 @@ _PyThread_CurrentFrames(void) static int PyThreadState_IsCurrent(PyThreadState *tstate) { - _PyRuntimeState *runtime = tstate->interp->runtime; /* Must be the tstate for this thread */ - struct _gilstate_runtime_state *gilstate = &runtime->gilstate; + struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate; assert(_PyGILState_GetThisThreadState(gilstate) == tstate); return tstate == _PyRuntimeGILState_GetThreadState(gilstate); } @@ -1130,14 +1139,12 @@ PyThreadState_IsCurrent(PyThreadState *tstate) Py_Initialize/Py_FinalizeEx */ void -_PyGILState_Init(PyThreadState *tstate) +_PyGILState_Init(_PyRuntimeState *runtime, + PyInterpreterState *interp, PyThreadState *tstate) { /* must init with valid states */ - assert(tstate != NULL); - PyInterpreterState *interp = tstate->interp; assert(interp != NULL); - _PyRuntimeState *runtime = interp->runtime; - assert(runtime != NULL); + assert(tstate != NULL); struct _gilstate_runtime_state *gilstate = &runtime->gilstate; diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 97bff94d8b41..12b1bd7711d5 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -120,9 +120,8 @@ should_audit(void) if (!ts) { return 0; } - PyInterpreterState *is = ts->interp; - _PyRuntimeState *runtime = is->runtime; - return runtime->audit_hook_head + PyInterpreterState *is = ts ? ts->interp : NULL; + return _PyRuntime.audit_hook_head || (is && is->audit_hooks) || PyDTrace_AUDIT_ENABLED(); } @@ -281,8 +280,8 @@ void _PySys_ClearAuditHooks(void) { PySys_Audit("cpython._PySys_ClearAuditHooks", NULL); PyErr_Clear(); - _Py_AuditHookEntry *e = runtime->audit_hook_head, *n; - runtime->audit_hook_head = NULL; + _Py_AuditHookEntry *e = _PyRuntime.audit_hook_head, *n; + _PyRuntime.audit_hook_head = NULL; while (e) { n = e->next; PyMem_RawFree(e); @@ -293,7 +292,6 @@ void _PySys_ClearAuditHooks(void) { int PySys_AddAuditHook(Py_AuditHookFunction hook, void *userData) { - _PyRuntimeState *runtime = &_PyRuntime; /* Invoke existing audit hooks to allow them an opportunity to abort. */ /* Cannot invoke hooks until we are initialized */ if (Py_IsInitialized()) { @@ -307,10 +305,10 @@ PySys_AddAuditHook(Py_AuditHookFunction hook, void *userData) } } - _Py_AuditHookEntry *e = runtime->audit_hook_head; + _Py_AuditHookEntry *e = _PyRuntime.audit_hook_head; if (!e) { e = (_Py_AuditHookEntry*)PyMem_RawMalloc(sizeof(_Py_AuditHookEntry)); - runtime->audit_hook_head = e; + _PyRuntime.audit_hook_head = e; } else { while (e->next) e = e->next; @@ -2415,9 +2413,8 @@ static PyStructSequence_Desc flags_desc = { }; static PyObject* -make_flags(PyInterpreterState *interp) +make_flags(_PyRuntimeState *runtime, PyInterpreterState *interp) { - _PyRuntimeState *runtime = interp->runtime; int pos = 0; PyObject *seq; const PyPreConfig *preconfig = &runtime->preconfig; @@ -2636,7 +2633,8 @@ static struct PyModuleDef sysmodule = { } while (0) static PyStatus -_PySys_InitCore(PyInterpreterState *interp, PyObject *sysdict) +_PySys_InitCore(_PyRuntimeState *runtime, PyInterpreterState *interp, + PyObject *sysdict) { PyObject *version_info; int res; @@ -2730,7 +2728,7 @@ _PySys_InitCore(PyInterpreterState *interp, PyObject *sysdict) } } /* Set flags to their default values (updated by _PySys_InitMain()) */ - SET_SYS_FROM_STRING("flags", make_flags(interp)); + SET_SYS_FROM_STRING("flags", make_flags(runtime, interp)); #if defined(MS_WINDOWS) /* getwindowsversion */ @@ -2851,7 +2849,7 @@ sys_create_xoptions_dict(const PyConfig *config) int -_PySys_InitMain(PyInterpreterState *interp) +_PySys_InitMain(_PyRuntimeState *runtime, PyInterpreterState *interp) { PyObject *sysdict = interp->sysdict; const PyConfig *config = &interp->config; @@ -2905,7 +2903,7 @@ _PySys_InitMain(PyInterpreterState *interp) #undef SET_SYS_FROM_WSTR /* Set flags to their final values */ - SET_SYS_FROM_STRING_INT_RESULT("flags", make_flags(interp)); + SET_SYS_FROM_STRING_INT_RESULT("flags", make_flags(runtime, interp)); /* prevent user from creating new instances */ FlagsType.tp_init = NULL; FlagsType.tp_new = NULL; @@ -2972,7 +2970,8 @@ _PySys_SetPreliminaryStderr(PyObject *sysdict) /* Create sys module without all attributes: _PySys_InitMain() should be called later to add remaining attributes. */ PyStatus -_PySys_Create(PyInterpreterState *interp, PyObject **sysmod_p) +_PySys_Create(_PyRuntimeState *runtime, PyInterpreterState *interp, + PyObject **sysmod_p) { PyObject *modules = PyDict_New(); if (modules == NULL) { @@ -3001,7 +3000,7 @@ _PySys_Create(PyInterpreterState *interp, PyObject **sysmod_p) return status; } - status = _PySys_InitCore(interp, sysdict); + status = _PySys_InitCore(runtime, interp, sysdict); if (_PyStatus_EXCEPTION(status)) { return status; } From webhook-mailer at python.org Tue Jun 4 04:23:27 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Tue, 04 Jun 2019 08:23:27 -0000 Subject: [Python-checkins] bpo-35431: Drop the k <= n requirement (GH-13798) Message-ID: https://github.com/python/cpython/commit/963eb0f4738456455b9bef7eb531b46805415208 commit: 963eb0f4738456455b9bef7eb531b46805415208 branch: master author: Raymond Hettinger committer: GitHub date: 2019-06-04T01:23:06-07:00 summary: bpo-35431: Drop the k <= n requirement (GH-13798) files: M Doc/library/math.rst M Lib/test/test_math.py M Modules/clinic/mathmodule.c.h M Modules/mathmodule.c diff --git a/Doc/library/math.rst b/Doc/library/math.rst index c5a77f1fab9f..4a1578972452 100644 --- a/Doc/library/math.rst +++ b/Doc/library/math.rst @@ -41,12 +41,15 @@ Number-theoretic and representation functions Return the number of ways to choose *k* items from *n* items without repetition and without order. - Also called the binomial coefficient. It is mathematically equal to the expression - ``n! / (k! (n - k)!)``. It is equivalent to the coefficient of the *k*-th term in the - polynomial expansion of the expression ``(1 + x) ** n``. + Evaluates to ``n! / (k! * (n - k)!)`` when ``k <= n`` and evaluates + to zero when ``k > n``. - Raises :exc:`TypeError` if the arguments not integers. - Raises :exc:`ValueError` if the arguments are negative or if *k* > *n*. + Also called the binomial coefficient because it is equivalent + to the coefficient of k-th term in polynomial expansion of the + expression ``(1 + x) ** n``. + + Raises :exc:`TypeError` if either of the arguments not integers. + Raises :exc:`ValueError` if either of the arguments are negative. .. versionadded:: 3.8 @@ -212,10 +215,11 @@ Number-theoretic and representation functions Return the number of ways to choose *k* items from *n* items without repetition and with order. - It is mathematically equal to the expression ``n! / (n - k)!``. + Evaluates to ``n! / (n - k)!`` when ``k <= n`` and evaluates + to zero when ``k > n``. - Raises :exc:`TypeError` if the arguments not integers. - Raises :exc:`ValueError` if the arguments are negative or if *k* > *n*. + Raises :exc:`TypeError` if either of the arguments not integers. + Raises :exc:`ValueError` if either of the arguments are negative. .. versionadded:: 3.8 diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index 96e0cf2fe671..86e3923af6d0 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -1904,9 +1904,9 @@ def testPerm(self): self.assertRaises(ValueError, perm, 1, -1) self.assertRaises(ValueError, perm, 1, -2**1000) - # Raises value error if k is greater than n - self.assertRaises(ValueError, perm, 1, 2) - self.assertRaises(ValueError, perm, 1, 2**1000) + # Returns zero if k is greater than n + self.assertEqual(perm(1, 2), 0) + self.assertEqual(perm(1, 2**1000), 0) n = 2**1000 self.assertEqual(perm(n, 0), 1) @@ -1970,9 +1970,9 @@ def testComb(self): self.assertRaises(ValueError, comb, 1, -1) self.assertRaises(ValueError, comb, 1, -2**1000) - # Raises value error if k is greater than n - self.assertRaises(ValueError, comb, 1, 2) - self.assertRaises(ValueError, comb, 1, 2**1000) + # Returns zero if k is greater than n + self.assertEqual(comb(1, 2), 0) + self.assertEqual(comb(1, 2**1000), 0) n = 2**1000 self.assertEqual(comb(n, 0), 1) diff --git a/Modules/clinic/mathmodule.c.h b/Modules/clinic/mathmodule.c.h index 0efe5cc409ce..cdf4305641b7 100644 --- a/Modules/clinic/mathmodule.c.h +++ b/Modules/clinic/mathmodule.c.h @@ -644,10 +644,11 @@ PyDoc_STRVAR(math_perm__doc__, "\n" "Number of ways to choose k items from n items without repetition and with order.\n" "\n" -"It is mathematically equal to the expression n! / (n - k)!.\n" +"Evaluates to n! / (n - k)! when k <= n and evaluates\n" +"to zero when k > n.\n" "\n" -"Raises TypeError if the arguments are not integers.\n" -"Raises ValueError if the arguments are negative or if k > n."); +"Raises TypeError if either of the arguments are not integers.\n" +"Raises ValueError if either of the arguments are negative."); #define MATH_PERM_METHODDEF \ {"perm", (PyCFunction)(void(*)(void))math_perm, METH_FASTCALL, math_perm__doc__}, @@ -679,12 +680,15 @@ PyDoc_STRVAR(math_comb__doc__, "\n" "Number of ways to choose k items from n items without repetition and without order.\n" "\n" -"Also called the binomial coefficient. It is mathematically equal to the expression\n" -"n! / (k! * (n - k)!). It is equivalent to the coefficient of k-th term in\n" -"polynomial expansion of the expression (1 + x)**n.\n" +"Evaluates to n! / (k! * (n - k)!) when k <= n and evaluates\n" +"to zero when k > n.\n" "\n" -"Raises TypeError if the arguments are not integers.\n" -"Raises ValueError if the arguments are negative or if k > n."); +"Also called the binomial coefficient because it is equivalent\n" +"to the coefficient of k-th term in polynomial expansion of the\n" +"expression (1 + x)**n.\n" +"\n" +"Raises TypeError if either of the arguments are not integers.\n" +"Raises ValueError if either of the arguments are negative."); #define MATH_COMB_METHODDEF \ {"comb", (PyCFunction)(void(*)(void))math_comb, METH_FASTCALL, math_comb__doc__}, @@ -709,4 +713,4 @@ math_comb(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: return return_value; } -/*[clinic end generated code: output=a82b0e705b6d0ec0 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=5004266613284dcc input=a9049054013a1b77]*/ diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index 6e1099321c54..9a9a8159ced4 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -3007,15 +3007,16 @@ math.perm Number of ways to choose k items from n items without repetition and with order. -It is mathematically equal to the expression n! / (n - k)!. +Evaluates to n! / (n - k)! when k <= n and evaluates +to zero when k > n. -Raises TypeError if the arguments are not integers. -Raises ValueError if the arguments are negative or if k > n. +Raises TypeError if either of the arguments are not integers. +Raises ValueError if either of the arguments are negative. [clinic start generated code]*/ static PyObject * math_perm_impl(PyObject *module, PyObject *n, PyObject *k) -/*[clinic end generated code: output=e021a25469653e23 input=f71ee4f6ff26be24]*/ +/*[clinic end generated code: output=e021a25469653e23 input=b2e7729d9a1949cf]*/ { PyObject *result = NULL, *factor = NULL; int overflow, cmp; @@ -3052,8 +3053,8 @@ math_perm_impl(PyObject *module, PyObject *n, PyObject *k) cmp = PyObject_RichCompareBool(n, k, Py_LT); if (cmp != 0) { if (cmp > 0) { - PyErr_SetString(PyExc_ValueError, - "k must be an integer less than or equal to n"); + result = PyLong_FromLong(0); + goto done; } goto error; } @@ -3121,18 +3122,21 @@ math.comb Number of ways to choose k items from n items without repetition and without order. -Also called the binomial coefficient. It is mathematically equal to the expression -n! / (k! * (n - k)!). It is equivalent to the coefficient of k-th term in -polynomial expansion of the expression (1 + x)**n. +Evaluates to n! / (k! * (n - k)!) when k <= n and evaluates +to zero when k > n. + +Also called the binomial coefficient because it is equivalent +to the coefficient of k-th term in polynomial expansion of the +expression (1 + x)**n. -Raises TypeError if the arguments are not integers. -Raises ValueError if the arguments are negative or if k > n. +Raises TypeError if either of the arguments are not integers. +Raises ValueError if either of the arguments are negative. [clinic start generated code]*/ static PyObject * math_comb_impl(PyObject *module, PyObject *n, PyObject *k) -/*[clinic end generated code: output=bd2cec8d854f3493 input=2f336ac9ec8242f9]*/ +/*[clinic end generated code: output=bd2cec8d854f3493 input=9a05315af2518709]*/ { PyObject *result = NULL, *factor = NULL, *temp; int overflow, cmp; @@ -3173,9 +3177,8 @@ math_comb_impl(PyObject *module, PyObject *n, PyObject *k) } if (Py_SIZE(temp) < 0) { Py_DECREF(temp); - PyErr_SetString(PyExc_ValueError, - "k must be an integer less than or equal to n"); - goto error; + result = PyLong_FromLong(0); + goto done; } cmp = PyObject_RichCompareBool(temp, k, Py_LT); if (cmp > 0) { From webhook-mailer at python.org Tue Jun 4 06:26:26 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Tue, 04 Jun 2019 10:26:26 -0000 Subject: [Python-checkins] bpo-37148: Fix asyncio test that check for warning when running the test suite with huntleaks (GH-13800) Message-ID: https://github.com/python/cpython/commit/4cdbc452ce308bb55523e53963cabdc988e3f44b commit: 4cdbc452ce308bb55523e53963cabdc988e3f44b branch: master author: Pablo Galindo committer: GitHub date: 2019-06-04T11:26:20+01:00 summary: bpo-37148: Fix asyncio test that check for warning when running the test suite with huntleaks (GH-13800) files: M Lib/test/test_asyncio/test_streams.py diff --git a/Lib/test/test_asyncio/test_streams.py b/Lib/test/test_asyncio/test_streams.py index df3d7e7dfa45..c1b9dc95ee62 100644 --- a/Lib/test/test_asyncio/test_streams.py +++ b/Lib/test/test_asyncio/test_streams.py @@ -1229,10 +1229,14 @@ def test_eof_feed_when_closing_writer(self): self.assertEqual(messages, []) def test_stream_reader_create_warning(self): + with contextlib.suppress(AttributeError): + del asyncio.StreamReader with self.assertWarns(DeprecationWarning): asyncio.StreamReader def test_stream_writer_create_warning(self): + with contextlib.suppress(AttributeError): + del asyncio.StreamWriter with self.assertWarns(DeprecationWarning): asyncio.StreamWriter From webhook-mailer at python.org Tue Jun 4 06:37:50 2019 From: webhook-mailer at python.org (Ivan Levkivskyi) Date: Tue, 04 Jun 2019 10:37:50 -0000 Subject: [Python-checkins] More updates to the annotated assignments docs (GH-13794) Message-ID: https://github.com/python/cpython/commit/8bcf2629a2e27267edba98fd3b5ed274b25aeb2d commit: 8bcf2629a2e27267edba98fd3b5ed274b25aeb2d branch: master author: Ivan Levkivskyi committer: GitHub date: 2019-06-04T11:37:46+01:00 summary: More updates to the annotated assignments docs (GH-13794) files: M Doc/reference/simple_stmts.rst diff --git a/Doc/reference/simple_stmts.rst b/Doc/reference/simple_stmts.rst index 9c0430da1fb2..0a043a90050c 100644 --- a/Doc/reference/simple_stmts.rst +++ b/Doc/reference/simple_stmts.rst @@ -330,10 +330,9 @@ statement, of a variable or attribute annotation and an optional assignment stat .. productionlist:: annotated_assignment_stmt: `augtarget` ":" `expression` - : ["=" (`expression_list` | `yield_expression`)] + : ["=" (`starred_expression` | `yield_expression`)] -The difference from normal :ref:`assignment` is that only single target and -only single right hand side value is allowed. +The difference from normal :ref:`assignment` is that only single target is allowed. For simple names as assignment targets, if in class or module scope, the annotations are evaluated and stored in a special class or module @@ -369,7 +368,7 @@ target, then the interpreter evaluates the target except for the last .. versionchanged:: 3.8 Now annotated assignments allow same expressions in the right hand side as - the augmented assignments. Previously, some expressions (like un-parenthesized + the regular assignments. Previously, some expressions (like un-parenthesized tuple expressions) caused a syntax error. From webhook-mailer at python.org Tue Jun 4 06:40:27 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Tue, 04 Jun 2019 10:40:27 -0000 Subject: [Python-checkins] Fix grammar (GH-13801) Message-ID: https://github.com/python/cpython/commit/8f4bbb5d627e07a5508099e84796cecaeb9e32ab commit: 8f4bbb5d627e07a5508099e84796cecaeb9e32ab branch: master author: Raymond Hettinger committer: GitHub date: 2019-06-04T03:40:23-07:00 summary: Fix grammar (GH-13801) files: M Doc/library/math.rst diff --git a/Doc/library/math.rst b/Doc/library/math.rst index 4a1578972452..28ed5d21f03a 100644 --- a/Doc/library/math.rst +++ b/Doc/library/math.rst @@ -48,7 +48,7 @@ Number-theoretic and representation functions to the coefficient of k-th term in polynomial expansion of the expression ``(1 + x) ** n``. - Raises :exc:`TypeError` if either of the arguments not integers. + Raises :exc:`TypeError` if either of the arguments are not integers. Raises :exc:`ValueError` if either of the arguments are negative. .. versionadded:: 3.8 @@ -218,7 +218,7 @@ Number-theoretic and representation functions Evaluates to ``n! / (n - k)!`` when ``k <= n`` and evaluates to zero when ``k > n``. - Raises :exc:`TypeError` if either of the arguments not integers. + Raises :exc:`TypeError` if either of the arguments are not integers. Raises :exc:`ValueError` if either of the arguments are negative. .. versionadded:: 3.8 From webhook-mailer at python.org Tue Jun 4 07:03:37 2019 From: webhook-mailer at python.org (=?utf-8?q?=C5=81ukasz?= Langa) Date: Tue, 04 Jun 2019 11:03:37 -0000 Subject: [Python-checkins] Revert "bpo-34037, asyncio: add BaseEventLoop.wait_executor_on_close (GH-13786)" (#13802) Message-ID: https://github.com/python/cpython/commit/7f9a2ae78051877f4d966119e2fcd27ec77eda1d commit: 7f9a2ae78051877f4d966119e2fcd27ec77eda1d branch: master author: ?ukasz Langa committer: GitHub date: 2019-06-04T13:03:20+02:00 summary: Revert "bpo-34037, asyncio: add BaseEventLoop.wait_executor_on_close (GH-13786)" (#13802) This reverts commit 0f0a30f4da4b529e0f7df857b9f575b231b32758. files: D Misc/NEWS.d/next/Library/2019-06-03-22-54-15.bpo-34037.fKNAbH.rst M Doc/library/asyncio-eventloop.rst M Lib/asyncio/base_events.py diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst index f75ca9a966b6..8673f84e9638 100644 --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -140,18 +140,12 @@ Running and stopping the loop The loop must not be running when this function is called. Any pending callbacks will be discarded. - This method clears all queues and shuts down the default executor. By - default, it waits for the default executor to finish. Set - *loop.wait_executor_on_close* to ``False`` to not wait for the executor. + This method clears all queues and shuts down the executor, but does + not wait for the executor to finish. This method is idempotent and irreversible. No other methods should be called after the event loop is closed. - .. versionchanged:: 3.8 - The method now waits for the default executor to finish by default. - Added *loop.wait_executor_on_close* attribute. - - .. coroutinemethod:: loop.shutdown_asyncgens() Schedule all currently open :term:`asynchronous generator` objects to diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index b1a7f88f4116..e0025397fa8a 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -380,8 +380,6 @@ def close(self): class BaseEventLoop(events.AbstractEventLoop): def __init__(self): - # If true, close() waits for the default executor to finish - self.wait_executor_on_close = True self._timer_cancelled_count = 0 self._closed = False self._stopping = False @@ -637,7 +635,7 @@ def close(self): executor = self._default_executor if executor is not None: self._default_executor = None - executor.shutdown(wait=self.wait_executor_on_close) + executor.shutdown(wait=False) def is_closed(self): """Returns True if the event loop was closed.""" diff --git a/Misc/NEWS.d/next/Library/2019-06-03-22-54-15.bpo-34037.fKNAbH.rst b/Misc/NEWS.d/next/Library/2019-06-03-22-54-15.bpo-34037.fKNAbH.rst deleted file mode 100644 index fb2f7a5fa36e..000000000000 --- a/Misc/NEWS.d/next/Library/2019-06-03-22-54-15.bpo-34037.fKNAbH.rst +++ /dev/null @@ -1,4 +0,0 @@ -:mod:`asyncio`: ``loop.close()`` now waits for the default executor to -finish by default. Set ``loop.wait_executor_on_close`` attribute to -``False`` to opt-in for Python 3.7 behavior (not wait for the executor to -finish). From webhook-mailer at python.org Tue Jun 4 07:37:23 2019 From: webhook-mailer at python.org (Yury Selivanov) Date: Tue, 04 Jun 2019 11:37:23 -0000 Subject: [Python-checkins] Make StreamServer.close() tests more robust (GH-13790) Message-ID: https://github.com/python/cpython/commit/35890abb8da7848919d70790f73fa091d7f98769 commit: 35890abb8da7848919d70790f73fa091d7f98769 branch: master author: Andrew Svetlov committer: Yury Selivanov date: 2019-06-04T13:37:10+02:00 summary: Make StreamServer.close() tests more robust (GH-13790) files: M Lib/test/test_asyncio/test_streams.py diff --git a/Lib/test/test_asyncio/test_streams.py b/Lib/test/test_asyncio/test_streams.py index c1b9dc95ee62..e484746432af 100644 --- a/Lib/test/test_asyncio/test_streams.py +++ b/Lib/test/test_asyncio/test_streams.py @@ -1507,10 +1507,14 @@ def test_stream_server_close(self): def test_stream_server_abort(self): server_stream_aborted = False - fut = self.loop.create_future() + fut1 = self.loop.create_future() + fut2 = self.loop.create_future() async def handle_client(stream): - await fut + data = await stream.readexactly(4) + self.assertEqual(b'data', data) + fut1.set_result(None) + await fut2 self.assertEqual(b'', await stream.readline()) nonlocal server_stream_aborted server_stream_aborted = True @@ -1518,7 +1522,8 @@ def test_stream_server_abort(self): async def client(srv): addr = srv.sockets[0].getsockname() stream = await asyncio.connect(*addr) - fut.set_result(None) + await stream.write(b'data') + await fut2 self.assertEqual(b'', await stream.readline()) await stream.close() @@ -1526,7 +1531,8 @@ def test_stream_server_abort(self): async with asyncio.StreamServer(handle_client, '127.0.0.1', 0) as server: await server.start_serving() task = asyncio.create_task(client(server)) - await fut + await fut1 + fut2.set_result(None) await server.abort() await task @@ -1534,21 +1540,31 @@ def test_stream_server_abort(self): self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) self.loop.run_until_complete(test()) self.assertEqual(messages, []) - self.assertTrue(fut.done()) + self.assertTrue(fut1.done()) + self.assertTrue(fut2.done()) self.assertTrue(server_stream_aborted) def test_stream_shutdown_hung_task(self): fut1 = self.loop.create_future() fut2 = self.loop.create_future() + cancelled = self.loop.create_future() async def handle_client(stream): - while True: - await asyncio.sleep(0.01) + data = await stream.readexactly(4) + self.assertEqual(b'data', data) + fut1.set_result(None) + await fut2 + try: + while True: + await asyncio.sleep(0.01) + except asyncio.CancelledError: + cancelled.set_result(None) + raise async def client(srv): addr = srv.sockets[0].getsockname() stream = await asyncio.connect(*addr) - fut1.set_result(None) + await stream.write(b'data') await fut2 self.assertEqual(b'', await stream.readline()) await stream.close() @@ -1561,9 +1577,10 @@ def test_stream_shutdown_hung_task(self): await server.start_serving() task = asyncio.create_task(client(server)) await fut1 - await server.close() fut2.set_result(None) + await server.close() await task + await cancelled messages = [] self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) @@ -1571,21 +1588,28 @@ def test_stream_shutdown_hung_task(self): self.assertEqual(messages, []) self.assertTrue(fut1.done()) self.assertTrue(fut2.done()) + self.assertTrue(cancelled.done()) def test_stream_shutdown_hung_task_prevents_cancellation(self): fut1 = self.loop.create_future() fut2 = self.loop.create_future() + cancelled = self.loop.create_future() do_handle_client = True async def handle_client(stream): + data = await stream.readexactly(4) + self.assertEqual(b'data', data) + fut1.set_result(None) + await fut2 while do_handle_client: with contextlib.suppress(asyncio.CancelledError): await asyncio.sleep(0.01) + cancelled.set_result(None) async def client(srv): addr = srv.sockets[0].getsockname() stream = await asyncio.connect(*addr) - fut1.set_result(None) + await stream.write(b'data') await fut2 self.assertEqual(b'', await stream.readline()) await stream.close() @@ -1598,11 +1622,12 @@ def test_stream_shutdown_hung_task_prevents_cancellation(self): await server.start_serving() task = asyncio.create_task(client(server)) await fut1 + fut2.set_result(None) await server.close() nonlocal do_handle_client do_handle_client = False - fut2.set_result(None) await task + await cancelled messages = [] self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) @@ -1612,6 +1637,7 @@ def test_stream_shutdown_hung_task_prevents_cancellation(self): " https://github.com/python/cpython/commit/8d561092d510670ce9c038701c90c913453eac90 commit: 8d561092d510670ce9c038701c90c913453eac90 branch: master author: Andrew Svetlov committer: Victor Stinner date: 2019-06-04T15:44:44+02:00 summary: bpo-37142: Make asyncio stream tests more robust again (GH-13804) Make test_stream_server_close() implementation following test_stream_server_abort(). Add explicit timeout for tests that can hang. files: M Lib/test/test_asyncio/test_streams.py diff --git a/Lib/test/test_asyncio/test_streams.py b/Lib/test/test_asyncio/test_streams.py index e484746432af..74e385524dd5 100644 --- a/Lib/test/test_asyncio/test_streams.py +++ b/Lib/test/test_asyncio/test_streams.py @@ -1475,10 +1475,14 @@ def test_stream_server_start_serving(self): def test_stream_server_close(self): server_stream_aborted = False - fut = self.loop.create_future() + fut1 = self.loop.create_future() + fut2 = self.loop.create_future() async def handle_client(stream): - await fut + data = await stream.readexactly(4) + self.assertEqual(b'data', data) + fut1.set_result(None) + await fut2 self.assertEqual(b'', await stream.readline()) nonlocal server_stream_aborted server_stream_aborted = True @@ -1486,7 +1490,8 @@ def test_stream_server_close(self): async def client(srv): addr = srv.sockets[0].getsockname() stream = await asyncio.connect(*addr) - fut.set_result(None) + await stream.write(b'data') + await fut2 self.assertEqual(b'', await stream.readline()) await stream.close() @@ -1494,15 +1499,17 @@ def test_stream_server_close(self): async with asyncio.StreamServer(handle_client, '127.0.0.1', 0) as server: await server.start_serving() task = asyncio.create_task(client(server)) - await fut + await fut1 + fut2.set_result(None) await server.close() await task messages = [] self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) - self.loop.run_until_complete(test()) + self.loop.run_until_complete(asyncio.wait_for(test(), 60.0)) self.assertEqual(messages, []) - self.assertTrue(fut.done()) + self.assertTrue(fut1.done()) + self.assertTrue(fut2.done()) self.assertTrue(server_stream_aborted) def test_stream_server_abort(self): @@ -1538,7 +1545,7 @@ def test_stream_server_abort(self): messages = [] self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) - self.loop.run_until_complete(test()) + self.loop.run_until_complete(asyncio.wait_for(test(), 60.0)) self.assertEqual(messages, []) self.assertTrue(fut1.done()) self.assertTrue(fut2.done()) @@ -1584,7 +1591,7 @@ def test_stream_shutdown_hung_task(self): messages = [] self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) - self.loop.run_until_complete(test()) + self.loop.run_until_complete(asyncio.wait_for(test(), 60.0)) self.assertEqual(messages, []) self.assertTrue(fut1.done()) self.assertTrue(fut2.done()) @@ -1631,7 +1638,7 @@ def test_stream_shutdown_hung_task_prevents_cancellation(self): messages = [] self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) - self.loop.run_until_complete(test()) + self.loop.run_until_complete(asyncio.wait_for(test(), 60.0)) self.assertEqual(1, len(messages)) self.assertRegex(messages[0]['message'], " https://github.com/python/cpython/commit/ea9f168957f7236aae2185f65e0dc608a9a7a37b commit: ea9f168957f7236aae2185f65e0dc608a9a7a37b branch: master author: Victor Stinner committer: GitHub date: 2019-06-04T17:08:24+02:00 summary: bpo-26219: Fix compiler warning in _PyCode_InitOpcache() (GH-13809) Fix this MSVC warning: objects\codeobject.c(264): warning C4244: '=': conversion from 'Py_ssize_t' to 'unsigned char', possible loss of data files: M Objects/codeobject.c diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 0d9e5d16e768..63ce4793597a 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -261,7 +261,8 @@ _PyCode_InitOpcache(PyCodeObject *co) // TODO: LOAD_METHOD, LOAD_ATTR if (opcode == LOAD_GLOBAL) { - co->co_opcache_map[i] = ++opts; + opts++; + co->co_opcache_map[i] = (unsigned char)opts; if (opts > 254) { break; } From webhook-mailer at python.org Tue Jun 4 11:09:15 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 04 Jun 2019 15:09:15 -0000 Subject: [Python-checkins] bpo-36778: Remove outdated comment from CodePageTest (GH-13807) Message-ID: https://github.com/python/cpython/commit/ca612a9728b83472d9d286bbea74972d426ed344 commit: ca612a9728b83472d9d286bbea74972d426ed344 branch: master author: Victor Stinner committer: GitHub date: 2019-06-04T17:09:10+02:00 summary: bpo-36778: Remove outdated comment from CodePageTest (GH-13807) CP65001Test has been removed. files: M Lib/test/test_codecs.py diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index 47df88cedaaf..d98f178384ab 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -2870,7 +2870,6 @@ def decode_to_bytes(*args, **kwds): @unittest.skipUnless(sys.platform == 'win32', 'code pages are specific to Windows') class CodePageTest(unittest.TestCase): - # CP_UTF8 is already tested by CP65001Test CP_UTF8 = 65001 def test_invalid_code_page(self): From webhook-mailer at python.org Tue Jun 4 11:18:18 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 04 Jun 2019 15:18:18 -0000 Subject: [Python-checkins] bpo-30699: Improve example on datetime tzinfo instances (GH-4290) Message-ID: https://github.com/python/cpython/commit/f0b5ae4567637b24035ecda93a3240efc96b6dd9 commit: f0b5ae4567637b24035ecda93a3240efc96b6dd9 branch: master author: Mario Corchero committer: Victor Stinner date: 2019-06-04T17:18:10+02:00 summary: bpo-30699: Improve example on datetime tzinfo instances (GH-4290) * Improve example on tzinfo instances Move from GMTX to TZX when naming the classes, as GMT1 might be rather confusing as seen in the reported issue. In addition, move to UTC over GMT and improve the tzname implementation. * Simplify datetime with tzinfo example Move the example in the documentation to just use timezone.utc and a user defined Kabul timezone rather than having two user defined timezones with DST. Kabul timezone is still interesting as it changes its offset but not based on DST. This is more accurate as the previous example was missing information about the fold attribute. Additionally, implementing the fold attribute was rather complex and probably not relevant enough for the section "datetime with tzinfo". files: M Doc/library/datetime.rst diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst index 3c45e56b5f4f..fb41aeeb5bed 100644 --- a/Doc/library/datetime.rst +++ b/Doc/library/datetime.rst @@ -1365,56 +1365,64 @@ Examples of working with datetime objects: Using datetime with tzinfo: - >>> from datetime import timedelta, datetime, tzinfo - >>> class GMT1(tzinfo): + >>> from datetime import timedelta, datetime, tzinfo, timezone + >>> class KabulTz(tzinfo): + ... # Kabul used +4 until 1945, when they moved to +4:30 + ... UTC_MOVE_DATE = datetime(1944, 12, 31, 20, tzinfo=timezone.utc) ... def utcoffset(self, dt): - ... return timedelta(hours=1) + self.dst(dt) - ... def dst(self, dt): - ... # DST starts last Sunday in March - ... d = datetime(dt.year, 4, 1) # ends last Sunday in October - ... self.dston = d - timedelta(days=d.weekday() + 1) - ... d = datetime(dt.year, 11, 1) - ... self.dstoff = d - timedelta(days=d.weekday() + 1) - ... if self.dston <= dt.replace(tzinfo=None) < self.dstoff: - ... return timedelta(hours=1) + ... if dt.year < 1945: + ... return timedelta(hours=4) + ... elif (1945, 1, 1, 0, 0) <= dt.timetuple()[:5] < (1945, 1, 1, 0, 30): + ... # If dt falls in the imaginary range, use fold to decide how + ... # to resolve. See PEP495 + ... return timedelta(hours=4, minutes=(30 if dt.fold else 0)) ... else: - ... return timedelta(0) - ... def tzname(self,dt): - ... return "GMT +1" + ... return timedelta(hours=4, minutes=30) + ... + ... def fromutc(self, dt): + ... # A custom implementation is required for fromutc as + ... # the input to this function is a datetime with utc values + ... # but with a tzinfo set to self + ... # See datetime.astimezone or fromtimestamp + ... + ... # Follow same validations as in datetime.tzinfo + ... if not isinstance(dt, datetime): + ... raise TypeError("fromutc() requires a datetime argument") + ... if dt.tzinfo is not self: + ... raise ValueError("dt.tzinfo is not self") + ... + ... if dt.replace(tzinfo=timezone.utc) >= self.UTC_MOVE_DATE: + ... return dt + timedelta(hours=4, minutes=30) + ... else: + ... return dt + timedelta(hours=4) ... - >>> class GMT2(tzinfo): - ... def utcoffset(self, dt): - ... return timedelta(hours=2) + self.dst(dt) ... def dst(self, dt): - ... d = datetime(dt.year, 4, 1) - ... self.dston = d - timedelta(days=d.weekday() + 1) - ... d = datetime(dt.year, 11, 1) - ... self.dstoff = d - timedelta(days=d.weekday() + 1) - ... if self.dston <= dt.replace(tzinfo=None) < self.dstoff: - ... return timedelta(hours=1) + ... return timedelta(0) + ... + ... def tzname(self, dt): + ... if dt >= self.UTC_MOVE_DATE: + ... return "+04:30" ... else: - ... return timedelta(0) - ... def tzname(self,dt): - ... return "GMT +2" + ... return "+04" ... - >>> gmt1 = GMT1() - >>> # Daylight Saving Time - >>> dt1 = datetime(2006, 11, 21, 16, 30, tzinfo=gmt1) - >>> dt1.dst() - datetime.timedelta(0) - >>> dt1.utcoffset() - datetime.timedelta(seconds=3600) - >>> dt2 = datetime(2006, 6, 14, 13, 0, tzinfo=gmt1) - >>> dt2.dst() - datetime.timedelta(seconds=3600) - >>> dt2.utcoffset() - datetime.timedelta(seconds=7200) + ... def __repr__(self): + ... return f"{self.__class__.__name__}()" + ... + >>> tz1 = KabulTz() + >>> # Datetime before the change + >>> dt1 = datetime(1900, 11, 21, 16, 30, tzinfo=tz1) + >>> print(dt1.utcoffset()) + 4:00:00 + >>> # Datetime after the change + >>> dt2 = datetime(2006, 6, 14, 13, 0, tzinfo=tz1) + >>> print(dt2.utcoffset()) + 4:30:00 >>> # Convert datetime to another time zone - >>> dt3 = dt2.astimezone(GMT2()) - >>> dt3 # doctest: +ELLIPSIS - datetime.datetime(2006, 6, 14, 14, 0, tzinfo=) - >>> dt2 # doctest: +ELLIPSIS - datetime.datetime(2006, 6, 14, 13, 0, tzinfo=) + >>> dt3 = dt2.astimezone(timezone.utc) + >>> dt3 + datetime.datetime(2006, 6, 14, 8, 30, tzinfo=datetime.timezone.utc) + >>> dt2 + datetime.datetime(2006, 6, 14, 13, 0, tzinfo=KabulTz()) >>> dt2.utctimetuple() == dt3.utctimetuple() True @@ -1656,26 +1664,27 @@ Instance methods: Example: >>> from datetime import time, tzinfo, timedelta - >>> class GMT1(tzinfo): + >>> class TZ1(tzinfo): ... def utcoffset(self, dt): ... return timedelta(hours=1) ... def dst(self, dt): ... return timedelta(0) ... def tzname(self,dt): - ... return "Europe/Prague" + ... return "+01:00" + ... def __repr__(self): + ... return f"{self.__class__.__name__}()" ... - >>> t = time(12, 10, 30, tzinfo=GMT1()) - >>> t # doctest: +ELLIPSIS - datetime.time(12, 10, 30, tzinfo=) - >>> gmt = GMT1() + >>> t = time(12, 10, 30, tzinfo=TZ1()) + >>> t + datetime.time(12, 10, 30, tzinfo=TZ1()) >>> t.isoformat() '12:10:30+01:00' >>> t.dst() datetime.timedelta(0) >>> t.tzname() - 'Europe/Prague' + '+01:00' >>> t.strftime("%H:%M:%S %Z") - '12:10:30 Europe/Prague' + '12:10:30 +01:00' >>> 'The {} is {:%H:%M}.'.format("time", t) 'The time is 12:10.' From webhook-mailer at python.org Tue Jun 4 11:20:25 2019 From: webhook-mailer at python.org (Vinay Sajip) Date: Tue, 04 Jun 2019 15:20:25 -0000 Subject: [Python-checkins] Fix extraneous whitespace in QueueListener.prepare (GH-13803) Message-ID: https://github.com/python/cpython/commit/800d78637034d77c099d49c4fe99e1fe773da700 commit: 800d78637034d77c099d49c4fe99e1fe773da700 branch: master author: Boris Feld committer: Vinay Sajip date: 2019-06-04T16:20:17+01:00 summary: Fix extraneous whitespace in QueueListener.prepare (GH-13803) files: M Lib/logging/handlers.py diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py index a913d27389ab..34ff7a056ef5 100644 --- a/Lib/logging/handlers.py +++ b/Lib/logging/handlers.py @@ -1437,7 +1437,7 @@ def start(self): t.daemon = True t.start() - def prepare(self , record): + def prepare(self, record): """ Prepare a record for handling. From webhook-mailer at python.org Tue Jun 4 11:25:21 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 04 Jun 2019 15:25:21 -0000 Subject: [Python-checkins] bpo-30699: Improve example on datetime tzinfo instances (GH-4290) Message-ID: https://github.com/python/cpython/commit/12c178799a23b47c5f8ebc072cbdf09a370649ae commit: 12c178799a23b47c5f8ebc072cbdf09a370649ae branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-04T08:25:16-07:00 summary: bpo-30699: Improve example on datetime tzinfo instances (GH-4290) * Improve example on tzinfo instances Move from GMTX to TZX when naming the classes, as GMT1 might be rather confusing as seen in the reported issue. In addition, move to UTC over GMT and improve the tzname implementation. * Simplify datetime with tzinfo example Move the example in the documentation to just use timezone.utc and a user defined Kabul timezone rather than having two user defined timezones with DST. Kabul timezone is still interesting as it changes its offset but not based on DST. This is more accurate as the previous example was missing information about the fold attribute. Additionally, implementing the fold attribute was rather complex and probably not relevant enough for the section "datetime with tzinfo". (cherry picked from commit f0b5ae4567637b24035ecda93a3240efc96b6dd9) Co-authored-by: Mario Corchero files: M Doc/library/datetime.rst diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst index 00cfaeb66f5a..15b500f770f0 100644 --- a/Doc/library/datetime.rst +++ b/Doc/library/datetime.rst @@ -1348,56 +1348,64 @@ Examples of working with datetime objects: Using datetime with tzinfo: - >>> from datetime import timedelta, datetime, tzinfo - >>> class GMT1(tzinfo): + >>> from datetime import timedelta, datetime, tzinfo, timezone + >>> class KabulTz(tzinfo): + ... # Kabul used +4 until 1945, when they moved to +4:30 + ... UTC_MOVE_DATE = datetime(1944, 12, 31, 20, tzinfo=timezone.utc) ... def utcoffset(self, dt): - ... return timedelta(hours=1) + self.dst(dt) - ... def dst(self, dt): - ... # DST starts last Sunday in March - ... d = datetime(dt.year, 4, 1) # ends last Sunday in October - ... self.dston = d - timedelta(days=d.weekday() + 1) - ... d = datetime(dt.year, 11, 1) - ... self.dstoff = d - timedelta(days=d.weekday() + 1) - ... if self.dston <= dt.replace(tzinfo=None) < self.dstoff: - ... return timedelta(hours=1) + ... if dt.year < 1945: + ... return timedelta(hours=4) + ... elif (1945, 1, 1, 0, 0) <= dt.timetuple()[:5] < (1945, 1, 1, 0, 30): + ... # If dt falls in the imaginary range, use fold to decide how + ... # to resolve. See PEP495 + ... return timedelta(hours=4, minutes=(30 if dt.fold else 0)) ... else: - ... return timedelta(0) - ... def tzname(self,dt): - ... return "GMT +1" + ... return timedelta(hours=4, minutes=30) + ... + ... def fromutc(self, dt): + ... # A custom implementation is required for fromutc as + ... # the input to this function is a datetime with utc values + ... # but with a tzinfo set to self + ... # See datetime.astimezone or fromtimestamp + ... + ... # Follow same validations as in datetime.tzinfo + ... if not isinstance(dt, datetime): + ... raise TypeError("fromutc() requires a datetime argument") + ... if dt.tzinfo is not self: + ... raise ValueError("dt.tzinfo is not self") + ... + ... if dt.replace(tzinfo=timezone.utc) >= self.UTC_MOVE_DATE: + ... return dt + timedelta(hours=4, minutes=30) + ... else: + ... return dt + timedelta(hours=4) ... - >>> class GMT2(tzinfo): - ... def utcoffset(self, dt): - ... return timedelta(hours=2) + self.dst(dt) ... def dst(self, dt): - ... d = datetime(dt.year, 4, 1) - ... self.dston = d - timedelta(days=d.weekday() + 1) - ... d = datetime(dt.year, 11, 1) - ... self.dstoff = d - timedelta(days=d.weekday() + 1) - ... if self.dston <= dt.replace(tzinfo=None) < self.dstoff: - ... return timedelta(hours=1) + ... return timedelta(0) + ... + ... def tzname(self, dt): + ... if dt >= self.UTC_MOVE_DATE: + ... return "+04:30" ... else: - ... return timedelta(0) - ... def tzname(self,dt): - ... return "GMT +2" + ... return "+04" ... - >>> gmt1 = GMT1() - >>> # Daylight Saving Time - >>> dt1 = datetime(2006, 11, 21, 16, 30, tzinfo=gmt1) - >>> dt1.dst() - datetime.timedelta(0) - >>> dt1.utcoffset() - datetime.timedelta(seconds=3600) - >>> dt2 = datetime(2006, 6, 14, 13, 0, tzinfo=gmt1) - >>> dt2.dst() - datetime.timedelta(seconds=3600) - >>> dt2.utcoffset() - datetime.timedelta(seconds=7200) + ... def __repr__(self): + ... return f"{self.__class__.__name__}()" + ... + >>> tz1 = KabulTz() + >>> # Datetime before the change + >>> dt1 = datetime(1900, 11, 21, 16, 30, tzinfo=tz1) + >>> print(dt1.utcoffset()) + 4:00:00 + >>> # Datetime after the change + >>> dt2 = datetime(2006, 6, 14, 13, 0, tzinfo=tz1) + >>> print(dt2.utcoffset()) + 4:30:00 >>> # Convert datetime to another time zone - >>> dt3 = dt2.astimezone(GMT2()) - >>> dt3 # doctest: +ELLIPSIS - datetime.datetime(2006, 6, 14, 14, 0, tzinfo=) - >>> dt2 # doctest: +ELLIPSIS - datetime.datetime(2006, 6, 14, 13, 0, tzinfo=) + >>> dt3 = dt2.astimezone(timezone.utc) + >>> dt3 + datetime.datetime(2006, 6, 14, 8, 30, tzinfo=datetime.timezone.utc) + >>> dt2 + datetime.datetime(2006, 6, 14, 13, 0, tzinfo=KabulTz()) >>> dt2.utctimetuple() == dt3.utctimetuple() True @@ -1639,26 +1647,27 @@ Instance methods: Example: >>> from datetime import time, tzinfo, timedelta - >>> class GMT1(tzinfo): + >>> class TZ1(tzinfo): ... def utcoffset(self, dt): ... return timedelta(hours=1) ... def dst(self, dt): ... return timedelta(0) ... def tzname(self,dt): - ... return "Europe/Prague" + ... return "+01:00" + ... def __repr__(self): + ... return f"{self.__class__.__name__}()" ... - >>> t = time(12, 10, 30, tzinfo=GMT1()) - >>> t # doctest: +ELLIPSIS - datetime.time(12, 10, 30, tzinfo=) - >>> gmt = GMT1() + >>> t = time(12, 10, 30, tzinfo=TZ1()) + >>> t + datetime.time(12, 10, 30, tzinfo=TZ1()) >>> t.isoformat() '12:10:30+01:00' >>> t.dst() datetime.timedelta(0) >>> t.tzname() - 'Europe/Prague' + '+01:00' >>> t.strftime("%H:%M:%S %Z") - '12:10:30 Europe/Prague' + '12:10:30 +01:00' >>> 'The {} is {:%H:%M}.'.format("time", t) 'The time is 12:10.' From webhook-mailer at python.org Tue Jun 4 11:56:01 2019 From: webhook-mailer at python.org (=?utf-8?q?=C5=81ukasz?= Langa) Date: Tue, 04 Jun 2019 15:56:01 -0000 Subject: [Python-checkins] bpo-36742: Corrects fix to handle decomposition in usernames (#13812) Message-ID: https://github.com/python/cpython/commit/8d0ef0b5edeae52960c7ed05ae8a12388324f87e commit: 8d0ef0b5edeae52960c7ed05ae8a12388324f87e branch: master author: Steve Dower committer: ?ukasz Langa date: 2019-06-04T17:55:29+02:00 summary: bpo-36742: Corrects fix to handle decomposition in usernames (#13812) files: M Lib/test/test_urlparse.py M Lib/urllib/parse.py diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py index 434476563764..4ae6ed33858c 100644 --- a/Lib/test/test_urlparse.py +++ b/Lib/test/test_urlparse.py @@ -1018,11 +1018,12 @@ def test_urlsplit_normalization(self): urllib.parse.urlsplit('http://\u30d5\u309a\ufe1380') for scheme in ["http", "https", "ftp"]: - for c in denorm_chars: - url = "{}://netloc{}false.netloc/path".format(scheme, c) - with self.subTest(url=url, char='{:04X}'.format(ord(c))): - with self.assertRaises(ValueError): - urllib.parse.urlsplit(url) + for netloc in ["netloc{}false.netloc", "n{}user at netloc"]: + for c in denorm_chars: + url = "{}://{}/path".format(scheme, netloc.format(c)) + with self.subTest(url=url, char='{:04X}'.format(ord(c))): + with self.assertRaises(ValueError): + urllib.parse.urlsplit(url) class Utility_Tests(unittest.TestCase): """Testcase to test the various utility functions in the urllib.""" diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py index daefb2025b14..b6608783a894 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -402,9 +402,9 @@ def _checknetloc(netloc): # looking for characters like \u2100 that expand to 'a/c' # IDNA uses NFKC equivalence, so normalize for this check import unicodedata - n = netloc.rpartition('@')[2] # ignore anything to the left of '@' - n = n.replace(':', '') # ignore characters already included - n = n.replace('#', '') # but not the surrounding text + n = netloc.replace('@', '') # ignore characters already included + n = n.replace(':', '') # but not the surrounding text + n = n.replace('#', '') n = n.replace('?', '') netloc2 = unicodedata.normalize('NFKC', n) if n == netloc2: From webhook-mailer at python.org Tue Jun 4 12:15:28 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 04 Jun 2019 16:15:28 -0000 Subject: [Python-checkins] bpo-36742: Corrects fix to handle decomposition in usernames (GH-13812) Message-ID: https://github.com/python/cpython/commit/250b62acc59921d399f0db47db3b462cd6037e09 commit: 250b62acc59921d399f0db47db3b462cd6037e09 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-04T09:15:13-07:00 summary: bpo-36742: Corrects fix to handle decomposition in usernames (GH-13812) (cherry picked from commit 8d0ef0b5edeae52960c7ed05ae8a12388324f87e) Co-authored-by: Steve Dower files: M Lib/test/test_urlparse.py M Lib/urllib/parse.py diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py index c26235449461..68f633ca3a7d 100644 --- a/Lib/test/test_urlparse.py +++ b/Lib/test/test_urlparse.py @@ -1008,11 +1008,12 @@ def test_urlsplit_normalization(self): urllib.parse.urlsplit('http://\u30d5\u309a\ufe1380') for scheme in ["http", "https", "ftp"]: - for c in denorm_chars: - url = "{}://netloc{}false.netloc/path".format(scheme, c) - with self.subTest(url=url, char='{:04X}'.format(ord(c))): - with self.assertRaises(ValueError): - urllib.parse.urlsplit(url) + for netloc in ["netloc{}false.netloc", "n{}user at netloc"]: + for c in denorm_chars: + url = "{}://{}/path".format(scheme, netloc.format(c)) + with self.subTest(url=url, char='{:04X}'.format(ord(c))): + with self.assertRaises(ValueError): + urllib.parse.urlsplit(url) class Utility_Tests(unittest.TestCase): """Testcase to test the various utility functions in the urllib.""" diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py index f5b3487ea9d6..4c8e77fe3912 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -397,9 +397,9 @@ def _checknetloc(netloc): # looking for characters like \u2100 that expand to 'a/c' # IDNA uses NFKC equivalence, so normalize for this check import unicodedata - n = netloc.rpartition('@')[2] # ignore anything to the left of '@' - n = n.replace(':', '') # ignore characters already included - n = n.replace('#', '') # but not the surrounding text + n = netloc.replace('@', '') # ignore characters already included + n = n.replace(':', '') # but not the surrounding text + n = n.replace('#', '') n = n.replace('?', '') netloc2 = unicodedata.normalize('NFKC', n) if n == netloc2: From webhook-mailer at python.org Tue Jun 4 12:40:21 2019 From: webhook-mailer at python.org (Steve Dower) Date: Tue, 04 Jun 2019 16:40:21 -0000 Subject: [Python-checkins] bpo-36742: Corrects fix to handle decomposition in usernames (GH-13812) Message-ID: https://github.com/python/cpython/commit/f61599b050c621386a3fc6bc480359e2d3bb93de commit: f61599b050c621386a3fc6bc480359e2d3bb93de branch: 2.7 author: Steve Dower committer: GitHub date: 2019-06-04T09:40:16-07:00 summary: bpo-36742: Corrects fix to handle decomposition in usernames (GH-13812) files: M Lib/test/test_urlparse.py M Lib/urlparse.py diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py index 6fd1071bf7cd..857ed96d92fe 100644 --- a/Lib/test/test_urlparse.py +++ b/Lib/test/test_urlparse.py @@ -648,12 +648,13 @@ def test_urlsplit_normalization(self): urlparse.urlsplit(u'http://\u30d5\u309a\ufe1380') for scheme in [u"http", u"https", u"ftp"]: - for c in denorm_chars: - url = u"{}://netloc{}false.netloc/path".format(scheme, c) - if test_support.verbose: - print "Checking %r" % url - with self.assertRaises(ValueError): - urlparse.urlsplit(url) + for netloc in [u"netloc{}false.netloc", u"n{}user at netloc"]: + for c in denorm_chars: + url = u"{}://{}/path".format(scheme, netloc.format(c)) + if test_support.verbose: + print "Checking %r" % url + with self.assertRaises(ValueError): + urlparse.urlsplit(url) def test_main(): test_support.run_unittest(UrlParseTestCase) diff --git a/Lib/urlparse.py b/Lib/urlparse.py index f08e0fe58432..6834f3c1798b 100644 --- a/Lib/urlparse.py +++ b/Lib/urlparse.py @@ -171,17 +171,17 @@ def _checknetloc(netloc): # looking for characters like \u2100 that expand to 'a/c' # IDNA uses NFKC equivalence, so normalize for this check import unicodedata - n = netloc.rpartition('@')[2] # ignore anything to the left of '@' - n = n.replace(':', '') # ignore characters already included - n = n.replace('#', '') # but not the surrounding text - n = n.replace('?', '') + n = netloc.replace(u'@', u'') # ignore characters already included + n = n.replace(u':', u'') # but not the surrounding text + n = n.replace(u'#', u'') + n = n.replace(u'?', u'') netloc2 = unicodedata.normalize('NFKC', n) if n == netloc2: return for c in '/?#@:': if c in netloc2: - raise ValueError("netloc '" + netloc + "' contains invalid " + - "characters under NFKC normalization") + raise ValueError(u"netloc '" + netloc + u"' contains invalid " + + u"characters under NFKC normalization") def urlsplit(url, scheme='', allow_fragments=True): """Parse a URL into 5 components: From webhook-mailer at python.org Tue Jun 4 13:03:17 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 04 Jun 2019 17:03:17 -0000 Subject: [Python-checkins] bpo-37153: test_venv.test_mutiprocessing() calls pool.terminate() (GH-13816) Message-ID: https://github.com/python/cpython/commit/bc6469f79ca13217b784fb47da7ec83484a3debe commit: bc6469f79ca13217b784fb47da7ec83484a3debe branch: master author: Victor Stinner committer: GitHub date: 2019-06-04T19:03:13+02:00 summary: bpo-37153: test_venv.test_mutiprocessing() calls pool.terminate() (GH-13816) test_venv.test_mutiprocessing() now explicitly calls pool.terminate() to wait until the pool completes. files: A Misc/NEWS.d/next/Tests/2019-06-04-18-30-39.bpo-37153.711INB.rst M Lib/test/test_venv.py diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index 278c68699d8e..24d3a69b1878 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -325,8 +325,10 @@ def test_multiprocessing(self): envpy = os.path.join(os.path.realpath(self.env_dir), self.bindir, self.exe) out, err = check_output([envpy, '-c', - 'from multiprocessing import Pool; ' + - 'print(Pool(1).apply_async("Python".lower).get(3))']) + 'from multiprocessing import Pool; ' + 'pool = Pool(1); ' + 'print(pool.apply_async("Python".lower).get(3)); ' + 'pool.terminate()']) self.assertEqual(out.strip(), "python".encode()) @requireVenvCreate diff --git a/Misc/NEWS.d/next/Tests/2019-06-04-18-30-39.bpo-37153.711INB.rst b/Misc/NEWS.d/next/Tests/2019-06-04-18-30-39.bpo-37153.711INB.rst new file mode 100644 index 000000000000..138a22f6acc2 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-06-04-18-30-39.bpo-37153.711INB.rst @@ -0,0 +1,2 @@ +``test_venv.test_mutiprocessing()`` now explicitly calls +``pool.terminate()`` to wait until the pool completes. From webhook-mailer at python.org Tue Jun 4 13:41:41 2019 From: webhook-mailer at python.org (Barry Warsaw) Date: Tue, 04 Jun 2019 17:41:41 -0000 Subject: [Python-checkins] bpo-35805: Add parser for Message-ID email header. (GH-13397) Message-ID: https://github.com/python/cpython/commit/46d88a113142b26c01c95c93846a89318ba87ffc commit: 46d88a113142b26c01c95c93846a89318ba87ffc branch: master author: Abhilash Raj committer: Barry Warsaw date: 2019-06-04T10:41:34-07:00 summary: bpo-35805: Add parser for Message-ID email header. (GH-13397) * bpo-35805: Add parser for Message-ID header. This parser is based on the definition of Identification Fields from RFC 5322 Sec 3.6.4. This should also prevent folding of Message-ID header using RFC 2047 encoded words and hence fix bpo-35805. * Prevent folding of non-ascii message-id headers. * Add fold method to MsgID token to prevent folding. files: A Misc/NEWS.d/next/Library/2019-05-17-15-11-08.bpo-35805.E4YwYz.rst M Doc/library/email.headerregistry.rst M Lib/email/_header_value_parser.py M Lib/email/headerregistry.py M Lib/test/test_email/test__header_value_parser.py M Lib/test/test_email/test_headerregistry.py diff --git a/Doc/library/email.headerregistry.rst b/Doc/library/email.headerregistry.rst index c3ce90c2d6d9..9376da2b8d39 100644 --- a/Doc/library/email.headerregistry.rst +++ b/Doc/library/email.headerregistry.rst @@ -321,19 +321,26 @@ variant, :attr:`~.BaseHeader.max_count` is set to 1. The default mappings are: - :subject: UniqueUnstructuredHeader - :date: UniqueDateHeader - :resent-date: DateHeader - :orig-date: UniqueDateHeader - :sender: UniqueSingleAddressHeader - :resent-sender: SingleAddressHeader - :to: UniqueAddressHeader - :resent-to: AddressHeader - :cc: UniqueAddressHeader - :resent-cc: AddressHeader - :from: UniqueAddressHeader - :resent-from: AddressHeader - :reply-to: UniqueAddressHeader + :subject: UniqueUnstructuredHeader + :date: UniqueDateHeader + :resent-date: DateHeader + :orig-date: UniqueDateHeader + :sender: UniqueSingleAddressHeader + :resent-sender: SingleAddressHeader + :to: UniqueAddressHeader + :resent-to: AddressHeader + :cc: UniqueAddressHeader + :resent-cc: AddressHeader + :bcc: UniqueAddressHeader + :resent-bcc: AddressHeader + :from: UniqueAddressHeader + :resent-from: AddressHeader + :reply-to: UniqueAddressHeader + :mime-version: MIMEVersionHeader + :content-type: ContentTypeHeader + :content-disposition: ContentDispositionHeader + :content-transfer-encoding: ContentTransferEncodingHeader + :message-id: MessageIDHeader ``HeaderRegistry`` has the following methods: diff --git a/Lib/email/_header_value_parser.py b/Lib/email/_header_value_parser.py index 14cc00c61e07..34969ab59151 100644 --- a/Lib/email/_header_value_parser.py +++ b/Lib/email/_header_value_parser.py @@ -179,37 +179,30 @@ def comments(self): class UnstructuredTokenList(TokenList): - token_type = 'unstructured' class Phrase(TokenList): - token_type = 'phrase' class Word(TokenList): - token_type = 'word' class CFWSList(WhiteSpaceTokenList): - token_type = 'cfws' class Atom(TokenList): - token_type = 'atom' class Token(TokenList): - token_type = 'token' encode_as_ew = False class EncodedWord(TokenList): - token_type = 'encoded-word' cte = None charset = None @@ -496,16 +489,19 @@ def domain(self): class DotAtom(TokenList): - token_type = 'dot-atom' class DotAtomText(TokenList): - token_type = 'dot-atom-text' as_ew_allowed = True +class NoFoldLiteral(TokenList): + token_type = 'no-fold-literal' + as_ew_allowed = False + + class AddrSpec(TokenList): token_type = 'addr-spec' @@ -809,7 +805,6 @@ def params(self): class ContentType(ParameterizedHeaderValue): - token_type = 'content-type' as_ew_allowed = False maintype = 'text' @@ -817,27 +812,35 @@ class ContentType(ParameterizedHeaderValue): class ContentDisposition(ParameterizedHeaderValue): - token_type = 'content-disposition' as_ew_allowed = False content_disposition = None class ContentTransferEncoding(TokenList): - token_type = 'content-transfer-encoding' as_ew_allowed = False cte = '7bit' class HeaderLabel(TokenList): - token_type = 'header-label' as_ew_allowed = False -class Header(TokenList): +class MsgID(TokenList): + token_type = 'msg-id' + as_ew_allowed = False + + def fold(self, policy): + # message-id tokens may not be folded. + return str(self) + policy.linesep + +class MessageID(MsgID): + token_type = 'message-id' + +class Header(TokenList): token_type = 'header' @@ -1583,7 +1586,7 @@ def get_addr_spec(value): addr_spec.append(token) if not value or value[0] != '@': addr_spec.defects.append(errors.InvalidHeaderDefect( - "add-spec local part with no domain")) + "addr-spec local part with no domain")) return addr_spec, value addr_spec.append(ValueTerminal('@', 'address-at-symbol')) token, value = get_domain(value[1:]) @@ -1968,6 +1971,110 @@ def get_address_list(value): value = value[1:] return address_list, value + +def get_no_fold_literal(value): + """ no-fold-literal = "[" *dtext "]" + """ + no_fold_literal = NoFoldLiteral() + if not value: + raise errors.HeaderParseError( + "expected no-fold-literal but found '{}'".format(value)) + if value[0] != '[': + raise errors.HeaderParseError( + "expected '[' at the start of no-fold-literal " + "but found '{}'".format(value)) + no_fold_literal.append(ValueTerminal('[', 'no-fold-literal-start')) + value = value[1:] + token, value = get_dtext(value) + no_fold_literal.append(token) + if not value or value[0] != ']': + raise errors.HeaderParseError( + "expected ']' at the end of no-fold-literal " + "but found '{}'".format(value)) + no_fold_literal.append(ValueTerminal(']', 'no-fold-literal-end')) + return no_fold_literal, value[1:] + +def get_msg_id(value): + """msg-id = [CFWS] "<" id-left '@' id-right ">" [CFWS] + id-left = dot-atom-text / obs-id-left + id-right = dot-atom-text / no-fold-literal / obs-id-right + no-fold-literal = "[" *dtext "]" + """ + msg_id = MsgID() + if value[0] in CFWS_LEADER: + token, value = get_cfws(value) + msg_id.append(token) + if not value or value[0] != '<': + raise errors.HeaderParseError( + "expected msg-id but found '{}'".format(value)) + msg_id.append(ValueTerminal('<', 'msg-id-start')) + value = value[1:] + # Parse id-left. + try: + token, value = get_dot_atom_text(value) + except errors.HeaderParseError: + try: + # obs-id-left is same as local-part of add-spec. + token, value = get_obs_local_part(value) + msg_id.defects.append(errors.ObsoleteHeaderDefect( + "obsolete id-left in msg-id")) + except errors.HeaderParseError: + raise errors.HeaderParseError( + "expected dot-atom-text or obs-id-left" + " but found '{}'".format(value)) + msg_id.append(token) + if not value or value[0] != '@': + msg_id.defects.append(errors.InvalidHeaderDefect( + "msg-id with no id-right")) + # Even though there is no id-right, if the local part + # ends with `>` let's just parse it too and return + # along with the defect. + if value and value[0] == '>': + msg_id.append(ValueTerminal('>', 'msg-id-end')) + value = value[1:] + return msg_id, value + msg_id.append(ValueTerminal('@', 'address-at-symbol')) + value = value[1:] + # Parse id-right. + try: + token, value = get_dot_atom_text(value) + except errors.HeaderParseError: + try: + token, value = get_no_fold_literal(value) + except errors.HeaderParseError as e: + try: + token, value = get_domain(value) + msg_id.defects.append(errors.ObsoleteHeaderDefect( + "obsolete id-right in msg-id")) + except errors.HeaderParseError: + raise errors.HeaderParseError( + "expected dot-atom-text, no-fold-literal or obs-id-right" + " but found '{}'".format(value)) + msg_id.append(token) + if value and value[0] == '>': + value = value[1:] + else: + msg_id.defects.append(errors.InvalidHeaderDefect( + "missing trailing '>' on msg-id")) + msg_id.append(ValueTerminal('>', 'msg-id-end')) + if value and value[0] in CFWS_LEADER: + token, value = get_cfws(value) + msg_id.append(token) + return msg_id, value + + +def parse_message_id(value): + """message-id = "Message-ID:" msg-id CRLF + """ + message_id = MessageID() + try: + token, value = get_msg_id(value) + except errors.HeaderParseError: + message_id.defects.append(errors.InvalidHeaderDefect( + "Expected msg-id but found {!r}".format(value))) + message_id.append(token) + return message_id + # # XXX: As I begin to add additional header parsers, I'm realizing we probably # have two level of parser routines: the get_XXX methods that get a token in diff --git a/Lib/email/headerregistry.py b/Lib/email/headerregistry.py index 00652049f2fa..452c6ad50846 100644 --- a/Lib/email/headerregistry.py +++ b/Lib/email/headerregistry.py @@ -520,6 +520,18 @@ def cte(self): return self._cte +class MessageIDHeader: + + max_count = 1 + value_parser = staticmethod(parser.parse_message_id) + + @classmethod + def parse(cls, value, kwds): + kwds['parse_tree'] = parse_tree = cls.value_parser(value) + kwds['decoded'] = str(parse_tree) + kwds['defects'].extend(parse_tree.all_defects) + + # The header factory # _default_header_map = { @@ -542,6 +554,7 @@ def cte(self): 'content-type': ContentTypeHeader, 'content-disposition': ContentDispositionHeader, 'content-transfer-encoding': ContentTransferEncodingHeader, + 'message-id': MessageIDHeader, } class HeaderRegistry: diff --git a/Lib/test/test_email/test__header_value_parser.py b/Lib/test/test_email/test__header_value_parser.py index 676732bb3d02..12da3cffb84c 100644 --- a/Lib/test/test_email/test__header_value_parser.py +++ b/Lib/test/test_email/test__header_value_parser.py @@ -2494,6 +2494,78 @@ def test_invalid_content_transfer_encoding(self): ";foo", ";foo", ";foo", [errors.InvalidHeaderDefect]*3 ) + # get_msg_id + + def test_get_msg_id_valid(self): + msg_id = self._test_get_x( + parser.get_msg_id, + "", + "", + "", + [], + '', + ) + self.assertEqual(msg_id.token_type, 'msg-id') + + def test_get_msg_id_obsolete_local(self): + msg_id = self._test_get_x( + parser.get_msg_id, + '<"simeple.local"@example.com>', + '<"simeple.local"@example.com>', + '', + [errors.ObsoleteHeaderDefect], + '', + ) + self.assertEqual(msg_id.token_type, 'msg-id') + + def test_get_msg_id_non_folding_literal_domain(self): + msg_id = self._test_get_x( + parser.get_msg_id, + "", + "", + "", + [], + "", + ) + self.assertEqual(msg_id.token_type, 'msg-id') + + + def test_get_msg_id_obsolete_domain_part(self): + msg_id = self._test_get_x( + parser.get_msg_id, + "", + "", + "", + [errors.ObsoleteHeaderDefect], + "" + ) + + def test_get_msg_id_no_id_right_part(self): + msg_id = self._test_get_x( + parser.get_msg_id, + "", + "", + "", + [errors.InvalidHeaderDefect], + "" + ) + self.assertEqual(msg_id.token_type, 'msg-id') + + def test_get_msg_id_no_angle_start(self): + with self.assertRaises(errors.HeaderParseError): + parser.get_msg_id("msgwithnoankle") + + def test_get_msg_id_no_angle_end(self): + msg_id = self._test_get_x( + parser.get_msg_id, + "", + "", + [errors.InvalidHeaderDefect], + "" + ) + self.assertEqual(msg_id.token_type, 'msg-id') + @parameterize class Test_parse_mime_parameters(TestParserMixin, TestEmailBase): diff --git a/Lib/test/test_email/test_headerregistry.py b/Lib/test/test_email/test_headerregistry.py index d1007099f666..75505460aba8 100644 --- a/Lib/test/test_email/test_headerregistry.py +++ b/Lib/test/test_email/test_headerregistry.py @@ -1648,6 +1648,34 @@ def test_fold_overlong_words_using_RFC2047(self): 'xxxxxxxxxxxxxxxxxxxx=3D=3D-xxx-xx-xx?=\n' ' =?utf-8?q?=3E?=\n') + def test_message_id_header_is_not_folded(self): + h = self.make_header( + 'Message-ID', + '') + self.assertEqual( + h.fold(policy=policy.default.clone(max_line_length=20)), + 'Message-ID: \n') + + # Test message-id isn't folded when id-right is no-fold-literal. + h = self.make_header( + 'Message-ID', + '') + self.assertEqual( + h.fold(policy=policy.default.clone(max_line_length=20)), + 'Message-ID: \n') + + # Test message-id isn't folded when id-right is non-ascii characters. + h = self.make_header('Message-ID', '') + self.assertEqual( + h.fold(policy=policy.default.clone(max_line_length=30)), + 'Message-ID: \n') + + # Test message-id is folded without breaking the msg-id token into + # encoded words, *even* if they don't fit into max_line_length. + h = self.make_header('Message-ID', '') + self.assertEqual( + h.fold(policy=policy.default.clone(max_line_length=20)), + 'Message-ID:\n \n') if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS.d/next/Library/2019-05-17-15-11-08.bpo-35805.E4YwYz.rst b/Misc/NEWS.d/next/Library/2019-05-17-15-11-08.bpo-35805.E4YwYz.rst new file mode 100644 index 000000000000..2d8c8b3222d0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-17-15-11-08.bpo-35805.E4YwYz.rst @@ -0,0 +1,2 @@ +Add parser for Message-ID header and add it to default HeaderRegistry. This +should prevent folding of Message-ID using RFC 2048 encoded words. From webhook-mailer at python.org Tue Jun 4 14:01:05 2019 From: webhook-mailer at python.org (Barry Warsaw) Date: Tue, 04 Jun 2019 18:01:05 -0000 Subject: [Python-checkins] bpo-30835: email: Fix AttributeError when parsing invalid CTE (GH-13598) Message-ID: https://github.com/python/cpython/commit/aa79707262f893428665ef45b5e879129abca4aa commit: aa79707262f893428665ef45b5e879129abca4aa branch: master author: Abhilash Raj committer: Barry Warsaw date: 2019-06-04T11:00:47-07:00 summary: bpo-30835: email: Fix AttributeError when parsing invalid CTE (GH-13598) * bpo-30835: email: Fix AttributeError when parsing invalid Content-Transfer-Encoding Parsing an email containing a multipart Content-Type, along with a Content-Transfer-Encoding containing an invalid (non-ASCII-decodable) byte will fail. email.feedparser.FeedParser._parsegen() gets the header and attempts to convert it to lowercase before comparing it with the accepted encodings, but as the header contains an invalid byte, it's returned as a Header object rather than a str. Cast the Content-Transfer-Encoding header to a str to avoid this. Found using the AFL fuzzer. Reported-by: Daniel Axtens Signed-off-by: Andrew Donnellan * Add email and NEWS entry for the bugfix. files: A Misc/NEWS.d/next/Library/2019-05-27-15-29-46.bpo-30835.3FoaWH.rst M Lib/email/feedparser.py M Lib/test/test_email/test_email.py diff --git a/Lib/email/feedparser.py b/Lib/email/feedparser.py index 7c07ca86457a..97d3f5144d60 100644 --- a/Lib/email/feedparser.py +++ b/Lib/email/feedparser.py @@ -320,7 +320,7 @@ def _parsegen(self): self._cur.set_payload(EMPTYSTRING.join(lines)) return # Make sure a valid content type was specified per RFC 2045:6.4. - if (self._cur.get('content-transfer-encoding', '8bit').lower() + if (str(self._cur.get('content-transfer-encoding', '8bit')).lower() not in ('7bit', '8bit', 'binary')): defect = errors.InvalidMultipartContentTransferEncodingDefect() self.policy.handle_defect(self._cur, defect) diff --git a/Lib/test/test_email/test_email.py b/Lib/test/test_email/test_email.py index dfb3be84384a..c29cc56203b1 100644 --- a/Lib/test/test_email/test_email.py +++ b/Lib/test/test_email/test_email.py @@ -1466,6 +1466,15 @@ def test_mangled_from_with_bad_bytes(self): g.flatten(msg) self.assertEqual(b.getvalue(), source + b'>From R\xc3\xb6lli\n') + def test_mutltipart_with_bad_bytes_in_cte(self): + # bpo30835 + source = textwrap.dedent("""\ + From: aperson at example.com + Content-Type: multipart/mixed; boundary="1" + Content-Transfer-Encoding: \xc8 + """).encode('utf-8') + msg = email.message_from_bytes(source) + # Test the basic MIMEAudio class class TestMIMEAudio(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Library/2019-05-27-15-29-46.bpo-30835.3FoaWH.rst b/Misc/NEWS.d/next/Library/2019-05-27-15-29-46.bpo-30835.3FoaWH.rst new file mode 100644 index 000000000000..019321d6f1d7 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-27-15-29-46.bpo-30835.3FoaWH.rst @@ -0,0 +1,3 @@ +Fixed a bug in email parsing where a message with invalid bytes in +content-transfer-encoding of a multipart message can cause an AttributeError. +Patch by Andrew Donnellan. From webhook-mailer at python.org Tue Jun 4 14:44:01 2019 From: webhook-mailer at python.org (Ned Deily) Date: Tue, 04 Jun 2019 18:44:01 -0000 Subject: [Python-checkins] bpo-36742: Corrects fix to handle decomposition in usernames (GH-13812) (GH-13814) Message-ID: https://github.com/python/cpython/commit/fd1771dbdd28709716bd531580c40ae5ed814468 commit: fd1771dbdd28709716bd531580c40ae5ed814468 branch: 3.6 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Ned Deily date: 2019-06-04T14:43:52-04:00 summary: bpo-36742: Corrects fix to handle decomposition in usernames (GH-13812) (GH-13814) (cherry picked from commit 8d0ef0b5edeae52960c7ed05ae8a12388324f87e) Co-authored-by: Steve Dower files: M Lib/test/test_urlparse.py M Lib/urllib/parse.py diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py index c26235449461..68f633ca3a7d 100644 --- a/Lib/test/test_urlparse.py +++ b/Lib/test/test_urlparse.py @@ -1008,11 +1008,12 @@ def test_urlsplit_normalization(self): urllib.parse.urlsplit('http://\u30d5\u309a\ufe1380') for scheme in ["http", "https", "ftp"]: - for c in denorm_chars: - url = "{}://netloc{}false.netloc/path".format(scheme, c) - with self.subTest(url=url, char='{:04X}'.format(ord(c))): - with self.assertRaises(ValueError): - urllib.parse.urlsplit(url) + for netloc in ["netloc{}false.netloc", "n{}user at netloc"]: + for c in denorm_chars: + url = "{}://{}/path".format(scheme, netloc.format(c)) + with self.subTest(url=url, char='{:04X}'.format(ord(c))): + with self.assertRaises(ValueError): + urllib.parse.urlsplit(url) class Utility_Tests(unittest.TestCase): """Testcase to test the various utility functions in the urllib.""" diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py index 791b457bfb8a..fa8827a9fa79 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -397,9 +397,9 @@ def _checknetloc(netloc): # looking for characters like \u2100 that expand to 'a/c' # IDNA uses NFKC equivalence, so normalize for this check import unicodedata - n = netloc.rpartition('@')[2] # ignore anything to the left of '@' - n = n.replace(':', '') # ignore characters already included - n = n.replace('#', '') # but not the surrounding text + n = netloc.replace('@', '') # ignore characters already included + n = n.replace(':', '') # but not the surrounding text + n = n.replace('#', '') n = n.replace('?', '') netloc2 = unicodedata.normalize('NFKC', n) if n == netloc2: From webhook-mailer at python.org Tue Jun 4 15:07:08 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 04 Jun 2019 19:07:08 -0000 Subject: [Python-checkins] bpo-37153: test_venv.test_mutiprocessing() calls pool.terminate() (GH-13816) (GH-13819) Message-ID: https://github.com/python/cpython/commit/5f8443eec9d54e1f74b69aa547e6810da6afa90b commit: 5f8443eec9d54e1f74b69aa547e6810da6afa90b branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Victor Stinner date: 2019-06-04T21:07:03+02:00 summary: bpo-37153: test_venv.test_mutiprocessing() calls pool.terminate() (GH-13816) (GH-13819) test_venv.test_mutiprocessing() now explicitly calls pool.terminate() to wait until the pool completes. (cherry picked from commit bc6469f79ca13217b784fb47da7ec83484a3debe) Co-authored-by: Victor Stinner files: A Misc/NEWS.d/next/Tests/2019-06-04-18-30-39.bpo-37153.711INB.rst M Lib/test/test_venv.py diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index 19a5aab7a210..a8dc59cb81c3 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -312,8 +312,10 @@ def test_multiprocessing(self): envpy = os.path.join(os.path.realpath(self.env_dir), self.bindir, self.exe) out, err = check_output([envpy, '-c', - 'from multiprocessing import Pool; ' + - 'print(Pool(1).apply_async("Python".lower).get(3))']) + 'from multiprocessing import Pool; ' + 'pool = Pool(1); ' + 'print(pool.apply_async("Python".lower).get(3)); ' + 'pool.terminate()']) self.assertEqual(out.strip(), "python".encode()) @requireVenvCreate diff --git a/Misc/NEWS.d/next/Tests/2019-06-04-18-30-39.bpo-37153.711INB.rst b/Misc/NEWS.d/next/Tests/2019-06-04-18-30-39.bpo-37153.711INB.rst new file mode 100644 index 000000000000..138a22f6acc2 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-06-04-18-30-39.bpo-37153.711INB.rst @@ -0,0 +1,2 @@ +``test_venv.test_mutiprocessing()`` now explicitly calls +``pool.terminate()`` to wait until the pool completes. From webhook-mailer at python.org Tue Jun 4 15:35:09 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 04 Jun 2019 19:35:09 -0000 Subject: [Python-checkins] bpo-35047: Update whatsnew/3.8 for better mock error message (GH-13746) Message-ID: https://github.com/python/cpython/commit/001d63cefaa9d84d6d59aa9db8bac66040c8f0ee commit: 001d63cefaa9d84d6d59aa9db8bac66040c8f0ee branch: master author: Petter Strandmark committer: Victor Stinner date: 2019-06-04T21:34:48+02:00 summary: bpo-35047: Update whatsnew/3.8 for better mock error message (GH-13746) files: M Doc/whatsnew/3.8.rst diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index f060f4b3f7c4..8456a17aedcc 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -760,6 +760,9 @@ unittest :meth:`~unittest.TestCase.setUpClass()`. (Contributed by Lisa Roach in :issue:`24412`.) +* Several mock assert functions now also print a list of actual calls upon + failure. (Contributed by Petter Strandmark in :issue:`35047`.) + venv ---- From webhook-mailer at python.org Tue Jun 4 15:54:04 2019 From: webhook-mailer at python.org (=?utf-8?q?=C5=81ukasz?= Langa) Date: Tue, 04 Jun 2019 19:54:04 -0000 Subject: [Python-checkins] Python 3.8.0b1 Message-ID: https://github.com/python/cpython/commit/3b5deb0116abf2c94690d48af41b109bc8a4d559 commit: 3b5deb0116abf2c94690d48af41b109bc8a4d559 branch: master author: ?ukasz Langa committer: ?ukasz Langa date: 2019-06-04T19:44:34+02:00 summary: Python 3.8.0b1 files: A Misc/NEWS.d/3.8.0b1.rst D Misc/NEWS.d/next/Build/2019-05-03-21-08-06.bpo-36786.gOLFbD.rst D Misc/NEWS.d/next/Build/2019-05-22-16-19-18.bpo-36721.9aRwfZ.rst D Misc/NEWS.d/next/C API/2019-05-11-03-56-23.bpo-36728.FR-dMP.rst D Misc/NEWS.d/next/C API/2019-05-15-10-46-55.bpo-36922.J3EFK_.rst D Misc/NEWS.d/next/C API/2019-05-17-19-23-24.bpo-36763.TswmDy.rst D Misc/NEWS.d/next/C API/2019-05-22-15-24-08.bpo-36974.TkySRe.rst D Misc/NEWS.d/next/C API/2019-05-22-17-33-52.bpo-37107.8BVPR-.rst D Misc/NEWS.d/next/C API/2019-05-24-07-11-08.bpo-36379.8zgoKe.rst D Misc/NEWS.d/next/C API/2019-05-27-12-25-25.bpo-36763.bHCA9j.rst D Misc/NEWS.d/next/Core and Builtins/2017-10-24-17-26-58.bpo-31862.5Gea8L.rst D Misc/NEWS.d/next/Core and Builtins/2017-12-21-20-37-40.bpo-32388.6w-i5t.rst D Misc/NEWS.d/next/Core and Builtins/2018-05-30-23-43-03.bpo-26826.NkRzjb.rst D Misc/NEWS.d/next/Core and Builtins/2018-07-04-16-57-59.bpo-20602.sDLElw.rst D Misc/NEWS.d/next/Core and Builtins/2019-02-13-16-47-19.bpo-35983.bNxsXv.rst D Misc/NEWS.d/next/Core and Builtins/2019-02-22-14-30-19.bpo-36035.-6dy1y.rst D Misc/NEWS.d/next/Core and Builtins/2019-02-22-23-03-20.bpo-36084.86Eh4X.rst D Misc/NEWS.d/next/Core and Builtins/2019-02-24-12-44-46.bpo-36045.RO20OV.rst D Misc/NEWS.d/next/Core and Builtins/2019-04-10-18-12-11.bpo-36594.fbnJAc.rst D Misc/NEWS.d/next/Core and Builtins/2019-04-13-16-14-16.bpo-36601.mIgS7t.rst D Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst D Misc/NEWS.d/next/Core and Builtins/2019-04-29-03-27-22.bpo-24048.vXxUDQ.rst D Misc/NEWS.d/next/Core and Builtins/2019-05-02-11-48-08.bpo-36774.ZqbJ1J.rst D Misc/NEWS.d/next/Core and Builtins/2019-05-04-16-15-33.bpo-36793.Izog4Z.rst D Misc/NEWS.d/next/Core and Builtins/2019-05-07-12-18-11.bpo-36737.XAo6LY.rst D Misc/NEWS.d/next/Core and Builtins/2019-05-07-15-49-17.bpo-27639.b1Ah87.rst D Misc/NEWS.d/next/Core and Builtins/2019-05-07-16-50-12.bpo-36842.NYww_N.rst D Misc/NEWS.d/next/Core and Builtins/2019-05-07-17-12-37.bpo-34616.0Y0_9r.rst D Misc/NEWS.d/next/Core and Builtins/2019-05-08-11-42-06.bpo-36851.J7DiCW.rst D Misc/NEWS.d/next/Core and Builtins/2019-05-08-16-36-51.bpo-28866.qCv_bj.rst D Misc/NEWS.d/next/Core and Builtins/2019-05-08-20-42-40.bpo-36861.72mvZM.rst D Misc/NEWS.d/next/Core and Builtins/2019-05-12-18-46-50.bpo-36027.Q4YatQ.rst D Misc/NEWS.d/next/Core and Builtins/2019-05-15-01-29-29.bpo-1875.9oxXFX.rst D Misc/NEWS.d/next/Core and Builtins/2019-05-15-14-01-09.bpo-36826.GLrO3W.rst D Misc/NEWS.d/next/Core and Builtins/2019-05-16-23-53-45.bpo-36946.qjxr0Y.rst D Misc/NEWS.d/next/Core and Builtins/2019-05-17-12-28-24.bpo-36907.rk7kgp.rst D Misc/NEWS.d/next/Core and Builtins/2019-05-17-18-34-30.bpo-2180.aBqHeW.rst D Misc/NEWS.d/next/Core and Builtins/2019-05-21-16-21-22.bpo-36878.EFRHZ3.rst D Misc/NEWS.d/next/Core and Builtins/2019-05-22-11-16-16.bpo-36878.QwLa3P.rst D Misc/NEWS.d/next/Core and Builtins/2019-05-22-23-01-29.bpo-36829.MfOcUg.rst D Misc/NEWS.d/next/Core and Builtins/2019-05-23-04-19-13.bpo-37007.d1SOtF.rst D Misc/NEWS.d/next/Core and Builtins/2019-05-24-12-38-40.bpo-37032.T8rSH8.rst D Misc/NEWS.d/next/Core and Builtins/2019-05-25-08-18-01.bpo-26836.rplYWW.rst D Misc/NEWS.d/next/Core and Builtins/2019-05-25-17-18-26.bpo-22385.VeVvhJ.rst D Misc/NEWS.d/next/Core and Builtins/2019-05-27-14-46-24.bpo-37050.7MyZGg.rst D Misc/NEWS.d/next/Core and Builtins/2019-05-27-18-00-19.bpo-26423.RgUOE8.rst D Misc/NEWS.d/next/Core and Builtins/2019-05-28-17-02-46.bpo-37029.MxpgfJ.rst D Misc/NEWS.d/next/Core and Builtins/2019-05-28-18-18-55.bpo-37072.1Hewl3.rst D Misc/NEWS.d/next/Core and Builtins/2019-05-29-22-03-09.bpo-26219.Ovf1Qs.rst D Misc/NEWS.d/next/Core and Builtins/2019-05-30-17-33-55.bpo-37087.vElenE.rst D Misc/NEWS.d/next/Core and Builtins/2019-05-31-11-55-49.bpo-20092.KIMjBW.rst D Misc/NEWS.d/next/Core and Builtins/2019-06-01-16-53-41.bpo-37122.dZ3-NY.rst D Misc/NEWS.d/next/Core and Builtins/2019-06-01-20-03-13.bpo-37126.tP6lL4.rst D Misc/NEWS.d/next/Core and Builtins/2019-06-03-00-51-02.bpo-35814.Cf7sGY.rst D Misc/NEWS.d/next/Documentation/2017-12-08-20-30-37.bpo-20285.cfnp0J.rst D Misc/NEWS.d/next/Documentation/2018-04-08-19-09-22.bpo-25735.idVQBD.rst D Misc/NEWS.d/next/Documentation/2018-05-13-10-36-37.bpo-33482.jalAaQ.rst D Misc/NEWS.d/next/Documentation/2018-05-17-21-02-00.bpo-33519.Q7s2FB.rst D Misc/NEWS.d/next/Documentation/2018-10-07-03-04-57.bpo-32995.TXN9ur.rst D Misc/NEWS.d/next/Documentation/2019-01-09-17-56-35.bpo-35397.ZMreIz.rst D Misc/NEWS.d/next/Documentation/2019-02-21-18-13-50.bpo-22865.6hg6J8.rst D Misc/NEWS.d/next/Documentation/2019-05-05-07-58-50.bpo-36797.W1X4On.rst D Misc/NEWS.d/next/Documentation/2019-05-07-02-30-51.bpo-36783.gpC8E2.rst D Misc/NEWS.d/next/Documentation/2019-05-08-13-17-44.bpo-35924.lqbNpW.rst D Misc/NEWS.d/next/Documentation/2019-05-11-17-42-15.bpo-36868.yioL0R.rst D Misc/NEWS.d/next/Documentation/2019-05-20-22-21-17.bpo-36984.IjZlmS.rst D Misc/NEWS.d/next/Documentation/2019-05-27-17-28-58.bpo-36686.Zot4sx.rst D Misc/NEWS.d/next/Documentation/2019-05-31-10-46-36.bpo-36896.wkXTW9.rst D Misc/NEWS.d/next/IDLE/2017-12-25-18-48-50.bpo-32411.vNwDhe.rst D Misc/NEWS.d/next/IDLE/2019-05-05-16-27-53.bpo-13102.AGNWYJ.rst D Misc/NEWS.d/next/IDLE/2019-05-19-22-02-22.bpo-36958.DZUC6G.rst D Misc/NEWS.d/next/IDLE/2019-05-24-18-57-57.bpo-37038.AJ3RwQ.rst D Misc/NEWS.d/next/IDLE/2019-06-02-14-10-52.bpo-35610.0w_v6Y.rst D Misc/NEWS.d/next/Library/2016-07-27-11-06-43.bpo-23395.MuCEX9.rst D Misc/NEWS.d/next/Library/2017-10-21-12-07-56.bpo-31829.6IhP-O.rst D Misc/NEWS.d/next/Library/2017-10-24-00-42-14.bpo-27141.zbAgSs.rst D Misc/NEWS.d/next/Library/2017-12-13-17-49-56.bpo-32299.eqAPWs.rst D Misc/NEWS.d/next/Library/2018-01-07-21-04-50.bpo-32515.D8_Wcb.rst D Misc/NEWS.d/next/Library/2018-03-08-16-15-00.bpo-22102.th33uD.rst D Misc/NEWS.d/next/Library/2018-03-20-20-57-00.bpo-32941.9FU0gL.rst D Misc/NEWS.d/next/Library/2018-03-22-19-13-19.bpo-33123._Y5ooE.rst D Misc/NEWS.d/next/Library/2018-03-27-13-28-16.bpo-31961.GjLoYu.rst D Misc/NEWS.d/next/Library/2018-04-04-14-54-30.bpo-24882.urybpa.rst D Misc/NEWS.d/next/Library/2018-05-30-01-05-50.bpo-31922.fobsXJ.rst D Misc/NEWS.d/next/Library/2018-06-10-17-48-07.bpo-22454.qeiy_X.rst D Misc/NEWS.d/next/Library/2018-07-13-20-17-17.bpo-33361.dx2NVn.rst D Misc/NEWS.d/next/Library/2018-08-03-09-47-20.bpo-34303.tOE2HP.rst D Misc/NEWS.d/next/Library/2018-08-18-14-47-00.bpo-34424.wAlRuS.rst D Misc/NEWS.d/next/Library/2018-08-28-03-00-12.bpo-33569.45YlGG.rst D Misc/NEWS.d/next/Library/2018-09-13-20-33-24.bpo-26467.cahAk3.rst D Misc/NEWS.d/next/Library/2018-10-21-17-39-32.bpo-34271.P15VLM.rst D Misc/NEWS.d/next/Library/2018-11-04-16-39-46.bpo-26660.RdXz8a.rst D Misc/NEWS.d/next/Library/2019-01-02-19-48-23.bpo-35431.FhG6QA.rst D Misc/NEWS.d/next/Library/2019-01-11-17-09-15.bpo-31855.PlhfsX.rst D Misc/NEWS.d/next/Library/2019-01-18-16-23-00.bpo-35721.d8djAJ.rst D Misc/NEWS.d/next/Library/2019-02-15-17-18-50.bpo-35125.h0xk0f.rst D Misc/NEWS.d/next/Library/2019-03-01-17-59-39.bpo-31904.38djdk.rst D Misc/NEWS.d/next/Library/2019-03-04-01-28-33.bpo-26707.QY4kRZ.rst D Misc/NEWS.d/next/Library/2019-03-09-23-51-27.bpo-36239.BHJ3Ln.rst D Misc/NEWS.d/next/Library/2019-03-13-10-57-41.bpo-27497.JDmIe_.rst D Misc/NEWS.d/next/Library/2019-03-18-14-25-36.bpo-31904.ds3d67.rst D Misc/NEWS.d/next/Library/2019-03-21-16-00-00.bpo-36368.zsRT1.rst D Misc/NEWS.d/next/Library/2019-03-22-22-40-00.bpo-35900.oiee0o.rst D Misc/NEWS.d/next/Library/2019-03-27-15-09-00.bpo-35900.fh56UU.rst D Misc/NEWS.d/next/Library/2019-04-02-19-23-12.bpo-35252.VooTVv.rst D Misc/NEWS.d/next/Library/2019-04-06-00-55-09.bpo-36533.kzMyRH.rst D Misc/NEWS.d/next/Library/2019-04-06-12-36-09.bpo-36542.Q0qyYV.rst D Misc/NEWS.d/next/Library/2019-04-07-14-30-10.bpo-36548.CJQiYw.rst D Misc/NEWS.d/next/Library/2019-04-22-22-55-29.bpo-29183.MILvsk.rst D Misc/NEWS.d/next/Library/2019-04-26-22-13-26.bpo-22640.p3rheW.rst D Misc/NEWS.d/next/Library/2019-04-27-02-54-23.bpo-8138.osBRGI.rst D Misc/NEWS.d/next/Library/2019-04-29-15-18-13.bpo-36748.YBKWps.rst D Misc/NEWS.d/next/Library/2019-04-30-04-34-53.bpo-6584.Hzp9-P.rst D Misc/NEWS.d/next/Library/2019-05-01-20-41-53.bpo-36772.fV2K0F.rst D Misc/NEWS.d/next/Library/2019-05-03-20-47-55.bpo-36785.PQLnPq.rst D Misc/NEWS.d/next/Library/2019-05-05-09-45-44.bpo-36801.XrlFFs.rst D Misc/NEWS.d/next/Library/2019-05-05-10-12-23.bpo-36802.HYMc8P.rst D Misc/NEWS.d/next/Library/2019-05-05-16-14-38.bpo-36806.rAzF-x.rst D Misc/NEWS.d/next/Library/2019-05-06-18-28-38.bpo-36813.NXD0KZ.rst D Misc/NEWS.d/next/Library/2019-05-06-19-17-04.bpo-26903.4payXb.rst D Misc/NEWS.d/next/Library/2019-05-06-22-34-47.bpo-33110.rSJSCh.rst D Misc/NEWS.d/next/Library/2019-05-06-23-13-26.bpo-36814.dSeMz_.rst D Misc/NEWS.d/next/Library/2019-05-07-15-00-45.bpo-36832.TExgqb.rst D Misc/NEWS.d/next/Library/2019-05-08-12-51-37.bpo-36829.8enFMA.rst D Misc/NEWS.d/next/Library/2019-05-09-08-35-18.bpo-24538.WK8Y-k.rst D Misc/NEWS.d/next/Library/2019-05-09-12-38-40.bpo-30262.Tu74ak.rst D Misc/NEWS.d/next/Library/2019-05-09-18-12-55.bpo-36867.FuwVTi.rst D Misc/NEWS.d/next/Library/2019-05-10-01-06-36.bpo-36778.GRqeiS.rst D Misc/NEWS.d/next/Library/2019-05-10-22-00-06.bpo-36878.iigeqk.rst D Misc/NEWS.d/next/Library/2019-05-11-02-30-45.bpo-34632.8MXa7T.rst D Misc/NEWS.d/next/Library/2019-05-11-14-50-59.bpo-36887.XD3f22.rst D Misc/NEWS.d/next/Library/2019-05-11-16-21-29.bpo-35545.FcvJvP.rst D Misc/NEWS.d/next/Library/2019-05-12-14-49-13.bpo-36895.ZZuuY7.rst D Misc/NEWS.d/next/Library/2019-05-13-05-49-15.bpo-23896.8TtUKo.rst D Misc/NEWS.d/next/Library/2019-05-13-13-02-43.bpo-36867.Qh-6mX.rst D Misc/NEWS.d/next/Library/2019-05-14-05-38-22.bpo-23378.R25teI.rst D Misc/NEWS.d/next/Library/2019-05-14-07-57-02.bpo-36845._GtFFf.rst D Misc/NEWS.d/next/Library/2019-05-14-12-25-44.bpo-36889.MChPqP.rst D Misc/NEWS.d/next/Library/2019-05-14-15-39-34.bpo-36916._GPsTt.rst D Misc/NEWS.d/next/Library/2019-05-14-21-39-52.bpo-25652.xLw42k.rst D Misc/NEWS.d/next/Library/2019-05-15-21-35-23.bpo-36921.kA1306.rst D Misc/NEWS.d/next/Library/2019-05-16-18-02-08.bpo-36888.-H2Dkm.rst D Misc/NEWS.d/next/Library/2019-05-16-23-40-36.bpo-24564.lIwV_7.rst D Misc/NEWS.d/next/Library/2019-05-17-11-44-21.bpo-33524.8y_xUU.rst D Misc/NEWS.d/next/Library/2019-05-17-21-42-58.bpo-36948.vnUDvk.rst D Misc/NEWS.d/next/Library/2019-05-19-06-54-26.bpo-36949.jBlG9F.rst D Misc/NEWS.d/next/Library/2019-05-20-08-54-41.bpo-36952.I_glok.rst D Misc/NEWS.d/next/Library/2019-05-20-11-01-28.bpo-36952.MgZi7-.rst D Misc/NEWS.d/next/Library/2019-05-20-14-47-55.bpo-32972.LoeUNh.rst D Misc/NEWS.d/next/Library/2019-05-20-17-08-26.bpo-36972.3l3SGc.rst D Misc/NEWS.d/next/Library/2019-05-20-20-41-30.bpo-36983.hz-fLr.rst D Misc/NEWS.d/next/Library/2019-05-20-23-31-20.bpo-36969.JkZORP.rst D Misc/NEWS.d/next/Library/2019-05-21-12-31-21.bpo-36969.u7cxu7.rst D Misc/NEWS.d/next/Library/2019-05-22-02-25-31.bpo-27737.7bgKpa.rst D Misc/NEWS.d/next/Library/2019-05-22-15-26-08.bpo-37008.WPbv31.rst D Misc/NEWS.d/next/Library/2019-05-22-22-55-18.bpo-36996.XQx08d.rst D Misc/NEWS.d/next/Library/2019-05-23-01-48-39.bpo-1230540.oKTNEQ.rst D Misc/NEWS.d/next/Library/2019-05-23-17-37-22.bpo-32528.sGnkcl.rst D Misc/NEWS.d/next/Library/2019-05-23-18-46-56.bpo-37027.iH4eut.rst D Misc/NEWS.d/next/Library/2019-05-23-18-57-34.bpo-37028.Vse6Pj.rst D Misc/NEWS.d/next/Library/2019-05-23-21-10-57.bpo-37001.DoLvTK.rst D Misc/NEWS.d/next/Library/2019-05-24-18-16-07.bpo-37035.HFbJVT.rst D Misc/NEWS.d/next/Library/2019-05-25-18-36-50.bpo-37045.suHdVJ.rst D Misc/NEWS.d/next/Library/2019-05-25-19-12-53.bpo-37046.iuhQQj.rst D Misc/NEWS.d/next/Library/2019-05-25-19-48-42.bpo-37049.an2LXJ.rst D Misc/NEWS.d/next/Library/2019-05-26-01-20-06.bpo-37047.K9epi8.rst D Misc/NEWS.d/next/Library/2019-05-26-10-16-55.bpo-36933.4w3eP9.rst D Misc/NEWS.d/next/Library/2019-05-26-19-05-24.bpo-37058.jmRu_g.rst D Misc/NEWS.d/next/Library/2019-05-28-01-06-44.bpo-37054.sLULGQ.rst D Misc/NEWS.d/next/Library/2019-05-28-01-17-42.bpo-33725.fFZoDG.rst D Misc/NEWS.d/next/Library/2019-05-28-12-17-10.bpo-37076.Bk2xOs.rst D Misc/NEWS.d/next/Library/2019-05-28-19-14-29.bpo-35279.PX7yl9.rst D Misc/NEWS.d/next/Library/2019-05-28-23-17-35.bpo-35246.oXT21d.rst D Misc/NEWS.d/next/Library/2019-05-30-13-30-46.bpo-36999.EjY_L2.rst D Misc/NEWS.d/next/Library/2019-05-30-16-16-47.bpo-12639.TQFOR4.rst D Misc/NEWS.d/next/Library/2019-05-30-21-25-14.bpo-29262.LdIzun.rst D Misc/NEWS.d/next/Library/2019-05-31-11-33-11.bpo-26835.xGbUX0.rst D Misc/NEWS.d/next/Library/2019-05-31-15-53-34.bpo-12202.nobzc9.rst D Misc/NEWS.d/next/Library/2019-06-01-09-03-32.bpo-37120.FOKQLU.rst D Misc/NEWS.d/next/Library/2019-06-01-22-54-03.bpo-37128.oGXBWN.rst D Misc/NEWS.d/next/Security/2018-03-30-12-26-47.bpo-33164.aO29Cx.rst D Misc/NEWS.d/next/Security/2019-02-24-18-48-16.bpo-33529.wpNNBD.rst D Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst D Misc/NEWS.d/next/Tests/2019-03-23-13-58-49.bpo-36342.q6Quiq.rst D Misc/NEWS.d/next/Tests/2019-05-04-21-25-19.bpo-36782.h3oPIb.rst D Misc/NEWS.d/next/Tests/2019-05-06-18-29-54.bpo-35925.gwQPuC.rst D Misc/NEWS.d/next/Tests/2019-05-08-15-55-46.bpo-36816.WBKRGZ.rst D Misc/NEWS.d/next/Tests/2019-05-10-01-50-30.bpo-36719.O84ZWv.rst D Misc/NEWS.d/next/Tests/2019-05-14-14-12-24.bpo-36915.58b7pH.rst D Misc/NEWS.d/next/Tests/2019-05-22-12-57-15.bpo-36829.e9mRWC.rst D Misc/NEWS.d/next/Tests/2019-05-28-17-48-22.bpo-37081.qxB-1l.rst D Misc/NEWS.d/next/Tests/2019-05-30-10-57-39.bpo-37098.SfXt1M.rst D Misc/NEWS.d/next/Tests/2019-06-03-02-30-36.bpo-37069.rVtdLk.rst D Misc/NEWS.d/next/Tools-Demos/2019-05-26-16-47-06.bpo-37053.-EYRuz.rst D Misc/NEWS.d/next/Windows/2018-08-28-17-23-49.bpo-33407.ARG0W_.rst D Misc/NEWS.d/next/Windows/2018-09-15-11-36-55.bpo-29883.HErerE.rst D Misc/NEWS.d/next/Windows/2019-03-01-16-43-45.bpo-35926.mLszHo.rst D Misc/NEWS.d/next/Windows/2019-05-20-20-26-36.bpo-36965.KsfI-N.rst D Misc/NEWS.d/next/macOS/2019-06-03-05-49-49.bpo-36231.RfmW_p.rst M Doc/tools/extensions/pyspecific.py M Include/patchlevel.h M Lib/pydoc_data/topics.py M README.rst diff --git a/Doc/tools/extensions/pyspecific.py b/Doc/tools/extensions/pyspecific.py index f79b25048a5a..8bf7eb699c4e 100644 --- a/Doc/tools/extensions/pyspecific.py +++ b/Doc/tools/extensions/pyspecific.py @@ -36,7 +36,7 @@ ISSUE_URI = 'https://bugs.python.org/issue%s' -SOURCE_URI = 'https://github.com/python/cpython/tree/master/%s' +SOURCE_URI = 'https://github.com/python/cpython/tree/3.8/%s' # monkey-patch reST parser to disable alphabetic and roman enumerated lists from docutils.parsers.rst.states import Body diff --git a/Include/patchlevel.h b/Include/patchlevel.h index da787f27cc88..881558bb44f6 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 0 -#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_ALPHA -#define PY_RELEASE_SERIAL 4 +#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_BETA +#define PY_RELEASE_SERIAL 1 /* Version as a string */ -#define PY_VERSION "3.8.0a4+" +#define PY_VERSION "3.8.0b1" /*--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 3361c6b5568a..1fb19f241ac3 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Autogenerated by Sphinx on Wed May 29 01:18:52 2019 +# Autogenerated by Sphinx on Tue Jun 4 19:40:37 2019 topics = {'assert': 'The "assert" statement\n' '**********************\n' '\n' @@ -357,12 +357,13 @@ 'a variable or attribute annotation and an optional assignment\n' 'statement:\n' '\n' - ' annotated_assignment_stmt ::= augtarget ":" expression ["=" ' - 'expression]\n' + ' annotated_assignment_stmt ::= augtarget ":" expression\n' + ' ["=" (starred_expression | ' + 'yield_expression)]\n' '\n' 'The difference from normal Assignment statements is that only ' 'single\n' - 'target and only single right hand side value is allowed.\n' + 'target is allowed.\n' '\n' 'For simple names as assignment targets, if in class or module ' 'scope,\n' @@ -409,7 +410,14 @@ 'standard\n' ' syntax for type annotations that can be used in static ' 'analysis\n' - ' tools and IDEs.\n', + ' tools and IDEs.\n' + '\n' + 'Changed in version 3.8: Now annotated assignments allow same\n' + 'expressions in the right hand side as the regular ' + 'assignments.\n' + 'Previously, some expressions (like un-parenthesized tuple ' + 'expressions)\n' + 'caused a syntax error.\n', 'async': 'Coroutines\n' '**********\n' '\n' @@ -2026,21 +2034,22 @@ '\n' 'For user-defined classes which do not define "__contains__()" ' 'but do\n' - 'define "__iter__()", "x in y" is "True" if some value "z" ' - 'with "x ==\n' - 'z" is produced while iterating over "y". If an exception is ' - 'raised\n' - 'during the iteration, it is as if "in" raised that ' - 'exception.\n' + 'define "__iter__()", "x in y" is "True" if some value "z", ' + 'for which\n' + 'the expression "x is z or x == z" is true, is produced while ' + 'iterating\n' + 'over "y". If an exception is raised during the iteration, it ' + 'is as if\n' + '"in" raised that exception.\n' '\n' 'Lastly, the old-style iteration protocol is tried: if a class ' 'defines\n' '"__getitem__()", "x in y" is "True" if and only if there is a ' 'non-\n' - 'negative integer index *i* such that "x == y[i]", and all ' - 'lower\n' - 'integer indices do not raise "IndexError" exception. (If any ' - 'other\n' + 'negative integer index *i* such that "x is y[i] or x == ' + 'y[i]", and no\n' + 'lower integer index raises the "IndexError" exception. (If ' + 'any other\n' 'exception is raised, it is as if "in" raised that ' 'exception).\n' '\n' @@ -5081,7 +5090,7 @@ 'Meaning ' '|\n' ' ' - '|===========|============================================================|\n' + '+===========+============================================================+\n' ' | "\'<\'" | Forces the field to be left-aligned ' 'within the available |\n' ' | | space (this is the default for most ' @@ -5130,7 +5139,7 @@ 'Meaning ' '|\n' ' ' - '|===========|============================================================|\n' + '+===========+============================================================+\n' ' | "\'+\'" | indicates that a sign should be used for ' 'both positive as |\n' ' | | well as negative ' @@ -5234,7 +5243,7 @@ 'Meaning ' '|\n' ' ' - '|===========|============================================================|\n' + '+===========+============================================================+\n' ' | "\'s\'" | String format. This is the default type ' 'for strings and |\n' ' | | may be ' @@ -5254,7 +5263,7 @@ 'Meaning ' '|\n' ' ' - '|===========|============================================================|\n' + '+===========+============================================================+\n' ' | "\'b\'" | Binary format. Outputs the number in ' 'base 2. |\n' ' ' @@ -5316,7 +5325,7 @@ 'Meaning ' '|\n' ' ' - '|===========|============================================================|\n' + '+===========+============================================================+\n' ' | "\'e\'" | Exponent notation. Prints the number in ' 'scientific |\n' ' | | notation using the letter ?e? to indicate ' @@ -6334,14 +6343,16 @@ '"False" otherwise.\n' '\n' 'For user-defined classes which do not define "__contains__()" but do\n' - 'define "__iter__()", "x in y" is "True" if some value "z" with "x ==\n' - 'z" is produced while iterating over "y". If an exception is raised\n' - 'during the iteration, it is as if "in" raised that exception.\n' + 'define "__iter__()", "x in y" is "True" if some value "z", for which\n' + 'the expression "x is z or x == z" is true, is produced while ' + 'iterating\n' + 'over "y". If an exception is raised during the iteration, it is as if\n' + '"in" raised that exception.\n' '\n' 'Lastly, the old-style iteration protocol is tried: if a class defines\n' '"__getitem__()", "x in y" is "True" if and only if there is a non-\n' - 'negative integer index *i* such that "x == y[i]", and all lower\n' - 'integer indices do not raise "IndexError" exception. (If any other\n' + 'negative integer index *i* such that "x is y[i] or x == y[i]", and no\n' + 'lower integer index raises the "IndexError" exception. (If any other\n' 'exception is raised, it is as if "in" raised that exception).\n' '\n' 'The operator "not in" is defined to have the inverse truth value of\n' @@ -6850,11 +6861,11 @@ 'numeric\n' ' object is an integer type. Must return an integer.\n' '\n' - ' Note: In order to have a coherent integer type class, ' - 'when\n' - ' "__index__()" is defined "__int__()" should also be ' - 'defined, and\n' - ' both should return the same value.\n' + ' If "__int__()", "__float__()" and "__complex__()" are ' + 'not defined\n' + ' then corresponding built-in functions "int()", "float()" ' + 'and\n' + ' "complex()" fall back to "__index__()".\n' '\n' 'object.__round__(self[, ndigits])\n' 'object.__trunc__(self)\n' @@ -7025,7 +7036,7 @@ '+-------------------------------------------------+---------------------------------------+\n' '| Operator | ' 'Description |\n' - '|=================================================|=======================================|\n' + '+=================================================+=======================================+\n' '| "lambda" | ' 'Lambda expression |\n' '+-------------------------------------------------+---------------------------------------+\n' @@ -8716,7 +8727,7 @@ ' in:\n' '\n' ' class Philosopher:\n' - ' def __init_subclass__(cls, default_name, ' + ' def __init_subclass__(cls, /, default_name, ' '**kwargs):\n' ' super().__init_subclass__(**kwargs)\n' ' cls.default_name = default_name\n' @@ -9469,11 +9480,11 @@ 'numeric\n' ' object is an integer type. Must return an integer.\n' '\n' - ' Note: In order to have a coherent integer type class, ' - 'when\n' - ' "__index__()" is defined "__int__()" should also be ' - 'defined, and\n' - ' both should return the same value.\n' + ' If "__int__()", "__float__()" and "__complex__()" are not ' + 'defined\n' + ' then corresponding built-in functions "int()", "float()" ' + 'and\n' + ' "complex()" fall back to "__index__()".\n' '\n' 'object.__round__(self[, ndigits])\n' 'object.__trunc__(self)\n' @@ -10269,7 +10280,7 @@ ' | Representation | ' 'Description |\n' ' ' - '|=========================|===============================|\n' + '+=========================+===============================+\n' ' | "\\n" | Line ' 'Feed |\n' ' ' @@ -10608,7 +10619,7 @@ '+-------------------+-----------------------------------+---------+\n' '| Escape Sequence | Meaning | Notes ' '|\n' - '|===================|===================================|=========|\n' + '+===================+===================================+=========+\n' '| "\\newline" | Backslash and newline ignored ' '| |\n' '+-------------------+-----------------------------------+---------+\n' @@ -10654,7 +10665,7 @@ '+-------------------+-----------------------------------+---------+\n' '| Escape Sequence | Meaning | Notes ' '|\n' - '|===================|===================================|=========|\n' + '+===================+===================================+=========+\n' '| "\\N{name}" | Character named *name* in the | ' '(4) |\n' '| | Unicode database | ' @@ -11292,7 +11303,7 @@ ' | Attribute | Meaning ' '| |\n' ' ' - '|===========================|=================================|=============|\n' + '+===========================+=================================+=============+\n' ' | "__doc__" | The function?s documentation ' '| Writable |\n' ' | | string, or "None" if ' @@ -11769,33 +11780,36 @@ '\n' ' Special read-only attributes: "co_name" gives the function ' 'name;\n' - ' "co_argcount" is the number of positional arguments ' - '(including\n' - ' arguments with default values); "co_nlocals" is the number ' - 'of\n' - ' local variables used by the function (including arguments);\n' - ' "co_varnames" is a tuple containing the names of the local\n' - ' variables (starting with the argument names); "co_cellvars" ' - 'is a\n' - ' tuple containing the names of local variables that are\n' - ' referenced by nested functions; "co_freevars" is a tuple\n' - ' containing the names of free variables; "co_code" is a ' - 'string\n' - ' representing the sequence of bytecode instructions; ' - '"co_consts"\n' - ' is a tuple containing the literals used by the bytecode;\n' - ' "co_names" is a tuple containing the names used by the ' - 'bytecode;\n' - ' "co_filename" is the filename from which the code was ' - 'compiled;\n' - ' "co_firstlineno" is the first line number of the function;\n' - ' "co_lnotab" is a string encoding the mapping from bytecode\n' - ' offsets to line numbers (for details see the source code of ' + ' "co_argcount" is the total number of positional arguments\n' + ' (including positional-only arguments and arguments with ' + 'default\n' + ' values); "co_posonlyargcount" is the number of ' + 'positional-only\n' + ' arguments (including arguments with default values);\n' + ' "co_kwonlyargcount" is the number of keyword-only arguments\n' + ' (including arguments with default values); "co_nlocals" is ' + 'the\n' + ' number of local variables used by the function (including\n' + ' arguments); "co_varnames" is a tuple containing the names of ' + 'the\n' + ' local variables (starting with the argument names);\n' + ' "co_cellvars" is a tuple containing the names of local ' + 'variables\n' + ' that are referenced by nested functions; "co_freevars" is a\n' + ' tuple containing the names of free variables; "co_code" is a\n' + ' string representing the sequence of bytecode instructions;\n' + ' "co_consts" is a tuple containing the literals used by the\n' + ' bytecode; "co_names" is a tuple containing the names used by ' 'the\n' - ' interpreter); "co_stacksize" is the required stack size\n' - ' (including local variables); "co_flags" is an integer ' - 'encoding a\n' - ' number of flags for the interpreter.\n' + ' bytecode; "co_filename" is the filename from which the code ' + 'was\n' + ' compiled; "co_firstlineno" is the first line number of the\n' + ' function; "co_lnotab" is a string encoding the mapping from\n' + ' bytecode offsets to line numbers (for details see the source\n' + ' code of the interpreter); "co_stacksize" is the required ' + 'stack\n' + ' size (including local variables); "co_flags" is an integer\n' + ' encoding a number of flags for the interpreter.\n' '\n' ' The following flag bits are defined for "co_flags": bit ' '"0x04"\n' @@ -12563,7 +12577,7 @@ '+----------------------------+----------------------------------+------------+\n' '| Operation | Result ' '| Notes |\n' - '|============================|==================================|============|\n' + '+============================+==================================+============+\n' '| "x in s" | "True" if an item of *s* is ' '| (1) |\n' '| | equal to *x*, else "False" ' @@ -12792,7 +12806,7 @@ '+--------------------------------+----------------------------------+-----------------------+\n' '| Operation | ' 'Result | Notes |\n' - '|================================|==================================|=======================|\n' + '+================================+==================================+=======================+\n' '| "s[i] = x" | item *i* of *s* is replaced ' 'by | |\n' '| | ' @@ -13254,7 +13268,7 @@ '| Operation | ' 'Result | Notes ' '|\n' - '|================================|==================================|=======================|\n' + '+================================+==================================+=======================+\n' '| "s[i] = x" | item *i* of *s* is ' 'replaced by | |\n' '| | ' diff --git a/Misc/NEWS.d/3.8.0b1.rst b/Misc/NEWS.d/3.8.0b1.rst new file mode 100644 index 000000000000..d083983642e7 --- /dev/null +++ b/Misc/NEWS.d/3.8.0b1.rst @@ -0,0 +1,2052 @@ +.. bpo: 35907 +.. date: 2019-05-21-23-20-18 +.. nonce: NC_zNK +.. release date: 2019-06-04 +.. section: Security + +CVE-2019-9948: Avoid file reading by disallowing ``local-file://`` and +``local_file://`` URL schemes in ``URLopener().open()`` and +``URLopener().retrieve()`` of :mod:`urllib.request`. + +.. + +.. bpo: 33529 +.. date: 2019-02-24-18-48-16 +.. nonce: wpNNBD +.. section: Security + +Prevent fold function used in email header encoding from entering infinite +loop when there are too many non-ASCII characters in a header. + +.. + +.. bpo: 33164 +.. date: 2018-03-30-12-26-47 +.. nonce: aO29Cx +.. section: Security + +Updated blake2 implementation which uses secure memset implementation +provided by platform. + +.. + +.. bpo: 35814 +.. date: 2019-06-03-00-51-02 +.. nonce: Cf7sGY +.. section: Core and Builtins + +Allow unpacking in the right hand side of annotated assignments. In +particular, ``t: Tuple[int, ...] = x, y, *z`` is now allowed. + +.. + +.. bpo: 37126 +.. date: 2019-06-01-20-03-13 +.. nonce: tP6lL4 +.. section: Core and Builtins + +All structseq objects are now tracked by the garbage collector. Patch by +Pablo Galindo. + +.. + +.. bpo: 37122 +.. date: 2019-06-01-16-53-41 +.. nonce: dZ3-NY +.. section: Core and Builtins + +Make the *co_argcount* attribute of code objects represent the total number +of positional arguments (including positional-only arguments). The value of +*co_posonlyargcount* can be used to distinguish which arguments are +positional only, and the difference (*co_argcount* - *co_posonlyargcount*) +is the number of positional-or-keyword arguments. Patch by Pablo Galindo. + +.. + +.. bpo: 20092 +.. date: 2019-05-31-11-55-49 +.. nonce: KIMjBW +.. section: Core and Builtins + +Constructors of :class:`int`, :class:`float` and :class:`complex` will now +use the :meth:`~object.__index__` special method, if available and the +corresponding method :meth:`~object.__int__`, :meth:`~object.__float__` or +:meth:`~object.__complex__` is not available. + +.. + +.. bpo: 37087 +.. date: 2019-05-30-17-33-55 +.. nonce: vElenE +.. section: Core and Builtins + +Add native thread ID (TID) support to OpenBSD. + +.. + +.. bpo: 26219 +.. date: 2019-05-29-22-03-09 +.. nonce: Ovf1Qs +.. section: Core and Builtins + +Implemented per opcode cache mechanism and ``LOAD_GLOBAL`` instruction use +it. ``LOAD_GLOBAL`` is now about 40% faster. Contributed by Yury Selivanov, +and Inada Naoki. + +.. + +.. bpo: 37072 +.. date: 2019-05-28-18-18-55 +.. nonce: 1Hewl3 +.. section: Core and Builtins + +Fix crash in PyAST_FromNodeObject() when flags is NULL. + +.. + +.. bpo: 37029 +.. date: 2019-05-28-17-02-46 +.. nonce: MxpgfJ +.. section: Core and Builtins + +Freeing a great many small objects could take time quadratic in the number +of arenas, due to using linear search to keep ``obmalloc.c``'s list of +usable arenas sorted by order of number of free memory pools. This is +accomplished without search now, leaving the worst-case time linear in the +number of arenas. For programs where this quite visibly matters (typically +with more than 100 thousand small objects alive simultaneously), this can +greatly reduce the time needed to release their memory. + +.. + +.. bpo: 26423 +.. date: 2019-05-27-18-00-19 +.. nonce: RgUOE8 +.. section: Core and Builtins + +Fix possible overflow in ``wrap_lenfunc()`` when ``sizeof(long) < +sizeof(Py_ssize_t)`` (e.g., 64-bit Windows). + +.. + +.. bpo: 37050 +.. date: 2019-05-27-14-46-24 +.. nonce: 7MyZGg +.. section: Core and Builtins + +Improve the AST for "debug" f-strings, which use '=' to print out the source +of the expression being evaluated. Delete expr_text from the FormattedValue +node, and instead use a Constant string node (possibly merged with adjacent +constant expressions inside the f-string). + +.. + +.. bpo: 22385 +.. date: 2019-05-25-17-18-26 +.. nonce: VeVvhJ +.. section: Core and Builtins + +The `bytes.hex`, `bytearray.hex`, and `memoryview.hex` methods as well as +the `binascii.hexlify` and `b2a_hex` functions now have the ability to +include an optional separator between hex bytes. This functionality was +inspired by MicroPython's hexlify implementation. + +.. + +.. bpo: 26836 +.. date: 2019-05-25-08-18-01 +.. nonce: rplYWW +.. section: Core and Builtins + +Add :func:`os.memfd_create`. + +.. + +.. bpo: 37032 +.. date: 2019-05-24-12-38-40 +.. nonce: T8rSH8 +.. section: Core and Builtins + +Added new ``replace()`` method to the code type (:class:`types.CodeType`). + +.. + +.. bpo: 37007 +.. date: 2019-05-23-04-19-13 +.. nonce: d1SOtF +.. section: Core and Builtins + +Implement :func:`socket.if_nameindex()`, :func:`socket.if_nametoindex()`, +and :func:`socket.if_indextoname()` on Windows. + +.. + +.. bpo: 36829 +.. date: 2019-05-22-23-01-29 +.. nonce: MfOcUg +.. section: Core and Builtins + +:c:func:`PyErr_WriteUnraisable` now creates a traceback object if there is +no current traceback. Moreover, call :c:func:`PyErr_NormalizeException` and +:c:func:`PyException_SetTraceback` to normalize the exception value. Ignore +any error. + +.. + +.. bpo: 36878 +.. date: 2019-05-22-11-16-16 +.. nonce: QwLa3P +.. section: Core and Builtins + +Only accept text after `# type: ignore` if the first character is ASCII. +This is to disallow things like `# type: ignore?`. + +.. + +.. bpo: 36878 +.. date: 2019-05-21-16-21-22 +.. nonce: EFRHZ3 +.. section: Core and Builtins + +Store text appearing after a `# type: ignore` comment in the AST. For +example a type ignore like `# type: ignore[E1000]` will have the string +`"[E1000]"` stored in its AST node. + +.. + +.. bpo: 2180 +.. date: 2019-05-17-18-34-30 +.. nonce: aBqHeW +.. section: Core and Builtins + +Treat line continuation at EOF as a ``SyntaxError`` by Anthony Sottile. + +.. + +.. bpo: 36907 +.. date: 2019-05-17-12-28-24 +.. nonce: rk7kgp +.. section: Core and Builtins + +Fix a crash when calling a C function with a keyword dict (``f(**kwargs)``) +and changing the dict ``kwargs`` while that function is running. + +.. + +.. bpo: 36946 +.. date: 2019-05-16-23-53-45 +.. nonce: qjxr0Y +.. section: Core and Builtins + +Fix possible signed integer overflow when handling slices. + +.. + +.. bpo: 36826 +.. date: 2019-05-15-14-01-09 +.. nonce: GLrO3W +.. section: Core and Builtins + +Add NamedExpression kind support to ast_unparse.c + +.. + +.. bpo: 1875 +.. date: 2019-05-15-01-29-29 +.. nonce: 9oxXFX +.. section: Core and Builtins + +A :exc:`SyntaxError` is now raised if a code blocks that will be optimized +away (e.g. if conditions that are always false) contains syntax errors. +Patch by Pablo Galindo. + +.. + +.. bpo: 36027 +.. date: 2019-05-12-18-46-50 +.. nonce: Q4YatQ +.. section: Core and Builtins + +Allow computation of modular inverses via three-argument ``pow``: the second +argument is now permitted to be negative in the case where the first and +third arguments are relatively prime. + +.. + +.. bpo: 36861 +.. date: 2019-05-08-20-42-40 +.. nonce: 72mvZM +.. section: Core and Builtins + +Update the Unicode database to version 12.1.0. + +.. + +.. bpo: 28866 +.. date: 2019-05-08-16-36-51 +.. nonce: qCv_bj +.. section: Core and Builtins + +Avoid caching attributes of classes which type defines mro() to avoid a hard +cache invalidation problem. + +.. + +.. bpo: 36851 +.. date: 2019-05-08-11-42-06 +.. nonce: J7DiCW +.. section: Core and Builtins + +The ``FrameType`` stack is now correctly cleaned up if the execution ends +with a return and the stack is not empty. + +.. + +.. bpo: 34616 +.. date: 2019-05-07-17-12-37 +.. nonce: 0Y0_9r +.. section: Core and Builtins + +The ``compile()`` builtin functions now support the +``ast.PyCF_ALLOW_TOP_LEVEL_AWAIT`` flag, which allow to compile sources +that contains top-level ``await``, ``async with`` or ``async for``. This is +useful to evaluate async-code from with an already async functions; for +example in a custom REPL. + +.. + +.. bpo: 36842 +.. date: 2019-05-07-16-50-12 +.. nonce: NYww_N +.. section: Core and Builtins + +Implement PEP 578, adding sys.audit, io.open_code and related APIs. + +.. + +.. bpo: 27639 +.. date: 2019-05-07-15-49-17 +.. nonce: b1Ah87 +.. section: Core and Builtins + +Correct return type for UserList slicing operations. Patch by Michael +Blahay, Erick Cervantes, and vaultah + +.. + +.. bpo: 36737 +.. date: 2019-05-07-12-18-11 +.. nonce: XAo6LY +.. section: Core and Builtins + +Move PyRuntimeState.warnings into per-interpreter state (via "module +state"). + +.. + +.. bpo: 36793 +.. date: 2019-05-04-16-15-33 +.. nonce: Izog4Z +.. section: Core and Builtins + +Removed ``__str__`` implementations from builtin types :class:`bool`, +:class:`int`, :class:`float`, :class:`complex` and few classes from the +standard library. They now inherit ``__str__()`` from :class:`object`. + +.. + +.. bpo: 36774 +.. date: 2019-05-02-11-48-08 +.. nonce: ZqbJ1J +.. section: Core and Builtins + +Add a ``=`` feature f-strings for debugging. This can precede ``!s``, +``!r``, or ``!a``. It produces the text of the expression, followed by an +equal sign, followed by the repr of the value of the expression. So +``f'{3*9+15=}'`` would be equal to the string ``'3*9+15=42'``. If ``=`` is +specified, the default conversion is set to ``!r``, unless a format spec is +given, in which case the formatting behavior is unchanged, and __format__ +will be used. + +.. + +.. bpo: 24048 +.. date: 2019-04-29-03-27-22 +.. nonce: vXxUDQ +.. section: Core and Builtins + +Save the live exception during import.c's ``remove_module()``. + +.. + +.. bpo: 27987 +.. date: 2019-04-16-11-52-21 +.. nonce: n2_DcQ +.. section: Core and Builtins + +pymalloc returns memory blocks aligned by 16 bytes, instead of 8 bytes, on +64-bit platforms to conform x86-64 ABI. Recent compilers assume this +alignment more often. Patch by Inada Naoki. + +.. + +.. bpo: 36601 +.. date: 2019-04-13-16-14-16 +.. nonce: mIgS7t +.. section: Core and Builtins + +A long-since-meaningless check for ``getpid() == main_pid`` was removed from +Python's internal C signal handler. + +.. + +.. bpo: 36594 +.. date: 2019-04-10-18-12-11 +.. nonce: fbnJAc +.. section: Core and Builtins + +Fix incorrect use of ``%p`` in format strings. Patch by Zackery Spytz. + +.. + +.. bpo: 36045 +.. date: 2019-02-24-12-44-46 +.. nonce: RO20OV +.. section: Core and Builtins + +builtins.help() now prefixes `async` for async functions + +.. + +.. bpo: 36084 +.. date: 2019-02-22-23-03-20 +.. nonce: 86Eh4X +.. section: Core and Builtins + +Add native thread ID (TID) to threading.Thread objects (supported platforms: +Windows, FreeBSD, Linux, macOS) + +.. + +.. bpo: 36035 +.. date: 2019-02-22-14-30-19 +.. nonce: -6dy1y +.. section: Core and Builtins + +Added fix for broken symlinks in combination with pathlib + +.. + +.. bpo: 35983 +.. date: 2019-02-13-16-47-19 +.. nonce: bNxsXv +.. section: Core and Builtins + +Added new trashcan macros to deal with a double deallocation that could +occur when the `tp_dealloc` of a subclass calls the `tp_dealloc` of a base +class and that base class uses the trashcan mechanism. Patch by Jeroen +Demeyer. + +.. + +.. bpo: 20602 +.. date: 2018-07-04-16-57-59 +.. nonce: sDLElw +.. section: Core and Builtins + +Do not clear :data:`sys.flags` and :data:`sys.float_info` during shutdown. +Patch by Zackery Spytz. + +.. + +.. bpo: 26826 +.. date: 2018-05-30-23-43-03 +.. nonce: NkRzjb +.. section: Core and Builtins + +Expose :func:`copy_file_range` as a low level API in the :mod:`os` module. + +.. + +.. bpo: 32388 +.. date: 2017-12-21-20-37-40 +.. nonce: 6w-i5t +.. section: Core and Builtins + +Remove cross-version binary compatibility requirement in tp_flags. + +.. + +.. bpo: 31862 +.. date: 2017-10-24-17-26-58 +.. nonce: 5Gea8L +.. section: Core and Builtins + +Port binascii to PEP 489 multiphase initialization. Patch by Marcel Plch. + +.. + +.. bpo: 37128 +.. date: 2019-06-01-22-54-03 +.. nonce: oGXBWN +.. section: Library + +Added :func:`math.perm`. + +.. + +.. bpo: 37120 +.. date: 2019-06-01-09-03-32 +.. nonce: FOKQLU +.. section: Library + +Add SSLContext.num_tickets to control the number of TLSv1.3 session tickets. + +.. + +.. bpo: 12202 +.. date: 2019-05-31-15-53-34 +.. nonce: nobzc9 +.. section: Library + +Fix the error handling in :meth:`msilib.SummaryInformation.GetProperty`. +Patch by Zackery Spytz. + +.. + +.. bpo: 26835 +.. date: 2019-05-31-11-33-11 +.. nonce: xGbUX0 +.. section: Library + +The fcntl module now contains file sealing constants for sealing of memfds. + +.. + +.. bpo: 29262 +.. date: 2019-05-30-21-25-14 +.. nonce: LdIzun +.. section: Library + +Add ``get_origin()`` and ``get_args()`` introspection helpers to ``typing`` +module. + +.. + +.. bpo: 12639 +.. date: 2019-05-30-16-16-47 +.. nonce: TQFOR4 +.. section: Library + +:meth:`msilib.Directory.start_component()` no longer fails if *keyfile* is +not ``None``. + +.. + +.. bpo: 36999 +.. date: 2019-05-30-13-30-46 +.. nonce: EjY_L2 +.. section: Library + +Add the ``asyncio.Task.get_coro()`` method to publicly expose the tasks's +coroutine object. + +.. + +.. bpo: 35246 +.. date: 2019-05-28-23-17-35 +.. nonce: oXT21d +.. section: Library + +Make :func:`asyncio.create_subprocess_exec` accept path-like arguments. + +.. + +.. bpo: 35279 +.. date: 2019-05-28-19-14-29 +.. nonce: PX7yl9 +.. section: Library + +Change default *max_workers* of ``ThreadPoolExecutor`` from ``cpu_count() * +5`` to ``min(32, cpu_count() + 4))``. Previous value was unreasonably large +on many cores machines. + +.. + +.. bpo: 37076 +.. date: 2019-05-28-12-17-10 +.. nonce: Bk2xOs +.. section: Library + +:func:`_thread.start_new_thread` now logs uncaught exception raised by the +function using :func:`sys.unraisablehook`, rather than +:func:`sys.excepthook`, so the hook gets access to the function which raised +the exception. + +.. + +.. bpo: 33725 +.. date: 2019-05-28-01-17-42 +.. nonce: fFZoDG +.. section: Library + +On macOS, the :mod:`multiprocessing` module now uses *spawn* start method by +default. + +.. + +.. bpo: 37054 +.. date: 2019-05-28-01-06-44 +.. nonce: sLULGQ +.. section: Library + +Fix destructor :class:`_pyio.BytesIO` and :class:`_pyio.TextIOWrapper`: +initialize their ``_buffer`` attribute as soon as possible (in the class +body), because it's used by ``__del__()`` which calls ``close()``. + +.. + +.. bpo: 37058 +.. date: 2019-05-26-19-05-24 +.. nonce: jmRu_g +.. section: Library + +PEP 544: Add ``Protocol`` and ``@runtime_checkable`` to the ``typing`` +module. + +.. + +.. bpo: 36933 +.. date: 2019-05-26-10-16-55 +.. nonce: 4w3eP9 +.. section: Library + +The functions ``sys.set_coroutine_wrapper`` and +``sys.get_coroutine_wrapper`` that were deprecated and marked for removal in +3.8 have been removed. + +.. + +.. bpo: 37047 +.. date: 2019-05-26-01-20-06 +.. nonce: K9epi8 +.. section: Library + +Handle late binding and attribute access in :class:`unittest.mock.AsyncMock` +setup for autospeccing. Document newly implemented async methods in +:class:`unittest.mock.MagicMock`. + +.. + +.. bpo: 37049 +.. date: 2019-05-25-19-48-42 +.. nonce: an2LXJ +.. section: Library + +PEP 589: Add ``TypedDict`` to the ``typing`` module. + +.. + +.. bpo: 37046 +.. date: 2019-05-25-19-12-53 +.. nonce: iuhQQj +.. section: Library + +PEP 586: Add ``Literal`` to the ``typing`` module. + +.. + +.. bpo: 37045 +.. date: 2019-05-25-18-36-50 +.. nonce: suHdVJ +.. section: Library + +PEP 591: Add ``Final`` qualifier and ``@final`` decorator to the ``typing`` +module. + +.. + +.. bpo: 37035 +.. date: 2019-05-24-18-16-07 +.. nonce: HFbJVT +.. section: Library + +Don't log OSError based exceptions if a fatal error has occurred in asyncio +transport. Peer can generate almost any OSError, user cannot avoid these +exceptions by fixing own code. Errors are still propagated to user code, +it's just logging them is pointless and pollute asyncio logs. + +.. + +.. bpo: 37001 +.. date: 2019-05-23-21-10-57 +.. nonce: DoLvTK +.. section: Library + +:func:`symtable.symtable` now accepts the same input types for source code +as the built-in :func:`compile` function. Patch by Dino Viehland. + +.. + +.. bpo: 37028 +.. date: 2019-05-23-18-57-34 +.. nonce: Vse6Pj +.. section: Library + +Implement asyncio REPL + +.. + +.. bpo: 37027 +.. date: 2019-05-23-18-46-56 +.. nonce: iH4eut +.. section: Library + +Return safe to use proxy socket object from +transport.get_extra_info('socket') + +.. + +.. bpo: 32528 +.. date: 2019-05-23-17-37-22 +.. nonce: sGnkcl +.. section: Library + +Make asyncio.CancelledError a BaseException. + +This will address the common mistake many asyncio users make: an "except +Exception" clause breaking Tasks cancellation. + +In addition to this change, we stop inheriting asyncio.TimeoutError and +asyncio.InvalidStateError from their concurrent.futures.* counterparts. +There's no point for these exceptions to share the inheritance chain. + +.. + +.. bpo: 1230540 +.. date: 2019-05-23-01-48-39 +.. nonce: oKTNEQ +.. section: Library + +Add a new :func:`threading.excepthook` function which handles uncaught +:meth:`threading.Thread.run` exception. It can be overridden to control how +uncaught :meth:`threading.Thread.run` exceptions are handled. + +.. + +.. bpo: 36996 +.. date: 2019-05-22-22-55-18 +.. nonce: XQx08d +.. section: Library + +Handle :func:`unittest.mock.patch` used as a decorator on async functions. + +.. + +.. bpo: 37008 +.. date: 2019-05-22-15-26-08 +.. nonce: WPbv31 +.. section: Library + +Add support for calling :func:`next` with the mock resulting from +:func:`unittest.mock.mock_open` + +.. + +.. bpo: 27737 +.. date: 2019-05-22-02-25-31 +.. nonce: 7bgKpa +.. section: Library + +Allow whitespace only header encoding in ``email.header`` - by Batuhan +Taskaya + +.. + +.. bpo: 36969 +.. date: 2019-05-21-12-31-21 +.. nonce: u7cxu7 +.. section: Library + +PDB command `args` now display positional only arguments. Patch contributed +by R?mi Lapeyre. + +.. + +.. bpo: 36969 +.. date: 2019-05-20-23-31-20 +.. nonce: JkZORP +.. section: Library + +PDB command `args` now display keyword only arguments. Patch contributed by +R?mi Lapeyre. + +.. + +.. bpo: 36983 +.. date: 2019-05-20-20-41-30 +.. nonce: hz-fLr +.. section: Library + +Add missing names to ``typing.__all__``: ``ChainMap``, ``ForwardRef``, +``OrderedDict`` - by Anthony Sottile. + +.. + +.. bpo: 36972 +.. date: 2019-05-20-17-08-26 +.. nonce: 3l3SGc +.. section: Library + +Add SupportsIndex protocol to the typing module to allow type checking to +detect classes that can be passed to `hex()`, `oct()` and `bin()`. + +.. + +.. bpo: 32972 +.. date: 2019-05-20-14-47-55 +.. nonce: LoeUNh +.. section: Library + +Implement ``unittest.AsyncTestCase`` to help testing asyncio-based code. + +.. + +.. bpo: 36952 +.. date: 2019-05-20-11-01-28 +.. nonce: MgZi7- +.. section: Library + +:func:`fileinput.input` and :class:`fileinput.FileInput` **bufsize** +argument has been removed (was deprecated and ignored since Python 3.6), and +as a result the **mode** and **openhook** arguments have been made +keyword-only. + +.. + +.. bpo: 36952 +.. date: 2019-05-20-08-54-41 +.. nonce: I_glok +.. section: Library + +Starting with Python 3.3, importing ABCs from :mod:`collections` is +deprecated, and import should be done from :mod:`collections.abc`. Still +being able to import from :mod:`collections` was marked for removal in 3.8, +but has been delayed to 3.9; documentation and ``DeprecationWarning`` +clarified. + +.. + +.. bpo: 36949 +.. date: 2019-05-19-06-54-26 +.. nonce: jBlG9F +.. section: Library + +Implement __repr__ for WeakSet objects. + +.. + +.. bpo: 36948 +.. date: 2019-05-17-21-42-58 +.. nonce: vnUDvk +.. section: Library + +Fix :exc:`NameError` in :meth:`urllib.request.URLopener.retrieve`. Patch by +Karthikeyan Singaravelan. + +.. + +.. bpo: 33524 +.. date: 2019-05-17-11-44-21 +.. nonce: 8y_xUU +.. section: Library + +Fix the folding of email header when the max_line_length is 0 or None and +the header contains non-ascii characters. Contributed by Licht Takeuchi +(@Licht-T). + +.. + +.. bpo: 24564 +.. date: 2019-05-16-23-40-36 +.. nonce: lIwV_7 +.. section: Library + +:func:`shutil.copystat` now ignores :const:`errno.EINVAL` on +:func:`os.setxattr` which may occur when copying files on filesystems +without extended attributes support. + +Original patch by Giampaolo Rodola, updated by Ying Wang. + +.. + +.. bpo: 36888 +.. date: 2019-05-16-18-02-08 +.. nonce: -H2Dkm +.. section: Library + +Python child processes can now access the status of their parent process +using multiprocessing.process.parent_process + +.. + +.. bpo: 36921 +.. date: 2019-05-15-21-35-23 +.. nonce: kA1306 +.. section: Library + +Deprecate ``@coroutine`` for sake of ``async def``. + +.. + +.. bpo: 25652 +.. date: 2019-05-14-21-39-52 +.. nonce: xLw42k +.. section: Library + +Fix bug in ``__rmod__`` of ``UserString`` - by Batuhan Taskaya. + +.. + +.. bpo: 36916 +.. date: 2019-05-14-15-39-34 +.. nonce: _GPsTt +.. section: Library + +Remove a message about an unhandled exception in a task when writer.write() +is used without await and writer.drain() fails with an exception. + +.. + +.. bpo: 36889 +.. date: 2019-05-14-12-25-44 +.. nonce: MChPqP +.. section: Library + +Introduce :class:`asyncio.Stream` class that merges +:class:`asyncio.StreamReader` and :class:`asyncio.StreamWriter` +functionality. :class:`asyncio.Stream` can work in readonly, writeonly and +readwrite modes. Provide :func:`asyncio.connect`, +:func:`asyncio.connect_unix`, :func:`asyncio.connect_read_pipe` and +:func:`asyncio.connect_write_pipe` factories to open :class:`asyncio.Stream` +connections. Provide :class:`asyncio.StreamServer` and +:class:`UnixStreamServer` to serve servers with asyncio.Stream API. Modify +:func:`asyncio.create_subprocess_shell` and +:func:`asyncio.create_subprocess_exec` to use :class:`asyncio.Stream` +instead of deprecated :class:`StreamReader` and :class:`StreamWriter`. +Deprecate :class:`asyncio.StreamReader` and :class:`asyncio.StreamWriter`. +Deprecate usage of private classes, e.g. :class:`asyncio.FlowControlMixing` +and :class:`asyncio.StreamReaderProtocol` outside of asyncio package. + +.. + +.. bpo: 36845 +.. date: 2019-05-14-07-57-02 +.. nonce: _GtFFf +.. section: Library + +Added validation of integer prefixes to the construction of IP networks and +interfaces in the ipaddress module. + +.. + +.. bpo: 23378 +.. date: 2019-05-14-05-38-22 +.. nonce: R25teI +.. section: Library + +Add an extend action to argparser. + +.. + +.. bpo: 36867 +.. date: 2019-05-13-13-02-43 +.. nonce: Qh-6mX +.. section: Library + +Fix a bug making a SharedMemoryManager instance and its parent process use +two separate resource_tracker processes. + +.. + +.. bpo: 23896 +.. date: 2019-05-13-05-49-15 +.. nonce: 8TtUKo +.. section: Library + +Adds a grammar to lib2to3.pygram that contains exec as a function not as +statement. + +.. + +.. bpo: 36895 +.. date: 2019-05-12-14-49-13 +.. nonce: ZZuuY7 +.. section: Library + +The function ``time.clock()`` was deprecated in 3.3 in favor of +``time.perf_counter()`` and marked for removal in 3.8, it has removed. + +.. + +.. bpo: 35545 +.. date: 2019-05-11-16-21-29 +.. nonce: FcvJvP +.. section: Library + +Fix asyncio discarding IPv6 scopes when ensuring hostname resolutions +internally + +.. + +.. bpo: 36887 +.. date: 2019-05-11-14-50-59 +.. nonce: XD3f22 +.. section: Library + +Add new function :func:`math.isqrt` to compute integer square roots. + +.. + +.. bpo: 34632 +.. date: 2019-05-11-02-30-45 +.. nonce: 8MXa7T +.. section: Library + +Introduce the ``importlib.metadata`` module with (provisional) support for +reading metadata from third-party packages. + +.. + +.. bpo: 36878 +.. date: 2019-05-10-22-00-06 +.. nonce: iigeqk +.. section: Library + +When using `type_comments=True` in `ast.parse`, treat `# type: ignore` +followed by a non-alphanumeric character and then arbitrary text as a type +ignore, instead of requiring nothing but whitespace or another comment. This +is to permit formations such as `# type: ignore[E1000]`. + +.. + +.. bpo: 36778 +.. date: 2019-05-10-01-06-36 +.. nonce: GRqeiS +.. section: Library + +``cp65001`` encoding (Windows code page 65001) becomes an alias to ``utf_8`` +encoding. + +.. + +.. bpo: 36867 +.. date: 2019-05-09-18-12-55 +.. nonce: FuwVTi +.. section: Library + +The multiprocessing.resource_tracker replaces the +multiprocessing.semaphore_tracker module. Other than semaphores, +resource_tracker also tracks shared_memory segments. + +.. + +.. bpo: 30262 +.. date: 2019-05-09-12-38-40 +.. nonce: Tu74ak +.. section: Library + +The ``Cache`` and ``Statement`` objects of the :mod:`sqlite3` module are not +exposed to the user. Patch by Aviv Palivoda. + +.. + +.. bpo: 24538 +.. date: 2019-05-09-08-35-18 +.. nonce: WK8Y-k +.. section: Library + +In `shutil.copystat()`, first copy extended file attributes and then file +permissions, since extended attributes can only be set on the destination +while it is still writeable. + +.. + +.. bpo: 36829 +.. date: 2019-05-08-12-51-37 +.. nonce: 8enFMA +.. section: Library + +Add new :func:`sys.unraisablehook` function which can be overridden to +control how "unraisable exceptions" are handled. It is called when an +exception has occurred but there is no way for Python to handle it. For +example, when a destructor raises an exception or during garbage collection +(:func:`gc.collect`). + +.. + +.. bpo: 36832 +.. date: 2019-05-07-15-00-45 +.. nonce: TExgqb +.. section: Library + +Introducing ``zipfile.Path``, a pathlib-compatible wrapper for traversing +zip files. + +.. + +.. bpo: 36814 +.. date: 2019-05-06-23-13-26 +.. nonce: dSeMz_ +.. section: Library + +Fix an issue where os.posix_spawnp() would incorrectly raise a TypeError +when file_actions is None. + +.. + +.. bpo: 33110 +.. date: 2019-05-06-22-34-47 +.. nonce: rSJSCh +.. section: Library + +Handle exceptions raised by functions added by concurrent.futures +add_done_callback correctly when the Future has already completed. + +.. + +.. bpo: 26903 +.. date: 2019-05-06-19-17-04 +.. nonce: 4payXb +.. section: Library + +Limit `max_workers` in `ProcessPoolExecutor` to 61 to work around a +WaitForMultipleObjects limitation. + +.. + +.. bpo: 36813 +.. date: 2019-05-06-18-28-38 +.. nonce: NXD0KZ +.. section: Library + +Fix :class:`~logging.handlers.QueueListener` to call ``queue.task_done()`` +upon stopping. Patch by Bar Harel. + +.. + +.. bpo: 36806 +.. date: 2019-05-05-16-14-38 +.. nonce: rAzF-x +.. section: Library + +Forbid creation of asyncio stream objects like StreamReader, StreamWriter, +Process, and their protocols outside of asyncio package. + +.. + +.. bpo: 36802 +.. date: 2019-05-05-10-12-23 +.. nonce: HYMc8P +.. section: Library + +Provide both sync and async calls for StreamWriter.write() and +StreamWriter.close() + +.. + +.. bpo: 36801 +.. date: 2019-05-05-09-45-44 +.. nonce: XrlFFs +.. section: Library + +Properly handle SSL connection closing in asyncio StreamWriter.drain() call. + +.. + +.. bpo: 36785 +.. date: 2019-05-03-20-47-55 +.. nonce: PQLnPq +.. section: Library + +Implement PEP 574 (pickle protocol 5 with out-of-band buffers). + +.. + +.. bpo: 36772 +.. date: 2019-05-01-20-41-53 +.. nonce: fV2K0F +.. section: Library + +functools.lru_cache() can now be used as a straight decorator in addition to +its existing usage as a function that returns a decorator. + +.. + +.. bpo: 6584 +.. date: 2019-04-30-04-34-53 +.. nonce: Hzp9-P +.. section: Library + +Add a :exc:`~gzip.BadGzipFile` exception to the :mod:`gzip` module. + +.. + +.. bpo: 36748 +.. date: 2019-04-29-15-18-13 +.. nonce: YBKWps +.. section: Library + +Optimized write buffering in C implementation of ``TextIOWrapper``. Writing +ASCII string to ``TextIOWrapper`` with ascii, latin1, or utf-8 encoding is +about 20% faster. Patch by Inada Naoki. + +.. + +.. bpo: 8138 +.. date: 2019-04-27-02-54-23 +.. nonce: osBRGI +.. section: Library + +Don't mark ``wsgiref.simple_server.SimpleServer`` as multi-threaded since +``wsgiref.simple_server.WSGIServer`` is single-threaded. + +.. + +.. bpo: 22640 +.. date: 2019-04-26-22-13-26 +.. nonce: p3rheW +.. section: Library + +:func:`py_compile.compile` now supports silent mode. Patch by Joannah +Nanjekye + +.. + +.. bpo: 29183 +.. date: 2019-04-22-22-55-29 +.. nonce: MILvsk +.. section: Library + +Fix double exceptions in :class:`wsgiref.handlers.BaseHandler` by calling +its :meth:`~wsgiref.handlers.BaseHandler.close` method only when no +exception is raised. + +.. + +.. bpo: 36548 +.. date: 2019-04-07-14-30-10 +.. nonce: CJQiYw +.. section: Library + +Improved the repr of regular expression flags. + +.. + +.. bpo: 36542 +.. date: 2019-04-06-12-36-09 +.. nonce: Q0qyYV +.. section: Library + +The signature of Python functions can now be overridden by specifying the +``__text_signature__`` attribute. + +.. + +.. bpo: 36533 +.. date: 2019-04-06-00-55-09 +.. nonce: kzMyRH +.. section: Library + +Reinitialize logging.Handler locks in forked child processes instead of +attempting to acquire them all in the parent before forking only to be +released in the child process. The acquire/release pattern was leading to +deadlocks in code that has implemented any form of chained logging handlers +that depend upon one another as the lock acquision order cannot be +guaranteed. + +.. + +.. bpo: 35252 +.. date: 2019-04-02-19-23-12 +.. nonce: VooTVv +.. section: Library + +Throw a TypeError instead of an AssertionError when using an invalid type +annotation with singledispatch. + +.. + +.. bpo: 35900 +.. date: 2019-03-27-15-09-00 +.. nonce: fh56UU +.. section: Library + +Allow reduction methods to return a 6-item tuple where the 6th item +specifies a custom state-setting method that's called instead of the regular +``__setstate__`` method. + +.. + +.. bpo: 35900 +.. date: 2019-03-22-22-40-00 +.. nonce: oiee0o +.. section: Library + +enable custom reduction callback registration for functions and classes in +_pickle.c, using the new Pickler's attribute ``reducer_override`` + +.. + +.. bpo: 36368 +.. date: 2019-03-21-16-00-00 +.. nonce: zsRT1 +.. section: Library + +Fix a bug crashing SharedMemoryManager instances in interactive sessions +after a ctrl-c (KeyboardInterrupt) was sent + +.. + +.. bpo: 31904 +.. date: 2019-03-18-14-25-36 +.. nonce: ds3d67 +.. section: Library + +Fix mmap fail for VxWorks + +.. + +.. bpo: 27497 +.. date: 2019-03-13-10-57-41 +.. nonce: JDmIe_ +.. section: Library + +:meth:`csv.DictWriter.writeheader` now returns the return value of the +underlying :meth:`csv.Writer.writerow` method. Patch contributed by Ashish +Nitin Patil. + +.. + +.. bpo: 36239 +.. date: 2019-03-09-23-51-27 +.. nonce: BHJ3Ln +.. section: Library + +Parsing .mo files now ignores comments starting and ending with #-#-#-#-#. + +.. + +.. bpo: 26707 +.. date: 2019-03-04-01-28-33 +.. nonce: QY4kRZ +.. section: Library + +Enable plistlib to read and write binary plist files that were created as a +KeyedArchive file. Specifically, this allows the plistlib to process 0x80 +tokens as UID objects. + +.. + +.. bpo: 31904 +.. date: 2019-03-01-17-59-39 +.. nonce: 38djdk +.. section: Library + +Add posix module support for VxWorks. + +.. + +.. bpo: 35125 +.. date: 2019-02-15-17-18-50 +.. nonce: h0xk0f +.. section: Library + +Asyncio: Remove inner callback on outer cancellation in shield + +.. + +.. bpo: 35721 +.. date: 2019-01-18-16-23-00 +.. nonce: d8djAJ +.. section: Library + +Fix :meth:`asyncio.SelectorEventLoop.subprocess_exec()` leaks file +descriptors if ``Popen`` fails and called with ``stdin=subprocess.PIPE``. +Patch by Niklas Fiekas. + +.. + +.. bpo: 31855 +.. date: 2019-01-11-17-09-15 +.. nonce: PlhfsX +.. section: Library + +:func:`unittest.mock.mock_open` results now respects the argument of +read([size]). Patch contributed by R?mi Lapeyre. + +.. + +.. bpo: 35431 +.. date: 2019-01-02-19-48-23 +.. nonce: FhG6QA +.. section: Library + +Implement :func:`math.comb` that returns binomial coefficient, that computes +the number of ways to choose k items from n items without repetition and +without order. Patch by Yash Aggarwal and Keller Fuchs. + +.. + +.. bpo: 26660 +.. date: 2018-11-04-16-39-46 +.. nonce: RdXz8a +.. section: Library + +Fixed permission errors in :class:`~tempfile.TemporaryDirectory` clean up. +Previously ``TemporaryDirectory.cleanup()`` failed when non-writeable or +non-searchable files or directories were created inside a temporary +directory. + +.. + +.. bpo: 34271 +.. date: 2018-10-21-17-39-32 +.. nonce: P15VLM +.. section: Library + +Add debugging helpers to ssl module. It's now possible to dump key material +and to trace TLS protocol. The default and stdlib contexts also support +SSLKEYLOGFILE env var. + +.. + +.. bpo: 26467 +.. date: 2018-09-13-20-33-24 +.. nonce: cahAk3 +.. section: Library + +Added AsyncMock to support using unittest to mock asyncio coroutines. Patch +by Lisa Roach. + +.. + +.. bpo: 33569 +.. date: 2018-08-28-03-00-12 +.. nonce: 45YlGG +.. section: Library + +dataclasses.InitVar: Exposes the type used to create the init var. + +.. + +.. bpo: 34424 +.. date: 2018-08-18-14-47-00 +.. nonce: wAlRuS +.. section: Library + +Fix serialization of messages containing encoded strings when the +policy.linesep is set to a multi-character string. Patch by Jens Troeger. + +.. + +.. bpo: 34303 +.. date: 2018-08-03-09-47-20 +.. nonce: tOE2HP +.. section: Library + +Performance of :func:`functools.reduce` is slightly improved. Patch by +Sergey Fedoseev. + +.. + +.. bpo: 33361 +.. date: 2018-07-13-20-17-17 +.. nonce: dx2NVn +.. section: Library + +Fix a bug in :class:`codecs.StreamRecoder` where seeking might leave old +data in a buffer and break subsequent read calls. Patch by Ammar Askar. + +.. + +.. bpo: 22454 +.. date: 2018-06-10-17-48-07 +.. nonce: qeiy_X +.. section: Library + +The :mod:`shlex` module now exposes :func:`shlex.join`, the inverse of +:func:`shlex.split`. Patch by Bo Bayles. + +.. + +.. bpo: 31922 +.. date: 2018-05-30-01-05-50 +.. nonce: fobsXJ +.. section: Library + +:meth:`asyncio.AbstractEventLoop.create_datagram_endpoint`: Do not connect +UDP socket when broadcast is allowed. This allows to receive replies after a +UDP broadcast. + +.. + +.. bpo: 24882 +.. date: 2018-04-04-14-54-30 +.. nonce: urybpa +.. section: Library + +Change ThreadPoolExecutor to use existing idle threads before spinning up +new ones. + +.. + +.. bpo: 31961 +.. date: 2018-03-27-13-28-16 +.. nonce: GjLoYu +.. section: Library + +Added support for bytes and path-like objects in :func:`subprocess.Popen` on +Windows. The *args* parameter now accepts a :term:`path-like object` if +*shell* is ``False`` and a sequence containing bytes and path-like objects. +The *executable* parameter now accepts a bytes and :term:`path-like object`. +The *cwd* parameter now accepts a bytes object. Based on patch by Anders +Lorentsen. + +.. + +.. bpo: 33123 +.. date: 2018-03-22-19-13-19 +.. nonce: _Y5ooE +.. section: Library + +:class:`pathlib.Path.unlink` now accepts a *missing_ok* parameter to avoid a +:exc:`FileNotFoundError` from being raised. Patch by Robert Buchholz. + +.. + +.. bpo: 32941 +.. date: 2018-03-20-20-57-00 +.. nonce: 9FU0gL +.. section: Library + +Allow :class:`mmap.mmap` objects to access the madvise() system call +(through :meth:`mmap.mmap.madvise`). + +.. + +.. bpo: 22102 +.. date: 2018-03-08-16-15-00 +.. nonce: th33uD +.. section: Library + +Added support for ZIP files with disks set to 0. Such files are commonly +created by builtin tools on Windows when use ZIP64 extension. Patch by +Francisco Facioni. + +.. + +.. bpo: 32515 +.. date: 2018-01-07-21-04-50 +.. nonce: D8_Wcb +.. section: Library + +trace.py can now run modules via python3 -m trace -t --module module_name + +.. + +.. bpo: 32299 +.. date: 2017-12-13-17-49-56 +.. nonce: eqAPWs +.. section: Library + +Changed :func:`unittest.mock.patch.dict` to return the patched dictionary +when used as context manager. Patch by Vadim Tsander. + +.. + +.. bpo: 27141 +.. date: 2017-10-24-00-42-14 +.. nonce: zbAgSs +.. section: Library + +Added a ``__copy__()`` to ``collections.UserList`` and +``collections.UserDict`` in order to correctly implement shallow copying of +the objects. Patch by Bar Harel. + +.. + +.. bpo: 31829 +.. date: 2017-10-21-12-07-56 +.. nonce: 6IhP-O +.. section: Library + +``\r``, ``\0`` and ``\x1a`` (end-of-file on Windows) are now escaped in +protocol 0 pickles of Unicode strings. This allows to load them without loss +from files open in text mode in Python 2. + +.. + +.. bpo: 23395 +.. date: 2016-07-27-11-06-43 +.. nonce: MuCEX9 +.. section: Library + +``_thread.interrupt_main()`` now avoids setting the Python error status if +the ``SIGINT`` signal is ignored or not handled by Python. + +.. + +.. bpo: 36896 +.. date: 2019-05-31-10-46-36 +.. nonce: wkXTW9 +.. section: Documentation + +Clarify that some types have unstable constructor signature between Python +versions. + +.. + +.. bpo: 36686 +.. date: 2019-05-27-17-28-58 +.. nonce: Zot4sx +.. section: Documentation + +Improve documentation of the stdin, stdout, and stderr arguments of of the +``asyncio.subprocess_exec`` function to specficy which values are supported. +Also mention that decoding as text is not supported. + +Add a few tests to verify that the various values passed to the std* +arguments actually work. + +.. + +.. bpo: 36984 +.. date: 2019-05-20-22-21-17 +.. nonce: IjZlmS +.. section: Documentation + +Improve version added references in ``typing`` module - by Anthony Sottile. + +.. + +.. bpo: 36868 +.. date: 2019-05-11-17-42-15 +.. nonce: yioL0R +.. section: Documentation + +What's new now mentions SSLContext.hostname_checks_common_name instead of +SSLContext.host_flags. + +.. + +.. bpo: 35924 +.. date: 2019-05-08-13-17-44 +.. nonce: lqbNpW +.. section: Documentation + +Add a note to the ``curses.addstr()`` documentation to warn that multiline +strings can cause segfaults because of an ncurses bug. + +.. + +.. bpo: 36783 +.. date: 2019-05-07-02-30-51 +.. nonce: gpC8E2 +.. section: Documentation + +Added C API Documentation for Time_FromTimeAndFold and +PyDateTime_FromDateAndTimeAndFold as per PEP 495. Patch by Edison Abahurire. + +.. + +.. bpo: 36797 +.. date: 2019-05-05-07-58-50 +.. nonce: W1X4On +.. section: Documentation + +More of the legacy distutils documentation has been either pruned, or else +more clearly marked as being retained solely until the setuptools +documentation covers it independently. + +.. + +.. bpo: 22865 +.. date: 2019-02-21-18-13-50 +.. nonce: 6hg6J8 +.. section: Documentation + +Add detail to the documentation on the `pty.spawn` function. + +.. + +.. bpo: 35397 +.. date: 2019-01-09-17-56-35 +.. nonce: ZMreIz +.. section: Documentation + +Remove deprecation and document urllib.parse.unwrap(). Patch contributed by +R?mi Lapeyre. + +.. + +.. bpo: 32995 +.. date: 2018-10-07-03-04-57 +.. nonce: TXN9ur +.. section: Documentation + +Added the context variable in glossary. + +.. + +.. bpo: 33519 +.. date: 2018-05-17-21-02-00 +.. nonce: Q7s2FB +.. section: Documentation + +Clarify that `copy()` is not part of the `MutableSequence` ABC. + +.. + +.. bpo: 33482 +.. date: 2018-05-13-10-36-37 +.. nonce: jalAaQ +.. section: Documentation + +Make `codecs.StreamRecoder.writelines` take a list of bytes. + +.. + +.. bpo: 25735 +.. date: 2018-04-08-19-09-22 +.. nonce: idVQBD +.. section: Documentation + +Added documentation for func factorial to indicate that returns integer +values + +.. + +.. bpo: 20285 +.. date: 2017-12-08-20-30-37 +.. nonce: cfnp0J +.. section: Documentation + +Expand object.__doc__ (docstring) to make it clearer. Modify pydoc.py so +that help(object) lists object methods (for other classes, help omits +methods of the object base class.) + +.. + +.. bpo: 37069 +.. date: 2019-06-03-02-30-36 +.. nonce: rVtdLk +.. section: Tests + +Modify test_coroutines, test_cprofile, test_generators, test_raise, test_ssl +and test_yield_from to use :func:`test.support.catch_unraisable_exception` +rather than :func:`test.support.captured_stderr`. + +.. + +.. bpo: 37098 +.. date: 2019-05-30-10-57-39 +.. nonce: SfXt1M +.. section: Tests + +Fix test_memfd_create on older Linux Kernels. + +.. + +.. bpo: 37081 +.. date: 2019-05-28-17-48-22 +.. nonce: qxB-1l +.. section: Tests + +Test with OpenSSL 1.1.1c + +.. + +.. bpo: 36829 +.. date: 2019-05-22-12-57-15 +.. nonce: e9mRWC +.. section: Tests + +Add :func:`test.support.catch_unraisable_exception`: context manager +catching unraisable exception using :func:`sys.unraisablehook`. + +.. + +.. bpo: 36915 +.. date: 2019-05-14-14-12-24 +.. nonce: 58b7pH +.. section: Tests + +The main regrtest process now always removes all temporary directories of +worker processes even if they crash or if they are killed on +KeyboardInterrupt (CTRL+c). + +.. + +.. bpo: 36719 +.. date: 2019-05-10-01-50-30 +.. nonce: O84ZWv +.. section: Tests + +"python3 -m test -jN ..." now continues the execution of next tests when a +worker process crash (CHILD_ERROR state). Previously, the test suite stopped +immediately. Use --failfast to stop at the first error. + +.. + +.. bpo: 36816 +.. date: 2019-05-08-15-55-46 +.. nonce: WBKRGZ +.. section: Tests + +Update Lib/test/selfsigned_pythontestdotnet.pem to match +self-signed.pythontest.net's new TLS certificate. + +.. + +.. bpo: 35925 +.. date: 2019-05-06-18-29-54 +.. nonce: gwQPuC +.. section: Tests + +Skip httplib and nntplib networking tests when they would otherwise fail due +to a modern OS or distro with a default OpenSSL policy of rejecting +connections to servers with weak certificates. + +.. + +.. bpo: 36782 +.. date: 2019-05-04-21-25-19 +.. nonce: h3oPIb +.. section: Tests + +Add tests for several C API functions in the :mod:`datetime` module. Patch +by Edison Abahurire. + +.. + +.. bpo: 36342 +.. date: 2019-03-23-13-58-49 +.. nonce: q6Quiq +.. section: Tests + +Fix test_multiprocessing in test_venv if platform lacks functioning +sem_open. + +.. + +.. bpo: 36721 +.. date: 2019-05-22-16-19-18 +.. nonce: 9aRwfZ +.. section: Build + +To embed Python into an application, a new ``--embed`` option must be passed +to ``python3-config --libs --embed`` to get ``-lpython3.8`` (link the +application to libpython). To support both 3.8 and older, try +``python3-config --libs --embed`` first and fallback to ``python3-config +--libs`` (without ``--embed``) if the previous command fails. + +Add a pkg-config ``python-3.8-embed`` module to embed Python into an +application: ``pkg-config python-3.8-embed --libs`` includes +``-lpython3.8``. To support both 3.8 and older, try ``pkg-config +python-X.Y-embed --libs`` first and fallback to ``pkg-config python-X.Y +--libs`` (without ``--embed``) if the previous command fails (replace +``X.Y`` with the Python version). + +On the other hand, ``pkg-config python3.8 --libs`` no longer contains +``-lpython3.8``. C extensions must not be linked to libpython (except on +Android, case handled by the script); this change is backward incompatible +on purpose. + +.. + +.. bpo: 36786 +.. date: 2019-05-03-21-08-06 +.. nonce: gOLFbD +.. section: Build + +"make install" now runs compileall in parallel. + +.. + +.. bpo: 36965 +.. date: 2019-05-20-20-26-36 +.. nonce: KsfI-N +.. section: Windows + +include of STATUS_CONTROL_C_EXIT without depending on MSC compiler + +.. + +.. bpo: 35926 +.. date: 2019-03-01-16-43-45 +.. nonce: mLszHo +.. section: Windows + +Update to OpenSSL 1.1.1b for Windows. + +.. + +.. bpo: 29883 +.. date: 2018-09-15-11-36-55 +.. nonce: HErerE +.. section: Windows + +Add Windows support for UDP transports for the Proactor Event Loop. Patch by +Adam Meily. + +.. + +.. bpo: 33407 +.. date: 2018-08-28-17-23-49 +.. nonce: ARG0W_ +.. section: Windows + +The :c:macro:`Py_DEPRECATED()` macro has been implemented for MSVC. + +.. + +.. bpo: 36231 +.. date: 2019-06-03-05-49-49 +.. nonce: RfmW_p +.. section: macOS + +Support building Python on macOS without /usr/include installed. As of macOS +10.14, system header files are only available within an SDK provided by +either the Command Line Tools or the Xcode app. + +.. + +.. bpo: 35610 +.. date: 2019-06-02-14-10-52 +.. nonce: 0w_v6Y +.. section: IDLE + +Replace now redundant .context_use_ps1 with .prompt_last_line. This finishes +change started in bpo-31858. + +.. + +.. bpo: 37038 +.. date: 2019-05-24-18-57-57 +.. nonce: AJ3RwQ +.. section: IDLE + +Make idlelib.run runnable; add test clause. + +.. + +.. bpo: 36958 +.. date: 2019-05-19-22-02-22 +.. nonce: DZUC6G +.. section: IDLE + +Print any argument other than None or int passed to SystemExit or +sys.exit(). + +.. + +.. bpo: 13102 +.. date: 2019-05-05-16-27-53 +.. nonce: AGNWYJ +.. section: IDLE + +When saving a file, call os.fsync() so bits are flushed to e.g. USB drive. + +.. + +.. bpo: 32411 +.. date: 2017-12-25-18-48-50 +.. nonce: vNwDhe +.. section: IDLE + +In browser.py, remove extraneous sorting by line number since dictionary was +created in line number order. + +.. + +.. bpo: 37053 +.. date: 2019-05-26-16-47-06 +.. nonce: -EYRuz +.. section: Tools/Demos + +Handle strings like u"bar" correctly in Tools/parser/unparse.py. Patch by +Chih-Hsuan Yen. + +.. + +.. bpo: 36763 +.. date: 2019-05-27-12-25-25 +.. nonce: bHCA9j +.. section: C API + +Implement the :pep:`587` "Python Initialization Configuration". + +.. + +.. bpo: 36379 +.. date: 2019-05-24-07-11-08 +.. nonce: 8zgoKe +.. section: C API + +Fix crashes when attempting to use the *modulo* parameter when ``__ipow__`` +is implemented in C. + +.. + +.. bpo: 37107 +.. date: 2019-05-22-17-33-52 +.. nonce: 8BVPR- +.. section: C API + +Update :c:func:`PyObject_CallMethodObjArgs` and +``_PyObject_CallMethodIdObjArgs`` to use ``_PyObject_GetMethod`` to avoid +creating a bound method object in many cases. Patch by Michael J. Sullivan. + +.. + +.. bpo: 36974 +.. date: 2019-05-22-15-24-08 +.. nonce: TkySRe +.. section: C API + +Implement :pep:`590`: Vectorcall: a fast calling protocol for CPython. This +is a new protocol to optimize calls of custom callable objects. + +.. + +.. bpo: 36763 +.. date: 2019-05-17-19-23-24 +.. nonce: TswmDy +.. section: C API + +``Py_Main()`` now returns the exitcode rather than calling +``Py_Exit(exitcode)`` when calling ``PyErr_Print()`` if the current +exception type is ``SystemExit``. + +.. + +.. bpo: 36922 +.. date: 2019-05-15-10-46-55 +.. nonce: J3EFK_ +.. section: C API + +Add new type flag ``Py_TPFLAGS_METHOD_DESCRIPTOR`` for objects behaving like +unbound methods. These are objects supporting the optimization given by the +``LOAD_METHOD``/``CALL_METHOD`` opcodes. See PEP 590. + +.. + +.. bpo: 36728 +.. date: 2019-05-11-03-56-23 +.. nonce: FR-dMP +.. section: C API + +The :c:func:`PyEval_ReInitThreads` function has been removed from the C API. +It should not be called explicitly: use :c:func:`PyOS_AfterFork_Child` +instead. diff --git a/Misc/NEWS.d/next/Build/2019-05-03-21-08-06.bpo-36786.gOLFbD.rst b/Misc/NEWS.d/next/Build/2019-05-03-21-08-06.bpo-36786.gOLFbD.rst deleted file mode 100644 index 0fcda434a799..000000000000 --- a/Misc/NEWS.d/next/Build/2019-05-03-21-08-06.bpo-36786.gOLFbD.rst +++ /dev/null @@ -1 +0,0 @@ -"make install" now runs compileall in parallel. diff --git a/Misc/NEWS.d/next/Build/2019-05-22-16-19-18.bpo-36721.9aRwfZ.rst b/Misc/NEWS.d/next/Build/2019-05-22-16-19-18.bpo-36721.9aRwfZ.rst deleted file mode 100644 index 1c266586a33b..000000000000 --- a/Misc/NEWS.d/next/Build/2019-05-22-16-19-18.bpo-36721.9aRwfZ.rst +++ /dev/null @@ -1,16 +0,0 @@ -To embed Python into an application, a new ``--embed`` option must be passed to -``python3-config --libs --embed`` to get ``-lpython3.8`` (link the application -to libpython). To support both 3.8 and older, try ``python3-config --libs ---embed`` first and fallback to ``python3-config --libs`` (without ``--embed``) -if the previous command fails. - -Add a pkg-config ``python-3.8-embed`` module to embed Python into an -application: ``pkg-config python-3.8-embed --libs`` includes ``-lpython3.8``. -To support both 3.8 and older, try ``pkg-config python-X.Y-embed --libs`` first -and fallback to ``pkg-config python-X.Y --libs`` (without ``--embed``) if the -previous command fails (replace ``X.Y`` with the Python version). - -On the other hand, ``pkg-config python3.8 --libs`` no longer contains -``-lpython3.8``. C extensions must not be linked to libpython (except on -Android, case handled by the script); this change is backward incompatible on -purpose. diff --git a/Misc/NEWS.d/next/C API/2019-05-11-03-56-23.bpo-36728.FR-dMP.rst b/Misc/NEWS.d/next/C API/2019-05-11-03-56-23.bpo-36728.FR-dMP.rst deleted file mode 100644 index c691cc412c21..000000000000 --- a/Misc/NEWS.d/next/C API/2019-05-11-03-56-23.bpo-36728.FR-dMP.rst +++ /dev/null @@ -1,2 +0,0 @@ -The :c:func:`PyEval_ReInitThreads` function has been removed from the C API. -It should not be called explicitly: use :c:func:`PyOS_AfterFork_Child` instead. diff --git a/Misc/NEWS.d/next/C API/2019-05-15-10-46-55.bpo-36922.J3EFK_.rst b/Misc/NEWS.d/next/C API/2019-05-15-10-46-55.bpo-36922.J3EFK_.rst deleted file mode 100644 index 8eee208f905b..000000000000 --- a/Misc/NEWS.d/next/C API/2019-05-15-10-46-55.bpo-36922.J3EFK_.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add new type flag ``Py_TPFLAGS_METHOD_DESCRIPTOR`` for objects behaving like -unbound methods. These are objects supporting the optimization given by the -``LOAD_METHOD``/``CALL_METHOD`` opcodes. See PEP 590. diff --git a/Misc/NEWS.d/next/C API/2019-05-17-19-23-24.bpo-36763.TswmDy.rst b/Misc/NEWS.d/next/C API/2019-05-17-19-23-24.bpo-36763.TswmDy.rst deleted file mode 100644 index 29c016600dbf..000000000000 --- a/Misc/NEWS.d/next/C API/2019-05-17-19-23-24.bpo-36763.TswmDy.rst +++ /dev/null @@ -1,3 +0,0 @@ -``Py_Main()`` now returns the exitcode rather than calling -``Py_Exit(exitcode)`` when calling ``PyErr_Print()`` if the current -exception type is ``SystemExit``. diff --git a/Misc/NEWS.d/next/C API/2019-05-22-15-24-08.bpo-36974.TkySRe.rst b/Misc/NEWS.d/next/C API/2019-05-22-15-24-08.bpo-36974.TkySRe.rst deleted file mode 100644 index c51c2e2419d1..000000000000 --- a/Misc/NEWS.d/next/C API/2019-05-22-15-24-08.bpo-36974.TkySRe.rst +++ /dev/null @@ -1,2 +0,0 @@ -Implement :pep:`590`: Vectorcall: a fast calling protocol for CPython. -This is a new protocol to optimize calls of custom callable objects. diff --git a/Misc/NEWS.d/next/C API/2019-05-22-17-33-52.bpo-37107.8BVPR-.rst b/Misc/NEWS.d/next/C API/2019-05-22-17-33-52.bpo-37107.8BVPR-.rst deleted file mode 100644 index 4a9e58f71554..000000000000 --- a/Misc/NEWS.d/next/C API/2019-05-22-17-33-52.bpo-37107.8BVPR-.rst +++ /dev/null @@ -1,4 +0,0 @@ -Update :c:func:`PyObject_CallMethodObjArgs` and ``_PyObject_CallMethodIdObjArgs`` -to use ``_PyObject_GetMethod`` to avoid creating a bound method object in many -cases. -Patch by Michael J. Sullivan. diff --git a/Misc/NEWS.d/next/C API/2019-05-24-07-11-08.bpo-36379.8zgoKe.rst b/Misc/NEWS.d/next/C API/2019-05-24-07-11-08.bpo-36379.8zgoKe.rst deleted file mode 100644 index 6a699b2084e4..000000000000 --- a/Misc/NEWS.d/next/C API/2019-05-24-07-11-08.bpo-36379.8zgoKe.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix crashes when attempting to use the *modulo* parameter when ``__ipow__`` -is implemented in C. diff --git a/Misc/NEWS.d/next/C API/2019-05-27-12-25-25.bpo-36763.bHCA9j.rst b/Misc/NEWS.d/next/C API/2019-05-27-12-25-25.bpo-36763.bHCA9j.rst deleted file mode 100644 index fc5a48107cfd..000000000000 --- a/Misc/NEWS.d/next/C API/2019-05-27-12-25-25.bpo-36763.bHCA9j.rst +++ /dev/null @@ -1 +0,0 @@ -Implement the :pep:`587` "Python Initialization Configuration". diff --git a/Misc/NEWS.d/next/Core and Builtins/2017-10-24-17-26-58.bpo-31862.5Gea8L.rst b/Misc/NEWS.d/next/Core and Builtins/2017-10-24-17-26-58.bpo-31862.5Gea8L.rst deleted file mode 100644 index 0e80cdc6924f..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2017-10-24-17-26-58.bpo-31862.5Gea8L.rst +++ /dev/null @@ -1,2 +0,0 @@ -Port binascii to PEP 489 multiphase initialization. -Patch by Marcel Plch. diff --git a/Misc/NEWS.d/next/Core and Builtins/2017-12-21-20-37-40.bpo-32388.6w-i5t.rst b/Misc/NEWS.d/next/Core and Builtins/2017-12-21-20-37-40.bpo-32388.6w-i5t.rst deleted file mode 100644 index 60615d47f60d..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2017-12-21-20-37-40.bpo-32388.6w-i5t.rst +++ /dev/null @@ -1 +0,0 @@ -Remove cross-version binary compatibility requirement in tp_flags. diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-05-30-23-43-03.bpo-26826.NkRzjb.rst b/Misc/NEWS.d/next/Core and Builtins/2018-05-30-23-43-03.bpo-26826.NkRzjb.rst deleted file mode 100644 index 27d7f82a672d..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2018-05-30-23-43-03.bpo-26826.NkRzjb.rst +++ /dev/null @@ -1 +0,0 @@ -Expose :func:`copy_file_range` as a low level API in the :mod:`os` module. diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-07-04-16-57-59.bpo-20602.sDLElw.rst b/Misc/NEWS.d/next/Core and Builtins/2018-07-04-16-57-59.bpo-20602.sDLElw.rst deleted file mode 100644 index ab37a020d803..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2018-07-04-16-57-59.bpo-20602.sDLElw.rst +++ /dev/null @@ -1,2 +0,0 @@ -Do not clear :data:`sys.flags` and :data:`sys.float_info` during shutdown. -Patch by Zackery Spytz. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-02-13-16-47-19.bpo-35983.bNxsXv.rst b/Misc/NEWS.d/next/Core and Builtins/2019-02-13-16-47-19.bpo-35983.bNxsXv.rst deleted file mode 100644 index 1138df635dbb..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-02-13-16-47-19.bpo-35983.bNxsXv.rst +++ /dev/null @@ -1,3 +0,0 @@ -Added new trashcan macros to deal with a double deallocation that could occur -when the `tp_dealloc` of a subclass calls the `tp_dealloc` of a base class -and that base class uses the trashcan mechanism. Patch by Jeroen Demeyer. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-02-22-14-30-19.bpo-36035.-6dy1y.rst b/Misc/NEWS.d/next/Core and Builtins/2019-02-22-14-30-19.bpo-36035.-6dy1y.rst deleted file mode 100644 index 1e4f7ac71f33..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-02-22-14-30-19.bpo-36035.-6dy1y.rst +++ /dev/null @@ -1 +0,0 @@ -Added fix for broken symlinks in combination with pathlib \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-02-22-23-03-20.bpo-36084.86Eh4X.rst b/Misc/NEWS.d/next/Core and Builtins/2019-02-22-23-03-20.bpo-36084.86Eh4X.rst deleted file mode 100644 index fb28a6fec77a..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-02-22-23-03-20.bpo-36084.86Eh4X.rst +++ /dev/null @@ -1 +0,0 @@ -Add native thread ID (TID) to threading.Thread objects (supported platforms: Windows, FreeBSD, Linux, macOS) \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-02-24-12-44-46.bpo-36045.RO20OV.rst b/Misc/NEWS.d/next/Core and Builtins/2019-02-24-12-44-46.bpo-36045.RO20OV.rst deleted file mode 100644 index 7cab3ea8409d..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-02-24-12-44-46.bpo-36045.RO20OV.rst +++ /dev/null @@ -1 +0,0 @@ -builtins.help() now prefixes `async` for async functions diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-04-10-18-12-11.bpo-36594.fbnJAc.rst b/Misc/NEWS.d/next/Core and Builtins/2019-04-10-18-12-11.bpo-36594.fbnJAc.rst deleted file mode 100644 index 7ca5dd998d98..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-04-10-18-12-11.bpo-36594.fbnJAc.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix incorrect use of ``%p`` in format strings. -Patch by Zackery Spytz. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-04-13-16-14-16.bpo-36601.mIgS7t.rst b/Misc/NEWS.d/next/Core and Builtins/2019-04-13-16-14-16.bpo-36601.mIgS7t.rst deleted file mode 100644 index 0159aae65d75..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-04-13-16-14-16.bpo-36601.mIgS7t.rst +++ /dev/null @@ -1,2 +0,0 @@ -A long-since-meaningless check for ``getpid() == main_pid`` was removed -from Python's internal C signal handler. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst b/Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst deleted file mode 100644 index b0f32a5c6c3f..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst +++ /dev/null @@ -1,3 +0,0 @@ -pymalloc returns memory blocks aligned by 16 bytes, instead of 8 bytes, on -64-bit platforms to conform x86-64 ABI. Recent compilers assume this alignment -more often. Patch by Inada Naoki. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-04-29-03-27-22.bpo-24048.vXxUDQ.rst b/Misc/NEWS.d/next/Core and Builtins/2019-04-29-03-27-22.bpo-24048.vXxUDQ.rst deleted file mode 100644 index 27c86a47f4b9..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-04-29-03-27-22.bpo-24048.vXxUDQ.rst +++ /dev/null @@ -1 +0,0 @@ -Save the live exception during import.c's ``remove_module()``. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-02-11-48-08.bpo-36774.ZqbJ1J.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-02-11-48-08.bpo-36774.ZqbJ1J.rst deleted file mode 100644 index b73547c84a7d..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-05-02-11-48-08.bpo-36774.ZqbJ1J.rst +++ /dev/null @@ -1,7 +0,0 @@ -Add a ``=`` feature f-strings for debugging. This can precede ``!s``, -``!r``, or ``!a``. It produces the text of the expression, followed by -an equal sign, followed by the repr of the value of the expression. So -``f'{3*9+15=}'`` would be equal to the string ``'3*9+15=42'``. If -``=`` is specified, the default conversion is set to ``!r``, unless a -format spec is given, in which case the formatting behavior is -unchanged, and __format__ will be used. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-04-16-15-33.bpo-36793.Izog4Z.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-04-16-15-33.bpo-36793.Izog4Z.rst deleted file mode 100644 index 6c79f97dacac..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-05-04-16-15-33.bpo-36793.Izog4Z.rst +++ /dev/null @@ -1,3 +0,0 @@ -Removed ``__str__`` implementations from builtin types :class:`bool`, -:class:`int`, :class:`float`, :class:`complex` and few classes from the -standard library. They now inherit ``__str__()`` from :class:`object`. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-07-12-18-11.bpo-36737.XAo6LY.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-07-12-18-11.bpo-36737.XAo6LY.rst deleted file mode 100644 index 7a2c647dbff3..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-05-07-12-18-11.bpo-36737.XAo6LY.rst +++ /dev/null @@ -1,2 +0,0 @@ -Move PyRuntimeState.warnings into per-interpreter state (via "module -state"). diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-07-15-49-17.bpo-27639.b1Ah87.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-07-15-49-17.bpo-27639.b1Ah87.rst deleted file mode 100644 index ae5b915969d3..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-05-07-15-49-17.bpo-27639.b1Ah87.rst +++ /dev/null @@ -1,2 +0,0 @@ -Correct return type for UserList slicing operations. Patch by Michael Blahay, -Erick Cervantes, and vaultah diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-07-16-50-12.bpo-36842.NYww_N.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-07-16-50-12.bpo-36842.NYww_N.rst deleted file mode 100644 index 5e23d31a2485..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-05-07-16-50-12.bpo-36842.NYww_N.rst +++ /dev/null @@ -1 +0,0 @@ -Implement PEP 578, adding sys.audit, io.open_code and related APIs. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-07-17-12-37.bpo-34616.0Y0_9r.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-07-17-12-37.bpo-34616.0Y0_9r.rst deleted file mode 100644 index c264d21bd016..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-05-07-17-12-37.bpo-34616.0Y0_9r.rst +++ /dev/null @@ -1 +0,0 @@ -The ``compile()`` builtin functions now support the ``ast.PyCF_ALLOW_TOP_LEVEL_AWAIT`` flag, which allow to compile sources that contains top-level ``await``, ``async with`` or ``async for``. This is useful to evaluate async-code from with an already async functions; for example in a custom REPL. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-08-11-42-06.bpo-36851.J7DiCW.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-08-11-42-06.bpo-36851.J7DiCW.rst deleted file mode 100644 index 9973e4ee7161..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-05-08-11-42-06.bpo-36851.J7DiCW.rst +++ /dev/null @@ -1,2 +0,0 @@ -The ``FrameType`` stack is now correctly cleaned up if the execution ends -with a return and the stack is not empty. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-08-16-36-51.bpo-28866.qCv_bj.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-08-16-36-51.bpo-28866.qCv_bj.rst deleted file mode 100644 index 69017293649c..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-05-08-16-36-51.bpo-28866.qCv_bj.rst +++ /dev/null @@ -1,2 +0,0 @@ -Avoid caching attributes of classes which type defines mro() to avoid a hard -cache invalidation problem. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-08-20-42-40.bpo-36861.72mvZM.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-08-20-42-40.bpo-36861.72mvZM.rst deleted file mode 100644 index 79c339a779e8..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-05-08-20-42-40.bpo-36861.72mvZM.rst +++ /dev/null @@ -1 +0,0 @@ -Update the Unicode database to version 12.1.0. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-12-18-46-50.bpo-36027.Q4YatQ.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-12-18-46-50.bpo-36027.Q4YatQ.rst deleted file mode 100644 index 866309cddc68..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-05-12-18-46-50.bpo-36027.Q4YatQ.rst +++ /dev/null @@ -1,3 +0,0 @@ -Allow computation of modular inverses via three-argument ``pow``: the second -argument is now permitted to be negative in the case where the first and -third arguments are relatively prime. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-15-01-29-29.bpo-1875.9oxXFX.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-15-01-29-29.bpo-1875.9oxXFX.rst deleted file mode 100644 index 8f095ed9f16b..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-05-15-01-29-29.bpo-1875.9oxXFX.rst +++ /dev/null @@ -1,3 +0,0 @@ -A :exc:`SyntaxError` is now raised if a code blocks that will be optimized -away (e.g. if conditions that are always false) contains syntax errors. -Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-15-14-01-09.bpo-36826.GLrO3W.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-15-14-01-09.bpo-36826.GLrO3W.rst deleted file mode 100644 index 5a1b51999f26..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-05-15-14-01-09.bpo-36826.GLrO3W.rst +++ /dev/null @@ -1 +0,0 @@ -Add NamedExpression kind support to ast_unparse.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-16-23-53-45.bpo-36946.qjxr0Y.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-16-23-53-45.bpo-36946.qjxr0Y.rst deleted file mode 100644 index aa5de80a2943..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-05-16-23-53-45.bpo-36946.qjxr0Y.rst +++ /dev/null @@ -1 +0,0 @@ -Fix possible signed integer overflow when handling slices. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-17-12-28-24.bpo-36907.rk7kgp.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-17-12-28-24.bpo-36907.rk7kgp.rst deleted file mode 100644 index ae502e83ef68..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-05-17-12-28-24.bpo-36907.rk7kgp.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a crash when calling a C function with a keyword dict (``f(**kwargs)``) -and changing the dict ``kwargs`` while that function is running. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-17-18-34-30.bpo-2180.aBqHeW.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-17-18-34-30.bpo-2180.aBqHeW.rst deleted file mode 100644 index a2207c17aea0..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-05-17-18-34-30.bpo-2180.aBqHeW.rst +++ /dev/null @@ -1 +0,0 @@ -Treat line continuation at EOF as a ``SyntaxError`` by Anthony Sottile. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-21-16-21-22.bpo-36878.EFRHZ3.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-21-16-21-22.bpo-36878.EFRHZ3.rst deleted file mode 100644 index 00c8b904ac2a..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-05-21-16-21-22.bpo-36878.EFRHZ3.rst +++ /dev/null @@ -1,3 +0,0 @@ -Store text appearing after a `# type: ignore` comment in the AST. For -example a type ignore like `# type: ignore[E1000]` will have the string -`"[E1000]"` stored in its AST node. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-22-11-16-16.bpo-36878.QwLa3P.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-22-11-16-16.bpo-36878.QwLa3P.rst deleted file mode 100644 index 2d9f014119db..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-05-22-11-16-16.bpo-36878.QwLa3P.rst +++ /dev/null @@ -1,2 +0,0 @@ -Only accept text after `# type: ignore` if the first character is ASCII. -This is to disallow things like `# type: ignore?`. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-22-23-01-29.bpo-36829.MfOcUg.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-22-23-01-29.bpo-36829.MfOcUg.rst deleted file mode 100644 index 957a4857e408..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-05-22-23-01-29.bpo-36829.MfOcUg.rst +++ /dev/null @@ -1,4 +0,0 @@ -:c:func:`PyErr_WriteUnraisable` now creates a traceback object if there is -no current traceback. Moreover, call :c:func:`PyErr_NormalizeException` and -:c:func:`PyException_SetTraceback` to normalize the exception value. Ignore any -error. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-23-04-19-13.bpo-37007.d1SOtF.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-23-04-19-13.bpo-37007.d1SOtF.rst deleted file mode 100644 index ac344a57c83d..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-05-23-04-19-13.bpo-37007.d1SOtF.rst +++ /dev/null @@ -1,2 +0,0 @@ -Implement :func:`socket.if_nameindex()`, :func:`socket.if_nametoindex()`, and -:func:`socket.if_indextoname()` on Windows. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-24-12-38-40.bpo-37032.T8rSH8.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-24-12-38-40.bpo-37032.T8rSH8.rst deleted file mode 100644 index 7e31a84eb468..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-05-24-12-38-40.bpo-37032.T8rSH8.rst +++ /dev/null @@ -1 +0,0 @@ -Added new ``replace()`` method to the code type (:class:`types.CodeType`). diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-25-08-18-01.bpo-26836.rplYWW.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-25-08-18-01.bpo-26836.rplYWW.rst deleted file mode 100644 index bbf63ec82ca6..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-05-25-08-18-01.bpo-26836.rplYWW.rst +++ /dev/null @@ -1 +0,0 @@ -Add :func:`os.memfd_create`. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-25-17-18-26.bpo-22385.VeVvhJ.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-25-17-18-26.bpo-22385.VeVvhJ.rst deleted file mode 100644 index e10690b3a560..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-05-25-17-18-26.bpo-22385.VeVvhJ.rst +++ /dev/null @@ -1,4 +0,0 @@ -The `bytes.hex`, `bytearray.hex`, and `memoryview.hex` methods as well as -the `binascii.hexlify` and `b2a_hex` functions now have the ability to -include an optional separator between hex bytes. This functionality was -inspired by MicroPython's hexlify implementation. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-27-14-46-24.bpo-37050.7MyZGg.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-27-14-46-24.bpo-37050.7MyZGg.rst deleted file mode 100644 index 0667c8ebd148..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-05-27-14-46-24.bpo-37050.7MyZGg.rst +++ /dev/null @@ -1,4 +0,0 @@ -Improve the AST for "debug" f-strings, which use '=' to print out the source -of the expression being evaluated. Delete expr_text from the FormattedValue -node, and instead use a Constant string node (possibly merged with adjacent -constant expressions inside the f-string). diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-27-18-00-19.bpo-26423.RgUOE8.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-27-18-00-19.bpo-26423.RgUOE8.rst deleted file mode 100644 index 6bf2031a3384..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-05-27-18-00-19.bpo-26423.RgUOE8.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix possible overflow in ``wrap_lenfunc()`` when -``sizeof(long) < sizeof(Py_ssize_t)`` (e.g., 64-bit Windows). diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-28-17-02-46.bpo-37029.MxpgfJ.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-28-17-02-46.bpo-37029.MxpgfJ.rst deleted file mode 100644 index c18f5d23eaa2..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-05-28-17-02-46.bpo-37029.MxpgfJ.rst +++ /dev/null @@ -1 +0,0 @@ -Freeing a great many small objects could take time quadratic in the number of arenas, due to using linear search to keep ``obmalloc.c``'s list of usable arenas sorted by order of number of free memory pools. This is accomplished without search now, leaving the worst-case time linear in the number of arenas. For programs where this quite visibly matters (typically with more than 100 thousand small objects alive simultaneously), this can greatly reduce the time needed to release their memory. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-28-18-18-55.bpo-37072.1Hewl3.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-28-18-18-55.bpo-37072.1Hewl3.rst deleted file mode 100644 index 15bcc5ed2bb0..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-05-28-18-18-55.bpo-37072.1Hewl3.rst +++ /dev/null @@ -1 +0,0 @@ -Fix crash in PyAST_FromNodeObject() when flags is NULL. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-29-22-03-09.bpo-26219.Ovf1Qs.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-29-22-03-09.bpo-26219.Ovf1Qs.rst deleted file mode 100644 index a4ee7b580bc8..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-05-29-22-03-09.bpo-26219.Ovf1Qs.rst +++ /dev/null @@ -1,3 +0,0 @@ -Implemented per opcode cache mechanism and ``LOAD_GLOBAL`` instruction use -it. ``LOAD_GLOBAL`` is now about 40% faster. Contributed by Yury Selivanov, -and Inada Naoki. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-30-17-33-55.bpo-37087.vElenE.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-30-17-33-55.bpo-37087.vElenE.rst deleted file mode 100644 index a45330fed999..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-05-30-17-33-55.bpo-37087.vElenE.rst +++ /dev/null @@ -1 +0,0 @@ -Add native thread ID (TID) support to OpenBSD. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-31-11-55-49.bpo-20092.KIMjBW.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-31-11-55-49.bpo-20092.KIMjBW.rst deleted file mode 100644 index 7536dc33c9f1..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-05-31-11-55-49.bpo-20092.KIMjBW.rst +++ /dev/null @@ -1,4 +0,0 @@ -Constructors of :class:`int`, :class:`float` and :class:`complex` will now -use the :meth:`~object.__index__` special method, if available and the -corresponding method :meth:`~object.__int__`, :meth:`~object.__float__` -or :meth:`~object.__complex__` is not available. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-06-01-16-53-41.bpo-37122.dZ3-NY.rst b/Misc/NEWS.d/next/Core and Builtins/2019-06-01-16-53-41.bpo-37122.dZ3-NY.rst deleted file mode 100644 index b9584b50e61d..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-06-01-16-53-41.bpo-37122.dZ3-NY.rst +++ /dev/null @@ -1,5 +0,0 @@ -Make the *co_argcount* attribute of code objects represent the total number -of positional arguments (including positional-only arguments). The value of -*co_posonlyargcount* can be used to distinguish which arguments are -positional only, and the difference (*co_argcount* - *co_posonlyargcount*) -is the number of positional-or-keyword arguments. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-06-01-20-03-13.bpo-37126.tP6lL4.rst b/Misc/NEWS.d/next/Core and Builtins/2019-06-01-20-03-13.bpo-37126.tP6lL4.rst deleted file mode 100644 index 069b064dfa61..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-06-01-20-03-13.bpo-37126.tP6lL4.rst +++ /dev/null @@ -1,2 +0,0 @@ -All structseq objects are now tracked by the garbage collector. Patch by -Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-06-03-00-51-02.bpo-35814.Cf7sGY.rst b/Misc/NEWS.d/next/Core and Builtins/2019-06-03-00-51-02.bpo-35814.Cf7sGY.rst deleted file mode 100644 index 2b9f00a6d9e7..000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-06-03-00-51-02.bpo-35814.Cf7sGY.rst +++ /dev/null @@ -1,2 +0,0 @@ -Allow unpacking in the right hand side of annotated assignments. In -particular, ``t: Tuple[int, ...] = x, y, *z`` is now allowed. diff --git a/Misc/NEWS.d/next/Documentation/2017-12-08-20-30-37.bpo-20285.cfnp0J.rst b/Misc/NEWS.d/next/Documentation/2017-12-08-20-30-37.bpo-20285.cfnp0J.rst deleted file mode 100644 index ebe0c3f95e45..000000000000 --- a/Misc/NEWS.d/next/Documentation/2017-12-08-20-30-37.bpo-20285.cfnp0J.rst +++ /dev/null @@ -1,3 +0,0 @@ -Expand object.__doc__ (docstring) to make it clearer. -Modify pydoc.py so that help(object) lists object methods -(for other classes, help omits methods of the object base class.) diff --git a/Misc/NEWS.d/next/Documentation/2018-04-08-19-09-22.bpo-25735.idVQBD.rst b/Misc/NEWS.d/next/Documentation/2018-04-08-19-09-22.bpo-25735.idVQBD.rst deleted file mode 100644 index 8d22cf69e170..000000000000 --- a/Misc/NEWS.d/next/Documentation/2018-04-08-19-09-22.bpo-25735.idVQBD.rst +++ /dev/null @@ -1 +0,0 @@ -Added documentation for func factorial to indicate that returns integer values diff --git a/Misc/NEWS.d/next/Documentation/2018-05-13-10-36-37.bpo-33482.jalAaQ.rst b/Misc/NEWS.d/next/Documentation/2018-05-13-10-36-37.bpo-33482.jalAaQ.rst deleted file mode 100644 index bda5be87723d..000000000000 --- a/Misc/NEWS.d/next/Documentation/2018-05-13-10-36-37.bpo-33482.jalAaQ.rst +++ /dev/null @@ -1 +0,0 @@ -Make `codecs.StreamRecoder.writelines` take a list of bytes. diff --git a/Misc/NEWS.d/next/Documentation/2018-05-17-21-02-00.bpo-33519.Q7s2FB.rst b/Misc/NEWS.d/next/Documentation/2018-05-17-21-02-00.bpo-33519.Q7s2FB.rst deleted file mode 100644 index 0ee6c0d5f8ea..000000000000 --- a/Misc/NEWS.d/next/Documentation/2018-05-17-21-02-00.bpo-33519.Q7s2FB.rst +++ /dev/null @@ -1 +0,0 @@ -Clarify that `copy()` is not part of the `MutableSequence` ABC. diff --git a/Misc/NEWS.d/next/Documentation/2018-10-07-03-04-57.bpo-32995.TXN9ur.rst b/Misc/NEWS.d/next/Documentation/2018-10-07-03-04-57.bpo-32995.TXN9ur.rst deleted file mode 100644 index 1df5eeaa965a..000000000000 --- a/Misc/NEWS.d/next/Documentation/2018-10-07-03-04-57.bpo-32995.TXN9ur.rst +++ /dev/null @@ -1 +0,0 @@ -Added the context variable in glossary. diff --git a/Misc/NEWS.d/next/Documentation/2019-01-09-17-56-35.bpo-35397.ZMreIz.rst b/Misc/NEWS.d/next/Documentation/2019-01-09-17-56-35.bpo-35397.ZMreIz.rst deleted file mode 100644 index 6dc7d3aebb1a..000000000000 --- a/Misc/NEWS.d/next/Documentation/2019-01-09-17-56-35.bpo-35397.ZMreIz.rst +++ /dev/null @@ -1,2 +0,0 @@ -Remove deprecation and document urllib.parse.unwrap(). Patch contributed by -R?mi Lapeyre. diff --git a/Misc/NEWS.d/next/Documentation/2019-02-21-18-13-50.bpo-22865.6hg6J8.rst b/Misc/NEWS.d/next/Documentation/2019-02-21-18-13-50.bpo-22865.6hg6J8.rst deleted file mode 100644 index 67a4ed26bede..000000000000 --- a/Misc/NEWS.d/next/Documentation/2019-02-21-18-13-50.bpo-22865.6hg6J8.rst +++ /dev/null @@ -1 +0,0 @@ -Add detail to the documentation on the `pty.spawn` function. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Documentation/2019-05-05-07-58-50.bpo-36797.W1X4On.rst b/Misc/NEWS.d/next/Documentation/2019-05-05-07-58-50.bpo-36797.W1X4On.rst deleted file mode 100644 index 5ca55556c887..000000000000 --- a/Misc/NEWS.d/next/Documentation/2019-05-05-07-58-50.bpo-36797.W1X4On.rst +++ /dev/null @@ -1,3 +0,0 @@ -More of the legacy distutils documentation has been either pruned, or else -more clearly marked as being retained solely until the setuptools -documentation covers it independently. diff --git a/Misc/NEWS.d/next/Documentation/2019-05-07-02-30-51.bpo-36783.gpC8E2.rst b/Misc/NEWS.d/next/Documentation/2019-05-07-02-30-51.bpo-36783.gpC8E2.rst deleted file mode 100644 index d3cbf4f6e13e..000000000000 --- a/Misc/NEWS.d/next/Documentation/2019-05-07-02-30-51.bpo-36783.gpC8E2.rst +++ /dev/null @@ -1,2 +0,0 @@ -Added C API Documentation for Time_FromTimeAndFold and PyDateTime_FromDateAndTimeAndFold as per PEP 495. -Patch by Edison Abahurire. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Documentation/2019-05-08-13-17-44.bpo-35924.lqbNpW.rst b/Misc/NEWS.d/next/Documentation/2019-05-08-13-17-44.bpo-35924.lqbNpW.rst deleted file mode 100644 index a88778f85cce..000000000000 --- a/Misc/NEWS.d/next/Documentation/2019-05-08-13-17-44.bpo-35924.lqbNpW.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add a note to the ``curses.addstr()`` documentation to warn that multiline -strings can cause segfaults because of an ncurses bug. diff --git a/Misc/NEWS.d/next/Documentation/2019-05-11-17-42-15.bpo-36868.yioL0R.rst b/Misc/NEWS.d/next/Documentation/2019-05-11-17-42-15.bpo-36868.yioL0R.rst deleted file mode 100644 index ad9ed5baf167..000000000000 --- a/Misc/NEWS.d/next/Documentation/2019-05-11-17-42-15.bpo-36868.yioL0R.rst +++ /dev/null @@ -1,2 +0,0 @@ -What's new now mentions SSLContext.hostname_checks_common_name instead of -SSLContext.host_flags. diff --git a/Misc/NEWS.d/next/Documentation/2019-05-20-22-21-17.bpo-36984.IjZlmS.rst b/Misc/NEWS.d/next/Documentation/2019-05-20-22-21-17.bpo-36984.IjZlmS.rst deleted file mode 100644 index b26eeadb924a..000000000000 --- a/Misc/NEWS.d/next/Documentation/2019-05-20-22-21-17.bpo-36984.IjZlmS.rst +++ /dev/null @@ -1 +0,0 @@ -Improve version added references in ``typing`` module - by Anthony Sottile. diff --git a/Misc/NEWS.d/next/Documentation/2019-05-27-17-28-58.bpo-36686.Zot4sx.rst b/Misc/NEWS.d/next/Documentation/2019-05-27-17-28-58.bpo-36686.Zot4sx.rst deleted file mode 100644 index 2ea42adf1317..000000000000 --- a/Misc/NEWS.d/next/Documentation/2019-05-27-17-28-58.bpo-36686.Zot4sx.rst +++ /dev/null @@ -1,6 +0,0 @@ -Improve documentation of the stdin, stdout, and stderr arguments of of the -``asyncio.subprocess_exec`` function to specficy which values are supported. -Also mention that decoding as text is not supported. - -Add a few tests to verify that the various values passed to the std* -arguments actually work. diff --git a/Misc/NEWS.d/next/Documentation/2019-05-31-10-46-36.bpo-36896.wkXTW9.rst b/Misc/NEWS.d/next/Documentation/2019-05-31-10-46-36.bpo-36896.wkXTW9.rst deleted file mode 100644 index d75fccad6c0f..000000000000 --- a/Misc/NEWS.d/next/Documentation/2019-05-31-10-46-36.bpo-36896.wkXTW9.rst +++ /dev/null @@ -1,2 +0,0 @@ -Clarify that some types have unstable constructor signature between Python -versions. diff --git a/Misc/NEWS.d/next/IDLE/2017-12-25-18-48-50.bpo-32411.vNwDhe.rst b/Misc/NEWS.d/next/IDLE/2017-12-25-18-48-50.bpo-32411.vNwDhe.rst deleted file mode 100644 index a5522012923a..000000000000 --- a/Misc/NEWS.d/next/IDLE/2017-12-25-18-48-50.bpo-32411.vNwDhe.rst +++ /dev/null @@ -1,2 +0,0 @@ -In browser.py, remove extraneous sorting by line number since dictionary was -created in line number order. diff --git a/Misc/NEWS.d/next/IDLE/2019-05-05-16-27-53.bpo-13102.AGNWYJ.rst b/Misc/NEWS.d/next/IDLE/2019-05-05-16-27-53.bpo-13102.AGNWYJ.rst deleted file mode 100644 index 2a905bf0eecf..000000000000 --- a/Misc/NEWS.d/next/IDLE/2019-05-05-16-27-53.bpo-13102.AGNWYJ.rst +++ /dev/null @@ -1 +0,0 @@ -When saving a file, call os.fsync() so bits are flushed to e.g. USB drive. diff --git a/Misc/NEWS.d/next/IDLE/2019-05-19-22-02-22.bpo-36958.DZUC6G.rst b/Misc/NEWS.d/next/IDLE/2019-05-19-22-02-22.bpo-36958.DZUC6G.rst deleted file mode 100644 index c5a675d6781a..000000000000 --- a/Misc/NEWS.d/next/IDLE/2019-05-19-22-02-22.bpo-36958.DZUC6G.rst +++ /dev/null @@ -1,2 +0,0 @@ -Print any argument other than None or int passed to SystemExit or -sys.exit(). diff --git a/Misc/NEWS.d/next/IDLE/2019-05-24-18-57-57.bpo-37038.AJ3RwQ.rst b/Misc/NEWS.d/next/IDLE/2019-05-24-18-57-57.bpo-37038.AJ3RwQ.rst deleted file mode 100644 index 762e9f1e4374..000000000000 --- a/Misc/NEWS.d/next/IDLE/2019-05-24-18-57-57.bpo-37038.AJ3RwQ.rst +++ /dev/null @@ -1 +0,0 @@ -Make idlelib.run runnable; add test clause. diff --git a/Misc/NEWS.d/next/IDLE/2019-06-02-14-10-52.bpo-35610.0w_v6Y.rst b/Misc/NEWS.d/next/IDLE/2019-06-02-14-10-52.bpo-35610.0w_v6Y.rst deleted file mode 100644 index 0042ab70497a..000000000000 --- a/Misc/NEWS.d/next/IDLE/2019-06-02-14-10-52.bpo-35610.0w_v6Y.rst +++ /dev/null @@ -1,2 +0,0 @@ -Replace now redundant .context_use_ps1 with .prompt_last_line. This finishes -change started in bpo-31858. diff --git a/Misc/NEWS.d/next/Library/2016-07-27-11-06-43.bpo-23395.MuCEX9.rst b/Misc/NEWS.d/next/Library/2016-07-27-11-06-43.bpo-23395.MuCEX9.rst deleted file mode 100644 index ec95320ab411..000000000000 --- a/Misc/NEWS.d/next/Library/2016-07-27-11-06-43.bpo-23395.MuCEX9.rst +++ /dev/null @@ -1,2 +0,0 @@ -``_thread.interrupt_main()`` now avoids setting the Python error status -if the ``SIGINT`` signal is ignored or not handled by Python. diff --git a/Misc/NEWS.d/next/Library/2017-10-21-12-07-56.bpo-31829.6IhP-O.rst b/Misc/NEWS.d/next/Library/2017-10-21-12-07-56.bpo-31829.6IhP-O.rst deleted file mode 100644 index aefb8aec16fd..000000000000 --- a/Misc/NEWS.d/next/Library/2017-10-21-12-07-56.bpo-31829.6IhP-O.rst +++ /dev/null @@ -1,3 +0,0 @@ -``\r``, ``\0`` and ``\x1a`` (end-of-file on Windows) are now escaped in -protocol 0 pickles of Unicode strings. This allows to load them without loss -from files open in text mode in Python 2. diff --git a/Misc/NEWS.d/next/Library/2017-10-24-00-42-14.bpo-27141.zbAgSs.rst b/Misc/NEWS.d/next/Library/2017-10-24-00-42-14.bpo-27141.zbAgSs.rst deleted file mode 100644 index 76c2abbf82d6..000000000000 --- a/Misc/NEWS.d/next/Library/2017-10-24-00-42-14.bpo-27141.zbAgSs.rst +++ /dev/null @@ -1,3 +0,0 @@ -Added a ``__copy__()`` to ``collections.UserList`` and -``collections.UserDict`` in order to correctly implement shallow copying of -the objects. Patch by Bar Harel. diff --git a/Misc/NEWS.d/next/Library/2017-12-13-17-49-56.bpo-32299.eqAPWs.rst b/Misc/NEWS.d/next/Library/2017-12-13-17-49-56.bpo-32299.eqAPWs.rst deleted file mode 100644 index 4e1afa9a43ea..000000000000 --- a/Misc/NEWS.d/next/Library/2017-12-13-17-49-56.bpo-32299.eqAPWs.rst +++ /dev/null @@ -1,2 +0,0 @@ -Changed :func:`unittest.mock.patch.dict` to return the patched -dictionary when used as context manager. Patch by Vadim Tsander. diff --git a/Misc/NEWS.d/next/Library/2018-01-07-21-04-50.bpo-32515.D8_Wcb.rst b/Misc/NEWS.d/next/Library/2018-01-07-21-04-50.bpo-32515.D8_Wcb.rst deleted file mode 100644 index ad585b3ab5ed..000000000000 --- a/Misc/NEWS.d/next/Library/2018-01-07-21-04-50.bpo-32515.D8_Wcb.rst +++ /dev/null @@ -1 +0,0 @@ -trace.py can now run modules via python3 -m trace -t --module module_name diff --git a/Misc/NEWS.d/next/Library/2018-03-08-16-15-00.bpo-22102.th33uD.rst b/Misc/NEWS.d/next/Library/2018-03-08-16-15-00.bpo-22102.th33uD.rst deleted file mode 100644 index ad690f57c523..000000000000 --- a/Misc/NEWS.d/next/Library/2018-03-08-16-15-00.bpo-22102.th33uD.rst +++ /dev/null @@ -1,2 +0,0 @@ -Added support for ZIP files with disks set to 0. Such files are commonly created by builtin tools on Windows when use ZIP64 extension. -Patch by Francisco Facioni. diff --git a/Misc/NEWS.d/next/Library/2018-03-20-20-57-00.bpo-32941.9FU0gL.rst b/Misc/NEWS.d/next/Library/2018-03-20-20-57-00.bpo-32941.9FU0gL.rst deleted file mode 100644 index f7668aecda6b..000000000000 --- a/Misc/NEWS.d/next/Library/2018-03-20-20-57-00.bpo-32941.9FU0gL.rst +++ /dev/null @@ -1,2 +0,0 @@ -Allow :class:`mmap.mmap` objects to access the madvise() system call -(through :meth:`mmap.mmap.madvise`). diff --git a/Misc/NEWS.d/next/Library/2018-03-22-19-13-19.bpo-33123._Y5ooE.rst b/Misc/NEWS.d/next/Library/2018-03-22-19-13-19.bpo-33123._Y5ooE.rst deleted file mode 100644 index 8803ca843131..000000000000 --- a/Misc/NEWS.d/next/Library/2018-03-22-19-13-19.bpo-33123._Y5ooE.rst +++ /dev/null @@ -1,2 +0,0 @@ -:class:`pathlib.Path.unlink` now accepts a *missing_ok* parameter to avoid a -:exc:`FileNotFoundError` from being raised. Patch by Robert Buchholz. diff --git a/Misc/NEWS.d/next/Library/2018-03-27-13-28-16.bpo-31961.GjLoYu.rst b/Misc/NEWS.d/next/Library/2018-03-27-13-28-16.bpo-31961.GjLoYu.rst deleted file mode 100644 index a38db6790f47..000000000000 --- a/Misc/NEWS.d/next/Library/2018-03-27-13-28-16.bpo-31961.GjLoYu.rst +++ /dev/null @@ -1,6 +0,0 @@ -Added support for bytes and path-like objects in :func:`subprocess.Popen` -on Windows. The *args* parameter now accepts a :term:`path-like object` if -*shell* is ``False`` and a sequence containing bytes and path-like objects. -The *executable* parameter now accepts a bytes and :term:`path-like object`. -The *cwd* parameter now accepts a bytes object. -Based on patch by Anders Lorentsen. diff --git a/Misc/NEWS.d/next/Library/2018-04-04-14-54-30.bpo-24882.urybpa.rst b/Misc/NEWS.d/next/Library/2018-04-04-14-54-30.bpo-24882.urybpa.rst deleted file mode 100644 index 8c418824a99d..000000000000 --- a/Misc/NEWS.d/next/Library/2018-04-04-14-54-30.bpo-24882.urybpa.rst +++ /dev/null @@ -1 +0,0 @@ -Change ThreadPoolExecutor to use existing idle threads before spinning up new ones. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2018-05-30-01-05-50.bpo-31922.fobsXJ.rst b/Misc/NEWS.d/next/Library/2018-05-30-01-05-50.bpo-31922.fobsXJ.rst deleted file mode 100644 index df3881bffaaa..000000000000 --- a/Misc/NEWS.d/next/Library/2018-05-30-01-05-50.bpo-31922.fobsXJ.rst +++ /dev/null @@ -1,3 +0,0 @@ -:meth:`asyncio.AbstractEventLoop.create_datagram_endpoint`: -Do not connect UDP socket when broadcast is allowed. -This allows to receive replies after a UDP broadcast. diff --git a/Misc/NEWS.d/next/Library/2018-06-10-17-48-07.bpo-22454.qeiy_X.rst b/Misc/NEWS.d/next/Library/2018-06-10-17-48-07.bpo-22454.qeiy_X.rst deleted file mode 100644 index 2f30e5c893cf..000000000000 --- a/Misc/NEWS.d/next/Library/2018-06-10-17-48-07.bpo-22454.qeiy_X.rst +++ /dev/null @@ -1,2 +0,0 @@ -The :mod:`shlex` module now exposes :func:`shlex.join`, the inverse of -:func:`shlex.split`. Patch by Bo Bayles. diff --git a/Misc/NEWS.d/next/Library/2018-07-13-20-17-17.bpo-33361.dx2NVn.rst b/Misc/NEWS.d/next/Library/2018-07-13-20-17-17.bpo-33361.dx2NVn.rst deleted file mode 100644 index 2b71095984a0..000000000000 --- a/Misc/NEWS.d/next/Library/2018-07-13-20-17-17.bpo-33361.dx2NVn.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a bug in :class:`codecs.StreamRecoder` where seeking might leave old data in a -buffer and break subsequent read calls. Patch by Ammar Askar. diff --git a/Misc/NEWS.d/next/Library/2018-08-03-09-47-20.bpo-34303.tOE2HP.rst b/Misc/NEWS.d/next/Library/2018-08-03-09-47-20.bpo-34303.tOE2HP.rst deleted file mode 100644 index 94c1299e5956..000000000000 --- a/Misc/NEWS.d/next/Library/2018-08-03-09-47-20.bpo-34303.tOE2HP.rst +++ /dev/null @@ -1,2 +0,0 @@ -Performance of :func:`functools.reduce` is slightly improved. Patch by -Sergey Fedoseev. diff --git a/Misc/NEWS.d/next/Library/2018-08-18-14-47-00.bpo-34424.wAlRuS.rst b/Misc/NEWS.d/next/Library/2018-08-18-14-47-00.bpo-34424.wAlRuS.rst deleted file mode 100644 index 2b384cd5513f..000000000000 --- a/Misc/NEWS.d/next/Library/2018-08-18-14-47-00.bpo-34424.wAlRuS.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix serialization of messages containing encoded strings when the -policy.linesep is set to a multi-character string. Patch by Jens Troeger. diff --git a/Misc/NEWS.d/next/Library/2018-08-28-03-00-12.bpo-33569.45YlGG.rst b/Misc/NEWS.d/next/Library/2018-08-28-03-00-12.bpo-33569.45YlGG.rst deleted file mode 100644 index adafa2803ae3..000000000000 --- a/Misc/NEWS.d/next/Library/2018-08-28-03-00-12.bpo-33569.45YlGG.rst +++ /dev/null @@ -1 +0,0 @@ -dataclasses.InitVar: Exposes the type used to create the init var. diff --git a/Misc/NEWS.d/next/Library/2018-09-13-20-33-24.bpo-26467.cahAk3.rst b/Misc/NEWS.d/next/Library/2018-09-13-20-33-24.bpo-26467.cahAk3.rst deleted file mode 100644 index 4cf3f2ae7ef7..000000000000 --- a/Misc/NEWS.d/next/Library/2018-09-13-20-33-24.bpo-26467.cahAk3.rst +++ /dev/null @@ -1,2 +0,0 @@ -Added AsyncMock to support using unittest to mock asyncio coroutines. -Patch by Lisa Roach. diff --git a/Misc/NEWS.d/next/Library/2018-10-21-17-39-32.bpo-34271.P15VLM.rst b/Misc/NEWS.d/next/Library/2018-10-21-17-39-32.bpo-34271.P15VLM.rst deleted file mode 100644 index 344388f7f228..000000000000 --- a/Misc/NEWS.d/next/Library/2018-10-21-17-39-32.bpo-34271.P15VLM.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add debugging helpers to ssl module. It's now possible to dump key material -and to trace TLS protocol. The default and stdlib contexts also support -SSLKEYLOGFILE env var. diff --git a/Misc/NEWS.d/next/Library/2018-11-04-16-39-46.bpo-26660.RdXz8a.rst b/Misc/NEWS.d/next/Library/2018-11-04-16-39-46.bpo-26660.RdXz8a.rst deleted file mode 100644 index 4448bf6b0164..000000000000 --- a/Misc/NEWS.d/next/Library/2018-11-04-16-39-46.bpo-26660.RdXz8a.rst +++ /dev/null @@ -1,4 +0,0 @@ -Fixed permission errors in :class:`~tempfile.TemporaryDirectory` clean up. -Previously ``TemporaryDirectory.cleanup()`` failed when non-writeable or -non-searchable files or directories were created inside a temporary -directory. diff --git a/Misc/NEWS.d/next/Library/2019-01-02-19-48-23.bpo-35431.FhG6QA.rst b/Misc/NEWS.d/next/Library/2019-01-02-19-48-23.bpo-35431.FhG6QA.rst deleted file mode 100644 index 34687bdb8a25..000000000000 --- a/Misc/NEWS.d/next/Library/2019-01-02-19-48-23.bpo-35431.FhG6QA.rst +++ /dev/null @@ -1,4 +0,0 @@ -Implement :func:`math.comb` that returns binomial coefficient, that computes -the number of ways to choose k items from n items without repetition and -without order. -Patch by Yash Aggarwal and Keller Fuchs. diff --git a/Misc/NEWS.d/next/Library/2019-01-11-17-09-15.bpo-31855.PlhfsX.rst b/Misc/NEWS.d/next/Library/2019-01-11-17-09-15.bpo-31855.PlhfsX.rst deleted file mode 100644 index 0da9c4997e1a..000000000000 --- a/Misc/NEWS.d/next/Library/2019-01-11-17-09-15.bpo-31855.PlhfsX.rst +++ /dev/null @@ -1,2 +0,0 @@ -:func:`unittest.mock.mock_open` results now respects the argument of read([size]). -Patch contributed by R?mi Lapeyre. diff --git a/Misc/NEWS.d/next/Library/2019-01-18-16-23-00.bpo-35721.d8djAJ.rst b/Misc/NEWS.d/next/Library/2019-01-18-16-23-00.bpo-35721.d8djAJ.rst deleted file mode 100644 index 5af4b1b89994..000000000000 --- a/Misc/NEWS.d/next/Library/2019-01-18-16-23-00.bpo-35721.d8djAJ.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix :meth:`asyncio.SelectorEventLoop.subprocess_exec()` leaks file descriptors -if ``Popen`` fails and called with ``stdin=subprocess.PIPE``. -Patch by Niklas Fiekas. diff --git a/Misc/NEWS.d/next/Library/2019-02-15-17-18-50.bpo-35125.h0xk0f.rst b/Misc/NEWS.d/next/Library/2019-02-15-17-18-50.bpo-35125.h0xk0f.rst deleted file mode 100644 index 2e28a25d2415..000000000000 --- a/Misc/NEWS.d/next/Library/2019-02-15-17-18-50.bpo-35125.h0xk0f.rst +++ /dev/null @@ -1 +0,0 @@ -Asyncio: Remove inner callback on outer cancellation in shield diff --git a/Misc/NEWS.d/next/Library/2019-03-01-17-59-39.bpo-31904.38djdk.rst b/Misc/NEWS.d/next/Library/2019-03-01-17-59-39.bpo-31904.38djdk.rst deleted file mode 100644 index 319c0a319f8c..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-01-17-59-39.bpo-31904.38djdk.rst +++ /dev/null @@ -1 +0,0 @@ -Add posix module support for VxWorks. diff --git a/Misc/NEWS.d/next/Library/2019-03-04-01-28-33.bpo-26707.QY4kRZ.rst b/Misc/NEWS.d/next/Library/2019-03-04-01-28-33.bpo-26707.QY4kRZ.rst deleted file mode 100644 index ab76540c9eec..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-04-01-28-33.bpo-26707.QY4kRZ.rst +++ /dev/null @@ -1 +0,0 @@ -Enable plistlib to read and write binary plist files that were created as a KeyedArchive file. Specifically, this allows the plistlib to process 0x80 tokens as UID objects. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2019-03-09-23-51-27.bpo-36239.BHJ3Ln.rst b/Misc/NEWS.d/next/Library/2019-03-09-23-51-27.bpo-36239.BHJ3Ln.rst deleted file mode 100644 index 3a7420291513..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-09-23-51-27.bpo-36239.BHJ3Ln.rst +++ /dev/null @@ -1 +0,0 @@ -Parsing .mo files now ignores comments starting and ending with #-#-#-#-#. diff --git a/Misc/NEWS.d/next/Library/2019-03-13-10-57-41.bpo-27497.JDmIe_.rst b/Misc/NEWS.d/next/Library/2019-03-13-10-57-41.bpo-27497.JDmIe_.rst deleted file mode 100644 index f6da1143681a..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-13-10-57-41.bpo-27497.JDmIe_.rst +++ /dev/null @@ -1,3 +0,0 @@ -:meth:`csv.DictWriter.writeheader` now returns the return value of the -underlying :meth:`csv.Writer.writerow` method. Patch contributed by Ashish -Nitin Patil. diff --git a/Misc/NEWS.d/next/Library/2019-03-18-14-25-36.bpo-31904.ds3d67.rst b/Misc/NEWS.d/next/Library/2019-03-18-14-25-36.bpo-31904.ds3d67.rst deleted file mode 100644 index fd82fe086f06..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-18-14-25-36.bpo-31904.ds3d67.rst +++ /dev/null @@ -1 +0,0 @@ -Fix mmap fail for VxWorks diff --git a/Misc/NEWS.d/next/Library/2019-03-21-16-00-00.bpo-36368.zsRT1.rst b/Misc/NEWS.d/next/Library/2019-03-21-16-00-00.bpo-36368.zsRT1.rst deleted file mode 100644 index d8426827cedf..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-21-16-00-00.bpo-36368.zsRT1.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix a bug crashing SharedMemoryManager instances in interactive sessions after -a ctrl-c (KeyboardInterrupt) was sent diff --git a/Misc/NEWS.d/next/Library/2019-03-22-22-40-00.bpo-35900.oiee0o.rst b/Misc/NEWS.d/next/Library/2019-03-22-22-40-00.bpo-35900.oiee0o.rst deleted file mode 100644 index 641572649694..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-22-22-40-00.bpo-35900.oiee0o.rst +++ /dev/null @@ -1,2 +0,0 @@ -enable custom reduction callback registration for functions and classes in -_pickle.c, using the new Pickler's attribute ``reducer_override`` diff --git a/Misc/NEWS.d/next/Library/2019-03-27-15-09-00.bpo-35900.fh56UU.rst b/Misc/NEWS.d/next/Library/2019-03-27-15-09-00.bpo-35900.fh56UU.rst deleted file mode 100644 index 7f3a0675cdab..000000000000 --- a/Misc/NEWS.d/next/Library/2019-03-27-15-09-00.bpo-35900.fh56UU.rst +++ /dev/null @@ -1,3 +0,0 @@ -Allow reduction methods to return a 6-item tuple where the 6th item specifies a -custom state-setting method that's called instead of the regular -``__setstate__`` method. diff --git a/Misc/NEWS.d/next/Library/2019-04-02-19-23-12.bpo-35252.VooTVv.rst b/Misc/NEWS.d/next/Library/2019-04-02-19-23-12.bpo-35252.VooTVv.rst deleted file mode 100644 index c8f3e7d5f5fb..000000000000 --- a/Misc/NEWS.d/next/Library/2019-04-02-19-23-12.bpo-35252.VooTVv.rst +++ /dev/null @@ -1 +0,0 @@ -Throw a TypeError instead of an AssertionError when using an invalid type annotation with singledispatch. diff --git a/Misc/NEWS.d/next/Library/2019-04-06-00-55-09.bpo-36533.kzMyRH.rst b/Misc/NEWS.d/next/Library/2019-04-06-00-55-09.bpo-36533.kzMyRH.rst deleted file mode 100644 index 15c4222d4837..000000000000 --- a/Misc/NEWS.d/next/Library/2019-04-06-00-55-09.bpo-36533.kzMyRH.rst +++ /dev/null @@ -1,6 +0,0 @@ -Reinitialize logging.Handler locks in forked child processes instead of -attempting to acquire them all in the parent before forking only to be -released in the child process. The acquire/release pattern was leading to -deadlocks in code that has implemented any form of chained logging handlers -that depend upon one another as the lock acquision order cannot be -guaranteed. diff --git a/Misc/NEWS.d/next/Library/2019-04-06-12-36-09.bpo-36542.Q0qyYV.rst b/Misc/NEWS.d/next/Library/2019-04-06-12-36-09.bpo-36542.Q0qyYV.rst deleted file mode 100644 index 8374776e61eb..000000000000 --- a/Misc/NEWS.d/next/Library/2019-04-06-12-36-09.bpo-36542.Q0qyYV.rst +++ /dev/null @@ -1,2 +0,0 @@ -The signature of Python functions can now be overridden by specifying the -``__text_signature__`` attribute. diff --git a/Misc/NEWS.d/next/Library/2019-04-07-14-30-10.bpo-36548.CJQiYw.rst b/Misc/NEWS.d/next/Library/2019-04-07-14-30-10.bpo-36548.CJQiYw.rst deleted file mode 100644 index e72bb9117404..000000000000 --- a/Misc/NEWS.d/next/Library/2019-04-07-14-30-10.bpo-36548.CJQiYw.rst +++ /dev/null @@ -1 +0,0 @@ -Improved the repr of regular expression flags. diff --git a/Misc/NEWS.d/next/Library/2019-04-22-22-55-29.bpo-29183.MILvsk.rst b/Misc/NEWS.d/next/Library/2019-04-22-22-55-29.bpo-29183.MILvsk.rst deleted file mode 100644 index 1d19f191eede..000000000000 --- a/Misc/NEWS.d/next/Library/2019-04-22-22-55-29.bpo-29183.MILvsk.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix double exceptions in :class:`wsgiref.handlers.BaseHandler` by calling -its :meth:`~wsgiref.handlers.BaseHandler.close` method only when no -exception is raised. diff --git a/Misc/NEWS.d/next/Library/2019-04-26-22-13-26.bpo-22640.p3rheW.rst b/Misc/NEWS.d/next/Library/2019-04-26-22-13-26.bpo-22640.p3rheW.rst deleted file mode 100644 index 8ac6be920443..000000000000 --- a/Misc/NEWS.d/next/Library/2019-04-26-22-13-26.bpo-22640.p3rheW.rst +++ /dev/null @@ -1,2 +0,0 @@ -:func:`py_compile.compile` now supports silent mode. -Patch by Joannah Nanjekye \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2019-04-27-02-54-23.bpo-8138.osBRGI.rst b/Misc/NEWS.d/next/Library/2019-04-27-02-54-23.bpo-8138.osBRGI.rst deleted file mode 100644 index e94d0a68d465..000000000000 --- a/Misc/NEWS.d/next/Library/2019-04-27-02-54-23.bpo-8138.osBRGI.rst +++ /dev/null @@ -1,2 +0,0 @@ -Don't mark ``wsgiref.simple_server.SimpleServer`` as multi-threaded since -``wsgiref.simple_server.WSGIServer`` is single-threaded. diff --git a/Misc/NEWS.d/next/Library/2019-04-29-15-18-13.bpo-36748.YBKWps.rst b/Misc/NEWS.d/next/Library/2019-04-29-15-18-13.bpo-36748.YBKWps.rst deleted file mode 100644 index 0eacc3c99cd9..000000000000 --- a/Misc/NEWS.d/next/Library/2019-04-29-15-18-13.bpo-36748.YBKWps.rst +++ /dev/null @@ -1,3 +0,0 @@ -Optimized write buffering in C implementation of ``TextIOWrapper``. Writing -ASCII string to ``TextIOWrapper`` with ascii, latin1, or utf-8 encoding is -about 20% faster. Patch by Inada Naoki. diff --git a/Misc/NEWS.d/next/Library/2019-04-30-04-34-53.bpo-6584.Hzp9-P.rst b/Misc/NEWS.d/next/Library/2019-04-30-04-34-53.bpo-6584.Hzp9-P.rst deleted file mode 100644 index 3a0943800b00..000000000000 --- a/Misc/NEWS.d/next/Library/2019-04-30-04-34-53.bpo-6584.Hzp9-P.rst +++ /dev/null @@ -1 +0,0 @@ -Add a :exc:`~gzip.BadGzipFile` exception to the :mod:`gzip` module. diff --git a/Misc/NEWS.d/next/Library/2019-05-01-20-41-53.bpo-36772.fV2K0F.rst b/Misc/NEWS.d/next/Library/2019-05-01-20-41-53.bpo-36772.fV2K0F.rst deleted file mode 100644 index 00b8a684f9a7..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-01-20-41-53.bpo-36772.fV2K0F.rst +++ /dev/null @@ -1,2 +0,0 @@ -functools.lru_cache() can now be used as a straight decorator in -addition to its existing usage as a function that returns a decorator. diff --git a/Misc/NEWS.d/next/Library/2019-05-03-20-47-55.bpo-36785.PQLnPq.rst b/Misc/NEWS.d/next/Library/2019-05-03-20-47-55.bpo-36785.PQLnPq.rst deleted file mode 100644 index 0a86054bbe86..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-03-20-47-55.bpo-36785.PQLnPq.rst +++ /dev/null @@ -1 +0,0 @@ -Implement PEP 574 (pickle protocol 5 with out-of-band buffers). diff --git a/Misc/NEWS.d/next/Library/2019-05-05-09-45-44.bpo-36801.XrlFFs.rst b/Misc/NEWS.d/next/Library/2019-05-05-09-45-44.bpo-36801.XrlFFs.rst deleted file mode 100644 index 43e51fe5ca94..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-05-09-45-44.bpo-36801.XrlFFs.rst +++ /dev/null @@ -1 +0,0 @@ -Properly handle SSL connection closing in asyncio StreamWriter.drain() call. diff --git a/Misc/NEWS.d/next/Library/2019-05-05-10-12-23.bpo-36802.HYMc8P.rst b/Misc/NEWS.d/next/Library/2019-05-05-10-12-23.bpo-36802.HYMc8P.rst deleted file mode 100644 index f59863b7b7a8..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-05-10-12-23.bpo-36802.HYMc8P.rst +++ /dev/null @@ -1,2 +0,0 @@ -Provide both sync and async calls for StreamWriter.write() and -StreamWriter.close() diff --git a/Misc/NEWS.d/next/Library/2019-05-05-16-14-38.bpo-36806.rAzF-x.rst b/Misc/NEWS.d/next/Library/2019-05-05-16-14-38.bpo-36806.rAzF-x.rst deleted file mode 100644 index 7e3ff6cf0e14..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-05-16-14-38.bpo-36806.rAzF-x.rst +++ /dev/null @@ -1,2 +0,0 @@ -Forbid creation of asyncio stream objects like StreamReader, StreamWriter, -Process, and their protocols outside of asyncio package. diff --git a/Misc/NEWS.d/next/Library/2019-05-06-18-28-38.bpo-36813.NXD0KZ.rst b/Misc/NEWS.d/next/Library/2019-05-06-18-28-38.bpo-36813.NXD0KZ.rst deleted file mode 100644 index e89358aa4051..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-06-18-28-38.bpo-36813.NXD0KZ.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix :class:`~logging.handlers.QueueListener` to call ``queue.task_done()`` -upon stopping. Patch by Bar Harel. diff --git a/Misc/NEWS.d/next/Library/2019-05-06-19-17-04.bpo-26903.4payXb.rst b/Misc/NEWS.d/next/Library/2019-05-06-19-17-04.bpo-26903.4payXb.rst deleted file mode 100644 index ec3aa05e907e..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-06-19-17-04.bpo-26903.4payXb.rst +++ /dev/null @@ -1 +0,0 @@ -Limit `max_workers` in `ProcessPoolExecutor` to 61 to work around a WaitForMultipleObjects limitation. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2019-05-06-22-34-47.bpo-33110.rSJSCh.rst b/Misc/NEWS.d/next/Library/2019-05-06-22-34-47.bpo-33110.rSJSCh.rst deleted file mode 100644 index f1e2460c4927..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-06-22-34-47.bpo-33110.rSJSCh.rst +++ /dev/null @@ -1 +0,0 @@ -Handle exceptions raised by functions added by concurrent.futures add_done_callback correctly when the Future has already completed. diff --git a/Misc/NEWS.d/next/Library/2019-05-06-23-13-26.bpo-36814.dSeMz_.rst b/Misc/NEWS.d/next/Library/2019-05-06-23-13-26.bpo-36814.dSeMz_.rst deleted file mode 100644 index 3f40011b2650..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-06-23-13-26.bpo-36814.dSeMz_.rst +++ /dev/null @@ -1 +0,0 @@ -Fix an issue where os.posix_spawnp() would incorrectly raise a TypeError when file_actions is None. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2019-05-07-15-00-45.bpo-36832.TExgqb.rst b/Misc/NEWS.d/next/Library/2019-05-07-15-00-45.bpo-36832.TExgqb.rst deleted file mode 100644 index 23577d9b5a82..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-07-15-00-45.bpo-36832.TExgqb.rst +++ /dev/null @@ -1 +0,0 @@ -Introducing ``zipfile.Path``, a pathlib-compatible wrapper for traversing zip files. diff --git a/Misc/NEWS.d/next/Library/2019-05-08-12-51-37.bpo-36829.8enFMA.rst b/Misc/NEWS.d/next/Library/2019-05-08-12-51-37.bpo-36829.8enFMA.rst deleted file mode 100644 index 0b04efcb7e2f..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-08-12-51-37.bpo-36829.8enFMA.rst +++ /dev/null @@ -1,5 +0,0 @@ -Add new :func:`sys.unraisablehook` function which can be overridden to -control how "unraisable exceptions" are handled. It is called when an -exception has occurred but there is no way for Python to handle it. For -example, when a destructor raises an exception or during garbage collection -(:func:`gc.collect`). diff --git a/Misc/NEWS.d/next/Library/2019-05-09-08-35-18.bpo-24538.WK8Y-k.rst b/Misc/NEWS.d/next/Library/2019-05-09-08-35-18.bpo-24538.WK8Y-k.rst deleted file mode 100644 index e799f931bcec..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-09-08-35-18.bpo-24538.WK8Y-k.rst +++ /dev/null @@ -1,3 +0,0 @@ -In `shutil.copystat()`, first copy extended file attributes and then file -permissions, since extended attributes can only be set on the destination -while it is still writeable. diff --git a/Misc/NEWS.d/next/Library/2019-05-09-12-38-40.bpo-30262.Tu74ak.rst b/Misc/NEWS.d/next/Library/2019-05-09-12-38-40.bpo-30262.Tu74ak.rst deleted file mode 100644 index 059bd717837f..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-09-12-38-40.bpo-30262.Tu74ak.rst +++ /dev/null @@ -1,2 +0,0 @@ -The ``Cache`` and ``Statement`` objects of the :mod:`sqlite3` module are not -exposed to the user. Patch by Aviv Palivoda. diff --git a/Misc/NEWS.d/next/Library/2019-05-09-18-12-55.bpo-36867.FuwVTi.rst b/Misc/NEWS.d/next/Library/2019-05-09-18-12-55.bpo-36867.FuwVTi.rst deleted file mode 100644 index 5eaf0a032cc3..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-09-18-12-55.bpo-36867.FuwVTi.rst +++ /dev/null @@ -1 +0,0 @@ -The multiprocessing.resource_tracker replaces the multiprocessing.semaphore_tracker module. Other than semaphores, resource_tracker also tracks shared_memory segments. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2019-05-10-01-06-36.bpo-36778.GRqeiS.rst b/Misc/NEWS.d/next/Library/2019-05-10-01-06-36.bpo-36778.GRqeiS.rst deleted file mode 100644 index 5e594a33447c..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-10-01-06-36.bpo-36778.GRqeiS.rst +++ /dev/null @@ -1,2 +0,0 @@ -``cp65001`` encoding (Windows code page 65001) becomes an alias to ``utf_8`` -encoding. diff --git a/Misc/NEWS.d/next/Library/2019-05-10-22-00-06.bpo-36878.iigeqk.rst b/Misc/NEWS.d/next/Library/2019-05-10-22-00-06.bpo-36878.iigeqk.rst deleted file mode 100644 index 20b44dcbf13f..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-10-22-00-06.bpo-36878.iigeqk.rst +++ /dev/null @@ -1,4 +0,0 @@ -When using `type_comments=True` in `ast.parse`, treat `# type: ignore` followed by -a non-alphanumeric character and then arbitrary text as a type ignore, instead of -requiring nothing but whitespace or another comment. This is to permit formations -such as `# type: ignore[E1000]`. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2019-05-11-02-30-45.bpo-34632.8MXa7T.rst b/Misc/NEWS.d/next/Library/2019-05-11-02-30-45.bpo-34632.8MXa7T.rst deleted file mode 100644 index ab4433846d4f..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-11-02-30-45.bpo-34632.8MXa7T.rst +++ /dev/null @@ -1 +0,0 @@ -Introduce the ``importlib.metadata`` module with (provisional) support for reading metadata from third-party packages. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2019-05-11-14-50-59.bpo-36887.XD3f22.rst b/Misc/NEWS.d/next/Library/2019-05-11-14-50-59.bpo-36887.XD3f22.rst deleted file mode 100644 index fe2929cea85a..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-11-14-50-59.bpo-36887.XD3f22.rst +++ /dev/null @@ -1 +0,0 @@ -Add new function :func:`math.isqrt` to compute integer square roots. diff --git a/Misc/NEWS.d/next/Library/2019-05-11-16-21-29.bpo-35545.FcvJvP.rst b/Misc/NEWS.d/next/Library/2019-05-11-16-21-29.bpo-35545.FcvJvP.rst deleted file mode 100644 index f4349afefcd8..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-11-16-21-29.bpo-35545.FcvJvP.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix asyncio discarding IPv6 scopes when ensuring hostname resolutions -internally diff --git a/Misc/NEWS.d/next/Library/2019-05-12-14-49-13.bpo-36895.ZZuuY7.rst b/Misc/NEWS.d/next/Library/2019-05-12-14-49-13.bpo-36895.ZZuuY7.rst deleted file mode 100644 index f6708abfc860..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-12-14-49-13.bpo-36895.ZZuuY7.rst +++ /dev/null @@ -1,2 +0,0 @@ -The function ``time.clock()`` was deprecated in 3.3 in favor of -``time.perf_counter()`` and marked for removal in 3.8, it has removed. diff --git a/Misc/NEWS.d/next/Library/2019-05-13-05-49-15.bpo-23896.8TtUKo.rst b/Misc/NEWS.d/next/Library/2019-05-13-05-49-15.bpo-23896.8TtUKo.rst deleted file mode 100644 index 3c154822c9ac..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-13-05-49-15.bpo-23896.8TtUKo.rst +++ /dev/null @@ -1,2 +0,0 @@ -Adds a grammar to lib2to3.pygram that contains exec as a function not as -statement. diff --git a/Misc/NEWS.d/next/Library/2019-05-13-13-02-43.bpo-36867.Qh-6mX.rst b/Misc/NEWS.d/next/Library/2019-05-13-13-02-43.bpo-36867.Qh-6mX.rst deleted file mode 100644 index ce925d0594bb..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-13-13-02-43.bpo-36867.Qh-6mX.rst +++ /dev/null @@ -1 +0,0 @@ -Fix a bug making a SharedMemoryManager instance and its parent process use two separate resource_tracker processes. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2019-05-14-05-38-22.bpo-23378.R25teI.rst b/Misc/NEWS.d/next/Library/2019-05-14-05-38-22.bpo-23378.R25teI.rst deleted file mode 100644 index c7c3f174d637..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-14-05-38-22.bpo-23378.R25teI.rst +++ /dev/null @@ -1 +0,0 @@ -Add an extend action to argparser. diff --git a/Misc/NEWS.d/next/Library/2019-05-14-07-57-02.bpo-36845._GtFFf.rst b/Misc/NEWS.d/next/Library/2019-05-14-07-57-02.bpo-36845._GtFFf.rst deleted file mode 100644 index c819dce3a57c..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-14-07-57-02.bpo-36845._GtFFf.rst +++ /dev/null @@ -1,2 +0,0 @@ -Added validation of integer prefixes to the construction of IP networks and -interfaces in the ipaddress module. diff --git a/Misc/NEWS.d/next/Library/2019-05-14-12-25-44.bpo-36889.MChPqP.rst b/Misc/NEWS.d/next/Library/2019-05-14-12-25-44.bpo-36889.MChPqP.rst deleted file mode 100644 index d08c0e287edf..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-14-12-25-44.bpo-36889.MChPqP.rst +++ /dev/null @@ -1,6 +0,0 @@ -Introduce :class:`asyncio.Stream` class that merges :class:`asyncio.StreamReader` and :class:`asyncio.StreamWriter` functionality. -:class:`asyncio.Stream` can work in readonly, writeonly and readwrite modes. -Provide :func:`asyncio.connect`, :func:`asyncio.connect_unix`, :func:`asyncio.connect_read_pipe` and :func:`asyncio.connect_write_pipe` factories to open :class:`asyncio.Stream` connections. Provide :class:`asyncio.StreamServer` and :class:`UnixStreamServer` to serve servers with asyncio.Stream API. -Modify :func:`asyncio.create_subprocess_shell` and :func:`asyncio.create_subprocess_exec` to use :class:`asyncio.Stream` instead of deprecated :class:`StreamReader` and :class:`StreamWriter`. -Deprecate :class:`asyncio.StreamReader` and :class:`asyncio.StreamWriter`. -Deprecate usage of private classes, e.g. :class:`asyncio.FlowControlMixing` and :class:`asyncio.StreamReaderProtocol` outside of asyncio package. diff --git a/Misc/NEWS.d/next/Library/2019-05-14-15-39-34.bpo-36916._GPsTt.rst b/Misc/NEWS.d/next/Library/2019-05-14-15-39-34.bpo-36916._GPsTt.rst deleted file mode 100644 index 8726bb241f23..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-14-15-39-34.bpo-36916._GPsTt.rst +++ /dev/null @@ -1,2 +0,0 @@ -Remove a message about an unhandled exception in a task when writer.write() -is used without await and writer.drain() fails with an exception. diff --git a/Misc/NEWS.d/next/Library/2019-05-14-21-39-52.bpo-25652.xLw42k.rst b/Misc/NEWS.d/next/Library/2019-05-14-21-39-52.bpo-25652.xLw42k.rst deleted file mode 100644 index 421fccfe8c73..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-14-21-39-52.bpo-25652.xLw42k.rst +++ /dev/null @@ -1 +0,0 @@ -Fix bug in ``__rmod__`` of ``UserString`` - by Batuhan Taskaya. diff --git a/Misc/NEWS.d/next/Library/2019-05-15-21-35-23.bpo-36921.kA1306.rst b/Misc/NEWS.d/next/Library/2019-05-15-21-35-23.bpo-36921.kA1306.rst deleted file mode 100644 index b443b379d8f7..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-15-21-35-23.bpo-36921.kA1306.rst +++ /dev/null @@ -1 +0,0 @@ -Deprecate ``@coroutine`` for sake of ``async def``. diff --git a/Misc/NEWS.d/next/Library/2019-05-16-18-02-08.bpo-36888.-H2Dkm.rst b/Misc/NEWS.d/next/Library/2019-05-16-18-02-08.bpo-36888.-H2Dkm.rst deleted file mode 100644 index e7b54677280c..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-16-18-02-08.bpo-36888.-H2Dkm.rst +++ /dev/null @@ -1,2 +0,0 @@ -Python child processes can now access the status of their parent process -using multiprocessing.process.parent_process diff --git a/Misc/NEWS.d/next/Library/2019-05-16-23-40-36.bpo-24564.lIwV_7.rst b/Misc/NEWS.d/next/Library/2019-05-16-23-40-36.bpo-24564.lIwV_7.rst deleted file mode 100644 index 27cb6178b54e..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-16-23-40-36.bpo-24564.lIwV_7.rst +++ /dev/null @@ -1,3 +0,0 @@ -:func:`shutil.copystat` now ignores :const:`errno.EINVAL` on :func:`os.setxattr` which may occur when copying files on filesystems without extended attributes support. - -Original patch by Giampaolo Rodola, updated by Ying Wang. diff --git a/Misc/NEWS.d/next/Library/2019-05-17-11-44-21.bpo-33524.8y_xUU.rst b/Misc/NEWS.d/next/Library/2019-05-17-11-44-21.bpo-33524.8y_xUU.rst deleted file mode 100644 index bfeab7231bdb..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-17-11-44-21.bpo-33524.8y_xUU.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix the folding of email header when the max_line_length is 0 or None and the -header contains non-ascii characters. Contributed by Licht Takeuchi -(@Licht-T). diff --git a/Misc/NEWS.d/next/Library/2019-05-17-21-42-58.bpo-36948.vnUDvk.rst b/Misc/NEWS.d/next/Library/2019-05-17-21-42-58.bpo-36948.vnUDvk.rst deleted file mode 100644 index c8cfa54067fd..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-17-21-42-58.bpo-36948.vnUDvk.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix :exc:`NameError` in :meth:`urllib.request.URLopener.retrieve`. Patch by -Karthikeyan Singaravelan. diff --git a/Misc/NEWS.d/next/Library/2019-05-19-06-54-26.bpo-36949.jBlG9F.rst b/Misc/NEWS.d/next/Library/2019-05-19-06-54-26.bpo-36949.jBlG9F.rst deleted file mode 100644 index e4eeb4010a23..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-19-06-54-26.bpo-36949.jBlG9F.rst +++ /dev/null @@ -1 +0,0 @@ -Implement __repr__ for WeakSet objects. diff --git a/Misc/NEWS.d/next/Library/2019-05-20-08-54-41.bpo-36952.I_glok.rst b/Misc/NEWS.d/next/Library/2019-05-20-08-54-41.bpo-36952.I_glok.rst deleted file mode 100644 index eeb4fd71e67b..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-20-08-54-41.bpo-36952.I_glok.rst +++ /dev/null @@ -1,5 +0,0 @@ -Starting with Python 3.3, importing ABCs from :mod:`collections` is -deprecated, and import should be done from :mod:`collections.abc`. Still -being able to import from :mod:`collections` was marked for removal in 3.8, -but has been delayed to 3.9; documentation and ``DeprecationWarning`` -clarified. diff --git a/Misc/NEWS.d/next/Library/2019-05-20-11-01-28.bpo-36952.MgZi7-.rst b/Misc/NEWS.d/next/Library/2019-05-20-11-01-28.bpo-36952.MgZi7-.rst deleted file mode 100644 index f5ce2aadf4a1..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-20-11-01-28.bpo-36952.MgZi7-.rst +++ /dev/null @@ -1,4 +0,0 @@ -:func:`fileinput.input` and :class:`fileinput.FileInput` **bufsize** -argument has been removed (was deprecated and ignored since Python 3.6), -and as a result the **mode** and **openhook** arguments have been made -keyword-only. diff --git a/Misc/NEWS.d/next/Library/2019-05-20-14-47-55.bpo-32972.LoeUNh.rst b/Misc/NEWS.d/next/Library/2019-05-20-14-47-55.bpo-32972.LoeUNh.rst deleted file mode 100644 index c8c47cd77635..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-20-14-47-55.bpo-32972.LoeUNh.rst +++ /dev/null @@ -1 +0,0 @@ -Implement ``unittest.AsyncTestCase`` to help testing asyncio-based code. diff --git a/Misc/NEWS.d/next/Library/2019-05-20-17-08-26.bpo-36972.3l3SGc.rst b/Misc/NEWS.d/next/Library/2019-05-20-17-08-26.bpo-36972.3l3SGc.rst deleted file mode 100644 index da650e8944df..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-20-17-08-26.bpo-36972.3l3SGc.rst +++ /dev/null @@ -1 +0,0 @@ -Add SupportsIndex protocol to the typing module to allow type checking to detect classes that can be passed to `hex()`, `oct()` and `bin()`. diff --git a/Misc/NEWS.d/next/Library/2019-05-20-20-41-30.bpo-36983.hz-fLr.rst b/Misc/NEWS.d/next/Library/2019-05-20-20-41-30.bpo-36983.hz-fLr.rst deleted file mode 100644 index bd2d91ad9234..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-20-20-41-30.bpo-36983.hz-fLr.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add missing names to ``typing.__all__``: ``ChainMap``, ``ForwardRef``, -``OrderedDict`` - by Anthony Sottile. diff --git a/Misc/NEWS.d/next/Library/2019-05-20-23-31-20.bpo-36969.JkZORP.rst b/Misc/NEWS.d/next/Library/2019-05-20-23-31-20.bpo-36969.JkZORP.rst deleted file mode 100644 index 9253ab92f1fb..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-20-23-31-20.bpo-36969.JkZORP.rst +++ /dev/null @@ -1,2 +0,0 @@ -PDB command `args` now display keyword only arguments. Patch contributed by -R?mi Lapeyre. diff --git a/Misc/NEWS.d/next/Library/2019-05-21-12-31-21.bpo-36969.u7cxu7.rst b/Misc/NEWS.d/next/Library/2019-05-21-12-31-21.bpo-36969.u7cxu7.rst deleted file mode 100644 index 1823a4dcc249..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-21-12-31-21.bpo-36969.u7cxu7.rst +++ /dev/null @@ -1,2 +0,0 @@ -PDB command `args` now display positional only arguments. Patch contributed -by R?mi Lapeyre. diff --git a/Misc/NEWS.d/next/Library/2019-05-22-02-25-31.bpo-27737.7bgKpa.rst b/Misc/NEWS.d/next/Library/2019-05-22-02-25-31.bpo-27737.7bgKpa.rst deleted file mode 100644 index 02d0ef891bec..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-22-02-25-31.bpo-27737.7bgKpa.rst +++ /dev/null @@ -1,2 +0,0 @@ -Allow whitespace only header encoding in ``email.header`` - by Batuhan -Taskaya diff --git a/Misc/NEWS.d/next/Library/2019-05-22-15-26-08.bpo-37008.WPbv31.rst b/Misc/NEWS.d/next/Library/2019-05-22-15-26-08.bpo-37008.WPbv31.rst deleted file mode 100644 index 42747aead49a..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-22-15-26-08.bpo-37008.WPbv31.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add support for calling :func:`next` with the mock resulting from -:func:`unittest.mock.mock_open` diff --git a/Misc/NEWS.d/next/Library/2019-05-22-22-55-18.bpo-36996.XQx08d.rst b/Misc/NEWS.d/next/Library/2019-05-22-22-55-18.bpo-36996.XQx08d.rst deleted file mode 100644 index 69d18d9713b4..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-22-22-55-18.bpo-36996.XQx08d.rst +++ /dev/null @@ -1 +0,0 @@ -Handle :func:`unittest.mock.patch` used as a decorator on async functions. diff --git a/Misc/NEWS.d/next/Library/2019-05-23-01-48-39.bpo-1230540.oKTNEQ.rst b/Misc/NEWS.d/next/Library/2019-05-23-01-48-39.bpo-1230540.oKTNEQ.rst deleted file mode 100644 index 250a64237d18..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-23-01-48-39.bpo-1230540.oKTNEQ.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add a new :func:`threading.excepthook` function which handles uncaught -:meth:`threading.Thread.run` exception. It can be overridden to control how -uncaught :meth:`threading.Thread.run` exceptions are handled. diff --git a/Misc/NEWS.d/next/Library/2019-05-23-17-37-22.bpo-32528.sGnkcl.rst b/Misc/NEWS.d/next/Library/2019-05-23-17-37-22.bpo-32528.sGnkcl.rst deleted file mode 100644 index 375f426025d3..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-23-17-37-22.bpo-32528.sGnkcl.rst +++ /dev/null @@ -1,8 +0,0 @@ -Make asyncio.CancelledError a BaseException. - -This will address the common mistake many asyncio users make: an "except -Exception" clause breaking Tasks cancellation. - -In addition to this change, we stop inheriting asyncio.TimeoutError and -asyncio.InvalidStateError from their concurrent.futures.* counterparts. -There's no point for these exceptions to share the inheritance chain. diff --git a/Misc/NEWS.d/next/Library/2019-05-23-18-46-56.bpo-37027.iH4eut.rst b/Misc/NEWS.d/next/Library/2019-05-23-18-46-56.bpo-37027.iH4eut.rst deleted file mode 100644 index 60b513d6ea3a..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-23-18-46-56.bpo-37027.iH4eut.rst +++ /dev/null @@ -1,2 +0,0 @@ -Return safe to use proxy socket object from -transport.get_extra_info('socket') diff --git a/Misc/NEWS.d/next/Library/2019-05-23-18-57-34.bpo-37028.Vse6Pj.rst b/Misc/NEWS.d/next/Library/2019-05-23-18-57-34.bpo-37028.Vse6Pj.rst deleted file mode 100644 index d9db21fb6f3c..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-23-18-57-34.bpo-37028.Vse6Pj.rst +++ /dev/null @@ -1 +0,0 @@ -Implement asyncio REPL diff --git a/Misc/NEWS.d/next/Library/2019-05-23-21-10-57.bpo-37001.DoLvTK.rst b/Misc/NEWS.d/next/Library/2019-05-23-21-10-57.bpo-37001.DoLvTK.rst deleted file mode 100644 index 5bcd7a9976c5..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-23-21-10-57.bpo-37001.DoLvTK.rst +++ /dev/null @@ -1,2 +0,0 @@ -:func:`symtable.symtable` now accepts the same input types for source code as the -built-in :func:`compile` function. Patch by Dino Viehland. diff --git a/Misc/NEWS.d/next/Library/2019-05-24-18-16-07.bpo-37035.HFbJVT.rst b/Misc/NEWS.d/next/Library/2019-05-24-18-16-07.bpo-37035.HFbJVT.rst deleted file mode 100644 index 004ec2d13714..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-24-18-16-07.bpo-37035.HFbJVT.rst +++ /dev/null @@ -1,5 +0,0 @@ -Don't log OSError based exceptions if a fatal error has occurred in asyncio -transport. Peer can generate almost any OSError, user cannot avoid these exceptions -by fixing own code. -Errors are still propagated to user code, it's just logging them -is pointless and pollute asyncio logs. diff --git a/Misc/NEWS.d/next/Library/2019-05-25-18-36-50.bpo-37045.suHdVJ.rst b/Misc/NEWS.d/next/Library/2019-05-25-18-36-50.bpo-37045.suHdVJ.rst deleted file mode 100644 index 001529ed6db4..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-25-18-36-50.bpo-37045.suHdVJ.rst +++ /dev/null @@ -1 +0,0 @@ -PEP 591: Add ``Final`` qualifier and ``@final`` decorator to the ``typing`` module. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2019-05-25-19-12-53.bpo-37046.iuhQQj.rst b/Misc/NEWS.d/next/Library/2019-05-25-19-12-53.bpo-37046.iuhQQj.rst deleted file mode 100644 index 9ec333b2d980..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-25-19-12-53.bpo-37046.iuhQQj.rst +++ /dev/null @@ -1 +0,0 @@ -PEP 586: Add ``Literal`` to the ``typing`` module. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2019-05-25-19-48-42.bpo-37049.an2LXJ.rst b/Misc/NEWS.d/next/Library/2019-05-25-19-48-42.bpo-37049.an2LXJ.rst deleted file mode 100644 index e0ce4a708d9e..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-25-19-48-42.bpo-37049.an2LXJ.rst +++ /dev/null @@ -1 +0,0 @@ -PEP 589: Add ``TypedDict`` to the ``typing`` module. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2019-05-26-01-20-06.bpo-37047.K9epi8.rst b/Misc/NEWS.d/next/Library/2019-05-26-01-20-06.bpo-37047.K9epi8.rst deleted file mode 100644 index ace5a3a44178..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-26-01-20-06.bpo-37047.K9epi8.rst +++ /dev/null @@ -1,3 +0,0 @@ -Handle late binding and attribute access in :class:`unittest.mock.AsyncMock` -setup for autospeccing. Document newly implemented async methods in -:class:`unittest.mock.MagicMock`. diff --git a/Misc/NEWS.d/next/Library/2019-05-26-10-16-55.bpo-36933.4w3eP9.rst b/Misc/NEWS.d/next/Library/2019-05-26-10-16-55.bpo-36933.4w3eP9.rst deleted file mode 100644 index dc2be7a140cf..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-26-10-16-55.bpo-36933.4w3eP9.rst +++ /dev/null @@ -1,2 +0,0 @@ -The functions ``sys.set_coroutine_wrapper`` and ``sys.get_coroutine_wrapper`` -that were deprecated and marked for removal in 3.8 have been removed. diff --git a/Misc/NEWS.d/next/Library/2019-05-26-19-05-24.bpo-37058.jmRu_g.rst b/Misc/NEWS.d/next/Library/2019-05-26-19-05-24.bpo-37058.jmRu_g.rst deleted file mode 100644 index 329b82c12adf..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-26-19-05-24.bpo-37058.jmRu_g.rst +++ /dev/null @@ -1 +0,0 @@ -PEP 544: Add ``Protocol`` and ``@runtime_checkable`` to the ``typing`` module. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2019-05-28-01-06-44.bpo-37054.sLULGQ.rst b/Misc/NEWS.d/next/Library/2019-05-28-01-06-44.bpo-37054.sLULGQ.rst deleted file mode 100644 index 9a2433abd0d0..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-28-01-06-44.bpo-37054.sLULGQ.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix destructor :class:`_pyio.BytesIO` and :class:`_pyio.TextIOWrapper`: -initialize their ``_buffer`` attribute as soon as possible (in the class -body), because it's used by ``__del__()`` which calls ``close()``. diff --git a/Misc/NEWS.d/next/Library/2019-05-28-01-17-42.bpo-33725.fFZoDG.rst b/Misc/NEWS.d/next/Library/2019-05-28-01-17-42.bpo-33725.fFZoDG.rst deleted file mode 100644 index 6f1665f6fab3..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-28-01-17-42.bpo-33725.fFZoDG.rst +++ /dev/null @@ -1,2 +0,0 @@ -On macOS, the :mod:`multiprocessing` module now uses *spawn* start method by -default. diff --git a/Misc/NEWS.d/next/Library/2019-05-28-12-17-10.bpo-37076.Bk2xOs.rst b/Misc/NEWS.d/next/Library/2019-05-28-12-17-10.bpo-37076.Bk2xOs.rst deleted file mode 100644 index 2773675cb5ad..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-28-12-17-10.bpo-37076.Bk2xOs.rst +++ /dev/null @@ -1,3 +0,0 @@ -:func:`_thread.start_new_thread` now logs uncaught exception raised by the -function using :func:`sys.unraisablehook`, rather than :func:`sys.excepthook`, -so the hook gets access to the function which raised the exception. diff --git a/Misc/NEWS.d/next/Library/2019-05-28-19-14-29.bpo-35279.PX7yl9.rst b/Misc/NEWS.d/next/Library/2019-05-28-19-14-29.bpo-35279.PX7yl9.rst deleted file mode 100644 index 41ee5c2fe8bf..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-28-19-14-29.bpo-35279.PX7yl9.rst +++ /dev/null @@ -1,3 +0,0 @@ -Change default *max_workers* of ``ThreadPoolExecutor`` from ``cpu_count() * -5`` to ``min(32, cpu_count() + 4))``. Previous value was unreasonably -large on many cores machines. diff --git a/Misc/NEWS.d/next/Library/2019-05-28-23-17-35.bpo-35246.oXT21d.rst b/Misc/NEWS.d/next/Library/2019-05-28-23-17-35.bpo-35246.oXT21d.rst deleted file mode 100644 index 39d4469cd101..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-28-23-17-35.bpo-35246.oXT21d.rst +++ /dev/null @@ -1 +0,0 @@ -Make :func:`asyncio.create_subprocess_exec` accept path-like arguments. diff --git a/Misc/NEWS.d/next/Library/2019-05-30-13-30-46.bpo-36999.EjY_L2.rst b/Misc/NEWS.d/next/Library/2019-05-30-13-30-46.bpo-36999.EjY_L2.rst deleted file mode 100644 index 5c897fb4dbc7..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-30-13-30-46.bpo-36999.EjY_L2.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add the ``asyncio.Task.get_coro()`` method to publicly expose the tasks's -coroutine object. diff --git a/Misc/NEWS.d/next/Library/2019-05-30-16-16-47.bpo-12639.TQFOR4.rst b/Misc/NEWS.d/next/Library/2019-05-30-16-16-47.bpo-12639.TQFOR4.rst deleted file mode 100644 index aade9121b4bb..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-30-16-16-47.bpo-12639.TQFOR4.rst +++ /dev/null @@ -1,2 +0,0 @@ -:meth:`msilib.Directory.start_component()` no longer fails if *keyfile* is -not ``None``. diff --git a/Misc/NEWS.d/next/Library/2019-05-30-21-25-14.bpo-29262.LdIzun.rst b/Misc/NEWS.d/next/Library/2019-05-30-21-25-14.bpo-29262.LdIzun.rst deleted file mode 100644 index e1154ef575a5..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-30-21-25-14.bpo-29262.LdIzun.rst +++ /dev/null @@ -1 +0,0 @@ -Add ``get_origin()`` and ``get_args()`` introspection helpers to ``typing`` module. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2019-05-31-11-33-11.bpo-26835.xGbUX0.rst b/Misc/NEWS.d/next/Library/2019-05-31-11-33-11.bpo-26835.xGbUX0.rst deleted file mode 100644 index 1c5ed97a7d19..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-31-11-33-11.bpo-26835.xGbUX0.rst +++ /dev/null @@ -1 +0,0 @@ -The fcntl module now contains file sealing constants for sealing of memfds. diff --git a/Misc/NEWS.d/next/Library/2019-05-31-15-53-34.bpo-12202.nobzc9.rst b/Misc/NEWS.d/next/Library/2019-05-31-15-53-34.bpo-12202.nobzc9.rst deleted file mode 100644 index 1e561970445f..000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-31-15-53-34.bpo-12202.nobzc9.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix the error handling in :meth:`msilib.SummaryInformation.GetProperty`. Patch -by Zackery Spytz. diff --git a/Misc/NEWS.d/next/Library/2019-06-01-09-03-32.bpo-37120.FOKQLU.rst b/Misc/NEWS.d/next/Library/2019-06-01-09-03-32.bpo-37120.FOKQLU.rst deleted file mode 100644 index 6bea492e6a55..000000000000 --- a/Misc/NEWS.d/next/Library/2019-06-01-09-03-32.bpo-37120.FOKQLU.rst +++ /dev/null @@ -1 +0,0 @@ -Add SSLContext.num_tickets to control the number of TLSv1.3 session tickets. diff --git a/Misc/NEWS.d/next/Library/2019-06-01-22-54-03.bpo-37128.oGXBWN.rst b/Misc/NEWS.d/next/Library/2019-06-01-22-54-03.bpo-37128.oGXBWN.rst deleted file mode 100644 index f1b825890231..000000000000 --- a/Misc/NEWS.d/next/Library/2019-06-01-22-54-03.bpo-37128.oGXBWN.rst +++ /dev/null @@ -1 +0,0 @@ -Added :func:`math.perm`. diff --git a/Misc/NEWS.d/next/Security/2018-03-30-12-26-47.bpo-33164.aO29Cx.rst b/Misc/NEWS.d/next/Security/2018-03-30-12-26-47.bpo-33164.aO29Cx.rst deleted file mode 100644 index 654494cb3498..000000000000 --- a/Misc/NEWS.d/next/Security/2018-03-30-12-26-47.bpo-33164.aO29Cx.rst +++ /dev/null @@ -1 +0,0 @@ -Updated blake2 implementation which uses secure memset implementation provided by platform. diff --git a/Misc/NEWS.d/next/Security/2019-02-24-18-48-16.bpo-33529.wpNNBD.rst b/Misc/NEWS.d/next/Security/2019-02-24-18-48-16.bpo-33529.wpNNBD.rst deleted file mode 100644 index 84d16f5a56ae..000000000000 --- a/Misc/NEWS.d/next/Security/2019-02-24-18-48-16.bpo-33529.wpNNBD.rst +++ /dev/null @@ -1,2 +0,0 @@ -Prevent fold function used in email header encoding from entering infinite -loop when there are too many non-ASCII characters in a header. diff --git a/Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst b/Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst deleted file mode 100644 index 37b567a5b6f9..000000000000 --- a/Misc/NEWS.d/next/Security/2019-05-21-23-20-18.bpo-35907.NC_zNK.rst +++ /dev/null @@ -1,3 +0,0 @@ -CVE-2019-9948: Avoid file reading by disallowing ``local-file://`` and -``local_file://`` URL schemes in ``URLopener().open()`` and -``URLopener().retrieve()`` of :mod:`urllib.request`. diff --git a/Misc/NEWS.d/next/Tests/2019-03-23-13-58-49.bpo-36342.q6Quiq.rst b/Misc/NEWS.d/next/Tests/2019-03-23-13-58-49.bpo-36342.q6Quiq.rst deleted file mode 100644 index a7c92980fd77..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-03-23-13-58-49.bpo-36342.q6Quiq.rst +++ /dev/null @@ -1 +0,0 @@ -Fix test_multiprocessing in test_venv if platform lacks functioning sem_open. diff --git a/Misc/NEWS.d/next/Tests/2019-05-04-21-25-19.bpo-36782.h3oPIb.rst b/Misc/NEWS.d/next/Tests/2019-05-04-21-25-19.bpo-36782.h3oPIb.rst deleted file mode 100644 index 222fb386ca7b..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-05-04-21-25-19.bpo-36782.h3oPIb.rst +++ /dev/null @@ -1 +0,0 @@ -Add tests for several C API functions in the :mod:`datetime` module. Patch by Edison Abahurire. diff --git a/Misc/NEWS.d/next/Tests/2019-05-06-18-29-54.bpo-35925.gwQPuC.rst b/Misc/NEWS.d/next/Tests/2019-05-06-18-29-54.bpo-35925.gwQPuC.rst deleted file mode 100644 index ad8cc8fc61a0..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-05-06-18-29-54.bpo-35925.gwQPuC.rst +++ /dev/null @@ -1 +0,0 @@ -Skip httplib and nntplib networking tests when they would otherwise fail due to a modern OS or distro with a default OpenSSL policy of rejecting connections to servers with weak certificates. diff --git a/Misc/NEWS.d/next/Tests/2019-05-08-15-55-46.bpo-36816.WBKRGZ.rst b/Misc/NEWS.d/next/Tests/2019-05-08-15-55-46.bpo-36816.WBKRGZ.rst deleted file mode 100644 index 420dfe832366..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-05-08-15-55-46.bpo-36816.WBKRGZ.rst +++ /dev/null @@ -1 +0,0 @@ -Update Lib/test/selfsigned_pythontestdotnet.pem to match self-signed.pythontest.net's new TLS certificate. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Tests/2019-05-10-01-50-30.bpo-36719.O84ZWv.rst b/Misc/NEWS.d/next/Tests/2019-05-10-01-50-30.bpo-36719.O84ZWv.rst deleted file mode 100644 index 9f60145975fe..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-05-10-01-50-30.bpo-36719.O84ZWv.rst +++ /dev/null @@ -1,3 +0,0 @@ -"python3 -m test -jN ..." now continues the execution of next tests when a -worker process crash (CHILD_ERROR state). Previously, the test suite stopped -immediately. Use --failfast to stop at the first error. diff --git a/Misc/NEWS.d/next/Tests/2019-05-14-14-12-24.bpo-36915.58b7pH.rst b/Misc/NEWS.d/next/Tests/2019-05-14-14-12-24.bpo-36915.58b7pH.rst deleted file mode 100644 index 4eebfb483251..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-05-14-14-12-24.bpo-36915.58b7pH.rst +++ /dev/null @@ -1,3 +0,0 @@ -The main regrtest process now always removes all temporary directories of -worker processes even if they crash or if they are killed on -KeyboardInterrupt (CTRL+c). diff --git a/Misc/NEWS.d/next/Tests/2019-05-22-12-57-15.bpo-36829.e9mRWC.rst b/Misc/NEWS.d/next/Tests/2019-05-22-12-57-15.bpo-36829.e9mRWC.rst deleted file mode 100644 index 4ab342b8a2b3..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-05-22-12-57-15.bpo-36829.e9mRWC.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add :func:`test.support.catch_unraisable_exception`: context manager -catching unraisable exception using :func:`sys.unraisablehook`. diff --git a/Misc/NEWS.d/next/Tests/2019-05-28-17-48-22.bpo-37081.qxB-1l.rst b/Misc/NEWS.d/next/Tests/2019-05-28-17-48-22.bpo-37081.qxB-1l.rst deleted file mode 100644 index df5b8f2482d3..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-05-28-17-48-22.bpo-37081.qxB-1l.rst +++ /dev/null @@ -1 +0,0 @@ -Test with OpenSSL 1.1.1c diff --git a/Misc/NEWS.d/next/Tests/2019-05-30-10-57-39.bpo-37098.SfXt1M.rst b/Misc/NEWS.d/next/Tests/2019-05-30-10-57-39.bpo-37098.SfXt1M.rst deleted file mode 100644 index 84e06e71869f..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-05-30-10-57-39.bpo-37098.SfXt1M.rst +++ /dev/null @@ -1 +0,0 @@ -Fix test_memfd_create on older Linux Kernels. diff --git a/Misc/NEWS.d/next/Tests/2019-06-03-02-30-36.bpo-37069.rVtdLk.rst b/Misc/NEWS.d/next/Tests/2019-06-03-02-30-36.bpo-37069.rVtdLk.rst deleted file mode 100644 index 566ff5150d5f..000000000000 --- a/Misc/NEWS.d/next/Tests/2019-06-03-02-30-36.bpo-37069.rVtdLk.rst +++ /dev/null @@ -1,3 +0,0 @@ -Modify test_coroutines, test_cprofile, test_generators, test_raise, test_ssl -and test_yield_from to use :func:`test.support.catch_unraisable_exception` -rather than :func:`test.support.captured_stderr`. diff --git a/Misc/NEWS.d/next/Tools-Demos/2019-05-26-16-47-06.bpo-37053.-EYRuz.rst b/Misc/NEWS.d/next/Tools-Demos/2019-05-26-16-47-06.bpo-37053.-EYRuz.rst deleted file mode 100644 index 5320dc51f750..000000000000 --- a/Misc/NEWS.d/next/Tools-Demos/2019-05-26-16-47-06.bpo-37053.-EYRuz.rst +++ /dev/null @@ -1 +0,0 @@ -Handle strings like u"bar" correctly in Tools/parser/unparse.py. Patch by Chih-Hsuan Yen. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Windows/2018-08-28-17-23-49.bpo-33407.ARG0W_.rst b/Misc/NEWS.d/next/Windows/2018-08-28-17-23-49.bpo-33407.ARG0W_.rst deleted file mode 100644 index 47b1e0668b18..000000000000 --- a/Misc/NEWS.d/next/Windows/2018-08-28-17-23-49.bpo-33407.ARG0W_.rst +++ /dev/null @@ -1 +0,0 @@ -The :c:macro:`Py_DEPRECATED()` macro has been implemented for MSVC. diff --git a/Misc/NEWS.d/next/Windows/2018-09-15-11-36-55.bpo-29883.HErerE.rst b/Misc/NEWS.d/next/Windows/2018-09-15-11-36-55.bpo-29883.HErerE.rst deleted file mode 100644 index b6d1375c7752..000000000000 --- a/Misc/NEWS.d/next/Windows/2018-09-15-11-36-55.bpo-29883.HErerE.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add Windows support for UDP transports for the Proactor Event Loop. Patch by -Adam Meily. diff --git a/Misc/NEWS.d/next/Windows/2019-03-01-16-43-45.bpo-35926.mLszHo.rst b/Misc/NEWS.d/next/Windows/2019-03-01-16-43-45.bpo-35926.mLszHo.rst deleted file mode 100644 index 03249c6a168a..000000000000 --- a/Misc/NEWS.d/next/Windows/2019-03-01-16-43-45.bpo-35926.mLszHo.rst +++ /dev/null @@ -1 +0,0 @@ -Update to OpenSSL 1.1.1b for Windows. diff --git a/Misc/NEWS.d/next/Windows/2019-05-20-20-26-36.bpo-36965.KsfI-N.rst b/Misc/NEWS.d/next/Windows/2019-05-20-20-26-36.bpo-36965.KsfI-N.rst deleted file mode 100644 index 2a531d2c14d9..000000000000 --- a/Misc/NEWS.d/next/Windows/2019-05-20-20-26-36.bpo-36965.KsfI-N.rst +++ /dev/null @@ -1 +0,0 @@ -include of STATUS_CONTROL_C_EXIT without depending on MSC compiler diff --git a/Misc/NEWS.d/next/macOS/2019-06-03-05-49-49.bpo-36231.RfmW_p.rst b/Misc/NEWS.d/next/macOS/2019-06-03-05-49-49.bpo-36231.RfmW_p.rst deleted file mode 100644 index c82e54c12c89..000000000000 --- a/Misc/NEWS.d/next/macOS/2019-06-03-05-49-49.bpo-36231.RfmW_p.rst +++ /dev/null @@ -1,3 +0,0 @@ -Support building Python on macOS without /usr/include installed. As of macOS -10.14, system header files are only available within an SDK provided by -either the Command Line Tools or the Xcode app. diff --git a/README.rst b/README.rst index 388543b8dcfc..b0a0ce7ec287 100644 --- a/README.rst +++ b/README.rst @@ -1,5 +1,5 @@ -This is Python version 3.8.0 alpha 4 -==================================== +This is Python version 3.8.0 beta 1 +=================================== .. image:: https://travis-ci.org/python/cpython.svg?branch=master :alt: CPython build status on Travis CI From webhook-mailer at python.org Tue Jun 4 16:13:27 2019 From: webhook-mailer at python.org (=?utf-8?q?=C5=81ukasz?= Langa) Date: Tue, 04 Jun 2019 20:13:27 -0000 Subject: [Python-checkins] Bump to 3.9.0a0 Message-ID: https://github.com/python/cpython/commit/9ab2fb1c68a75115da92d51b8c40b74f60f88561 commit: 9ab2fb1c68a75115da92d51b8c40b74f60f88561 branch: master author: ?ukasz Langa committer: ?ukasz Langa date: 2019-06-04T22:12:32+02:00 summary: Bump to 3.9.0a0 files: M Doc/tools/extensions/pyspecific.py M Doc/tutorial/interpreter.rst M Doc/tutorial/stdlib.rst M Doc/tutorial/stdlib2.rst M Include/patchlevel.h M PC/pyconfig.h M PC/python3.def M PCbuild/readme.txt M README.rst M configure M configure.ac diff --git a/Doc/tools/extensions/pyspecific.py b/Doc/tools/extensions/pyspecific.py index 8bf7eb699c4e..f79b25048a5a 100644 --- a/Doc/tools/extensions/pyspecific.py +++ b/Doc/tools/extensions/pyspecific.py @@ -36,7 +36,7 @@ ISSUE_URI = 'https://bugs.python.org/issue%s' -SOURCE_URI = 'https://github.com/python/cpython/tree/3.8/%s' +SOURCE_URI = 'https://github.com/python/cpython/tree/master/%s' # monkey-patch reST parser to disable alphabetic and roman enumerated lists from docutils.parsers.rst.states import Body diff --git a/Doc/tutorial/interpreter.rst b/Doc/tutorial/interpreter.rst index dddfd850cd29..87d2fefac7ef 100644 --- a/Doc/tutorial/interpreter.rst +++ b/Doc/tutorial/interpreter.rst @@ -10,13 +10,13 @@ Using the Python Interpreter Invoking the Interpreter ======================== -The Python interpreter is usually installed as :file:`/usr/local/bin/python3.8` +The Python interpreter is usually installed as :file:`/usr/local/bin/python3.9` on those machines where it is available; putting :file:`/usr/local/bin` in your Unix shell's search path makes it possible to start it by typing the command: .. code-block:: text - python3.8 + python3.9 to the shell. [#]_ Since the choice of the directory where the interpreter lives is an installation option, other places are possible; check with your local @@ -98,8 +98,8 @@ before printing the first prompt: .. code-block:: shell-session - $ python3.8 - Python 3.8 (default, Sep 16 2015, 09:25:04) + $ python3.9 + Python 3.9 (default, June 4 2019, 09:25:04) [GCC 4.8.2] on linux Type "help", "copyright", "credits" or "license" for more information. >>> diff --git a/Doc/tutorial/stdlib.rst b/Doc/tutorial/stdlib.rst index 82261a651348..e030f8f19b48 100644 --- a/Doc/tutorial/stdlib.rst +++ b/Doc/tutorial/stdlib.rst @@ -15,7 +15,7 @@ operating system:: >>> import os >>> os.getcwd() # Return the current working directory - 'C:\\Python38' + 'C:\\Python39' >>> os.chdir('/server/accesslogs') # Change current working directory >>> os.system('mkdir today') # Run the command mkdir in the system shell 0 diff --git a/Doc/tutorial/stdlib2.rst b/Doc/tutorial/stdlib2.rst index d2ac57b8e4d3..299482856ff3 100644 --- a/Doc/tutorial/stdlib2.rst +++ b/Doc/tutorial/stdlib2.rst @@ -278,7 +278,7 @@ applications include caching objects that are expensive to create:: Traceback (most recent call last): File "", line 1, in d['primary'] # entry was automatically removed - File "C:/python38/lib/weakref.py", line 46, in __getitem__ + File "C:/python39/lib/weakref.py", line 46, in __getitem__ o = self.data[key]() KeyError: 'primary' diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 881558bb44f6..ad5599462a8b 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -17,13 +17,13 @@ /* Version parsed out into numeric values */ /*--start constants--*/ #define PY_MAJOR_VERSION 3 -#define PY_MINOR_VERSION 8 +#define PY_MINOR_VERSION 9 #define PY_MICRO_VERSION 0 -#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_BETA -#define PY_RELEASE_SERIAL 1 +#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_ALPHA +#define PY_RELEASE_SERIAL 0 /* Version as a string */ -#define PY_VERSION "3.8.0b1" +#define PY_VERSION "3.9.0a0" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/PC/pyconfig.h b/PC/pyconfig.h index a74ee98a753d..122591276b4a 100644 --- a/PC/pyconfig.h +++ b/PC/pyconfig.h @@ -274,11 +274,11 @@ Py_NO_ENABLE_SHARED to find out. Also support MS_NO_COREDLL for b/w compat */ file in their Makefile (other compilers are generally taken care of by distutils.) */ # if defined(_DEBUG) -# pragma comment(lib,"python38_d.lib") +# pragma comment(lib,"python39_d.lib") # elif defined(Py_LIMITED_API) # pragma comment(lib,"python3.lib") # else -# pragma comment(lib,"python38.lib") +# pragma comment(lib,"python39.lib") # endif /* _DEBUG */ # endif /* _MSC_VER */ # endif /* Py_BUILD_CORE */ diff --git a/PC/python3.def b/PC/python3.def index e317864d0cd8..6844cf1f3b8e 100644 --- a/PC/python3.def +++ b/PC/python3.def @@ -2,802 +2,802 @@ ; It is used when building python3dll.vcxproj LIBRARY "python3" EXPORTS - PyArg_Parse=python38.PyArg_Parse - PyArg_ParseTuple=python38.PyArg_ParseTuple - PyArg_ParseTupleAndKeywords=python38.PyArg_ParseTupleAndKeywords - PyArg_UnpackTuple=python38.PyArg_UnpackTuple - PyArg_VaParse=python38.PyArg_VaParse - PyArg_VaParseTupleAndKeywords=python38.PyArg_VaParseTupleAndKeywords - PyArg_ValidateKeywordArguments=python38.PyArg_ValidateKeywordArguments - PyBaseObject_Type=python38.PyBaseObject_Type DATA - PyBool_FromLong=python38.PyBool_FromLong - PyBool_Type=python38.PyBool_Type DATA - PyByteArrayIter_Type=python38.PyByteArrayIter_Type DATA - PyByteArray_AsString=python38.PyByteArray_AsString - PyByteArray_Concat=python38.PyByteArray_Concat - PyByteArray_FromObject=python38.PyByteArray_FromObject - PyByteArray_FromStringAndSize=python38.PyByteArray_FromStringAndSize - PyByteArray_Resize=python38.PyByteArray_Resize - PyByteArray_Size=python38.PyByteArray_Size - PyByteArray_Type=python38.PyByteArray_Type DATA - PyBytesIter_Type=python38.PyBytesIter_Type DATA - PyBytes_AsString=python38.PyBytes_AsString - PyBytes_AsStringAndSize=python38.PyBytes_AsStringAndSize - PyBytes_Concat=python38.PyBytes_Concat - PyBytes_ConcatAndDel=python38.PyBytes_ConcatAndDel - PyBytes_DecodeEscape=python38.PyBytes_DecodeEscape - PyBytes_FromFormat=python38.PyBytes_FromFormat - PyBytes_FromFormatV=python38.PyBytes_FromFormatV - PyBytes_FromObject=python38.PyBytes_FromObject - PyBytes_FromString=python38.PyBytes_FromString - PyBytes_FromStringAndSize=python38.PyBytes_FromStringAndSize - PyBytes_Repr=python38.PyBytes_Repr - PyBytes_Size=python38.PyBytes_Size - PyBytes_Type=python38.PyBytes_Type DATA - PyCFunction_Call=python38.PyCFunction_Call - PyCFunction_ClearFreeList=python38.PyCFunction_ClearFreeList - PyCFunction_GetFlags=python38.PyCFunction_GetFlags - PyCFunction_GetFunction=python38.PyCFunction_GetFunction - PyCFunction_GetSelf=python38.PyCFunction_GetSelf - PyCFunction_New=python38.PyCFunction_New - PyCFunction_NewEx=python38.PyCFunction_NewEx - PyCFunction_Type=python38.PyCFunction_Type DATA - PyCallIter_New=python38.PyCallIter_New - PyCallIter_Type=python38.PyCallIter_Type DATA - PyCallable_Check=python38.PyCallable_Check - PyCapsule_GetContext=python38.PyCapsule_GetContext - PyCapsule_GetDestructor=python38.PyCapsule_GetDestructor - PyCapsule_GetName=python38.PyCapsule_GetName - PyCapsule_GetPointer=python38.PyCapsule_GetPointer - PyCapsule_Import=python38.PyCapsule_Import - PyCapsule_IsValid=python38.PyCapsule_IsValid - PyCapsule_New=python38.PyCapsule_New - PyCapsule_SetContext=python38.PyCapsule_SetContext - PyCapsule_SetDestructor=python38.PyCapsule_SetDestructor - PyCapsule_SetName=python38.PyCapsule_SetName - PyCapsule_SetPointer=python38.PyCapsule_SetPointer - PyCapsule_Type=python38.PyCapsule_Type DATA - PyClassMethodDescr_Type=python38.PyClassMethodDescr_Type DATA - PyCodec_BackslashReplaceErrors=python38.PyCodec_BackslashReplaceErrors - PyCodec_Decode=python38.PyCodec_Decode - PyCodec_Decoder=python38.PyCodec_Decoder - PyCodec_Encode=python38.PyCodec_Encode - PyCodec_Encoder=python38.PyCodec_Encoder - PyCodec_IgnoreErrors=python38.PyCodec_IgnoreErrors - PyCodec_IncrementalDecoder=python38.PyCodec_IncrementalDecoder - PyCodec_IncrementalEncoder=python38.PyCodec_IncrementalEncoder - PyCodec_KnownEncoding=python38.PyCodec_KnownEncoding - PyCodec_LookupError=python38.PyCodec_LookupError - PyCodec_NameReplaceErrors=python38.PyCodec_NameReplaceErrors - PyCodec_Register=python38.PyCodec_Register - PyCodec_RegisterError=python38.PyCodec_RegisterError - PyCodec_ReplaceErrors=python38.PyCodec_ReplaceErrors - PyCodec_StreamReader=python38.PyCodec_StreamReader - PyCodec_StreamWriter=python38.PyCodec_StreamWriter - PyCodec_StrictErrors=python38.PyCodec_StrictErrors - PyCodec_XMLCharRefReplaceErrors=python38.PyCodec_XMLCharRefReplaceErrors - PyComplex_FromDoubles=python38.PyComplex_FromDoubles - PyComplex_ImagAsDouble=python38.PyComplex_ImagAsDouble - PyComplex_RealAsDouble=python38.PyComplex_RealAsDouble - PyComplex_Type=python38.PyComplex_Type DATA - PyDescr_NewClassMethod=python38.PyDescr_NewClassMethod - PyDescr_NewGetSet=python38.PyDescr_NewGetSet - PyDescr_NewMember=python38.PyDescr_NewMember - PyDescr_NewMethod=python38.PyDescr_NewMethod - PyDictItems_Type=python38.PyDictItems_Type DATA - PyDictIterItem_Type=python38.PyDictIterItem_Type DATA - PyDictIterKey_Type=python38.PyDictIterKey_Type DATA - PyDictIterValue_Type=python38.PyDictIterValue_Type DATA - PyDictKeys_Type=python38.PyDictKeys_Type DATA - PyDictProxy_New=python38.PyDictProxy_New - PyDictProxy_Type=python38.PyDictProxy_Type DATA - PyDictValues_Type=python38.PyDictValues_Type DATA - PyDict_Clear=python38.PyDict_Clear - PyDict_Contains=python38.PyDict_Contains - PyDict_Copy=python38.PyDict_Copy - PyDict_DelItem=python38.PyDict_DelItem - PyDict_DelItemString=python38.PyDict_DelItemString - PyDict_GetItem=python38.PyDict_GetItem - PyDict_GetItemString=python38.PyDict_GetItemString - PyDict_GetItemWithError=python38.PyDict_GetItemWithError - PyDict_Items=python38.PyDict_Items - PyDict_Keys=python38.PyDict_Keys - PyDict_Merge=python38.PyDict_Merge - PyDict_MergeFromSeq2=python38.PyDict_MergeFromSeq2 - PyDict_New=python38.PyDict_New - PyDict_Next=python38.PyDict_Next - PyDict_SetItem=python38.PyDict_SetItem - PyDict_SetItemString=python38.PyDict_SetItemString - PyDict_Size=python38.PyDict_Size - PyDict_Type=python38.PyDict_Type DATA - PyDict_Update=python38.PyDict_Update - PyDict_Values=python38.PyDict_Values - PyEllipsis_Type=python38.PyEllipsis_Type DATA - PyEnum_Type=python38.PyEnum_Type DATA - PyErr_BadArgument=python38.PyErr_BadArgument - PyErr_BadInternalCall=python38.PyErr_BadInternalCall - PyErr_CheckSignals=python38.PyErr_CheckSignals - PyErr_Clear=python38.PyErr_Clear - PyErr_Display=python38.PyErr_Display - PyErr_ExceptionMatches=python38.PyErr_ExceptionMatches - PyErr_Fetch=python38.PyErr_Fetch - PyErr_Format=python38.PyErr_Format - PyErr_FormatV=python38.PyErr_FormatV - PyErr_GetExcInfo=python38.PyErr_GetExcInfo - PyErr_GivenExceptionMatches=python38.PyErr_GivenExceptionMatches - PyErr_NewException=python38.PyErr_NewException - PyErr_NewExceptionWithDoc=python38.PyErr_NewExceptionWithDoc - PyErr_NoMemory=python38.PyErr_NoMemory - PyErr_NormalizeException=python38.PyErr_NormalizeException - PyErr_Occurred=python38.PyErr_Occurred - PyErr_Print=python38.PyErr_Print - PyErr_PrintEx=python38.PyErr_PrintEx - PyErr_ProgramText=python38.PyErr_ProgramText - PyErr_ResourceWarning=python38.PyErr_ResourceWarning - PyErr_Restore=python38.PyErr_Restore - PyErr_SetExcFromWindowsErr=python38.PyErr_SetExcFromWindowsErr - PyErr_SetExcFromWindowsErrWithFilename=python38.PyErr_SetExcFromWindowsErrWithFilename - PyErr_SetExcFromWindowsErrWithFilenameObject=python38.PyErr_SetExcFromWindowsErrWithFilenameObject - PyErr_SetExcFromWindowsErrWithFilenameObjects=python38.PyErr_SetExcFromWindowsErrWithFilenameObjects - PyErr_SetExcInfo=python38.PyErr_SetExcInfo - PyErr_SetFromErrno=python38.PyErr_SetFromErrno - PyErr_SetFromErrnoWithFilename=python38.PyErr_SetFromErrnoWithFilename - PyErr_SetFromErrnoWithFilenameObject=python38.PyErr_SetFromErrnoWithFilenameObject - PyErr_SetFromErrnoWithFilenameObjects=python38.PyErr_SetFromErrnoWithFilenameObjects - PyErr_SetFromWindowsErr=python38.PyErr_SetFromWindowsErr - PyErr_SetFromWindowsErrWithFilename=python38.PyErr_SetFromWindowsErrWithFilename - PyErr_SetImportError=python38.PyErr_SetImportError - PyErr_SetImportErrorSubclass=python38.PyErr_SetImportErrorSubclass - PyErr_SetInterrupt=python38.PyErr_SetInterrupt - PyErr_SetNone=python38.PyErr_SetNone - PyErr_SetObject=python38.PyErr_SetObject - PyErr_SetString=python38.PyErr_SetString - PyErr_SyntaxLocation=python38.PyErr_SyntaxLocation - PyErr_SyntaxLocationEx=python38.PyErr_SyntaxLocationEx - PyErr_WarnEx=python38.PyErr_WarnEx - PyErr_WarnExplicit=python38.PyErr_WarnExplicit - PyErr_WarnFormat=python38.PyErr_WarnFormat - PyErr_WriteUnraisable=python38.PyErr_WriteUnraisable - PyEval_AcquireLock=python38.PyEval_AcquireLock - PyEval_AcquireThread=python38.PyEval_AcquireThread - PyEval_CallFunction=python38.PyEval_CallFunction - PyEval_CallMethod=python38.PyEval_CallMethod - PyEval_CallObjectWithKeywords=python38.PyEval_CallObjectWithKeywords - PyEval_EvalCode=python38.PyEval_EvalCode - PyEval_EvalCodeEx=python38.PyEval_EvalCodeEx - PyEval_EvalFrame=python38.PyEval_EvalFrame - PyEval_EvalFrameEx=python38.PyEval_EvalFrameEx - PyEval_GetBuiltins=python38.PyEval_GetBuiltins - PyEval_GetCallStats=python38.PyEval_GetCallStats - PyEval_GetFrame=python38.PyEval_GetFrame - PyEval_GetFuncDesc=python38.PyEval_GetFuncDesc - PyEval_GetFuncName=python38.PyEval_GetFuncName - PyEval_GetGlobals=python38.PyEval_GetGlobals - PyEval_GetLocals=python38.PyEval_GetLocals - PyEval_InitThreads=python38.PyEval_InitThreads - PyEval_ReInitThreads=python38.PyEval_ReInitThreads - PyEval_ReleaseLock=python38.PyEval_ReleaseLock - PyEval_ReleaseThread=python38.PyEval_ReleaseThread - PyEval_RestoreThread=python38.PyEval_RestoreThread - PyEval_SaveThread=python38.PyEval_SaveThread - PyEval_ThreadsInitialized=python38.PyEval_ThreadsInitialized - PyExc_ArithmeticError=python38.PyExc_ArithmeticError DATA - PyExc_AssertionError=python38.PyExc_AssertionError DATA - PyExc_AttributeError=python38.PyExc_AttributeError DATA - PyExc_BaseException=python38.PyExc_BaseException DATA - PyExc_BlockingIOError=python38.PyExc_BlockingIOError DATA - PyExc_BrokenPipeError=python38.PyExc_BrokenPipeError DATA - PyExc_BufferError=python38.PyExc_BufferError DATA - PyExc_BytesWarning=python38.PyExc_BytesWarning DATA - PyExc_ChildProcessError=python38.PyExc_ChildProcessError DATA - PyExc_ConnectionAbortedError=python38.PyExc_ConnectionAbortedError DATA - PyExc_ConnectionError=python38.PyExc_ConnectionError DATA - PyExc_ConnectionRefusedError=python38.PyExc_ConnectionRefusedError DATA - PyExc_ConnectionResetError=python38.PyExc_ConnectionResetError DATA - PyExc_DeprecationWarning=python38.PyExc_DeprecationWarning DATA - PyExc_EOFError=python38.PyExc_EOFError DATA - PyExc_EnvironmentError=python38.PyExc_EnvironmentError DATA - PyExc_Exception=python38.PyExc_Exception DATA - PyExc_FileExistsError=python38.PyExc_FileExistsError DATA - PyExc_FileNotFoundError=python38.PyExc_FileNotFoundError DATA - PyExc_FloatingPointError=python38.PyExc_FloatingPointError DATA - PyExc_FutureWarning=python38.PyExc_FutureWarning DATA - PyExc_GeneratorExit=python38.PyExc_GeneratorExit DATA - PyExc_IOError=python38.PyExc_IOError DATA - PyExc_ImportError=python38.PyExc_ImportError DATA - PyExc_ImportWarning=python38.PyExc_ImportWarning DATA - PyExc_IndentationError=python38.PyExc_IndentationError DATA - PyExc_IndexError=python38.PyExc_IndexError DATA - PyExc_InterruptedError=python38.PyExc_InterruptedError DATA - PyExc_IsADirectoryError=python38.PyExc_IsADirectoryError DATA - PyExc_KeyError=python38.PyExc_KeyError DATA - PyExc_KeyboardInterrupt=python38.PyExc_KeyboardInterrupt DATA - PyExc_LookupError=python38.PyExc_LookupError DATA - PyExc_MemoryError=python38.PyExc_MemoryError DATA - PyExc_ModuleNotFoundError=python38.PyExc_ModuleNotFoundError DATA - PyExc_NameError=python38.PyExc_NameError DATA - PyExc_NotADirectoryError=python38.PyExc_NotADirectoryError DATA - PyExc_NotImplementedError=python38.PyExc_NotImplementedError DATA - PyExc_OSError=python38.PyExc_OSError DATA - PyExc_OverflowError=python38.PyExc_OverflowError DATA - PyExc_PendingDeprecationWarning=python38.PyExc_PendingDeprecationWarning DATA - PyExc_PermissionError=python38.PyExc_PermissionError DATA - PyExc_ProcessLookupError=python38.PyExc_ProcessLookupError DATA - PyExc_RecursionError=python38.PyExc_RecursionError DATA - PyExc_ReferenceError=python38.PyExc_ReferenceError DATA - PyExc_ResourceWarning=python38.PyExc_ResourceWarning DATA - PyExc_RuntimeError=python38.PyExc_RuntimeError DATA - PyExc_RuntimeWarning=python38.PyExc_RuntimeWarning DATA - PyExc_StopAsyncIteration=python38.PyExc_StopAsyncIteration DATA - PyExc_StopIteration=python38.PyExc_StopIteration DATA - PyExc_SyntaxError=python38.PyExc_SyntaxError DATA - PyExc_SyntaxWarning=python38.PyExc_SyntaxWarning DATA - PyExc_SystemError=python38.PyExc_SystemError DATA - PyExc_SystemExit=python38.PyExc_SystemExit DATA - PyExc_TabError=python38.PyExc_TabError DATA - PyExc_TargetScopeError=python38.PyExc_TargetScopeError DATA - PyExc_TimeoutError=python38.PyExc_TimeoutError DATA - PyExc_TypeError=python38.PyExc_TypeError DATA - PyExc_UnboundLocalError=python38.PyExc_UnboundLocalError DATA - PyExc_UnicodeDecodeError=python38.PyExc_UnicodeDecodeError DATA - PyExc_UnicodeEncodeError=python38.PyExc_UnicodeEncodeError DATA - PyExc_UnicodeError=python38.PyExc_UnicodeError DATA - PyExc_UnicodeTranslateError=python38.PyExc_UnicodeTranslateError DATA - PyExc_UnicodeWarning=python38.PyExc_UnicodeWarning DATA - PyExc_UserWarning=python38.PyExc_UserWarning DATA - PyExc_ValueError=python38.PyExc_ValueError DATA - PyExc_Warning=python38.PyExc_Warning DATA - PyExc_WindowsError=python38.PyExc_WindowsError DATA - PyExc_ZeroDivisionError=python38.PyExc_ZeroDivisionError DATA - PyExceptionClass_Name=python38.PyExceptionClass_Name - PyException_GetCause=python38.PyException_GetCause - PyException_GetContext=python38.PyException_GetContext - PyException_GetTraceback=python38.PyException_GetTraceback - PyException_SetCause=python38.PyException_SetCause - PyException_SetContext=python38.PyException_SetContext - PyException_SetTraceback=python38.PyException_SetTraceback - PyFile_FromFd=python38.PyFile_FromFd - PyFile_GetLine=python38.PyFile_GetLine - PyFile_WriteObject=python38.PyFile_WriteObject - PyFile_WriteString=python38.PyFile_WriteString - PyFilter_Type=python38.PyFilter_Type DATA - PyFloat_AsDouble=python38.PyFloat_AsDouble - PyFloat_FromDouble=python38.PyFloat_FromDouble - PyFloat_FromString=python38.PyFloat_FromString - PyFloat_GetInfo=python38.PyFloat_GetInfo - PyFloat_GetMax=python38.PyFloat_GetMax - PyFloat_GetMin=python38.PyFloat_GetMin - PyFloat_Type=python38.PyFloat_Type DATA - PyFrozenSet_New=python38.PyFrozenSet_New - PyFrozenSet_Type=python38.PyFrozenSet_Type DATA - PyGC_Collect=python38.PyGC_Collect - PyGILState_Ensure=python38.PyGILState_Ensure - PyGILState_GetThisThreadState=python38.PyGILState_GetThisThreadState - PyGILState_Release=python38.PyGILState_Release - PyGetSetDescr_Type=python38.PyGetSetDescr_Type DATA - PyImport_AddModule=python38.PyImport_AddModule - PyImport_AddModuleObject=python38.PyImport_AddModuleObject - PyImport_AppendInittab=python38.PyImport_AppendInittab - PyImport_Cleanup=python38.PyImport_Cleanup - PyImport_ExecCodeModule=python38.PyImport_ExecCodeModule - PyImport_ExecCodeModuleEx=python38.PyImport_ExecCodeModuleEx - PyImport_ExecCodeModuleObject=python38.PyImport_ExecCodeModuleObject - PyImport_ExecCodeModuleWithPathnames=python38.PyImport_ExecCodeModuleWithPathnames - PyImport_GetImporter=python38.PyImport_GetImporter - PyImport_GetMagicNumber=python38.PyImport_GetMagicNumber - PyImport_GetMagicTag=python38.PyImport_GetMagicTag - PyImport_GetModule=python38.PyImport_GetModule - PyImport_GetModuleDict=python38.PyImport_GetModuleDict - PyImport_Import=python38.PyImport_Import - PyImport_ImportFrozenModule=python38.PyImport_ImportFrozenModule - PyImport_ImportFrozenModuleObject=python38.PyImport_ImportFrozenModuleObject - PyImport_ImportModule=python38.PyImport_ImportModule - PyImport_ImportModuleLevel=python38.PyImport_ImportModuleLevel - PyImport_ImportModuleLevelObject=python38.PyImport_ImportModuleLevelObject - PyImport_ImportModuleNoBlock=python38.PyImport_ImportModuleNoBlock - PyImport_ReloadModule=python38.PyImport_ReloadModule - PyIndex_Check=python38.PyIndex_Check - PyInterpreterState_Clear=python38.PyInterpreterState_Clear - PyInterpreterState_Delete=python38.PyInterpreterState_Delete - PyInterpreterState_New=python38.PyInterpreterState_New - PyIter_Check=python38.PyIter_Check - PyIter_Next=python38.PyIter_Next - PyListIter_Type=python38.PyListIter_Type DATA - PyListRevIter_Type=python38.PyListRevIter_Type DATA - PyList_Append=python38.PyList_Append - PyList_AsTuple=python38.PyList_AsTuple - PyList_GetItem=python38.PyList_GetItem - PyList_GetSlice=python38.PyList_GetSlice - PyList_Insert=python38.PyList_Insert - PyList_New=python38.PyList_New - PyList_Reverse=python38.PyList_Reverse - PyList_SetItem=python38.PyList_SetItem - PyList_SetSlice=python38.PyList_SetSlice - PyList_Size=python38.PyList_Size - PyList_Sort=python38.PyList_Sort - PyList_Type=python38.PyList_Type DATA - PyLongRangeIter_Type=python38.PyLongRangeIter_Type DATA - PyLong_AsDouble=python38.PyLong_AsDouble - PyLong_AsLong=python38.PyLong_AsLong - PyLong_AsLongAndOverflow=python38.PyLong_AsLongAndOverflow - PyLong_AsLongLong=python38.PyLong_AsLongLong - PyLong_AsLongLongAndOverflow=python38.PyLong_AsLongLongAndOverflow - PyLong_AsSize_t=python38.PyLong_AsSize_t - PyLong_AsSsize_t=python38.PyLong_AsSsize_t - PyLong_AsUnsignedLong=python38.PyLong_AsUnsignedLong - PyLong_AsUnsignedLongLong=python38.PyLong_AsUnsignedLongLong - PyLong_AsUnsignedLongLongMask=python38.PyLong_AsUnsignedLongLongMask - PyLong_AsUnsignedLongMask=python38.PyLong_AsUnsignedLongMask - PyLong_AsVoidPtr=python38.PyLong_AsVoidPtr - PyLong_FromDouble=python38.PyLong_FromDouble - PyLong_FromLong=python38.PyLong_FromLong - PyLong_FromLongLong=python38.PyLong_FromLongLong - PyLong_FromSize_t=python38.PyLong_FromSize_t - PyLong_FromSsize_t=python38.PyLong_FromSsize_t - PyLong_FromString=python38.PyLong_FromString - PyLong_FromUnsignedLong=python38.PyLong_FromUnsignedLong - PyLong_FromUnsignedLongLong=python38.PyLong_FromUnsignedLongLong - PyLong_FromVoidPtr=python38.PyLong_FromVoidPtr - PyLong_GetInfo=python38.PyLong_GetInfo - PyLong_Type=python38.PyLong_Type DATA - PyMap_Type=python38.PyMap_Type DATA - PyMapping_Check=python38.PyMapping_Check - PyMapping_GetItemString=python38.PyMapping_GetItemString - PyMapping_HasKey=python38.PyMapping_HasKey - PyMapping_HasKeyString=python38.PyMapping_HasKeyString - PyMapping_Items=python38.PyMapping_Items - PyMapping_Keys=python38.PyMapping_Keys - PyMapping_Length=python38.PyMapping_Length - PyMapping_SetItemString=python38.PyMapping_SetItemString - PyMapping_Size=python38.PyMapping_Size - PyMapping_Values=python38.PyMapping_Values - PyMem_Calloc=python38.PyMem_Calloc - PyMem_Free=python38.PyMem_Free - PyMem_Malloc=python38.PyMem_Malloc - PyMem_Realloc=python38.PyMem_Realloc - PyMemberDescr_Type=python38.PyMemberDescr_Type DATA - PyMemoryView_FromMemory=python38.PyMemoryView_FromMemory - PyMemoryView_FromObject=python38.PyMemoryView_FromObject - PyMemoryView_GetContiguous=python38.PyMemoryView_GetContiguous - PyMemoryView_Type=python38.PyMemoryView_Type DATA - PyMethodDescr_Type=python38.PyMethodDescr_Type DATA - PyModuleDef_Init=python38.PyModuleDef_Init - PyModuleDef_Type=python38.PyModuleDef_Type DATA - PyModule_AddFunctions=python38.PyModule_AddFunctions - PyModule_AddIntConstant=python38.PyModule_AddIntConstant - PyModule_AddObject=python38.PyModule_AddObject - PyModule_AddStringConstant=python38.PyModule_AddStringConstant - PyModule_Create2=python38.PyModule_Create2 - PyModule_ExecDef=python38.PyModule_ExecDef - PyModule_FromDefAndSpec2=python38.PyModule_FromDefAndSpec2 - PyModule_GetDef=python38.PyModule_GetDef - PyModule_GetDict=python38.PyModule_GetDict - PyModule_GetFilename=python38.PyModule_GetFilename - PyModule_GetFilenameObject=python38.PyModule_GetFilenameObject - PyModule_GetName=python38.PyModule_GetName - PyModule_GetNameObject=python38.PyModule_GetNameObject - PyModule_GetState=python38.PyModule_GetState - PyModule_New=python38.PyModule_New - PyModule_NewObject=python38.PyModule_NewObject - PyModule_SetDocString=python38.PyModule_SetDocString - PyModule_Type=python38.PyModule_Type DATA - PyNullImporter_Type=python38.PyNullImporter_Type DATA - PyNumber_Absolute=python38.PyNumber_Absolute - PyNumber_Add=python38.PyNumber_Add - PyNumber_And=python38.PyNumber_And - PyNumber_AsSsize_t=python38.PyNumber_AsSsize_t - PyNumber_Check=python38.PyNumber_Check - PyNumber_Divmod=python38.PyNumber_Divmod - PyNumber_Float=python38.PyNumber_Float - PyNumber_FloorDivide=python38.PyNumber_FloorDivide - PyNumber_InPlaceAdd=python38.PyNumber_InPlaceAdd - PyNumber_InPlaceAnd=python38.PyNumber_InPlaceAnd - PyNumber_InPlaceFloorDivide=python38.PyNumber_InPlaceFloorDivide - PyNumber_InPlaceLshift=python38.PyNumber_InPlaceLshift - PyNumber_InPlaceMatrixMultiply=python38.PyNumber_InPlaceMatrixMultiply - PyNumber_InPlaceMultiply=python38.PyNumber_InPlaceMultiply - PyNumber_InPlaceOr=python38.PyNumber_InPlaceOr - PyNumber_InPlacePower=python38.PyNumber_InPlacePower - PyNumber_InPlaceRemainder=python38.PyNumber_InPlaceRemainder - PyNumber_InPlaceRshift=python38.PyNumber_InPlaceRshift - PyNumber_InPlaceSubtract=python38.PyNumber_InPlaceSubtract - PyNumber_InPlaceTrueDivide=python38.PyNumber_InPlaceTrueDivide - PyNumber_InPlaceXor=python38.PyNumber_InPlaceXor - PyNumber_Index=python38.PyNumber_Index - PyNumber_Invert=python38.PyNumber_Invert - PyNumber_Long=python38.PyNumber_Long - PyNumber_Lshift=python38.PyNumber_Lshift - PyNumber_MatrixMultiply=python38.PyNumber_MatrixMultiply - PyNumber_Multiply=python38.PyNumber_Multiply - PyNumber_Negative=python38.PyNumber_Negative - PyNumber_Or=python38.PyNumber_Or - PyNumber_Positive=python38.PyNumber_Positive - PyNumber_Power=python38.PyNumber_Power - PyNumber_Remainder=python38.PyNumber_Remainder - PyNumber_Rshift=python38.PyNumber_Rshift - PyNumber_Subtract=python38.PyNumber_Subtract - PyNumber_ToBase=python38.PyNumber_ToBase - PyNumber_TrueDivide=python38.PyNumber_TrueDivide - PyNumber_Xor=python38.PyNumber_Xor - PyODictItems_Type=python38.PyODictItems_Type DATA - PyODictIter_Type=python38.PyODictIter_Type DATA - PyODictKeys_Type=python38.PyODictKeys_Type DATA - PyODictValues_Type=python38.PyODictValues_Type DATA - PyODict_DelItem=python38.PyODict_DelItem - PyODict_New=python38.PyODict_New - PyODict_SetItem=python38.PyODict_SetItem - PyODict_Type=python38.PyODict_Type DATA - PyOS_AfterFork=python38.PyOS_AfterFork - PyOS_CheckStack=python38.PyOS_CheckStack - PyOS_FSPath=python38.PyOS_FSPath - PyOS_InitInterrupts=python38.PyOS_InitInterrupts - PyOS_InputHook=python38.PyOS_InputHook DATA - PyOS_InterruptOccurred=python38.PyOS_InterruptOccurred - PyOS_ReadlineFunctionPointer=python38.PyOS_ReadlineFunctionPointer DATA - PyOS_double_to_string=python38.PyOS_double_to_string - PyOS_getsig=python38.PyOS_getsig - PyOS_mystricmp=python38.PyOS_mystricmp - PyOS_mystrnicmp=python38.PyOS_mystrnicmp - PyOS_setsig=python38.PyOS_setsig - PyOS_snprintf=python38.PyOS_snprintf - PyOS_string_to_double=python38.PyOS_string_to_double - PyOS_strtol=python38.PyOS_strtol - PyOS_strtoul=python38.PyOS_strtoul - PyOS_vsnprintf=python38.PyOS_vsnprintf - PyObject_ASCII=python38.PyObject_ASCII - PyObject_AsCharBuffer=python38.PyObject_AsCharBuffer - PyObject_AsFileDescriptor=python38.PyObject_AsFileDescriptor - PyObject_AsReadBuffer=python38.PyObject_AsReadBuffer - PyObject_AsWriteBuffer=python38.PyObject_AsWriteBuffer - PyObject_Bytes=python38.PyObject_Bytes - PyObject_Call=python38.PyObject_Call - PyObject_CallFunction=python38.PyObject_CallFunction - PyObject_CallFunctionObjArgs=python38.PyObject_CallFunctionObjArgs - PyObject_CallMethod=python38.PyObject_CallMethod - PyObject_CallMethodObjArgs=python38.PyObject_CallMethodObjArgs - PyObject_CallObject=python38.PyObject_CallObject - PyObject_Calloc=python38.PyObject_Calloc - PyObject_CheckReadBuffer=python38.PyObject_CheckReadBuffer - PyObject_ClearWeakRefs=python38.PyObject_ClearWeakRefs - PyObject_DelItem=python38.PyObject_DelItem - PyObject_DelItemString=python38.PyObject_DelItemString - PyObject_Dir=python38.PyObject_Dir - PyObject_Format=python38.PyObject_Format - PyObject_Free=python38.PyObject_Free - PyObject_GC_Del=python38.PyObject_GC_Del - PyObject_GC_Track=python38.PyObject_GC_Track - PyObject_GC_UnTrack=python38.PyObject_GC_UnTrack - PyObject_GenericGetAttr=python38.PyObject_GenericGetAttr - PyObject_GenericSetAttr=python38.PyObject_GenericSetAttr - PyObject_GenericSetDict=python38.PyObject_GenericSetDict - PyObject_GetAttr=python38.PyObject_GetAttr - PyObject_GetAttrString=python38.PyObject_GetAttrString - PyObject_GetItem=python38.PyObject_GetItem - PyObject_GetIter=python38.PyObject_GetIter - PyObject_HasAttr=python38.PyObject_HasAttr - PyObject_HasAttrString=python38.PyObject_HasAttrString - PyObject_Hash=python38.PyObject_Hash - PyObject_HashNotImplemented=python38.PyObject_HashNotImplemented - PyObject_Init=python38.PyObject_Init - PyObject_InitVar=python38.PyObject_InitVar - PyObject_IsInstance=python38.PyObject_IsInstance - PyObject_IsSubclass=python38.PyObject_IsSubclass - PyObject_IsTrue=python38.PyObject_IsTrue - PyObject_Length=python38.PyObject_Length - PyObject_Malloc=python38.PyObject_Malloc - PyObject_Not=python38.PyObject_Not - PyObject_Realloc=python38.PyObject_Realloc - PyObject_Repr=python38.PyObject_Repr - PyObject_RichCompare=python38.PyObject_RichCompare - PyObject_RichCompareBool=python38.PyObject_RichCompareBool - PyObject_SelfIter=python38.PyObject_SelfIter - PyObject_SetAttr=python38.PyObject_SetAttr - PyObject_SetAttrString=python38.PyObject_SetAttrString - PyObject_SetItem=python38.PyObject_SetItem - PyObject_Size=python38.PyObject_Size - PyObject_Str=python38.PyObject_Str - PyObject_Type=python38.PyObject_Type - PyParser_SimpleParseFileFlags=python38.PyParser_SimpleParseFileFlags - PyParser_SimpleParseStringFlags=python38.PyParser_SimpleParseStringFlags - PyParser_SimpleParseStringFlagsFilename=python38.PyParser_SimpleParseStringFlagsFilename - PyProperty_Type=python38.PyProperty_Type DATA - PyRangeIter_Type=python38.PyRangeIter_Type DATA - PyRange_Type=python38.PyRange_Type DATA - PyReversed_Type=python38.PyReversed_Type DATA - PySeqIter_New=python38.PySeqIter_New - PySeqIter_Type=python38.PySeqIter_Type DATA - PySequence_Check=python38.PySequence_Check - PySequence_Concat=python38.PySequence_Concat - PySequence_Contains=python38.PySequence_Contains - PySequence_Count=python38.PySequence_Count - PySequence_DelItem=python38.PySequence_DelItem - PySequence_DelSlice=python38.PySequence_DelSlice - PySequence_Fast=python38.PySequence_Fast - PySequence_GetItem=python38.PySequence_GetItem - PySequence_GetSlice=python38.PySequence_GetSlice - PySequence_In=python38.PySequence_In - PySequence_InPlaceConcat=python38.PySequence_InPlaceConcat - PySequence_InPlaceRepeat=python38.PySequence_InPlaceRepeat - PySequence_Index=python38.PySequence_Index - PySequence_Length=python38.PySequence_Length - PySequence_List=python38.PySequence_List - PySequence_Repeat=python38.PySequence_Repeat - PySequence_SetItem=python38.PySequence_SetItem - PySequence_SetSlice=python38.PySequence_SetSlice - PySequence_Size=python38.PySequence_Size - PySequence_Tuple=python38.PySequence_Tuple - PySetIter_Type=python38.PySetIter_Type DATA - PySet_Add=python38.PySet_Add - PySet_Clear=python38.PySet_Clear - PySet_Contains=python38.PySet_Contains - PySet_Discard=python38.PySet_Discard - PySet_New=python38.PySet_New - PySet_Pop=python38.PySet_Pop - PySet_Size=python38.PySet_Size - PySet_Type=python38.PySet_Type DATA - PySlice_AdjustIndices=python38.PySlice_AdjustIndices - PySlice_GetIndices=python38.PySlice_GetIndices - PySlice_GetIndicesEx=python38.PySlice_GetIndicesEx - PySlice_New=python38.PySlice_New - PySlice_Type=python38.PySlice_Type DATA - PySlice_Unpack=python38.PySlice_Unpack - PySortWrapper_Type=python38.PySortWrapper_Type DATA - PyInterpreterState_GetID=python38.PyInterpreterState_GetID - PyState_AddModule=python38.PyState_AddModule - PyState_FindModule=python38.PyState_FindModule - PyState_RemoveModule=python38.PyState_RemoveModule - PyStructSequence_GetItem=python38.PyStructSequence_GetItem - PyStructSequence_New=python38.PyStructSequence_New - PyStructSequence_NewType=python38.PyStructSequence_NewType - PyStructSequence_SetItem=python38.PyStructSequence_SetItem - PySuper_Type=python38.PySuper_Type DATA - PySys_AddWarnOption=python38.PySys_AddWarnOption - PySys_AddWarnOptionUnicode=python38.PySys_AddWarnOptionUnicode - PySys_AddXOption=python38.PySys_AddXOption - PySys_FormatStderr=python38.PySys_FormatStderr - PySys_FormatStdout=python38.PySys_FormatStdout - PySys_GetObject=python38.PySys_GetObject - PySys_GetXOptions=python38.PySys_GetXOptions - PySys_HasWarnOptions=python38.PySys_HasWarnOptions - PySys_ResetWarnOptions=python38.PySys_ResetWarnOptions - PySys_SetArgv=python38.PySys_SetArgv - PySys_SetArgvEx=python38.PySys_SetArgvEx - PySys_SetObject=python38.PySys_SetObject - PySys_SetPath=python38.PySys_SetPath - PySys_WriteStderr=python38.PySys_WriteStderr - PySys_WriteStdout=python38.PySys_WriteStdout - PyThreadState_Clear=python38.PyThreadState_Clear - PyThreadState_Delete=python38.PyThreadState_Delete - PyThreadState_DeleteCurrent=python38.PyThreadState_DeleteCurrent - PyThreadState_Get=python38.PyThreadState_Get - PyThreadState_GetDict=python38.PyThreadState_GetDict - PyThreadState_New=python38.PyThreadState_New - PyThreadState_SetAsyncExc=python38.PyThreadState_SetAsyncExc - PyThreadState_Swap=python38.PyThreadState_Swap - PyThread_tss_alloc=python38.PyThread_tss_alloc - PyThread_tss_create=python38.PyThread_tss_create - PyThread_tss_delete=python38.PyThread_tss_delete - PyThread_tss_free=python38.PyThread_tss_free - PyThread_tss_get=python38.PyThread_tss_get - PyThread_tss_is_created=python38.PyThread_tss_is_created - PyThread_tss_set=python38.PyThread_tss_set - PyTraceBack_Here=python38.PyTraceBack_Here - PyTraceBack_Print=python38.PyTraceBack_Print - PyTraceBack_Type=python38.PyTraceBack_Type DATA - PyTupleIter_Type=python38.PyTupleIter_Type DATA - PyTuple_ClearFreeList=python38.PyTuple_ClearFreeList - PyTuple_GetItem=python38.PyTuple_GetItem - PyTuple_GetSlice=python38.PyTuple_GetSlice - PyTuple_New=python38.PyTuple_New - PyTuple_Pack=python38.PyTuple_Pack - PyTuple_SetItem=python38.PyTuple_SetItem - PyTuple_Size=python38.PyTuple_Size - PyTuple_Type=python38.PyTuple_Type DATA - PyType_ClearCache=python38.PyType_ClearCache - PyType_FromSpec=python38.PyType_FromSpec - PyType_FromSpecWithBases=python38.PyType_FromSpecWithBases - PyType_GenericAlloc=python38.PyType_GenericAlloc - PyType_GenericNew=python38.PyType_GenericNew - PyType_GetFlags=python38.PyType_GetFlags - PyType_GetSlot=python38.PyType_GetSlot - PyType_IsSubtype=python38.PyType_IsSubtype - PyType_Modified=python38.PyType_Modified - PyType_Ready=python38.PyType_Ready - PyType_Type=python38.PyType_Type DATA - PyUnicodeDecodeError_Create=python38.PyUnicodeDecodeError_Create - PyUnicodeDecodeError_GetEncoding=python38.PyUnicodeDecodeError_GetEncoding - PyUnicodeDecodeError_GetEnd=python38.PyUnicodeDecodeError_GetEnd - PyUnicodeDecodeError_GetObject=python38.PyUnicodeDecodeError_GetObject - PyUnicodeDecodeError_GetReason=python38.PyUnicodeDecodeError_GetReason - PyUnicodeDecodeError_GetStart=python38.PyUnicodeDecodeError_GetStart - PyUnicodeDecodeError_SetEnd=python38.PyUnicodeDecodeError_SetEnd - PyUnicodeDecodeError_SetReason=python38.PyUnicodeDecodeError_SetReason - PyUnicodeDecodeError_SetStart=python38.PyUnicodeDecodeError_SetStart - PyUnicodeEncodeError_GetEncoding=python38.PyUnicodeEncodeError_GetEncoding - PyUnicodeEncodeError_GetEnd=python38.PyUnicodeEncodeError_GetEnd - PyUnicodeEncodeError_GetObject=python38.PyUnicodeEncodeError_GetObject - PyUnicodeEncodeError_GetReason=python38.PyUnicodeEncodeError_GetReason - PyUnicodeEncodeError_GetStart=python38.PyUnicodeEncodeError_GetStart - PyUnicodeEncodeError_SetEnd=python38.PyUnicodeEncodeError_SetEnd - PyUnicodeEncodeError_SetReason=python38.PyUnicodeEncodeError_SetReason - PyUnicodeEncodeError_SetStart=python38.PyUnicodeEncodeError_SetStart - PyUnicodeIter_Type=python38.PyUnicodeIter_Type DATA - PyUnicodeTranslateError_GetEnd=python38.PyUnicodeTranslateError_GetEnd - PyUnicodeTranslateError_GetObject=python38.PyUnicodeTranslateError_GetObject - PyUnicodeTranslateError_GetReason=python38.PyUnicodeTranslateError_GetReason - PyUnicodeTranslateError_GetStart=python38.PyUnicodeTranslateError_GetStart - PyUnicodeTranslateError_SetEnd=python38.PyUnicodeTranslateError_SetEnd - PyUnicodeTranslateError_SetReason=python38.PyUnicodeTranslateError_SetReason - PyUnicodeTranslateError_SetStart=python38.PyUnicodeTranslateError_SetStart - PyUnicode_Append=python38.PyUnicode_Append - PyUnicode_AppendAndDel=python38.PyUnicode_AppendAndDel - PyUnicode_AsASCIIString=python38.PyUnicode_AsASCIIString - PyUnicode_AsCharmapString=python38.PyUnicode_AsCharmapString - PyUnicode_AsDecodedObject=python38.PyUnicode_AsDecodedObject - PyUnicode_AsDecodedUnicode=python38.PyUnicode_AsDecodedUnicode - PyUnicode_AsEncodedObject=python38.PyUnicode_AsEncodedObject - PyUnicode_AsEncodedString=python38.PyUnicode_AsEncodedString - PyUnicode_AsEncodedUnicode=python38.PyUnicode_AsEncodedUnicode - PyUnicode_AsLatin1String=python38.PyUnicode_AsLatin1String - PyUnicode_AsMBCSString=python38.PyUnicode_AsMBCSString - PyUnicode_AsRawUnicodeEscapeString=python38.PyUnicode_AsRawUnicodeEscapeString - PyUnicode_AsUCS4=python38.PyUnicode_AsUCS4 - PyUnicode_AsUCS4Copy=python38.PyUnicode_AsUCS4Copy - PyUnicode_AsUTF16String=python38.PyUnicode_AsUTF16String - PyUnicode_AsUTF32String=python38.PyUnicode_AsUTF32String - PyUnicode_AsUTF8String=python38.PyUnicode_AsUTF8String - PyUnicode_AsUnicodeEscapeString=python38.PyUnicode_AsUnicodeEscapeString - PyUnicode_AsWideChar=python38.PyUnicode_AsWideChar - PyUnicode_AsWideCharString=python38.PyUnicode_AsWideCharString - PyUnicode_BuildEncodingMap=python38.PyUnicode_BuildEncodingMap - PyUnicode_ClearFreeList=python38.PyUnicode_ClearFreeList - PyUnicode_Compare=python38.PyUnicode_Compare - PyUnicode_CompareWithASCIIString=python38.PyUnicode_CompareWithASCIIString - PyUnicode_Concat=python38.PyUnicode_Concat - PyUnicode_Contains=python38.PyUnicode_Contains - PyUnicode_Count=python38.PyUnicode_Count - PyUnicode_Decode=python38.PyUnicode_Decode - PyUnicode_DecodeASCII=python38.PyUnicode_DecodeASCII - PyUnicode_DecodeCharmap=python38.PyUnicode_DecodeCharmap - PyUnicode_DecodeCodePageStateful=python38.PyUnicode_DecodeCodePageStateful - PyUnicode_DecodeFSDefault=python38.PyUnicode_DecodeFSDefault - PyUnicode_DecodeFSDefaultAndSize=python38.PyUnicode_DecodeFSDefaultAndSize - PyUnicode_DecodeLatin1=python38.PyUnicode_DecodeLatin1 - PyUnicode_DecodeLocale=python38.PyUnicode_DecodeLocale - PyUnicode_DecodeLocaleAndSize=python38.PyUnicode_DecodeLocaleAndSize - PyUnicode_DecodeMBCS=python38.PyUnicode_DecodeMBCS - PyUnicode_DecodeMBCSStateful=python38.PyUnicode_DecodeMBCSStateful - PyUnicode_DecodeRawUnicodeEscape=python38.PyUnicode_DecodeRawUnicodeEscape - PyUnicode_DecodeUTF16=python38.PyUnicode_DecodeUTF16 - PyUnicode_DecodeUTF16Stateful=python38.PyUnicode_DecodeUTF16Stateful - PyUnicode_DecodeUTF32=python38.PyUnicode_DecodeUTF32 - PyUnicode_DecodeUTF32Stateful=python38.PyUnicode_DecodeUTF32Stateful - PyUnicode_DecodeUTF7=python38.PyUnicode_DecodeUTF7 - PyUnicode_DecodeUTF7Stateful=python38.PyUnicode_DecodeUTF7Stateful - PyUnicode_DecodeUTF8=python38.PyUnicode_DecodeUTF8 - PyUnicode_DecodeUTF8Stateful=python38.PyUnicode_DecodeUTF8Stateful - PyUnicode_DecodeUnicodeEscape=python38.PyUnicode_DecodeUnicodeEscape - PyUnicode_EncodeCodePage=python38.PyUnicode_EncodeCodePage - PyUnicode_EncodeFSDefault=python38.PyUnicode_EncodeFSDefault - PyUnicode_EncodeLocale=python38.PyUnicode_EncodeLocale - PyUnicode_FSConverter=python38.PyUnicode_FSConverter - PyUnicode_FSDecoder=python38.PyUnicode_FSDecoder - PyUnicode_Find=python38.PyUnicode_Find - PyUnicode_FindChar=python38.PyUnicode_FindChar - PyUnicode_Format=python38.PyUnicode_Format - PyUnicode_FromEncodedObject=python38.PyUnicode_FromEncodedObject - PyUnicode_FromFormat=python38.PyUnicode_FromFormat - PyUnicode_FromFormatV=python38.PyUnicode_FromFormatV - PyUnicode_FromObject=python38.PyUnicode_FromObject - PyUnicode_FromOrdinal=python38.PyUnicode_FromOrdinal - PyUnicode_FromString=python38.PyUnicode_FromString - PyUnicode_FromStringAndSize=python38.PyUnicode_FromStringAndSize - PyUnicode_FromWideChar=python38.PyUnicode_FromWideChar - PyUnicode_GetDefaultEncoding=python38.PyUnicode_GetDefaultEncoding - PyUnicode_GetLength=python38.PyUnicode_GetLength - PyUnicode_GetSize=python38.PyUnicode_GetSize - PyUnicode_InternFromString=python38.PyUnicode_InternFromString - PyUnicode_InternImmortal=python38.PyUnicode_InternImmortal - PyUnicode_InternInPlace=python38.PyUnicode_InternInPlace - PyUnicode_IsIdentifier=python38.PyUnicode_IsIdentifier - PyUnicode_Join=python38.PyUnicode_Join - PyUnicode_Partition=python38.PyUnicode_Partition - PyUnicode_RPartition=python38.PyUnicode_RPartition - PyUnicode_RSplit=python38.PyUnicode_RSplit - PyUnicode_ReadChar=python38.PyUnicode_ReadChar - PyUnicode_Replace=python38.PyUnicode_Replace - PyUnicode_Resize=python38.PyUnicode_Resize - PyUnicode_RichCompare=python38.PyUnicode_RichCompare - PyUnicode_Split=python38.PyUnicode_Split - PyUnicode_Splitlines=python38.PyUnicode_Splitlines - PyUnicode_Substring=python38.PyUnicode_Substring - PyUnicode_Tailmatch=python38.PyUnicode_Tailmatch - PyUnicode_Translate=python38.PyUnicode_Translate - PyUnicode_Type=python38.PyUnicode_Type DATA - PyUnicode_WriteChar=python38.PyUnicode_WriteChar - PyWeakref_GetObject=python38.PyWeakref_GetObject - PyWeakref_NewProxy=python38.PyWeakref_NewProxy - PyWeakref_NewRef=python38.PyWeakref_NewRef - PyWrapperDescr_Type=python38.PyWrapperDescr_Type DATA - PyWrapper_New=python38.PyWrapper_New - PyZip_Type=python38.PyZip_Type DATA - Py_AddPendingCall=python38.Py_AddPendingCall - Py_AtExit=python38.Py_AtExit - Py_BuildValue=python38.Py_BuildValue - Py_CompileString=python38.Py_CompileString - Py_DecRef=python38.Py_DecRef - Py_DecodeLocale=python38.Py_DecodeLocale - Py_EncodeLocale=python38.Py_EncodeLocale - Py_EndInterpreter=python38.Py_EndInterpreter - Py_Exit=python38.Py_Exit - Py_FatalError=python38.Py_FatalError - Py_FileSystemDefaultEncodeErrors=python38.Py_FileSystemDefaultEncodeErrors DATA - Py_FileSystemDefaultEncoding=python38.Py_FileSystemDefaultEncoding DATA - Py_Finalize=python38.Py_Finalize - Py_FinalizeEx=python38.Py_FinalizeEx - Py_GetBuildInfo=python38.Py_GetBuildInfo - Py_GetCompiler=python38.Py_GetCompiler - Py_GetCopyright=python38.Py_GetCopyright - Py_GetExecPrefix=python38.Py_GetExecPrefix - Py_GetPath=python38.Py_GetPath - Py_GetPlatform=python38.Py_GetPlatform - Py_GetPrefix=python38.Py_GetPrefix - Py_GetProgramFullPath=python38.Py_GetProgramFullPath - Py_GetProgramName=python38.Py_GetProgramName - Py_GetPythonHome=python38.Py_GetPythonHome - Py_GetRecursionLimit=python38.Py_GetRecursionLimit - Py_GetVersion=python38.Py_GetVersion - Py_HasFileSystemDefaultEncoding=python38.Py_HasFileSystemDefaultEncoding DATA - Py_IncRef=python38.Py_IncRef - Py_Initialize=python38.Py_Initialize - Py_InitializeEx=python38.Py_InitializeEx - Py_IsInitialized=python38.Py_IsInitialized - Py_Main=python38.Py_Main - Py_MakePendingCalls=python38.Py_MakePendingCalls - Py_NewInterpreter=python38.Py_NewInterpreter - Py_ReprEnter=python38.Py_ReprEnter - Py_ReprLeave=python38.Py_ReprLeave - Py_SetPath=python38.Py_SetPath - Py_SetProgramName=python38.Py_SetProgramName - Py_SetPythonHome=python38.Py_SetPythonHome - Py_SetRecursionLimit=python38.Py_SetRecursionLimit - Py_SymtableString=python38.Py_SymtableString - Py_UTF8Mode=python38.Py_UTF8Mode DATA - Py_VaBuildValue=python38.Py_VaBuildValue - _PyArg_ParseTupleAndKeywords_SizeT=python38._PyArg_ParseTupleAndKeywords_SizeT - _PyArg_ParseTuple_SizeT=python38._PyArg_ParseTuple_SizeT - _PyArg_Parse_SizeT=python38._PyArg_Parse_SizeT - _PyArg_VaParseTupleAndKeywords_SizeT=python38._PyArg_VaParseTupleAndKeywords_SizeT - _PyArg_VaParse_SizeT=python38._PyArg_VaParse_SizeT - _PyErr_BadInternalCall=python38._PyErr_BadInternalCall - _PyObject_CallFunction_SizeT=python38._PyObject_CallFunction_SizeT - _PyObject_CallMethod_SizeT=python38._PyObject_CallMethod_SizeT - _PyObject_GC_Malloc=python38._PyObject_GC_Malloc - _PyObject_GC_New=python38._PyObject_GC_New - _PyObject_GC_NewVar=python38._PyObject_GC_NewVar - _PyObject_GC_Resize=python38._PyObject_GC_Resize - _PyObject_New=python38._PyObject_New - _PyObject_NewVar=python38._PyObject_NewVar - _PyState_AddModule=python38._PyState_AddModule - _PyThreadState_Init=python38._PyThreadState_Init - _PyThreadState_Prealloc=python38._PyThreadState_Prealloc - _PyTrash_delete_later=python38._PyTrash_delete_later DATA - _PyTrash_delete_nesting=python38._PyTrash_delete_nesting DATA - _PyTrash_deposit_object=python38._PyTrash_deposit_object - _PyTrash_destroy_chain=python38._PyTrash_destroy_chain - _PyTrash_thread_deposit_object=python38._PyTrash_thread_deposit_object - _PyTrash_thread_destroy_chain=python38._PyTrash_thread_destroy_chain - _PyWeakref_CallableProxyType=python38._PyWeakref_CallableProxyType DATA - _PyWeakref_ProxyType=python38._PyWeakref_ProxyType DATA - _PyWeakref_RefType=python38._PyWeakref_RefType DATA - _Py_BuildValue_SizeT=python38._Py_BuildValue_SizeT - _Py_CheckRecursionLimit=python38._Py_CheckRecursionLimit DATA - _Py_CheckRecursiveCall=python38._Py_CheckRecursiveCall - _Py_Dealloc=python38._Py_Dealloc - _Py_EllipsisObject=python38._Py_EllipsisObject DATA - _Py_FalseStruct=python38._Py_FalseStruct DATA - _Py_NoneStruct=python38._Py_NoneStruct DATA - _Py_NotImplementedStruct=python38._Py_NotImplementedStruct DATA - _Py_SwappedOp=python38._Py_SwappedOp DATA - _Py_TrueStruct=python38._Py_TrueStruct DATA - _Py_VaBuildValue_SizeT=python38._Py_VaBuildValue_SizeT + PyArg_Parse=python39.PyArg_Parse + PyArg_ParseTuple=python39.PyArg_ParseTuple + PyArg_ParseTupleAndKeywords=python39.PyArg_ParseTupleAndKeywords + PyArg_UnpackTuple=python39.PyArg_UnpackTuple + PyArg_VaParse=python39.PyArg_VaParse + PyArg_VaParseTupleAndKeywords=python39.PyArg_VaParseTupleAndKeywords + PyArg_ValidateKeywordArguments=python39.PyArg_ValidateKeywordArguments + PyBaseObject_Type=python39.PyBaseObject_Type DATA + PyBool_FromLong=python39.PyBool_FromLong + PyBool_Type=python39.PyBool_Type DATA + PyByteArrayIter_Type=python39.PyByteArrayIter_Type DATA + PyByteArray_AsString=python39.PyByteArray_AsString + PyByteArray_Concat=python39.PyByteArray_Concat + PyByteArray_FromObject=python39.PyByteArray_FromObject + PyByteArray_FromStringAndSize=python39.PyByteArray_FromStringAndSize + PyByteArray_Resize=python39.PyByteArray_Resize + PyByteArray_Size=python39.PyByteArray_Size + PyByteArray_Type=python39.PyByteArray_Type DATA + PyBytesIter_Type=python39.PyBytesIter_Type DATA + PyBytes_AsString=python39.PyBytes_AsString + PyBytes_AsStringAndSize=python39.PyBytes_AsStringAndSize + PyBytes_Concat=python39.PyBytes_Concat + PyBytes_ConcatAndDel=python39.PyBytes_ConcatAndDel + PyBytes_DecodeEscape=python39.PyBytes_DecodeEscape + PyBytes_FromFormat=python39.PyBytes_FromFormat + PyBytes_FromFormatV=python39.PyBytes_FromFormatV + PyBytes_FromObject=python39.PyBytes_FromObject + PyBytes_FromString=python39.PyBytes_FromString + PyBytes_FromStringAndSize=python39.PyBytes_FromStringAndSize + PyBytes_Repr=python39.PyBytes_Repr + PyBytes_Size=python39.PyBytes_Size + PyBytes_Type=python39.PyBytes_Type DATA + PyCFunction_Call=python39.PyCFunction_Call + PyCFunction_ClearFreeList=python39.PyCFunction_ClearFreeList + PyCFunction_GetFlags=python39.PyCFunction_GetFlags + PyCFunction_GetFunction=python39.PyCFunction_GetFunction + PyCFunction_GetSelf=python39.PyCFunction_GetSelf + PyCFunction_New=python39.PyCFunction_New + PyCFunction_NewEx=python39.PyCFunction_NewEx + PyCFunction_Type=python39.PyCFunction_Type DATA + PyCallIter_New=python39.PyCallIter_New + PyCallIter_Type=python39.PyCallIter_Type DATA + PyCallable_Check=python39.PyCallable_Check + PyCapsule_GetContext=python39.PyCapsule_GetContext + PyCapsule_GetDestructor=python39.PyCapsule_GetDestructor + PyCapsule_GetName=python39.PyCapsule_GetName + PyCapsule_GetPointer=python39.PyCapsule_GetPointer + PyCapsule_Import=python39.PyCapsule_Import + PyCapsule_IsValid=python39.PyCapsule_IsValid + PyCapsule_New=python39.PyCapsule_New + PyCapsule_SetContext=python39.PyCapsule_SetContext + PyCapsule_SetDestructor=python39.PyCapsule_SetDestructor + PyCapsule_SetName=python39.PyCapsule_SetName + PyCapsule_SetPointer=python39.PyCapsule_SetPointer + PyCapsule_Type=python39.PyCapsule_Type DATA + PyClassMethodDescr_Type=python39.PyClassMethodDescr_Type DATA + PyCodec_BackslashReplaceErrors=python39.PyCodec_BackslashReplaceErrors + PyCodec_Decode=python39.PyCodec_Decode + PyCodec_Decoder=python39.PyCodec_Decoder + PyCodec_Encode=python39.PyCodec_Encode + PyCodec_Encoder=python39.PyCodec_Encoder + PyCodec_IgnoreErrors=python39.PyCodec_IgnoreErrors + PyCodec_IncrementalDecoder=python39.PyCodec_IncrementalDecoder + PyCodec_IncrementalEncoder=python39.PyCodec_IncrementalEncoder + PyCodec_KnownEncoding=python39.PyCodec_KnownEncoding + PyCodec_LookupError=python39.PyCodec_LookupError + PyCodec_NameReplaceErrors=python39.PyCodec_NameReplaceErrors + PyCodec_Register=python39.PyCodec_Register + PyCodec_RegisterError=python39.PyCodec_RegisterError + PyCodec_ReplaceErrors=python39.PyCodec_ReplaceErrors + PyCodec_StreamReader=python39.PyCodec_StreamReader + PyCodec_StreamWriter=python39.PyCodec_StreamWriter + PyCodec_StrictErrors=python39.PyCodec_StrictErrors + PyCodec_XMLCharRefReplaceErrors=python39.PyCodec_XMLCharRefReplaceErrors + PyComplex_FromDoubles=python39.PyComplex_FromDoubles + PyComplex_ImagAsDouble=python39.PyComplex_ImagAsDouble + PyComplex_RealAsDouble=python39.PyComplex_RealAsDouble + PyComplex_Type=python39.PyComplex_Type DATA + PyDescr_NewClassMethod=python39.PyDescr_NewClassMethod + PyDescr_NewGetSet=python39.PyDescr_NewGetSet + PyDescr_NewMember=python39.PyDescr_NewMember + PyDescr_NewMethod=python39.PyDescr_NewMethod + PyDictItems_Type=python39.PyDictItems_Type DATA + PyDictIterItem_Type=python39.PyDictIterItem_Type DATA + PyDictIterKey_Type=python39.PyDictIterKey_Type DATA + PyDictIterValue_Type=python39.PyDictIterValue_Type DATA + PyDictKeys_Type=python39.PyDictKeys_Type DATA + PyDictProxy_New=python39.PyDictProxy_New + PyDictProxy_Type=python39.PyDictProxy_Type DATA + PyDictValues_Type=python39.PyDictValues_Type DATA + PyDict_Clear=python39.PyDict_Clear + PyDict_Contains=python39.PyDict_Contains + PyDict_Copy=python39.PyDict_Copy + PyDict_DelItem=python39.PyDict_DelItem + PyDict_DelItemString=python39.PyDict_DelItemString + PyDict_GetItem=python39.PyDict_GetItem + PyDict_GetItemString=python39.PyDict_GetItemString + PyDict_GetItemWithError=python39.PyDict_GetItemWithError + PyDict_Items=python39.PyDict_Items + PyDict_Keys=python39.PyDict_Keys + PyDict_Merge=python39.PyDict_Merge + PyDict_MergeFromSeq2=python39.PyDict_MergeFromSeq2 + PyDict_New=python39.PyDict_New + PyDict_Next=python39.PyDict_Next + PyDict_SetItem=python39.PyDict_SetItem + PyDict_SetItemString=python39.PyDict_SetItemString + PyDict_Size=python39.PyDict_Size + PyDict_Type=python39.PyDict_Type DATA + PyDict_Update=python39.PyDict_Update + PyDict_Values=python39.PyDict_Values + PyEllipsis_Type=python39.PyEllipsis_Type DATA + PyEnum_Type=python39.PyEnum_Type DATA + PyErr_BadArgument=python39.PyErr_BadArgument + PyErr_BadInternalCall=python39.PyErr_BadInternalCall + PyErr_CheckSignals=python39.PyErr_CheckSignals + PyErr_Clear=python39.PyErr_Clear + PyErr_Display=python39.PyErr_Display + PyErr_ExceptionMatches=python39.PyErr_ExceptionMatches + PyErr_Fetch=python39.PyErr_Fetch + PyErr_Format=python39.PyErr_Format + PyErr_FormatV=python39.PyErr_FormatV + PyErr_GetExcInfo=python39.PyErr_GetExcInfo + PyErr_GivenExceptionMatches=python39.PyErr_GivenExceptionMatches + PyErr_NewException=python39.PyErr_NewException + PyErr_NewExceptionWithDoc=python39.PyErr_NewExceptionWithDoc + PyErr_NoMemory=python39.PyErr_NoMemory + PyErr_NormalizeException=python39.PyErr_NormalizeException + PyErr_Occurred=python39.PyErr_Occurred + PyErr_Print=python39.PyErr_Print + PyErr_PrintEx=python39.PyErr_PrintEx + PyErr_ProgramText=python39.PyErr_ProgramText + PyErr_ResourceWarning=python39.PyErr_ResourceWarning + PyErr_Restore=python39.PyErr_Restore + PyErr_SetExcFromWindowsErr=python39.PyErr_SetExcFromWindowsErr + PyErr_SetExcFromWindowsErrWithFilename=python39.PyErr_SetExcFromWindowsErrWithFilename + PyErr_SetExcFromWindowsErrWithFilenameObject=python39.PyErr_SetExcFromWindowsErrWithFilenameObject + PyErr_SetExcFromWindowsErrWithFilenameObjects=python39.PyErr_SetExcFromWindowsErrWithFilenameObjects + PyErr_SetExcInfo=python39.PyErr_SetExcInfo + PyErr_SetFromErrno=python39.PyErr_SetFromErrno + PyErr_SetFromErrnoWithFilename=python39.PyErr_SetFromErrnoWithFilename + PyErr_SetFromErrnoWithFilenameObject=python39.PyErr_SetFromErrnoWithFilenameObject + PyErr_SetFromErrnoWithFilenameObjects=python39.PyErr_SetFromErrnoWithFilenameObjects + PyErr_SetFromWindowsErr=python39.PyErr_SetFromWindowsErr + PyErr_SetFromWindowsErrWithFilename=python39.PyErr_SetFromWindowsErrWithFilename + PyErr_SetImportError=python39.PyErr_SetImportError + PyErr_SetImportErrorSubclass=python39.PyErr_SetImportErrorSubclass + PyErr_SetInterrupt=python39.PyErr_SetInterrupt + PyErr_SetNone=python39.PyErr_SetNone + PyErr_SetObject=python39.PyErr_SetObject + PyErr_SetString=python39.PyErr_SetString + PyErr_SyntaxLocation=python39.PyErr_SyntaxLocation + PyErr_SyntaxLocationEx=python39.PyErr_SyntaxLocationEx + PyErr_WarnEx=python39.PyErr_WarnEx + PyErr_WarnExplicit=python39.PyErr_WarnExplicit + PyErr_WarnFormat=python39.PyErr_WarnFormat + PyErr_WriteUnraisable=python39.PyErr_WriteUnraisable + PyEval_AcquireLock=python39.PyEval_AcquireLock + PyEval_AcquireThread=python39.PyEval_AcquireThread + PyEval_CallFunction=python39.PyEval_CallFunction + PyEval_CallMethod=python39.PyEval_CallMethod + PyEval_CallObjectWithKeywords=python39.PyEval_CallObjectWithKeywords + PyEval_EvalCode=python39.PyEval_EvalCode + PyEval_EvalCodeEx=python39.PyEval_EvalCodeEx + PyEval_EvalFrame=python39.PyEval_EvalFrame + PyEval_EvalFrameEx=python39.PyEval_EvalFrameEx + PyEval_GetBuiltins=python39.PyEval_GetBuiltins + PyEval_GetCallStats=python39.PyEval_GetCallStats + PyEval_GetFrame=python39.PyEval_GetFrame + PyEval_GetFuncDesc=python39.PyEval_GetFuncDesc + PyEval_GetFuncName=python39.PyEval_GetFuncName + PyEval_GetGlobals=python39.PyEval_GetGlobals + PyEval_GetLocals=python39.PyEval_GetLocals + PyEval_InitThreads=python39.PyEval_InitThreads + PyEval_ReInitThreads=python39.PyEval_ReInitThreads + PyEval_ReleaseLock=python39.PyEval_ReleaseLock + PyEval_ReleaseThread=python39.PyEval_ReleaseThread + PyEval_RestoreThread=python39.PyEval_RestoreThread + PyEval_SaveThread=python39.PyEval_SaveThread + PyEval_ThreadsInitialized=python39.PyEval_ThreadsInitialized + PyExc_ArithmeticError=python39.PyExc_ArithmeticError DATA + PyExc_AssertionError=python39.PyExc_AssertionError DATA + PyExc_AttributeError=python39.PyExc_AttributeError DATA + PyExc_BaseException=python39.PyExc_BaseException DATA + PyExc_BlockingIOError=python39.PyExc_BlockingIOError DATA + PyExc_BrokenPipeError=python39.PyExc_BrokenPipeError DATA + PyExc_BufferError=python39.PyExc_BufferError DATA + PyExc_BytesWarning=python39.PyExc_BytesWarning DATA + PyExc_ChildProcessError=python39.PyExc_ChildProcessError DATA + PyExc_ConnectionAbortedError=python39.PyExc_ConnectionAbortedError DATA + PyExc_ConnectionError=python39.PyExc_ConnectionError DATA + PyExc_ConnectionRefusedError=python39.PyExc_ConnectionRefusedError DATA + PyExc_ConnectionResetError=python39.PyExc_ConnectionResetError DATA + PyExc_DeprecationWarning=python39.PyExc_DeprecationWarning DATA + PyExc_EOFError=python39.PyExc_EOFError DATA + PyExc_EnvironmentError=python39.PyExc_EnvironmentError DATA + PyExc_Exception=python39.PyExc_Exception DATA + PyExc_FileExistsError=python39.PyExc_FileExistsError DATA + PyExc_FileNotFoundError=python39.PyExc_FileNotFoundError DATA + PyExc_FloatingPointError=python39.PyExc_FloatingPointError DATA + PyExc_FutureWarning=python39.PyExc_FutureWarning DATA + PyExc_GeneratorExit=python39.PyExc_GeneratorExit DATA + PyExc_IOError=python39.PyExc_IOError DATA + PyExc_ImportError=python39.PyExc_ImportError DATA + PyExc_ImportWarning=python39.PyExc_ImportWarning DATA + PyExc_IndentationError=python39.PyExc_IndentationError DATA + PyExc_IndexError=python39.PyExc_IndexError DATA + PyExc_InterruptedError=python39.PyExc_InterruptedError DATA + PyExc_IsADirectoryError=python39.PyExc_IsADirectoryError DATA + PyExc_KeyError=python39.PyExc_KeyError DATA + PyExc_KeyboardInterrupt=python39.PyExc_KeyboardInterrupt DATA + PyExc_LookupError=python39.PyExc_LookupError DATA + PyExc_MemoryError=python39.PyExc_MemoryError DATA + PyExc_ModuleNotFoundError=python39.PyExc_ModuleNotFoundError DATA + PyExc_NameError=python39.PyExc_NameError DATA + PyExc_NotADirectoryError=python39.PyExc_NotADirectoryError DATA + PyExc_NotImplementedError=python39.PyExc_NotImplementedError DATA + PyExc_OSError=python39.PyExc_OSError DATA + PyExc_OverflowError=python39.PyExc_OverflowError DATA + PyExc_PendingDeprecationWarning=python39.PyExc_PendingDeprecationWarning DATA + PyExc_PermissionError=python39.PyExc_PermissionError DATA + PyExc_ProcessLookupError=python39.PyExc_ProcessLookupError DATA + PyExc_RecursionError=python39.PyExc_RecursionError DATA + PyExc_ReferenceError=python39.PyExc_ReferenceError DATA + PyExc_ResourceWarning=python39.PyExc_ResourceWarning DATA + PyExc_RuntimeError=python39.PyExc_RuntimeError DATA + PyExc_RuntimeWarning=python39.PyExc_RuntimeWarning DATA + PyExc_StopAsyncIteration=python39.PyExc_StopAsyncIteration DATA + PyExc_StopIteration=python39.PyExc_StopIteration DATA + PyExc_SyntaxError=python39.PyExc_SyntaxError DATA + PyExc_SyntaxWarning=python39.PyExc_SyntaxWarning DATA + PyExc_SystemError=python39.PyExc_SystemError DATA + PyExc_SystemExit=python39.PyExc_SystemExit DATA + PyExc_TabError=python39.PyExc_TabError DATA + PyExc_TargetScopeError=python39.PyExc_TargetScopeError DATA + PyExc_TimeoutError=python39.PyExc_TimeoutError DATA + PyExc_TypeError=python39.PyExc_TypeError DATA + PyExc_UnboundLocalError=python39.PyExc_UnboundLocalError DATA + PyExc_UnicodeDecodeError=python39.PyExc_UnicodeDecodeError DATA + PyExc_UnicodeEncodeError=python39.PyExc_UnicodeEncodeError DATA + PyExc_UnicodeError=python39.PyExc_UnicodeError DATA + PyExc_UnicodeTranslateError=python39.PyExc_UnicodeTranslateError DATA + PyExc_UnicodeWarning=python39.PyExc_UnicodeWarning DATA + PyExc_UserWarning=python39.PyExc_UserWarning DATA + PyExc_ValueError=python39.PyExc_ValueError DATA + PyExc_Warning=python39.PyExc_Warning DATA + PyExc_WindowsError=python39.PyExc_WindowsError DATA + PyExc_ZeroDivisionError=python39.PyExc_ZeroDivisionError DATA + PyExceptionClass_Name=python39.PyExceptionClass_Name + PyException_GetCause=python39.PyException_GetCause + PyException_GetContext=python39.PyException_GetContext + PyException_GetTraceback=python39.PyException_GetTraceback + PyException_SetCause=python39.PyException_SetCause + PyException_SetContext=python39.PyException_SetContext + PyException_SetTraceback=python39.PyException_SetTraceback + PyFile_FromFd=python39.PyFile_FromFd + PyFile_GetLine=python39.PyFile_GetLine + PyFile_WriteObject=python39.PyFile_WriteObject + PyFile_WriteString=python39.PyFile_WriteString + PyFilter_Type=python39.PyFilter_Type DATA + PyFloat_AsDouble=python39.PyFloat_AsDouble + PyFloat_FromDouble=python39.PyFloat_FromDouble + PyFloat_FromString=python39.PyFloat_FromString + PyFloat_GetInfo=python39.PyFloat_GetInfo + PyFloat_GetMax=python39.PyFloat_GetMax + PyFloat_GetMin=python39.PyFloat_GetMin + PyFloat_Type=python39.PyFloat_Type DATA + PyFrozenSet_New=python39.PyFrozenSet_New + PyFrozenSet_Type=python39.PyFrozenSet_Type DATA + PyGC_Collect=python39.PyGC_Collect + PyGILState_Ensure=python39.PyGILState_Ensure + PyGILState_GetThisThreadState=python39.PyGILState_GetThisThreadState + PyGILState_Release=python39.PyGILState_Release + PyGetSetDescr_Type=python39.PyGetSetDescr_Type DATA + PyImport_AddModule=python39.PyImport_AddModule + PyImport_AddModuleObject=python39.PyImport_AddModuleObject + PyImport_AppendInittab=python39.PyImport_AppendInittab + PyImport_Cleanup=python39.PyImport_Cleanup + PyImport_ExecCodeModule=python39.PyImport_ExecCodeModule + PyImport_ExecCodeModuleEx=python39.PyImport_ExecCodeModuleEx + PyImport_ExecCodeModuleObject=python39.PyImport_ExecCodeModuleObject + PyImport_ExecCodeModuleWithPathnames=python39.PyImport_ExecCodeModuleWithPathnames + PyImport_GetImporter=python39.PyImport_GetImporter + PyImport_GetMagicNumber=python39.PyImport_GetMagicNumber + PyImport_GetMagicTag=python39.PyImport_GetMagicTag + PyImport_GetModule=python39.PyImport_GetModule + PyImport_GetModuleDict=python39.PyImport_GetModuleDict + PyImport_Import=python39.PyImport_Import + PyImport_ImportFrozenModule=python39.PyImport_ImportFrozenModule + PyImport_ImportFrozenModuleObject=python39.PyImport_ImportFrozenModuleObject + PyImport_ImportModule=python39.PyImport_ImportModule + PyImport_ImportModuleLevel=python39.PyImport_ImportModuleLevel + PyImport_ImportModuleLevelObject=python39.PyImport_ImportModuleLevelObject + PyImport_ImportModuleNoBlock=python39.PyImport_ImportModuleNoBlock + PyImport_ReloadModule=python39.PyImport_ReloadModule + PyIndex_Check=python39.PyIndex_Check + PyInterpreterState_Clear=python39.PyInterpreterState_Clear + PyInterpreterState_Delete=python39.PyInterpreterState_Delete + PyInterpreterState_New=python39.PyInterpreterState_New + PyIter_Check=python39.PyIter_Check + PyIter_Next=python39.PyIter_Next + PyListIter_Type=python39.PyListIter_Type DATA + PyListRevIter_Type=python39.PyListRevIter_Type DATA + PyList_Append=python39.PyList_Append + PyList_AsTuple=python39.PyList_AsTuple + PyList_GetItem=python39.PyList_GetItem + PyList_GetSlice=python39.PyList_GetSlice + PyList_Insert=python39.PyList_Insert + PyList_New=python39.PyList_New + PyList_Reverse=python39.PyList_Reverse + PyList_SetItem=python39.PyList_SetItem + PyList_SetSlice=python39.PyList_SetSlice + PyList_Size=python39.PyList_Size + PyList_Sort=python39.PyList_Sort + PyList_Type=python39.PyList_Type DATA + PyLongRangeIter_Type=python39.PyLongRangeIter_Type DATA + PyLong_AsDouble=python39.PyLong_AsDouble + PyLong_AsLong=python39.PyLong_AsLong + PyLong_AsLongAndOverflow=python39.PyLong_AsLongAndOverflow + PyLong_AsLongLong=python39.PyLong_AsLongLong + PyLong_AsLongLongAndOverflow=python39.PyLong_AsLongLongAndOverflow + PyLong_AsSize_t=python39.PyLong_AsSize_t + PyLong_AsSsize_t=python39.PyLong_AsSsize_t + PyLong_AsUnsignedLong=python39.PyLong_AsUnsignedLong + PyLong_AsUnsignedLongLong=python39.PyLong_AsUnsignedLongLong + PyLong_AsUnsignedLongLongMask=python39.PyLong_AsUnsignedLongLongMask + PyLong_AsUnsignedLongMask=python39.PyLong_AsUnsignedLongMask + PyLong_AsVoidPtr=python39.PyLong_AsVoidPtr + PyLong_FromDouble=python39.PyLong_FromDouble + PyLong_FromLong=python39.PyLong_FromLong + PyLong_FromLongLong=python39.PyLong_FromLongLong + PyLong_FromSize_t=python39.PyLong_FromSize_t + PyLong_FromSsize_t=python39.PyLong_FromSsize_t + PyLong_FromString=python39.PyLong_FromString + PyLong_FromUnsignedLong=python39.PyLong_FromUnsignedLong + PyLong_FromUnsignedLongLong=python39.PyLong_FromUnsignedLongLong + PyLong_FromVoidPtr=python39.PyLong_FromVoidPtr + PyLong_GetInfo=python39.PyLong_GetInfo + PyLong_Type=python39.PyLong_Type DATA + PyMap_Type=python39.PyMap_Type DATA + PyMapping_Check=python39.PyMapping_Check + PyMapping_GetItemString=python39.PyMapping_GetItemString + PyMapping_HasKey=python39.PyMapping_HasKey + PyMapping_HasKeyString=python39.PyMapping_HasKeyString + PyMapping_Items=python39.PyMapping_Items + PyMapping_Keys=python39.PyMapping_Keys + PyMapping_Length=python39.PyMapping_Length + PyMapping_SetItemString=python39.PyMapping_SetItemString + PyMapping_Size=python39.PyMapping_Size + PyMapping_Values=python39.PyMapping_Values + PyMem_Calloc=python39.PyMem_Calloc + PyMem_Free=python39.PyMem_Free + PyMem_Malloc=python39.PyMem_Malloc + PyMem_Realloc=python39.PyMem_Realloc + PyMemberDescr_Type=python39.PyMemberDescr_Type DATA + PyMemoryView_FromMemory=python39.PyMemoryView_FromMemory + PyMemoryView_FromObject=python39.PyMemoryView_FromObject + PyMemoryView_GetContiguous=python39.PyMemoryView_GetContiguous + PyMemoryView_Type=python39.PyMemoryView_Type DATA + PyMethodDescr_Type=python39.PyMethodDescr_Type DATA + PyModuleDef_Init=python39.PyModuleDef_Init + PyModuleDef_Type=python39.PyModuleDef_Type DATA + PyModule_AddFunctions=python39.PyModule_AddFunctions + PyModule_AddIntConstant=python39.PyModule_AddIntConstant + PyModule_AddObject=python39.PyModule_AddObject + PyModule_AddStringConstant=python39.PyModule_AddStringConstant + PyModule_Create2=python39.PyModule_Create2 + PyModule_ExecDef=python39.PyModule_ExecDef + PyModule_FromDefAndSpec2=python39.PyModule_FromDefAndSpec2 + PyModule_GetDef=python39.PyModule_GetDef + PyModule_GetDict=python39.PyModule_GetDict + PyModule_GetFilename=python39.PyModule_GetFilename + PyModule_GetFilenameObject=python39.PyModule_GetFilenameObject + PyModule_GetName=python39.PyModule_GetName + PyModule_GetNameObject=python39.PyModule_GetNameObject + PyModule_GetState=python39.PyModule_GetState + PyModule_New=python39.PyModule_New + PyModule_NewObject=python39.PyModule_NewObject + PyModule_SetDocString=python39.PyModule_SetDocString + PyModule_Type=python39.PyModule_Type DATA + PyNullImporter_Type=python39.PyNullImporter_Type DATA + PyNumber_Absolute=python39.PyNumber_Absolute + PyNumber_Add=python39.PyNumber_Add + PyNumber_And=python39.PyNumber_And + PyNumber_AsSsize_t=python39.PyNumber_AsSsize_t + PyNumber_Check=python39.PyNumber_Check + PyNumber_Divmod=python39.PyNumber_Divmod + PyNumber_Float=python39.PyNumber_Float + PyNumber_FloorDivide=python39.PyNumber_FloorDivide + PyNumber_InPlaceAdd=python39.PyNumber_InPlaceAdd + PyNumber_InPlaceAnd=python39.PyNumber_InPlaceAnd + PyNumber_InPlaceFloorDivide=python39.PyNumber_InPlaceFloorDivide + PyNumber_InPlaceLshift=python39.PyNumber_InPlaceLshift + PyNumber_InPlaceMatrixMultiply=python39.PyNumber_InPlaceMatrixMultiply + PyNumber_InPlaceMultiply=python39.PyNumber_InPlaceMultiply + PyNumber_InPlaceOr=python39.PyNumber_InPlaceOr + PyNumber_InPlacePower=python39.PyNumber_InPlacePower + PyNumber_InPlaceRemainder=python39.PyNumber_InPlaceRemainder + PyNumber_InPlaceRshift=python39.PyNumber_InPlaceRshift + PyNumber_InPlaceSubtract=python39.PyNumber_InPlaceSubtract + PyNumber_InPlaceTrueDivide=python39.PyNumber_InPlaceTrueDivide + PyNumber_InPlaceXor=python39.PyNumber_InPlaceXor + PyNumber_Index=python39.PyNumber_Index + PyNumber_Invert=python39.PyNumber_Invert + PyNumber_Long=python39.PyNumber_Long + PyNumber_Lshift=python39.PyNumber_Lshift + PyNumber_MatrixMultiply=python39.PyNumber_MatrixMultiply + PyNumber_Multiply=python39.PyNumber_Multiply + PyNumber_Negative=python39.PyNumber_Negative + PyNumber_Or=python39.PyNumber_Or + PyNumber_Positive=python39.PyNumber_Positive + PyNumber_Power=python39.PyNumber_Power + PyNumber_Remainder=python39.PyNumber_Remainder + PyNumber_Rshift=python39.PyNumber_Rshift + PyNumber_Subtract=python39.PyNumber_Subtract + PyNumber_ToBase=python39.PyNumber_ToBase + PyNumber_TrueDivide=python39.PyNumber_TrueDivide + PyNumber_Xor=python39.PyNumber_Xor + PyODictItems_Type=python39.PyODictItems_Type DATA + PyODictIter_Type=python39.PyODictIter_Type DATA + PyODictKeys_Type=python39.PyODictKeys_Type DATA + PyODictValues_Type=python39.PyODictValues_Type DATA + PyODict_DelItem=python39.PyODict_DelItem + PyODict_New=python39.PyODict_New + PyODict_SetItem=python39.PyODict_SetItem + PyODict_Type=python39.PyODict_Type DATA + PyOS_AfterFork=python39.PyOS_AfterFork + PyOS_CheckStack=python39.PyOS_CheckStack + PyOS_FSPath=python39.PyOS_FSPath + PyOS_InitInterrupts=python39.PyOS_InitInterrupts + PyOS_InputHook=python39.PyOS_InputHook DATA + PyOS_InterruptOccurred=python39.PyOS_InterruptOccurred + PyOS_ReadlineFunctionPointer=python39.PyOS_ReadlineFunctionPointer DATA + PyOS_double_to_string=python39.PyOS_double_to_string + PyOS_getsig=python39.PyOS_getsig + PyOS_mystricmp=python39.PyOS_mystricmp + PyOS_mystrnicmp=python39.PyOS_mystrnicmp + PyOS_setsig=python39.PyOS_setsig + PyOS_snprintf=python39.PyOS_snprintf + PyOS_string_to_double=python39.PyOS_string_to_double + PyOS_strtol=python39.PyOS_strtol + PyOS_strtoul=python39.PyOS_strtoul + PyOS_vsnprintf=python39.PyOS_vsnprintf + PyObject_ASCII=python39.PyObject_ASCII + PyObject_AsCharBuffer=python39.PyObject_AsCharBuffer + PyObject_AsFileDescriptor=python39.PyObject_AsFileDescriptor + PyObject_AsReadBuffer=python39.PyObject_AsReadBuffer + PyObject_AsWriteBuffer=python39.PyObject_AsWriteBuffer + PyObject_Bytes=python39.PyObject_Bytes + PyObject_Call=python39.PyObject_Call + PyObject_CallFunction=python39.PyObject_CallFunction + PyObject_CallFunctionObjArgs=python39.PyObject_CallFunctionObjArgs + PyObject_CallMethod=python39.PyObject_CallMethod + PyObject_CallMethodObjArgs=python39.PyObject_CallMethodObjArgs + PyObject_CallObject=python39.PyObject_CallObject + PyObject_Calloc=python39.PyObject_Calloc + PyObject_CheckReadBuffer=python39.PyObject_CheckReadBuffer + PyObject_ClearWeakRefs=python39.PyObject_ClearWeakRefs + PyObject_DelItem=python39.PyObject_DelItem + PyObject_DelItemString=python39.PyObject_DelItemString + PyObject_Dir=python39.PyObject_Dir + PyObject_Format=python39.PyObject_Format + PyObject_Free=python39.PyObject_Free + PyObject_GC_Del=python39.PyObject_GC_Del + PyObject_GC_Track=python39.PyObject_GC_Track + PyObject_GC_UnTrack=python39.PyObject_GC_UnTrack + PyObject_GenericGetAttr=python39.PyObject_GenericGetAttr + PyObject_GenericSetAttr=python39.PyObject_GenericSetAttr + PyObject_GenericSetDict=python39.PyObject_GenericSetDict + PyObject_GetAttr=python39.PyObject_GetAttr + PyObject_GetAttrString=python39.PyObject_GetAttrString + PyObject_GetItem=python39.PyObject_GetItem + PyObject_GetIter=python39.PyObject_GetIter + PyObject_HasAttr=python39.PyObject_HasAttr + PyObject_HasAttrString=python39.PyObject_HasAttrString + PyObject_Hash=python39.PyObject_Hash + PyObject_HashNotImplemented=python39.PyObject_HashNotImplemented + PyObject_Init=python39.PyObject_Init + PyObject_InitVar=python39.PyObject_InitVar + PyObject_IsInstance=python39.PyObject_IsInstance + PyObject_IsSubclass=python39.PyObject_IsSubclass + PyObject_IsTrue=python39.PyObject_IsTrue + PyObject_Length=python39.PyObject_Length + PyObject_Malloc=python39.PyObject_Malloc + PyObject_Not=python39.PyObject_Not + PyObject_Realloc=python39.PyObject_Realloc + PyObject_Repr=python39.PyObject_Repr + PyObject_RichCompare=python39.PyObject_RichCompare + PyObject_RichCompareBool=python39.PyObject_RichCompareBool + PyObject_SelfIter=python39.PyObject_SelfIter + PyObject_SetAttr=python39.PyObject_SetAttr + PyObject_SetAttrString=python39.PyObject_SetAttrString + PyObject_SetItem=python39.PyObject_SetItem + PyObject_Size=python39.PyObject_Size + PyObject_Str=python39.PyObject_Str + PyObject_Type=python39.PyObject_Type + PyParser_SimpleParseFileFlags=python39.PyParser_SimpleParseFileFlags + PyParser_SimpleParseStringFlags=python39.PyParser_SimpleParseStringFlags + PyParser_SimpleParseStringFlagsFilename=python39.PyParser_SimpleParseStringFlagsFilename + PyProperty_Type=python39.PyProperty_Type DATA + PyRangeIter_Type=python39.PyRangeIter_Type DATA + PyRange_Type=python39.PyRange_Type DATA + PyReversed_Type=python39.PyReversed_Type DATA + PySeqIter_New=python39.PySeqIter_New + PySeqIter_Type=python39.PySeqIter_Type DATA + PySequence_Check=python39.PySequence_Check + PySequence_Concat=python39.PySequence_Concat + PySequence_Contains=python39.PySequence_Contains + PySequence_Count=python39.PySequence_Count + PySequence_DelItem=python39.PySequence_DelItem + PySequence_DelSlice=python39.PySequence_DelSlice + PySequence_Fast=python39.PySequence_Fast + PySequence_GetItem=python39.PySequence_GetItem + PySequence_GetSlice=python39.PySequence_GetSlice + PySequence_In=python39.PySequence_In + PySequence_InPlaceConcat=python39.PySequence_InPlaceConcat + PySequence_InPlaceRepeat=python39.PySequence_InPlaceRepeat + PySequence_Index=python39.PySequence_Index + PySequence_Length=python39.PySequence_Length + PySequence_List=python39.PySequence_List + PySequence_Repeat=python39.PySequence_Repeat + PySequence_SetItem=python39.PySequence_SetItem + PySequence_SetSlice=python39.PySequence_SetSlice + PySequence_Size=python39.PySequence_Size + PySequence_Tuple=python39.PySequence_Tuple + PySetIter_Type=python39.PySetIter_Type DATA + PySet_Add=python39.PySet_Add + PySet_Clear=python39.PySet_Clear + PySet_Contains=python39.PySet_Contains + PySet_Discard=python39.PySet_Discard + PySet_New=python39.PySet_New + PySet_Pop=python39.PySet_Pop + PySet_Size=python39.PySet_Size + PySet_Type=python39.PySet_Type DATA + PySlice_AdjustIndices=python39.PySlice_AdjustIndices + PySlice_GetIndices=python39.PySlice_GetIndices + PySlice_GetIndicesEx=python39.PySlice_GetIndicesEx + PySlice_New=python39.PySlice_New + PySlice_Type=python39.PySlice_Type DATA + PySlice_Unpack=python39.PySlice_Unpack + PySortWrapper_Type=python39.PySortWrapper_Type DATA + PyInterpreterState_GetID=python39.PyInterpreterState_GetID + PyState_AddModule=python39.PyState_AddModule + PyState_FindModule=python39.PyState_FindModule + PyState_RemoveModule=python39.PyState_RemoveModule + PyStructSequence_GetItem=python39.PyStructSequence_GetItem + PyStructSequence_New=python39.PyStructSequence_New + PyStructSequence_NewType=python39.PyStructSequence_NewType + PyStructSequence_SetItem=python39.PyStructSequence_SetItem + PySuper_Type=python39.PySuper_Type DATA + PySys_AddWarnOption=python39.PySys_AddWarnOption + PySys_AddWarnOptionUnicode=python39.PySys_AddWarnOptionUnicode + PySys_AddXOption=python39.PySys_AddXOption + PySys_FormatStderr=python39.PySys_FormatStderr + PySys_FormatStdout=python39.PySys_FormatStdout + PySys_GetObject=python39.PySys_GetObject + PySys_GetXOptions=python39.PySys_GetXOptions + PySys_HasWarnOptions=python39.PySys_HasWarnOptions + PySys_ResetWarnOptions=python39.PySys_ResetWarnOptions + PySys_SetArgv=python39.PySys_SetArgv + PySys_SetArgvEx=python39.PySys_SetArgvEx + PySys_SetObject=python39.PySys_SetObject + PySys_SetPath=python39.PySys_SetPath + PySys_WriteStderr=python39.PySys_WriteStderr + PySys_WriteStdout=python39.PySys_WriteStdout + PyThreadState_Clear=python39.PyThreadState_Clear + PyThreadState_Delete=python39.PyThreadState_Delete + PyThreadState_DeleteCurrent=python39.PyThreadState_DeleteCurrent + PyThreadState_Get=python39.PyThreadState_Get + PyThreadState_GetDict=python39.PyThreadState_GetDict + PyThreadState_New=python39.PyThreadState_New + PyThreadState_SetAsyncExc=python39.PyThreadState_SetAsyncExc + PyThreadState_Swap=python39.PyThreadState_Swap + PyThread_tss_alloc=python39.PyThread_tss_alloc + PyThread_tss_create=python39.PyThread_tss_create + PyThread_tss_delete=python39.PyThread_tss_delete + PyThread_tss_free=python39.PyThread_tss_free + PyThread_tss_get=python39.PyThread_tss_get + PyThread_tss_is_created=python39.PyThread_tss_is_created + PyThread_tss_set=python39.PyThread_tss_set + PyTraceBack_Here=python39.PyTraceBack_Here + PyTraceBack_Print=python39.PyTraceBack_Print + PyTraceBack_Type=python39.PyTraceBack_Type DATA + PyTupleIter_Type=python39.PyTupleIter_Type DATA + PyTuple_ClearFreeList=python39.PyTuple_ClearFreeList + PyTuple_GetItem=python39.PyTuple_GetItem + PyTuple_GetSlice=python39.PyTuple_GetSlice + PyTuple_New=python39.PyTuple_New + PyTuple_Pack=python39.PyTuple_Pack + PyTuple_SetItem=python39.PyTuple_SetItem + PyTuple_Size=python39.PyTuple_Size + PyTuple_Type=python39.PyTuple_Type DATA + PyType_ClearCache=python39.PyType_ClearCache + PyType_FromSpec=python39.PyType_FromSpec + PyType_FromSpecWithBases=python39.PyType_FromSpecWithBases + PyType_GenericAlloc=python39.PyType_GenericAlloc + PyType_GenericNew=python39.PyType_GenericNew + PyType_GetFlags=python39.PyType_GetFlags + PyType_GetSlot=python39.PyType_GetSlot + PyType_IsSubtype=python39.PyType_IsSubtype + PyType_Modified=python39.PyType_Modified + PyType_Ready=python39.PyType_Ready + PyType_Type=python39.PyType_Type DATA + PyUnicodeDecodeError_Create=python39.PyUnicodeDecodeError_Create + PyUnicodeDecodeError_GetEncoding=python39.PyUnicodeDecodeError_GetEncoding + PyUnicodeDecodeError_GetEnd=python39.PyUnicodeDecodeError_GetEnd + PyUnicodeDecodeError_GetObject=python39.PyUnicodeDecodeError_GetObject + PyUnicodeDecodeError_GetReason=python39.PyUnicodeDecodeError_GetReason + PyUnicodeDecodeError_GetStart=python39.PyUnicodeDecodeError_GetStart + PyUnicodeDecodeError_SetEnd=python39.PyUnicodeDecodeError_SetEnd + PyUnicodeDecodeError_SetReason=python39.PyUnicodeDecodeError_SetReason + PyUnicodeDecodeError_SetStart=python39.PyUnicodeDecodeError_SetStart + PyUnicodeEncodeError_GetEncoding=python39.PyUnicodeEncodeError_GetEncoding + PyUnicodeEncodeError_GetEnd=python39.PyUnicodeEncodeError_GetEnd + PyUnicodeEncodeError_GetObject=python39.PyUnicodeEncodeError_GetObject + PyUnicodeEncodeError_GetReason=python39.PyUnicodeEncodeError_GetReason + PyUnicodeEncodeError_GetStart=python39.PyUnicodeEncodeError_GetStart + PyUnicodeEncodeError_SetEnd=python39.PyUnicodeEncodeError_SetEnd + PyUnicodeEncodeError_SetReason=python39.PyUnicodeEncodeError_SetReason + PyUnicodeEncodeError_SetStart=python39.PyUnicodeEncodeError_SetStart + PyUnicodeIter_Type=python39.PyUnicodeIter_Type DATA + PyUnicodeTranslateError_GetEnd=python39.PyUnicodeTranslateError_GetEnd + PyUnicodeTranslateError_GetObject=python39.PyUnicodeTranslateError_GetObject + PyUnicodeTranslateError_GetReason=python39.PyUnicodeTranslateError_GetReason + PyUnicodeTranslateError_GetStart=python39.PyUnicodeTranslateError_GetStart + PyUnicodeTranslateError_SetEnd=python39.PyUnicodeTranslateError_SetEnd + PyUnicodeTranslateError_SetReason=python39.PyUnicodeTranslateError_SetReason + PyUnicodeTranslateError_SetStart=python39.PyUnicodeTranslateError_SetStart + PyUnicode_Append=python39.PyUnicode_Append + PyUnicode_AppendAndDel=python39.PyUnicode_AppendAndDel + PyUnicode_AsASCIIString=python39.PyUnicode_AsASCIIString + PyUnicode_AsCharmapString=python39.PyUnicode_AsCharmapString + PyUnicode_AsDecodedObject=python39.PyUnicode_AsDecodedObject + PyUnicode_AsDecodedUnicode=python39.PyUnicode_AsDecodedUnicode + PyUnicode_AsEncodedObject=python39.PyUnicode_AsEncodedObject + PyUnicode_AsEncodedString=python39.PyUnicode_AsEncodedString + PyUnicode_AsEncodedUnicode=python39.PyUnicode_AsEncodedUnicode + PyUnicode_AsLatin1String=python39.PyUnicode_AsLatin1String + PyUnicode_AsMBCSString=python39.PyUnicode_AsMBCSString + PyUnicode_AsRawUnicodeEscapeString=python39.PyUnicode_AsRawUnicodeEscapeString + PyUnicode_AsUCS4=python39.PyUnicode_AsUCS4 + PyUnicode_AsUCS4Copy=python39.PyUnicode_AsUCS4Copy + PyUnicode_AsUTF16String=python39.PyUnicode_AsUTF16String + PyUnicode_AsUTF32String=python39.PyUnicode_AsUTF32String + PyUnicode_AsUTF8String=python39.PyUnicode_AsUTF8String + PyUnicode_AsUnicodeEscapeString=python39.PyUnicode_AsUnicodeEscapeString + PyUnicode_AsWideChar=python39.PyUnicode_AsWideChar + PyUnicode_AsWideCharString=python39.PyUnicode_AsWideCharString + PyUnicode_BuildEncodingMap=python39.PyUnicode_BuildEncodingMap + PyUnicode_ClearFreeList=python39.PyUnicode_ClearFreeList + PyUnicode_Compare=python39.PyUnicode_Compare + PyUnicode_CompareWithASCIIString=python39.PyUnicode_CompareWithASCIIString + PyUnicode_Concat=python39.PyUnicode_Concat + PyUnicode_Contains=python39.PyUnicode_Contains + PyUnicode_Count=python39.PyUnicode_Count + PyUnicode_Decode=python39.PyUnicode_Decode + PyUnicode_DecodeASCII=python39.PyUnicode_DecodeASCII + PyUnicode_DecodeCharmap=python39.PyUnicode_DecodeCharmap + PyUnicode_DecodeCodePageStateful=python39.PyUnicode_DecodeCodePageStateful + PyUnicode_DecodeFSDefault=python39.PyUnicode_DecodeFSDefault + PyUnicode_DecodeFSDefaultAndSize=python39.PyUnicode_DecodeFSDefaultAndSize + PyUnicode_DecodeLatin1=python39.PyUnicode_DecodeLatin1 + PyUnicode_DecodeLocale=python39.PyUnicode_DecodeLocale + PyUnicode_DecodeLocaleAndSize=python39.PyUnicode_DecodeLocaleAndSize + PyUnicode_DecodeMBCS=python39.PyUnicode_DecodeMBCS + PyUnicode_DecodeMBCSStateful=python39.PyUnicode_DecodeMBCSStateful + PyUnicode_DecodeRawUnicodeEscape=python39.PyUnicode_DecodeRawUnicodeEscape + PyUnicode_DecodeUTF16=python39.PyUnicode_DecodeUTF16 + PyUnicode_DecodeUTF16Stateful=python39.PyUnicode_DecodeUTF16Stateful + PyUnicode_DecodeUTF32=python39.PyUnicode_DecodeUTF32 + PyUnicode_DecodeUTF32Stateful=python39.PyUnicode_DecodeUTF32Stateful + PyUnicode_DecodeUTF7=python39.PyUnicode_DecodeUTF7 + PyUnicode_DecodeUTF7Stateful=python39.PyUnicode_DecodeUTF7Stateful + PyUnicode_DecodeUTF8=python39.PyUnicode_DecodeUTF8 + PyUnicode_DecodeUTF8Stateful=python39.PyUnicode_DecodeUTF8Stateful + PyUnicode_DecodeUnicodeEscape=python39.PyUnicode_DecodeUnicodeEscape + PyUnicode_EncodeCodePage=python39.PyUnicode_EncodeCodePage + PyUnicode_EncodeFSDefault=python39.PyUnicode_EncodeFSDefault + PyUnicode_EncodeLocale=python39.PyUnicode_EncodeLocale + PyUnicode_FSConverter=python39.PyUnicode_FSConverter + PyUnicode_FSDecoder=python39.PyUnicode_FSDecoder + PyUnicode_Find=python39.PyUnicode_Find + PyUnicode_FindChar=python39.PyUnicode_FindChar + PyUnicode_Format=python39.PyUnicode_Format + PyUnicode_FromEncodedObject=python39.PyUnicode_FromEncodedObject + PyUnicode_FromFormat=python39.PyUnicode_FromFormat + PyUnicode_FromFormatV=python39.PyUnicode_FromFormatV + PyUnicode_FromObject=python39.PyUnicode_FromObject + PyUnicode_FromOrdinal=python39.PyUnicode_FromOrdinal + PyUnicode_FromString=python39.PyUnicode_FromString + PyUnicode_FromStringAndSize=python39.PyUnicode_FromStringAndSize + PyUnicode_FromWideChar=python39.PyUnicode_FromWideChar + PyUnicode_GetDefaultEncoding=python39.PyUnicode_GetDefaultEncoding + PyUnicode_GetLength=python39.PyUnicode_GetLength + PyUnicode_GetSize=python39.PyUnicode_GetSize + PyUnicode_InternFromString=python39.PyUnicode_InternFromString + PyUnicode_InternImmortal=python39.PyUnicode_InternImmortal + PyUnicode_InternInPlace=python39.PyUnicode_InternInPlace + PyUnicode_IsIdentifier=python39.PyUnicode_IsIdentifier + PyUnicode_Join=python39.PyUnicode_Join + PyUnicode_Partition=python39.PyUnicode_Partition + PyUnicode_RPartition=python39.PyUnicode_RPartition + PyUnicode_RSplit=python39.PyUnicode_RSplit + PyUnicode_ReadChar=python39.PyUnicode_ReadChar + PyUnicode_Replace=python39.PyUnicode_Replace + PyUnicode_Resize=python39.PyUnicode_Resize + PyUnicode_RichCompare=python39.PyUnicode_RichCompare + PyUnicode_Split=python39.PyUnicode_Split + PyUnicode_Splitlines=python39.PyUnicode_Splitlines + PyUnicode_Substring=python39.PyUnicode_Substring + PyUnicode_Tailmatch=python39.PyUnicode_Tailmatch + PyUnicode_Translate=python39.PyUnicode_Translate + PyUnicode_Type=python39.PyUnicode_Type DATA + PyUnicode_WriteChar=python39.PyUnicode_WriteChar + PyWeakref_GetObject=python39.PyWeakref_GetObject + PyWeakref_NewProxy=python39.PyWeakref_NewProxy + PyWeakref_NewRef=python39.PyWeakref_NewRef + PyWrapperDescr_Type=python39.PyWrapperDescr_Type DATA + PyWrapper_New=python39.PyWrapper_New + PyZip_Type=python39.PyZip_Type DATA + Py_AddPendingCall=python39.Py_AddPendingCall + Py_AtExit=python39.Py_AtExit + Py_BuildValue=python39.Py_BuildValue + Py_CompileString=python39.Py_CompileString + Py_DecRef=python39.Py_DecRef + Py_DecodeLocale=python39.Py_DecodeLocale + Py_EncodeLocale=python39.Py_EncodeLocale + Py_EndInterpreter=python39.Py_EndInterpreter + Py_Exit=python39.Py_Exit + Py_FatalError=python39.Py_FatalError + Py_FileSystemDefaultEncodeErrors=python39.Py_FileSystemDefaultEncodeErrors DATA + Py_FileSystemDefaultEncoding=python39.Py_FileSystemDefaultEncoding DATA + Py_Finalize=python39.Py_Finalize + Py_FinalizeEx=python39.Py_FinalizeEx + Py_GetBuildInfo=python39.Py_GetBuildInfo + Py_GetCompiler=python39.Py_GetCompiler + Py_GetCopyright=python39.Py_GetCopyright + Py_GetExecPrefix=python39.Py_GetExecPrefix + Py_GetPath=python39.Py_GetPath + Py_GetPlatform=python39.Py_GetPlatform + Py_GetPrefix=python39.Py_GetPrefix + Py_GetProgramFullPath=python39.Py_GetProgramFullPath + Py_GetProgramName=python39.Py_GetProgramName + Py_GetPythonHome=python39.Py_GetPythonHome + Py_GetRecursionLimit=python39.Py_GetRecursionLimit + Py_GetVersion=python39.Py_GetVersion + Py_HasFileSystemDefaultEncoding=python39.Py_HasFileSystemDefaultEncoding DATA + Py_IncRef=python39.Py_IncRef + Py_Initialize=python39.Py_Initialize + Py_InitializeEx=python39.Py_InitializeEx + Py_IsInitialized=python39.Py_IsInitialized + Py_Main=python39.Py_Main + Py_MakePendingCalls=python39.Py_MakePendingCalls + Py_NewInterpreter=python39.Py_NewInterpreter + Py_ReprEnter=python39.Py_ReprEnter + Py_ReprLeave=python39.Py_ReprLeave + Py_SetPath=python39.Py_SetPath + Py_SetProgramName=python39.Py_SetProgramName + Py_SetPythonHome=python39.Py_SetPythonHome + Py_SetRecursionLimit=python39.Py_SetRecursionLimit + Py_SymtableString=python39.Py_SymtableString + Py_UTF8Mode=python39.Py_UTF8Mode DATA + Py_VaBuildValue=python39.Py_VaBuildValue + _PyArg_ParseTupleAndKeywords_SizeT=python39._PyArg_ParseTupleAndKeywords_SizeT + _PyArg_ParseTuple_SizeT=python39._PyArg_ParseTuple_SizeT + _PyArg_Parse_SizeT=python39._PyArg_Parse_SizeT + _PyArg_VaParseTupleAndKeywords_SizeT=python39._PyArg_VaParseTupleAndKeywords_SizeT + _PyArg_VaParse_SizeT=python39._PyArg_VaParse_SizeT + _PyErr_BadInternalCall=python39._PyErr_BadInternalCall + _PyObject_CallFunction_SizeT=python39._PyObject_CallFunction_SizeT + _PyObject_CallMethod_SizeT=python39._PyObject_CallMethod_SizeT + _PyObject_GC_Malloc=python39._PyObject_GC_Malloc + _PyObject_GC_New=python39._PyObject_GC_New + _PyObject_GC_NewVar=python39._PyObject_GC_NewVar + _PyObject_GC_Resize=python39._PyObject_GC_Resize + _PyObject_New=python39._PyObject_New + _PyObject_NewVar=python39._PyObject_NewVar + _PyState_AddModule=python39._PyState_AddModule + _PyThreadState_Init=python39._PyThreadState_Init + _PyThreadState_Prealloc=python39._PyThreadState_Prealloc + _PyTrash_delete_later=python39._PyTrash_delete_later DATA + _PyTrash_delete_nesting=python39._PyTrash_delete_nesting DATA + _PyTrash_deposit_object=python39._PyTrash_deposit_object + _PyTrash_destroy_chain=python39._PyTrash_destroy_chain + _PyTrash_thread_deposit_object=python39._PyTrash_thread_deposit_object + _PyTrash_thread_destroy_chain=python39._PyTrash_thread_destroy_chain + _PyWeakref_CallableProxyType=python39._PyWeakref_CallableProxyType DATA + _PyWeakref_ProxyType=python39._PyWeakref_ProxyType DATA + _PyWeakref_RefType=python39._PyWeakref_RefType DATA + _Py_BuildValue_SizeT=python39._Py_BuildValue_SizeT + _Py_CheckRecursionLimit=python39._Py_CheckRecursionLimit DATA + _Py_CheckRecursiveCall=python39._Py_CheckRecursiveCall + _Py_Dealloc=python39._Py_Dealloc + _Py_EllipsisObject=python39._Py_EllipsisObject DATA + _Py_FalseStruct=python39._Py_FalseStruct DATA + _Py_NoneStruct=python39._Py_NoneStruct DATA + _Py_NotImplementedStruct=python39._Py_NotImplementedStruct DATA + _Py_SwappedOp=python39._Py_SwappedOp DATA + _Py_TrueStruct=python39._Py_TrueStruct DATA + _Py_VaBuildValue_SizeT=python39._Py_VaBuildValue_SizeT diff --git a/PCbuild/readme.txt b/PCbuild/readme.txt index cf4aa4c91754..312fa6a588a6 100644 --- a/PCbuild/readme.txt +++ b/PCbuild/readme.txt @@ -38,7 +38,7 @@ Debug Used to build Python with extra debugging capabilities, equivalent to using ./configure --with-pydebug on UNIX. All binaries built using this configuration have "_d" added to their name: - python38_d.dll, python_d.exe, parser_d.pyd, and so on. Both the + python39_d.dll, python_d.exe, parser_d.pyd, and so on. Both the build and rt (run test) batch files in this directory accept a -d option for debug builds. If you are building Python to help with development of CPython, you will most likely use this configuration. diff --git a/README.rst b/README.rst index b0a0ce7ec287..0f658531cbac 100644 --- a/README.rst +++ b/README.rst @@ -1,5 +1,5 @@ -This is Python version 3.8.0 beta 1 -=================================== +This is Python version 3.9.0 alpha 0 +==================================== .. image:: https://travis-ci.org/python/cpython.svg?branch=master :alt: CPython build status on Travis CI @@ -140,7 +140,7 @@ What's New ---------- We have a comprehensive overview of the changes in the `What's New in Python -3.8 `_ document. For a more +3.9 `_ document. For a more detailed change log, read `Misc/NEWS `_, but a full accounting of changes can only be gleaned from the `commit history @@ -153,7 +153,7 @@ entitled "Installing multiple versions". Documentation ------------- -`Documentation for Python 3.8 `_ is online, +`Documentation for Python 3.9 `_ is online, updated daily. It can also be downloaded in many formats for faster access. The documentation @@ -212,8 +212,8 @@ intend to install multiple versions using the same prefix you must decide which version (if any) is your "primary" version. Install that version using ``make install``. Install all other versions using ``make altinstall``. -For example, if you want to install Python 2.7, 3.6, and 3.8 with 3.8 being the -primary version, you would execute ``make install`` in your 3.8 build directory +For example, if you want to install Python 2.7, 3.6, and 3.9 with 3.9 being the +primary version, you would execute ``make install`` in your 3.9 build directory and ``make altinstall`` in the others. @@ -243,7 +243,7 @@ All current PEPs, as well as guidelines for submitting a new PEP, are listed at Release Schedule ---------------- -See :pep:`569` for Python 3.8 release details. +See :pep:`596` for Python 3.9 release details. Copyright and License Information diff --git a/configure b/configure index b606fc808c17..4b98fc6914e2 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for python 3.8. +# Generated by GNU Autoconf 2.69 for python 3.9. # # Report bugs to . # @@ -580,8 +580,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='python' PACKAGE_TARNAME='python' -PACKAGE_VERSION='3.8' -PACKAGE_STRING='python 3.8' +PACKAGE_VERSION='3.9' +PACKAGE_STRING='python 3.9' PACKAGE_BUGREPORT='https://bugs.python.org/' PACKAGE_URL='' @@ -1399,7 +1399,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures python 3.8 to adapt to many kinds of systems. +\`configure' configures python 3.9 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1465,7 +1465,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of python 3.8:";; + short | recursive ) echo "Configuration of python 3.9:";; esac cat <<\_ACEOF @@ -1631,7 +1631,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -python configure 3.8 +python configure 3.9 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2340,7 +2340,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by python $as_me 3.8, which was +It was created by python $as_me 3.9, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -2960,7 +2960,7 @@ rm confdefs.h mv confdefs.h.new confdefs.h -VERSION=3.8 +VERSION=3.9 # Version number of Python's own shared library file. @@ -17862,7 +17862,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by python $as_me 3.8, which was +This file was extended by python $as_me 3.9, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -17924,7 +17924,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -python config.status 3.8 +python config.status 3.9 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/configure.ac b/configure.ac index 3d589ac25891..e82ed1964729 100644 --- a/configure.ac +++ b/configure.ac @@ -3,7 +3,7 @@ dnl * Please run autoreconf to test your changes! * dnl *********************************************** # Set VERSION so we only need to edit in one place (i.e., here) -m4_define(PYTHON_VERSION, 3.8) +m4_define(PYTHON_VERSION, 3.9) AC_PREREQ([2.69]) From webhook-mailer at python.org Tue Jun 4 17:03:24 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 04 Jun 2019 21:03:24 -0000 Subject: [Python-checkins] bpo-34282: Remove deprecated enum _convert method (GH-13823) Message-ID: https://github.com/python/cpython/commit/19a1e1eb86115db66c1faae5927f87e3a12692fc commit: 19a1e1eb86115db66c1faae5927f87e3a12692fc branch: master author: Zachary Ware committer: Victor Stinner date: 2019-06-04T23:03:10+02:00 summary: bpo-34282: Remove deprecated enum _convert method (GH-13823) files: A Misc/NEWS.d/next/Library/2019-06-04-15-39-14.bpo-34282.aAK54n.rst M Lib/enum.py diff --git a/Lib/enum.py b/Lib/enum.py index 6ef17c7f6dc8..403f747d22a4 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -464,12 +464,6 @@ def _convert_(cls, name, module, filter, source=None): module_globals[name] = cls return cls - def _convert(cls, *args, **kwargs): - import warnings - warnings.warn("_convert is deprecated and will be removed in 3.9, use " - "_convert_ instead.", DeprecationWarning, stacklevel=2) - return cls._convert_(*args, **kwargs) - @staticmethod def _get_mixins_(bases): """Returns the type for creating enum members, and the first inherited diff --git a/Misc/NEWS.d/next/Library/2019-06-04-15-39-14.bpo-34282.aAK54n.rst b/Misc/NEWS.d/next/Library/2019-06-04-15-39-14.bpo-34282.aAK54n.rst new file mode 100644 index 000000000000..66c388e1d6ee --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-04-15-39-14.bpo-34282.aAK54n.rst @@ -0,0 +1 @@ +Remove ``Enum._convert`` method, deprecated in 3.8. From webhook-mailer at python.org Tue Jun 4 19:15:42 2019 From: webhook-mailer at python.org (Ned Deily) Date: Tue, 04 Jun 2019 23:15:42 -0000 Subject: [Python-checkins] Doc: Python 3.9 in sidebar and version switcher. (GH-13824) Message-ID: https://github.com/python/cpython/commit/59e7bbcaa4d0d556591f774c5ea4869c41fa95b0 commit: 59e7bbcaa4d0d556591f774c5ea4869c41fa95b0 branch: master author: Julien Palard committer: Ned Deily date: 2019-06-04T19:15:32-04:00 summary: Doc: Python 3.9 in sidebar and version switcher. (GH-13824) files: M Doc/tools/static/switchers.js M Doc/tools/templates/indexsidebar.html diff --git a/Doc/tools/static/switchers.js b/Doc/tools/static/switchers.js index 346b31494e60..fa298a76b0fe 100644 --- a/Doc/tools/static/switchers.js +++ b/Doc/tools/static/switchers.js @@ -10,7 +10,8 @@ '(?:release/\\d.\\d[\\x\\d\\.]*)']; var all_versions = { - '3.8': 'dev (3.8)', + '3.9': 'dev (3.9)', + '3.8': 'pre (3.8)', '3.7': '3.7', '3.6': '3.6', '3.5': '3.5', diff --git a/Doc/tools/templates/indexsidebar.html b/Doc/tools/templates/indexsidebar.html index 3666af92f0da..4fd7423430ca 100644 --- a/Doc/tools/templates/indexsidebar.html +++ b/Doc/tools/templates/indexsidebar.html @@ -2,7 +2,8 @@

{% trans %}Download{% endtrans %}

{% trans %}Download these documents{% endtrans %}

{% trans %}Docs by version{% endtrans %}

    -
  • {% trans %}Python 3.8 (in development){% endtrans %}
  • +
  • {% trans %}Python 3.9 (in development){% endtrans %}
  • +
  • {% trans %}Python 3.8 (pre-release){% endtrans %}
  • {% trans %}Python 3.7 (stable){% endtrans %}
  • {% trans %}Python 3.6 (security-fixes){% endtrans %}
  • {% trans %}Python 3.5 (security-fixes){% endtrans %}
  • From webhook-mailer at python.org Tue Jun 4 19:21:12 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 04 Jun 2019 23:21:12 -0000 Subject: [Python-checkins] Doc: Python 3.9 in sidebar and version switcher. (GH-13824) Message-ID: https://github.com/python/cpython/commit/49832e60c88d9d734b7b264db9878c44d01bc010 commit: 49832e60c88d9d734b7b264db9878c44d01bc010 branch: 2.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-04T16:21:08-07:00 summary: Doc: Python 3.9 in sidebar and version switcher. (GH-13824) (cherry picked from commit 59e7bbcaa4d0d556591f774c5ea4869c41fa95b0) Co-authored-by: Julien Palard files: M Doc/tools/static/switchers.js M Doc/tools/templates/indexsidebar.html diff --git a/Doc/tools/static/switchers.js b/Doc/tools/static/switchers.js index dbf907e09dc5..7f995fef8083 100644 --- a/Doc/tools/static/switchers.js +++ b/Doc/tools/static/switchers.js @@ -10,7 +10,8 @@ '(?:release/\\d.\\d[\\x\\d\\.]*)']; var all_versions = { - '3.8': 'dev (3.8)', + '3.9': 'dev (3.9)', + '3.8': 'pre (3.8)', '3.7': '3.7', '3.6': '3.6', '3.5': '3.5', diff --git a/Doc/tools/templates/indexsidebar.html b/Doc/tools/templates/indexsidebar.html index 1181f7179c6c..0adaf038d0e5 100644 --- a/Doc/tools/templates/indexsidebar.html +++ b/Doc/tools/templates/indexsidebar.html @@ -2,7 +2,8 @@

    {% trans %}Download{% endtrans %}

    {% trans %}Download these documents{% endtrans %}

    {% trans %}Docs by version{% endtrans %}

      -
    • {% trans %}Python 3.8 (in development){% endtrans %}
    • +
    • {% trans %}Python 3.9 (in development){% endtrans %}
    • +
    • {% trans %}Python 3.8 (pre-release){% endtrans %}
    • {% trans %}Python 3.7 (stable){% endtrans %}
    • {% trans %}Python 3.6 (security-fixes){% endtrans %}
    • {% trans %}Python 3.5 (security-fixes){% endtrans %}
    • From webhook-mailer at python.org Tue Jun 4 19:21:22 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 04 Jun 2019 23:21:22 -0000 Subject: [Python-checkins] Doc: Python 3.9 in sidebar and version switcher. (GH-13824) Message-ID: https://github.com/python/cpython/commit/99a5178cd143cc880f081dc5f53903fefa378681 commit: 99a5178cd143cc880f081dc5f53903fefa378681 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-04T16:21:19-07:00 summary: Doc: Python 3.9 in sidebar and version switcher. (GH-13824) (cherry picked from commit 59e7bbcaa4d0d556591f774c5ea4869c41fa95b0) Co-authored-by: Julien Palard files: M Doc/tools/static/switchers.js M Doc/tools/templates/indexsidebar.html diff --git a/Doc/tools/static/switchers.js b/Doc/tools/static/switchers.js index 346b31494e60..fa298a76b0fe 100644 --- a/Doc/tools/static/switchers.js +++ b/Doc/tools/static/switchers.js @@ -10,7 +10,8 @@ '(?:release/\\d.\\d[\\x\\d\\.]*)']; var all_versions = { - '3.8': 'dev (3.8)', + '3.9': 'dev (3.9)', + '3.8': 'pre (3.8)', '3.7': '3.7', '3.6': '3.6', '3.5': '3.5', diff --git a/Doc/tools/templates/indexsidebar.html b/Doc/tools/templates/indexsidebar.html index 3666af92f0da..4fd7423430ca 100644 --- a/Doc/tools/templates/indexsidebar.html +++ b/Doc/tools/templates/indexsidebar.html @@ -2,7 +2,8 @@

      {% trans %}Download{% endtrans %}

      {% trans %}Download these documents{% endtrans %}

      {% trans %}Docs by version{% endtrans %}

        -
      • {% trans %}Python 3.8 (in development){% endtrans %}
      • +
      • {% trans %}Python 3.9 (in development){% endtrans %}
      • +
      • {% trans %}Python 3.8 (pre-release){% endtrans %}
      • {% trans %}Python 3.7 (stable){% endtrans %}
      • {% trans %}Python 3.6 (security-fixes){% endtrans %}
      • {% trans %}Python 3.5 (security-fixes){% endtrans %}
      • From webhook-mailer at python.org Tue Jun 4 19:21:38 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 04 Jun 2019 23:21:38 -0000 Subject: [Python-checkins] Doc: Python 3.9 in sidebar and version switcher. (GH-13824) Message-ID: https://github.com/python/cpython/commit/beba8c7fd3e32c51baa6179e6459d093483ca92f commit: beba8c7fd3e32c51baa6179e6459d093483ca92f branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-04T16:21:34-07:00 summary: Doc: Python 3.9 in sidebar and version switcher. (GH-13824) (cherry picked from commit 59e7bbcaa4d0d556591f774c5ea4869c41fa95b0) Co-authored-by: Julien Palard files: M Doc/tools/static/switchers.js M Doc/tools/templates/indexsidebar.html diff --git a/Doc/tools/static/switchers.js b/Doc/tools/static/switchers.js index 346b31494e60..fa298a76b0fe 100644 --- a/Doc/tools/static/switchers.js +++ b/Doc/tools/static/switchers.js @@ -10,7 +10,8 @@ '(?:release/\\d.\\d[\\x\\d\\.]*)']; var all_versions = { - '3.8': 'dev (3.8)', + '3.9': 'dev (3.9)', + '3.8': 'pre (3.8)', '3.7': '3.7', '3.6': '3.6', '3.5': '3.5', diff --git a/Doc/tools/templates/indexsidebar.html b/Doc/tools/templates/indexsidebar.html index 1181f7179c6c..0adaf038d0e5 100644 --- a/Doc/tools/templates/indexsidebar.html +++ b/Doc/tools/templates/indexsidebar.html @@ -2,7 +2,8 @@

        {% trans %}Download{% endtrans %}

        {% trans %}Download these documents{% endtrans %}

        {% trans %}Docs by version{% endtrans %}

          -
        • {% trans %}Python 3.8 (in development){% endtrans %}
        • +
        • {% trans %}Python 3.9 (in development){% endtrans %}
        • +
        • {% trans %}Python 3.8 (pre-release){% endtrans %}
        • {% trans %}Python 3.7 (stable){% endtrans %}
        • {% trans %}Python 3.6 (security-fixes){% endtrans %}
        • {% trans %}Python 3.5 (security-fixes){% endtrans %}
        • From webhook-mailer at python.org Tue Jun 4 19:22:54 2019 From: webhook-mailer at python.org (Ned Deily) Date: Tue, 04 Jun 2019 23:22:54 -0000 Subject: [Python-checkins] Doc: Python 3.9 in sidebar and version switcher. (GH-13824) (GH-13827) Message-ID: https://github.com/python/cpython/commit/dffc558dac05483186ae92fa926994d964ad4093 commit: dffc558dac05483186ae92fa926994d964ad4093 branch: 3.6 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Ned Deily date: 2019-06-04T19:22:50-04:00 summary: Doc: Python 3.9 in sidebar and version switcher. (GH-13824) (GH-13827) (cherry picked from commit 59e7bbcaa4d0d556591f774c5ea4869c41fa95b0) Co-authored-by: Julien Palard files: M Doc/tools/static/switchers.js M Doc/tools/templates/indexsidebar.html diff --git a/Doc/tools/static/switchers.js b/Doc/tools/static/switchers.js index 20dad93d6a5e..7a5c8bd38478 100644 --- a/Doc/tools/static/switchers.js +++ b/Doc/tools/static/switchers.js @@ -10,7 +10,8 @@ '(?:release/\\d.\\d[\\x\\d\\.]*)']; var all_versions = { - '3.8': 'dev (3.8)', + '3.9': 'dev (3.9)', + '3.8': 'pre (3.8)', '3.7': '3.7', '3.6': '3.6', '3.5': '3.5', diff --git a/Doc/tools/templates/indexsidebar.html b/Doc/tools/templates/indexsidebar.html index 1181f7179c6c..0adaf038d0e5 100644 --- a/Doc/tools/templates/indexsidebar.html +++ b/Doc/tools/templates/indexsidebar.html @@ -2,7 +2,8 @@

          {% trans %}Download{% endtrans %}

          {% trans %}Download these documents{% endtrans %}

          {% trans %}Docs by version{% endtrans %}

            -
          • {% trans %}Python 3.8 (in development){% endtrans %}
          • +
          • {% trans %}Python 3.9 (in development){% endtrans %}
          • +
          • {% trans %}Python 3.8 (pre-release){% endtrans %}
          • {% trans %}Python 3.7 (stable){% endtrans %}
          • {% trans %}Python 3.6 (security-fixes){% endtrans %}
          • {% trans %}Python 3.5 (security-fixes){% endtrans %}
          • From webhook-mailer at python.org Tue Jun 4 20:19:40 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Wed, 05 Jun 2019 00:19:40 -0000 Subject: [Python-checkins] Update outdated reference to Mercurial (GH-12857) Message-ID: https://github.com/python/cpython/commit/20093b3adf6b06930fe994527670dfb3aee40cc7 commit: 20093b3adf6b06930fe994527670dfb3aee40cc7 branch: 2.7 author: Anthony Sottile committer: Cheryl Sabella date: 2019-06-04T20:19:36-04:00 summary: Update outdated reference to Mercurial (GH-12857) files: M Doc/library/sys.rst diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index 5a7647b7e99d..339625ad3802 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -1030,7 +1030,7 @@ always available. .. note:: Python is now `developed `_ using - Mercurial. In recent Python 2.7 bugfix releases, :data:`subversion` + Git. In recent Python 2.7 bugfix releases, :data:`subversion` therefore contains placeholder information. It is removed in Python 3.3. From webhook-mailer at python.org Tue Jun 4 21:55:41 2019 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Wed, 05 Jun 2019 01:55:41 -0000 Subject: [Python-checkins] bpo-35763: Make IDLE calltip note about '/' less obtrusive (GH-13791) Message-ID: https://github.com/python/cpython/commit/949fe976d5c62ae63ed505ecf729f815d0baccfc commit: 949fe976d5c62ae63ed505ecf729f815d0baccfc branch: master author: Terry Jan Reedy committer: GitHub date: 2019-06-04T21:55:37-04:00 summary: bpo-35763: Make IDLE calltip note about '/' less obtrusive (GH-13791) Add it to the end of the first line if there is room. Tests were reworked. files: A Misc/NEWS.d/next/IDLE/2019-06-04-20-36-24.bpo-35763.7XdoWz.rst M Lib/idlelib/calltip.py M Lib/idlelib/idle_test/test_calltip.py diff --git a/Lib/idlelib/calltip.py b/Lib/idlelib/calltip.py index b013a7f6ec0f..a3dda2678bd4 100644 --- a/Lib/idlelib/calltip.py +++ b/Lib/idlelib/calltip.py @@ -118,7 +118,7 @@ def get_entity(expression): _first_param = re.compile(r'(?<=\()\w*\,?\s*') _default_callable_argspec = "See source or doc" _invalid_method = "invalid method signature" -_argument_positional = "\n['/' marks preceding arguments as positional-only]\n" +_argument_positional = " # '/' marks preceding args as positional-only." def get_argspec(ob): '''Return a string describing the signature of a callable object, or ''. @@ -144,11 +144,11 @@ def get_argspec(ob): if msg.startswith(_invalid_method): return _invalid_method - if '/' in argspec: - """Using AC's positional argument should add the explain""" + if '/' in argspec and len(argspec) < _MAX_COLS - len(_argument_positional): + # Add explanation TODO remove after 3.7, before 3.9. argspec += _argument_positional if isinstance(fob, type) and argspec == '()': - """fob with no argument, use default callable argspec""" + # If fob has no argument, use default callable argspec. argspec = _default_callable_argspec lines = (textwrap.wrap(argspec, _MAX_COLS, subsequent_indent=_INDENT) diff --git a/Lib/idlelib/idle_test/test_calltip.py b/Lib/idlelib/idle_test/test_calltip.py index 833351bd7996..886959b17074 100644 --- a/Lib/idlelib/idle_test/test_calltip.py +++ b/Lib/idlelib/idle_test/test_calltip.py @@ -4,8 +4,7 @@ import unittest import textwrap import types - -default_tip = calltip._default_callable_argspec +import re # Test Class TC is used in multiple get_argspec test methods @@ -28,6 +27,7 @@ def t6(no, self): 'doc' t6.tip = "(no, self)" def __call__(self, ci): 'doc' __call__.tip = "(self, ci)" + def nd(self): pass # No doc. # attaching .tip to wrapped methods does not work @classmethod def cm(cls, a): 'doc' @@ -36,11 +36,12 @@ def sm(b): 'doc' tc = TC() -signature = calltip.get_argspec # 2.7 and 3.x use different functions +default_tip = calltip._default_callable_argspec +get_spec = calltip.get_argspec -class Get_signatureTest(unittest.TestCase): - # The signature function must return a string, even if blank. +class Get_argspecTest(unittest.TestCase): + # The get_spec function must return a string, even if blank. # Test a variety of objects to be sure that none cause it to raise # (quite aside from getting as correct an answer as possible). # The tests of builtins may break if inspect or the docstrings change, @@ -49,57 +50,59 @@ class Get_signatureTest(unittest.TestCase): def test_builtins(self): + def tiptest(obj, out): + self.assertEqual(get_spec(obj), out) + # Python class that inherits builtin methods class List(list): "List() doc" # Simulate builtin with no docstring for default tip test class SB: __call__ = None - def gtest(obj, out): - self.assertEqual(signature(obj), out) - if List.__doc__ is not None: - gtest(List, '(iterable=(), /)' + calltip._argument_positional - + '\n' + List.__doc__) - gtest(list.__new__, + tiptest(List, + f'(iterable=(), /){calltip._argument_positional}' + f'\n{List.__doc__}') + tiptest(list.__new__, '(*args, **kwargs)\n' 'Create and return a new object. ' 'See help(type) for accurate signature.') - gtest(list.__init__, + tiptest(list.__init__, '(self, /, *args, **kwargs)' + calltip._argument_positional + '\n' + 'Initialize self. See help(type(self)) for accurate signature.') append_doc = (calltip._argument_positional + "\nAppend object to the end of the list.") - gtest(list.append, '(self, object, /)' + append_doc) - gtest(List.append, '(self, object, /)' + append_doc) - gtest([].append, '(object, /)' + append_doc) + tiptest(list.append, '(self, object, /)' + append_doc) + tiptest(List.append, '(self, object, /)' + append_doc) + tiptest([].append, '(object, /)' + append_doc) + + tiptest(types.MethodType, "method(function, instance)") + tiptest(SB(), default_tip) - gtest(types.MethodType, "method(function, instance)") - gtest(SB(), default_tip) - import re p = re.compile('') - gtest(re.sub, '''\ + tiptest(re.sub, '''\ (pattern, repl, string, count=0, flags=0) Return the string obtained by replacing the leftmost non-overlapping occurrences of the pattern in string by the replacement repl. repl can be either a string or a callable; if a string, backslash escapes in it are processed. If it is a callable, it's passed the Match object and must return''') - gtest(p.sub, '''\ + tiptest(p.sub, '''\ (repl, string, count=0) Return the string obtained by replacing the leftmost \ non-overlapping occurrences o...''') def test_signature_wrap(self): if textwrap.TextWrapper.__doc__ is not None: - self.assertEqual(signature(textwrap.TextWrapper), '''\ + self.assertEqual(get_spec(textwrap.TextWrapper), '''\ (width=70, initial_indent='', subsequent_indent='', expand_tabs=True, replace_whitespace=True, fix_sentence_endings=False, break_long_words=True, drop_whitespace=True, break_on_hyphens=True, tabsize=8, *, max_lines=None, placeholder=' [...]')''') def test_properly_formated(self): + def foo(s='a'*100): pass @@ -112,35 +115,35 @@ def baz(s='a'*100, z='b'*100): indent = calltip._INDENT - str_foo = "(s='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"\ - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + indent + "aaaaaaaaa"\ - "aaaaaaaaaa')" - str_bar = "(s='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"\ - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + indent + "aaaaaaaaa"\ - "aaaaaaaaaa')\nHello Guido" - str_baz = "(s='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"\ - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + indent + "aaaaaaaaa"\ - "aaaaaaaaaa', z='bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"\ - "bbbbbbbbbbbbbbbbb\n" + indent + "bbbbbbbbbbbbbbbbbbbbbb"\ - "bbbbbbbbbbbbbbbbbbbbbb')" - - self.assertEqual(calltip.get_argspec(foo), str_foo) - self.assertEqual(calltip.get_argspec(bar), str_bar) - self.assertEqual(calltip.get_argspec(baz), str_baz) + sfoo = "(s='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"\ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + indent + "aaaaaaaaa"\ + "aaaaaaaaaa')" + sbar = "(s='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"\ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + indent + "aaaaaaaaa"\ + "aaaaaaaaaa')\nHello Guido" + sbaz = "(s='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"\ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + indent + "aaaaaaaaa"\ + "aaaaaaaaaa', z='bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"\ + "bbbbbbbbbbbbbbbbb\n" + indent + "bbbbbbbbbbbbbbbbbbbbbb"\ + "bbbbbbbbbbbbbbbbbbbbbb')" + + for func,doc in [(foo, sfoo), (bar, sbar), (baz, sbaz)]: + with self.subTest(func=func, doc=doc): + self.assertEqual(get_spec(func), doc) def test_docline_truncation(self): def f(): pass f.__doc__ = 'a'*300 - self.assertEqual(signature(f), '()\n' + 'a' * (calltip._MAX_COLS-3) + '...') + self.assertEqual(get_spec(f), f"()\n{'a'*(calltip._MAX_COLS-3) + '...'}") def test_multiline_docstring(self): # Test fewer lines than max. - self.assertEqual(signature(range), + self.assertEqual(get_spec(range), "range(stop) -> range object\n" "range(start, stop[, step]) -> range object") # Test max lines - self.assertEqual(signature(bytes), '''\ + self.assertEqual(get_spec(bytes), '''\ bytes(iterable_of_ints) -> bytes bytes(string, encoding[, errors]) -> bytes bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer @@ -150,7 +153,7 @@ def test_multiline_docstring(self): # Test more than max lines def f(): pass f.__doc__ = 'a\n' * 15 - self.assertEqual(signature(f), '()' + '\na' * calltip._MAX_LINES) + self.assertEqual(get_spec(f), '()' + '\na' * calltip._MAX_LINES) def test_functions(self): def t1(): 'doc' @@ -166,14 +169,16 @@ def t5(a, b=None, *args, **kw): 'doc' doc = '\ndoc' if t1.__doc__ is not None else '' for func in (t1, t2, t3, t4, t5, TC): - self.assertEqual(signature(func), func.tip + doc) + with self.subTest(func=func): + self.assertEqual(get_spec(func), func.tip + doc) def test_methods(self): doc = '\ndoc' if TC.__doc__ is not None else '' for meth in (TC.t1, TC.t2, TC.t3, TC.t4, TC.t5, TC.t6, TC.__call__): - self.assertEqual(signature(meth), meth.tip + doc) - self.assertEqual(signature(TC.cm), "(a)" + doc) - self.assertEqual(signature(TC.sm), "(b)" + doc) + with self.subTest(meth=meth): + self.assertEqual(get_spec(meth), meth.tip + doc) + self.assertEqual(get_spec(TC.cm), "(a)" + doc) + self.assertEqual(get_spec(TC.sm), "(b)" + doc) def test_bound_methods(self): # test that first parameter is correctly removed from argspec @@ -181,7 +186,8 @@ def test_bound_methods(self): for meth, mtip in ((tc.t1, "()"), (tc.t4, "(*args)"), (tc.t6, "(self)"), (tc.__call__, '(ci)'), (tc, '(ci)'), (TC.cm, "(a)"),): - self.assertEqual(signature(meth), mtip + doc) + with self.subTest(meth=meth, mtip=mtip): + self.assertEqual(get_spec(meth), mtip + doc) def test_starred_parameter(self): # test that starred first parameter is *not* removed from argspec @@ -189,17 +195,18 @@ class C: def m1(*args): pass c = C() for meth, mtip in ((C.m1, '(*args)'), (c.m1, "(*args)"),): - self.assertEqual(signature(meth), mtip) + with self.subTest(meth=meth, mtip=mtip): + self.assertEqual(get_spec(meth), mtip) - def test_invalid_method_signature(self): + def test_invalid_method_get_spec(self): class C: def m2(**kwargs): pass class Test: def __call__(*, a): pass mtip = calltip._invalid_method - self.assertEqual(signature(C().m2), mtip) - self.assertEqual(signature(Test()), mtip) + self.assertEqual(get_spec(C().m2), mtip) + self.assertEqual(get_spec(Test()), mtip) def test_non_ascii_name(self): # test that re works to delete a first parameter name that @@ -208,12 +215,9 @@ def test_non_ascii_name(self): assert calltip._first_param.sub('', uni) == '(a)' def test_no_docstring(self): - def nd(s): - pass - TC.nd = nd - self.assertEqual(signature(nd), "(s)") - self.assertEqual(signature(TC.nd), "(s)") - self.assertEqual(signature(tc.nd), "()") + for meth, mtip in ((TC.nd, "(self)"), (tc.nd, "()")): + with self.subTest(meth=meth, mtip=mtip): + self.assertEqual(get_spec(meth), mtip) def test_attribute_exception(self): class NoCall: @@ -229,11 +233,13 @@ def __call__(self, ci): for meth, mtip in ((NoCall, default_tip), (CallA, default_tip), (NoCall(), ''), (CallA(), '(a, b, c)'), (CallB(), '(ci)')): - self.assertEqual(signature(meth), mtip) + with self.subTest(meth=meth, mtip=mtip): + self.assertEqual(get_spec(meth), mtip) def test_non_callables(self): for obj in (0, 0.0, '0', b'0', [], {}): - self.assertEqual(signature(obj), '') + with self.subTest(obj=obj): + self.assertEqual(get_spec(obj), '') class Get_entityTest(unittest.TestCase): diff --git a/Misc/NEWS.d/next/IDLE/2019-06-04-20-36-24.bpo-35763.7XdoWz.rst b/Misc/NEWS.d/next/IDLE/2019-06-04-20-36-24.bpo-35763.7XdoWz.rst new file mode 100644 index 000000000000..c2b6594cc350 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-06-04-20-36-24.bpo-35763.7XdoWz.rst @@ -0,0 +1,2 @@ +Make calltip reminder about '/' meaning positional-only less obtrusive by +only adding it when there is room on the first line. From webhook-mailer at python.org Tue Jun 4 16:57:23 2019 From: webhook-mailer at python.org (=?utf-8?q?=C5=81ukasz?= Langa) Date: Tue, 04 Jun 2019 20:57:23 -0000 Subject: [Python-checkins] (no subject) Message-ID: To: python-checkins at python.org Subject: Bump version in AppVeyor config (#13822) Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 https://github.com/python/cpython/commit/750767f7c06994f58bf235a520bc76b62aff= b70b commit: 750767f7c06994f58bf235a520bc76b62affb70b branch: master author: Zachary Ware committer: =C5=81ukasz Langa date: 2019-06-04T22:57:15+02:00 summary: Bump version in AppVeyor config (#13822) files: M .github/appveyor.yml diff --git a/.github/appveyor.yml b/.github/appveyor.yml index e8012f69ee5b..8556cf8437e5 100644 --- a/.github/appveyor.yml +++ b/.github/appveyor.yml @@ -1,4 +1,4 @@ -version: 3.8build{build} +version: 3.9build{build} clone_depth: 5 branches: only: From tjreedy at udel.edu Tue Jun 4 22:05:07 2019 From: tjreedy at udel.edu (Terry Reedy) Date: Tue, 4 Jun 2019 22:05:07 -0400 Subject: [Python-checkins] (no subject) In-Reply-To: <45JX7x3nJ3zpBlM@mail.python.org> References: <45JX7x3nJ3zpBlM@mail.python.org> Message-ID: <9eb87d0d-06b3-d63f-88e8-0388897a74ac@udel.edu> To whoever, this was malformed somehow that caused it to get hung up for python-checkings moderation. No title and something about blind CCs not allowed. The subject did not come through properly either. On 6/4/2019 10:01 PM, ?ukasz Langa wrote > > To: python-checkins at python.org > Subject: Bump version in AppVeyor config (#13822) > Content-Type: text/plain; charset="utf-8" > Content-Transfer-Encoding: quoted-printable > MIME-Version: 1.0 > > https://github.com/python/cpython/commit/750767f7c06994f58bf235a520bc76b62aff= > b70b > commit: 750767f7c06994f58bf235a520bc76b62affb70b > branch: master > author: Zachary Ware > committer: =C5=81ukasz Langa > date: 2019-06-04T22:57:15+02:00 > summary: > > Bump version in AppVeyor config (#13822) > > files: > M .github/appveyor.yml > > diff --git a/.github/appveyor.yml b/.github/appveyor.yml > index e8012f69ee5b..8556cf8437e5 100644 > --- a/.github/appveyor.yml > +++ b/.github/appveyor.yml > @@ -1,4 +1,4 @@ > -version: 3.8build{build} > +version: 3.9build{build} > clone_depth: 5 > branches: > only: > > _______________________________________________ > Python-checkins mailing list > Python-checkins at python.org > https://mail.python.org/mailman/listinfo/python-checkins > From webhook-mailer at python.org Tue Jun 4 22:11:48 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 05 Jun 2019 02:11:48 -0000 Subject: [Python-checkins] bpo-35763: Make IDLE calltip note about '/' less obtrusive (GH-13791) Message-ID: https://github.com/python/cpython/commit/39346ff60ac14bb83521c7e4f87304d0ad6478c2 commit: 39346ff60ac14bb83521c7e4f87304d0ad6478c2 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-04T19:11:42-07:00 summary: bpo-35763: Make IDLE calltip note about '/' less obtrusive (GH-13791) Add it to the end of the first line if there is room. Tests were reworked. (cherry picked from commit 949fe976d5c62ae63ed505ecf729f815d0baccfc) Co-authored-by: Terry Jan Reedy files: A Misc/NEWS.d/next/IDLE/2019-06-04-20-36-24.bpo-35763.7XdoWz.rst M Lib/idlelib/calltip.py M Lib/idlelib/idle_test/test_calltip.py diff --git a/Lib/idlelib/calltip.py b/Lib/idlelib/calltip.py index b013a7f6ec0f..a3dda2678bd4 100644 --- a/Lib/idlelib/calltip.py +++ b/Lib/idlelib/calltip.py @@ -118,7 +118,7 @@ def get_entity(expression): _first_param = re.compile(r'(?<=\()\w*\,?\s*') _default_callable_argspec = "See source or doc" _invalid_method = "invalid method signature" -_argument_positional = "\n['/' marks preceding arguments as positional-only]\n" +_argument_positional = " # '/' marks preceding args as positional-only." def get_argspec(ob): '''Return a string describing the signature of a callable object, or ''. @@ -144,11 +144,11 @@ def get_argspec(ob): if msg.startswith(_invalid_method): return _invalid_method - if '/' in argspec: - """Using AC's positional argument should add the explain""" + if '/' in argspec and len(argspec) < _MAX_COLS - len(_argument_positional): + # Add explanation TODO remove after 3.7, before 3.9. argspec += _argument_positional if isinstance(fob, type) and argspec == '()': - """fob with no argument, use default callable argspec""" + # If fob has no argument, use default callable argspec. argspec = _default_callable_argspec lines = (textwrap.wrap(argspec, _MAX_COLS, subsequent_indent=_INDENT) diff --git a/Lib/idlelib/idle_test/test_calltip.py b/Lib/idlelib/idle_test/test_calltip.py index 833351bd7996..886959b17074 100644 --- a/Lib/idlelib/idle_test/test_calltip.py +++ b/Lib/idlelib/idle_test/test_calltip.py @@ -4,8 +4,7 @@ import unittest import textwrap import types - -default_tip = calltip._default_callable_argspec +import re # Test Class TC is used in multiple get_argspec test methods @@ -28,6 +27,7 @@ def t6(no, self): 'doc' t6.tip = "(no, self)" def __call__(self, ci): 'doc' __call__.tip = "(self, ci)" + def nd(self): pass # No doc. # attaching .tip to wrapped methods does not work @classmethod def cm(cls, a): 'doc' @@ -36,11 +36,12 @@ def sm(b): 'doc' tc = TC() -signature = calltip.get_argspec # 2.7 and 3.x use different functions +default_tip = calltip._default_callable_argspec +get_spec = calltip.get_argspec -class Get_signatureTest(unittest.TestCase): - # The signature function must return a string, even if blank. +class Get_argspecTest(unittest.TestCase): + # The get_spec function must return a string, even if blank. # Test a variety of objects to be sure that none cause it to raise # (quite aside from getting as correct an answer as possible). # The tests of builtins may break if inspect or the docstrings change, @@ -49,57 +50,59 @@ class Get_signatureTest(unittest.TestCase): def test_builtins(self): + def tiptest(obj, out): + self.assertEqual(get_spec(obj), out) + # Python class that inherits builtin methods class List(list): "List() doc" # Simulate builtin with no docstring for default tip test class SB: __call__ = None - def gtest(obj, out): - self.assertEqual(signature(obj), out) - if List.__doc__ is not None: - gtest(List, '(iterable=(), /)' + calltip._argument_positional - + '\n' + List.__doc__) - gtest(list.__new__, + tiptest(List, + f'(iterable=(), /){calltip._argument_positional}' + f'\n{List.__doc__}') + tiptest(list.__new__, '(*args, **kwargs)\n' 'Create and return a new object. ' 'See help(type) for accurate signature.') - gtest(list.__init__, + tiptest(list.__init__, '(self, /, *args, **kwargs)' + calltip._argument_positional + '\n' + 'Initialize self. See help(type(self)) for accurate signature.') append_doc = (calltip._argument_positional + "\nAppend object to the end of the list.") - gtest(list.append, '(self, object, /)' + append_doc) - gtest(List.append, '(self, object, /)' + append_doc) - gtest([].append, '(object, /)' + append_doc) + tiptest(list.append, '(self, object, /)' + append_doc) + tiptest(List.append, '(self, object, /)' + append_doc) + tiptest([].append, '(object, /)' + append_doc) + + tiptest(types.MethodType, "method(function, instance)") + tiptest(SB(), default_tip) - gtest(types.MethodType, "method(function, instance)") - gtest(SB(), default_tip) - import re p = re.compile('') - gtest(re.sub, '''\ + tiptest(re.sub, '''\ (pattern, repl, string, count=0, flags=0) Return the string obtained by replacing the leftmost non-overlapping occurrences of the pattern in string by the replacement repl. repl can be either a string or a callable; if a string, backslash escapes in it are processed. If it is a callable, it's passed the Match object and must return''') - gtest(p.sub, '''\ + tiptest(p.sub, '''\ (repl, string, count=0) Return the string obtained by replacing the leftmost \ non-overlapping occurrences o...''') def test_signature_wrap(self): if textwrap.TextWrapper.__doc__ is not None: - self.assertEqual(signature(textwrap.TextWrapper), '''\ + self.assertEqual(get_spec(textwrap.TextWrapper), '''\ (width=70, initial_indent='', subsequent_indent='', expand_tabs=True, replace_whitespace=True, fix_sentence_endings=False, break_long_words=True, drop_whitespace=True, break_on_hyphens=True, tabsize=8, *, max_lines=None, placeholder=' [...]')''') def test_properly_formated(self): + def foo(s='a'*100): pass @@ -112,35 +115,35 @@ def baz(s='a'*100, z='b'*100): indent = calltip._INDENT - str_foo = "(s='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"\ - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + indent + "aaaaaaaaa"\ - "aaaaaaaaaa')" - str_bar = "(s='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"\ - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + indent + "aaaaaaaaa"\ - "aaaaaaaaaa')\nHello Guido" - str_baz = "(s='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"\ - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + indent + "aaaaaaaaa"\ - "aaaaaaaaaa', z='bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"\ - "bbbbbbbbbbbbbbbbb\n" + indent + "bbbbbbbbbbbbbbbbbbbbbb"\ - "bbbbbbbbbbbbbbbbbbbbbb')" - - self.assertEqual(calltip.get_argspec(foo), str_foo) - self.assertEqual(calltip.get_argspec(bar), str_bar) - self.assertEqual(calltip.get_argspec(baz), str_baz) + sfoo = "(s='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"\ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + indent + "aaaaaaaaa"\ + "aaaaaaaaaa')" + sbar = "(s='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"\ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + indent + "aaaaaaaaa"\ + "aaaaaaaaaa')\nHello Guido" + sbaz = "(s='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"\ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + indent + "aaaaaaaaa"\ + "aaaaaaaaaa', z='bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"\ + "bbbbbbbbbbbbbbbbb\n" + indent + "bbbbbbbbbbbbbbbbbbbbbb"\ + "bbbbbbbbbbbbbbbbbbbbbb')" + + for func,doc in [(foo, sfoo), (bar, sbar), (baz, sbaz)]: + with self.subTest(func=func, doc=doc): + self.assertEqual(get_spec(func), doc) def test_docline_truncation(self): def f(): pass f.__doc__ = 'a'*300 - self.assertEqual(signature(f), '()\n' + 'a' * (calltip._MAX_COLS-3) + '...') + self.assertEqual(get_spec(f), f"()\n{'a'*(calltip._MAX_COLS-3) + '...'}") def test_multiline_docstring(self): # Test fewer lines than max. - self.assertEqual(signature(range), + self.assertEqual(get_spec(range), "range(stop) -> range object\n" "range(start, stop[, step]) -> range object") # Test max lines - self.assertEqual(signature(bytes), '''\ + self.assertEqual(get_spec(bytes), '''\ bytes(iterable_of_ints) -> bytes bytes(string, encoding[, errors]) -> bytes bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer @@ -150,7 +153,7 @@ def test_multiline_docstring(self): # Test more than max lines def f(): pass f.__doc__ = 'a\n' * 15 - self.assertEqual(signature(f), '()' + '\na' * calltip._MAX_LINES) + self.assertEqual(get_spec(f), '()' + '\na' * calltip._MAX_LINES) def test_functions(self): def t1(): 'doc' @@ -166,14 +169,16 @@ def t5(a, b=None, *args, **kw): 'doc' doc = '\ndoc' if t1.__doc__ is not None else '' for func in (t1, t2, t3, t4, t5, TC): - self.assertEqual(signature(func), func.tip + doc) + with self.subTest(func=func): + self.assertEqual(get_spec(func), func.tip + doc) def test_methods(self): doc = '\ndoc' if TC.__doc__ is not None else '' for meth in (TC.t1, TC.t2, TC.t3, TC.t4, TC.t5, TC.t6, TC.__call__): - self.assertEqual(signature(meth), meth.tip + doc) - self.assertEqual(signature(TC.cm), "(a)" + doc) - self.assertEqual(signature(TC.sm), "(b)" + doc) + with self.subTest(meth=meth): + self.assertEqual(get_spec(meth), meth.tip + doc) + self.assertEqual(get_spec(TC.cm), "(a)" + doc) + self.assertEqual(get_spec(TC.sm), "(b)" + doc) def test_bound_methods(self): # test that first parameter is correctly removed from argspec @@ -181,7 +186,8 @@ def test_bound_methods(self): for meth, mtip in ((tc.t1, "()"), (tc.t4, "(*args)"), (tc.t6, "(self)"), (tc.__call__, '(ci)'), (tc, '(ci)'), (TC.cm, "(a)"),): - self.assertEqual(signature(meth), mtip + doc) + with self.subTest(meth=meth, mtip=mtip): + self.assertEqual(get_spec(meth), mtip + doc) def test_starred_parameter(self): # test that starred first parameter is *not* removed from argspec @@ -189,17 +195,18 @@ class C: def m1(*args): pass c = C() for meth, mtip in ((C.m1, '(*args)'), (c.m1, "(*args)"),): - self.assertEqual(signature(meth), mtip) + with self.subTest(meth=meth, mtip=mtip): + self.assertEqual(get_spec(meth), mtip) - def test_invalid_method_signature(self): + def test_invalid_method_get_spec(self): class C: def m2(**kwargs): pass class Test: def __call__(*, a): pass mtip = calltip._invalid_method - self.assertEqual(signature(C().m2), mtip) - self.assertEqual(signature(Test()), mtip) + self.assertEqual(get_spec(C().m2), mtip) + self.assertEqual(get_spec(Test()), mtip) def test_non_ascii_name(self): # test that re works to delete a first parameter name that @@ -208,12 +215,9 @@ def test_non_ascii_name(self): assert calltip._first_param.sub('', uni) == '(a)' def test_no_docstring(self): - def nd(s): - pass - TC.nd = nd - self.assertEqual(signature(nd), "(s)") - self.assertEqual(signature(TC.nd), "(s)") - self.assertEqual(signature(tc.nd), "()") + for meth, mtip in ((TC.nd, "(self)"), (tc.nd, "()")): + with self.subTest(meth=meth, mtip=mtip): + self.assertEqual(get_spec(meth), mtip) def test_attribute_exception(self): class NoCall: @@ -229,11 +233,13 @@ def __call__(self, ci): for meth, mtip in ((NoCall, default_tip), (CallA, default_tip), (NoCall(), ''), (CallA(), '(a, b, c)'), (CallB(), '(ci)')): - self.assertEqual(signature(meth), mtip) + with self.subTest(meth=meth, mtip=mtip): + self.assertEqual(get_spec(meth), mtip) def test_non_callables(self): for obj in (0, 0.0, '0', b'0', [], {}): - self.assertEqual(signature(obj), '') + with self.subTest(obj=obj): + self.assertEqual(get_spec(obj), '') class Get_entityTest(unittest.TestCase): diff --git a/Misc/NEWS.d/next/IDLE/2019-06-04-20-36-24.bpo-35763.7XdoWz.rst b/Misc/NEWS.d/next/IDLE/2019-06-04-20-36-24.bpo-35763.7XdoWz.rst new file mode 100644 index 000000000000..c2b6594cc350 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-06-04-20-36-24.bpo-35763.7XdoWz.rst @@ -0,0 +1,2 @@ +Make calltip reminder about '/' meaning positional-only less obtrusive by +only adding it when there is room on the first line. From webhook-mailer at python.org Tue Jun 4 22:15:55 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 05 Jun 2019 02:15:55 -0000 Subject: [Python-checkins] bpo-35763: Make IDLE calltip note about '/' less obtrusive (GH-13791) Message-ID: https://github.com/python/cpython/commit/3d75bd15ac82575967db367c517d7e6e703a6de3 commit: 3d75bd15ac82575967db367c517d7e6e703a6de3 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-04T19:15:48-07:00 summary: bpo-35763: Make IDLE calltip note about '/' less obtrusive (GH-13791) Add it to the end of the first line if there is room. Tests were reworked. (cherry picked from commit 949fe976d5c62ae63ed505ecf729f815d0baccfc) Co-authored-by: Terry Jan Reedy files: A Misc/NEWS.d/next/IDLE/2019-06-04-20-36-24.bpo-35763.7XdoWz.rst M Lib/idlelib/calltip.py M Lib/idlelib/idle_test/test_calltip.py diff --git a/Lib/idlelib/calltip.py b/Lib/idlelib/calltip.py index b013a7f6ec0f..a3dda2678bd4 100644 --- a/Lib/idlelib/calltip.py +++ b/Lib/idlelib/calltip.py @@ -118,7 +118,7 @@ def get_entity(expression): _first_param = re.compile(r'(?<=\()\w*\,?\s*') _default_callable_argspec = "See source or doc" _invalid_method = "invalid method signature" -_argument_positional = "\n['/' marks preceding arguments as positional-only]\n" +_argument_positional = " # '/' marks preceding args as positional-only." def get_argspec(ob): '''Return a string describing the signature of a callable object, or ''. @@ -144,11 +144,11 @@ def get_argspec(ob): if msg.startswith(_invalid_method): return _invalid_method - if '/' in argspec: - """Using AC's positional argument should add the explain""" + if '/' in argspec and len(argspec) < _MAX_COLS - len(_argument_positional): + # Add explanation TODO remove after 3.7, before 3.9. argspec += _argument_positional if isinstance(fob, type) and argspec == '()': - """fob with no argument, use default callable argspec""" + # If fob has no argument, use default callable argspec. argspec = _default_callable_argspec lines = (textwrap.wrap(argspec, _MAX_COLS, subsequent_indent=_INDENT) diff --git a/Lib/idlelib/idle_test/test_calltip.py b/Lib/idlelib/idle_test/test_calltip.py index 833351bd7996..886959b17074 100644 --- a/Lib/idlelib/idle_test/test_calltip.py +++ b/Lib/idlelib/idle_test/test_calltip.py @@ -4,8 +4,7 @@ import unittest import textwrap import types - -default_tip = calltip._default_callable_argspec +import re # Test Class TC is used in multiple get_argspec test methods @@ -28,6 +27,7 @@ def t6(no, self): 'doc' t6.tip = "(no, self)" def __call__(self, ci): 'doc' __call__.tip = "(self, ci)" + def nd(self): pass # No doc. # attaching .tip to wrapped methods does not work @classmethod def cm(cls, a): 'doc' @@ -36,11 +36,12 @@ def sm(b): 'doc' tc = TC() -signature = calltip.get_argspec # 2.7 and 3.x use different functions +default_tip = calltip._default_callable_argspec +get_spec = calltip.get_argspec -class Get_signatureTest(unittest.TestCase): - # The signature function must return a string, even if blank. +class Get_argspecTest(unittest.TestCase): + # The get_spec function must return a string, even if blank. # Test a variety of objects to be sure that none cause it to raise # (quite aside from getting as correct an answer as possible). # The tests of builtins may break if inspect or the docstrings change, @@ -49,57 +50,59 @@ class Get_signatureTest(unittest.TestCase): def test_builtins(self): + def tiptest(obj, out): + self.assertEqual(get_spec(obj), out) + # Python class that inherits builtin methods class List(list): "List() doc" # Simulate builtin with no docstring for default tip test class SB: __call__ = None - def gtest(obj, out): - self.assertEqual(signature(obj), out) - if List.__doc__ is not None: - gtest(List, '(iterable=(), /)' + calltip._argument_positional - + '\n' + List.__doc__) - gtest(list.__new__, + tiptest(List, + f'(iterable=(), /){calltip._argument_positional}' + f'\n{List.__doc__}') + tiptest(list.__new__, '(*args, **kwargs)\n' 'Create and return a new object. ' 'See help(type) for accurate signature.') - gtest(list.__init__, + tiptest(list.__init__, '(self, /, *args, **kwargs)' + calltip._argument_positional + '\n' + 'Initialize self. See help(type(self)) for accurate signature.') append_doc = (calltip._argument_positional + "\nAppend object to the end of the list.") - gtest(list.append, '(self, object, /)' + append_doc) - gtest(List.append, '(self, object, /)' + append_doc) - gtest([].append, '(object, /)' + append_doc) + tiptest(list.append, '(self, object, /)' + append_doc) + tiptest(List.append, '(self, object, /)' + append_doc) + tiptest([].append, '(object, /)' + append_doc) + + tiptest(types.MethodType, "method(function, instance)") + tiptest(SB(), default_tip) - gtest(types.MethodType, "method(function, instance)") - gtest(SB(), default_tip) - import re p = re.compile('') - gtest(re.sub, '''\ + tiptest(re.sub, '''\ (pattern, repl, string, count=0, flags=0) Return the string obtained by replacing the leftmost non-overlapping occurrences of the pattern in string by the replacement repl. repl can be either a string or a callable; if a string, backslash escapes in it are processed. If it is a callable, it's passed the Match object and must return''') - gtest(p.sub, '''\ + tiptest(p.sub, '''\ (repl, string, count=0) Return the string obtained by replacing the leftmost \ non-overlapping occurrences o...''') def test_signature_wrap(self): if textwrap.TextWrapper.__doc__ is not None: - self.assertEqual(signature(textwrap.TextWrapper), '''\ + self.assertEqual(get_spec(textwrap.TextWrapper), '''\ (width=70, initial_indent='', subsequent_indent='', expand_tabs=True, replace_whitespace=True, fix_sentence_endings=False, break_long_words=True, drop_whitespace=True, break_on_hyphens=True, tabsize=8, *, max_lines=None, placeholder=' [...]')''') def test_properly_formated(self): + def foo(s='a'*100): pass @@ -112,35 +115,35 @@ def baz(s='a'*100, z='b'*100): indent = calltip._INDENT - str_foo = "(s='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"\ - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + indent + "aaaaaaaaa"\ - "aaaaaaaaaa')" - str_bar = "(s='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"\ - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + indent + "aaaaaaaaa"\ - "aaaaaaaaaa')\nHello Guido" - str_baz = "(s='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"\ - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + indent + "aaaaaaaaa"\ - "aaaaaaaaaa', z='bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"\ - "bbbbbbbbbbbbbbbbb\n" + indent + "bbbbbbbbbbbbbbbbbbbbbb"\ - "bbbbbbbbbbbbbbbbbbbbbb')" - - self.assertEqual(calltip.get_argspec(foo), str_foo) - self.assertEqual(calltip.get_argspec(bar), str_bar) - self.assertEqual(calltip.get_argspec(baz), str_baz) + sfoo = "(s='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"\ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + indent + "aaaaaaaaa"\ + "aaaaaaaaaa')" + sbar = "(s='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"\ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + indent + "aaaaaaaaa"\ + "aaaaaaaaaa')\nHello Guido" + sbaz = "(s='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"\ + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + indent + "aaaaaaaaa"\ + "aaaaaaaaaa', z='bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"\ + "bbbbbbbbbbbbbbbbb\n" + indent + "bbbbbbbbbbbbbbbbbbbbbb"\ + "bbbbbbbbbbbbbbbbbbbbbb')" + + for func,doc in [(foo, sfoo), (bar, sbar), (baz, sbaz)]: + with self.subTest(func=func, doc=doc): + self.assertEqual(get_spec(func), doc) def test_docline_truncation(self): def f(): pass f.__doc__ = 'a'*300 - self.assertEqual(signature(f), '()\n' + 'a' * (calltip._MAX_COLS-3) + '...') + self.assertEqual(get_spec(f), f"()\n{'a'*(calltip._MAX_COLS-3) + '...'}") def test_multiline_docstring(self): # Test fewer lines than max. - self.assertEqual(signature(range), + self.assertEqual(get_spec(range), "range(stop) -> range object\n" "range(start, stop[, step]) -> range object") # Test max lines - self.assertEqual(signature(bytes), '''\ + self.assertEqual(get_spec(bytes), '''\ bytes(iterable_of_ints) -> bytes bytes(string, encoding[, errors]) -> bytes bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer @@ -150,7 +153,7 @@ def test_multiline_docstring(self): # Test more than max lines def f(): pass f.__doc__ = 'a\n' * 15 - self.assertEqual(signature(f), '()' + '\na' * calltip._MAX_LINES) + self.assertEqual(get_spec(f), '()' + '\na' * calltip._MAX_LINES) def test_functions(self): def t1(): 'doc' @@ -166,14 +169,16 @@ def t5(a, b=None, *args, **kw): 'doc' doc = '\ndoc' if t1.__doc__ is not None else '' for func in (t1, t2, t3, t4, t5, TC): - self.assertEqual(signature(func), func.tip + doc) + with self.subTest(func=func): + self.assertEqual(get_spec(func), func.tip + doc) def test_methods(self): doc = '\ndoc' if TC.__doc__ is not None else '' for meth in (TC.t1, TC.t2, TC.t3, TC.t4, TC.t5, TC.t6, TC.__call__): - self.assertEqual(signature(meth), meth.tip + doc) - self.assertEqual(signature(TC.cm), "(a)" + doc) - self.assertEqual(signature(TC.sm), "(b)" + doc) + with self.subTest(meth=meth): + self.assertEqual(get_spec(meth), meth.tip + doc) + self.assertEqual(get_spec(TC.cm), "(a)" + doc) + self.assertEqual(get_spec(TC.sm), "(b)" + doc) def test_bound_methods(self): # test that first parameter is correctly removed from argspec @@ -181,7 +186,8 @@ def test_bound_methods(self): for meth, mtip in ((tc.t1, "()"), (tc.t4, "(*args)"), (tc.t6, "(self)"), (tc.__call__, '(ci)'), (tc, '(ci)'), (TC.cm, "(a)"),): - self.assertEqual(signature(meth), mtip + doc) + with self.subTest(meth=meth, mtip=mtip): + self.assertEqual(get_spec(meth), mtip + doc) def test_starred_parameter(self): # test that starred first parameter is *not* removed from argspec @@ -189,17 +195,18 @@ class C: def m1(*args): pass c = C() for meth, mtip in ((C.m1, '(*args)'), (c.m1, "(*args)"),): - self.assertEqual(signature(meth), mtip) + with self.subTest(meth=meth, mtip=mtip): + self.assertEqual(get_spec(meth), mtip) - def test_invalid_method_signature(self): + def test_invalid_method_get_spec(self): class C: def m2(**kwargs): pass class Test: def __call__(*, a): pass mtip = calltip._invalid_method - self.assertEqual(signature(C().m2), mtip) - self.assertEqual(signature(Test()), mtip) + self.assertEqual(get_spec(C().m2), mtip) + self.assertEqual(get_spec(Test()), mtip) def test_non_ascii_name(self): # test that re works to delete a first parameter name that @@ -208,12 +215,9 @@ def test_non_ascii_name(self): assert calltip._first_param.sub('', uni) == '(a)' def test_no_docstring(self): - def nd(s): - pass - TC.nd = nd - self.assertEqual(signature(nd), "(s)") - self.assertEqual(signature(TC.nd), "(s)") - self.assertEqual(signature(tc.nd), "()") + for meth, mtip in ((TC.nd, "(self)"), (tc.nd, "()")): + with self.subTest(meth=meth, mtip=mtip): + self.assertEqual(get_spec(meth), mtip) def test_attribute_exception(self): class NoCall: @@ -229,11 +233,13 @@ def __call__(self, ci): for meth, mtip in ((NoCall, default_tip), (CallA, default_tip), (NoCall(), ''), (CallA(), '(a, b, c)'), (CallB(), '(ci)')): - self.assertEqual(signature(meth), mtip) + with self.subTest(meth=meth, mtip=mtip): + self.assertEqual(get_spec(meth), mtip) def test_non_callables(self): for obj in (0, 0.0, '0', b'0', [], {}): - self.assertEqual(signature(obj), '') + with self.subTest(obj=obj): + self.assertEqual(get_spec(obj), '') class Get_entityTest(unittest.TestCase): diff --git a/Misc/NEWS.d/next/IDLE/2019-06-04-20-36-24.bpo-35763.7XdoWz.rst b/Misc/NEWS.d/next/IDLE/2019-06-04-20-36-24.bpo-35763.7XdoWz.rst new file mode 100644 index 000000000000..c2b6594cc350 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-06-04-20-36-24.bpo-35763.7XdoWz.rst @@ -0,0 +1,2 @@ +Make calltip reminder about '/' meaning positional-only less obtrusive by +only adding it when there is room on the first line. From webhook-mailer at python.org Wed Jun 5 01:45:58 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 05 Jun 2019 05:45:58 -0000 Subject: [Python-checkins] bpo-36373: Deprecate explicit loop parameter in all public asyncio APIs [streams] (GH-13671) Message-ID: https://github.com/python/cpython/commit/6d64a8f49eb321116f585c4b036c81bb976d2d5c commit: 6d64a8f49eb321116f585c4b036c81bb976d2d5c branch: master author: Emmanuel Arias committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-06-04T22:45:53-07:00 summary: bpo-36373: Deprecate explicit loop parameter in all public asyncio APIs [streams] (GH-13671) This PR deprecate explicit loop parameters in all public asyncio APIs This issues is split to be easier to review. Second step: streams.py https://bugs.python.org/issue36373 files: M Lib/asyncio/streams.py diff --git a/Lib/asyncio/streams.py b/Lib/asyncio/streams.py index 480f1a3fdd74..f03441b6b11d 100644 --- a/Lib/asyncio/streams.py +++ b/Lib/asyncio/streams.py @@ -175,6 +175,10 @@ def connect_write_pipe(pipe, *, limit=_DEFAULT_LIMIT): stacklevel=2) if loop is None: loop = events.get_event_loop() + else: + warnings.warn("The loop argument is deprecated since Python 3.8, " + "and scheduled for removal in Python 3.10.", + DeprecationWarning, stacklevel=2) reader = StreamReader(limit=limit, loop=loop) protocol = StreamReaderProtocol(reader, loop=loop, _asyncio_internal=True) transport, _ = await loop.create_connection( @@ -213,6 +217,10 @@ def connect_write_pipe(pipe, *, limit=_DEFAULT_LIMIT): stacklevel=2) if loop is None: loop = events.get_event_loop() + else: + warnings.warn("The loop argument is deprecated since Python 3.8, " + "and scheduled for removal in Python 3.10.", + DeprecationWarning, stacklevel=2) def factory(): reader = StreamReader(limit=limit, loop=loop) @@ -414,6 +422,10 @@ def factory(): stacklevel=2) if loop is None: loop = events.get_event_loop() + else: + warnings.warn("The loop argument is deprecated since Python 3.8, " + "and scheduled for removal in Python 3.10.", + DeprecationWarning, stacklevel=2) reader = StreamReader(limit=limit, loop=loop) protocol = StreamReaderProtocol(reader, loop=loop, _asyncio_internal=True) @@ -473,6 +485,10 @@ def connect_unix(path=None, *, stacklevel=2) if loop is None: loop = events.get_event_loop() + else: + warnings.warn("The loop argument is deprecated since Python 3.8, " + "and scheduled for removal in Python 3.10.", + DeprecationWarning, stacklevel=2) def factory(): reader = StreamReader(limit=limit, loop=loop) From webhook-mailer at python.org Wed Jun 5 02:01:05 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 05 Jun 2019 06:01:05 -0000 Subject: [Python-checkins] bpo-36373: Deprecate explicit loop parameter in all public asyncio APIs [streams] (GH-13671) Message-ID: https://github.com/python/cpython/commit/8899b11b95f08e2e03478f2acad336ad5933a2d1 commit: 8899b11b95f08e2e03478f2acad336ad5933a2d1 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-04T23:01:01-07:00 summary: bpo-36373: Deprecate explicit loop parameter in all public asyncio APIs [streams] (GH-13671) This PR deprecate explicit loop parameters in all public asyncio APIs This issues is split to be easier to review. Second step: streams.py https://bugs.python.org/issue36373 (cherry picked from commit 6d64a8f49eb321116f585c4b036c81bb976d2d5c) Co-authored-by: Emmanuel Arias files: M Lib/asyncio/streams.py diff --git a/Lib/asyncio/streams.py b/Lib/asyncio/streams.py index 480f1a3fdd74..f03441b6b11d 100644 --- a/Lib/asyncio/streams.py +++ b/Lib/asyncio/streams.py @@ -175,6 +175,10 @@ def connect_write_pipe(pipe, *, limit=_DEFAULT_LIMIT): stacklevel=2) if loop is None: loop = events.get_event_loop() + else: + warnings.warn("The loop argument is deprecated since Python 3.8, " + "and scheduled for removal in Python 3.10.", + DeprecationWarning, stacklevel=2) reader = StreamReader(limit=limit, loop=loop) protocol = StreamReaderProtocol(reader, loop=loop, _asyncio_internal=True) transport, _ = await loop.create_connection( @@ -213,6 +217,10 @@ def connect_write_pipe(pipe, *, limit=_DEFAULT_LIMIT): stacklevel=2) if loop is None: loop = events.get_event_loop() + else: + warnings.warn("The loop argument is deprecated since Python 3.8, " + "and scheduled for removal in Python 3.10.", + DeprecationWarning, stacklevel=2) def factory(): reader = StreamReader(limit=limit, loop=loop) @@ -414,6 +422,10 @@ def factory(): stacklevel=2) if loop is None: loop = events.get_event_loop() + else: + warnings.warn("The loop argument is deprecated since Python 3.8, " + "and scheduled for removal in Python 3.10.", + DeprecationWarning, stacklevel=2) reader = StreamReader(limit=limit, loop=loop) protocol = StreamReaderProtocol(reader, loop=loop, _asyncio_internal=True) @@ -473,6 +485,10 @@ def connect_unix(path=None, *, stacklevel=2) if loop is None: loop = events.get_event_loop() + else: + warnings.warn("The loop argument is deprecated since Python 3.8, " + "and scheduled for removal in Python 3.10.", + DeprecationWarning, stacklevel=2) def factory(): reader = StreamReader(limit=limit, loop=loop) From webhook-mailer at python.org Wed Jun 5 05:08:20 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 05 Jun 2019 09:08:20 -0000 Subject: [Python-checkins] Fix documentation (GH-13721) Message-ID: https://github.com/python/cpython/commit/d4cf099dff4720a25208b5fa247dc16d86b11ac3 commit: d4cf099dff4720a25208b5fa247dc16d86b11ac3 branch: master author: Benjamin Yeh committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-06-05T02:08:04-07:00 summary: Fix documentation (GH-13721) Based on the source code https://github.com/python/cpython/blob/4a686504eb2bbf69adf78077458508a7ba131667/Lib/multiprocessing/pool.py#L755 AsyncResult.successful() raises a ValueError, not an AssertionError. files: M Doc/library/multiprocessing.rst diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index a4771d3a84cd..6c07124f9790 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -2279,6 +2279,10 @@ with the :class:`Pool` class. Return whether the call completed without raising an exception. Will raise :exc:`AssertionError` if the result is not ready. + .. versionchanged:: 3.7 + If the result is not ready, :exc:`ValueError` is raised instead of + :exc:`AssertionError`. + The following example demonstrates the use of a pool:: from multiprocessing import Pool From webhook-mailer at python.org Wed Jun 5 05:14:32 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 05 Jun 2019 09:14:32 -0000 Subject: [Python-checkins] Fix documentation (GH-13721) Message-ID: https://github.com/python/cpython/commit/f2054d956529606a08adfd6de133103276c49f7e commit: f2054d956529606a08adfd6de133103276c49f7e branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-05T02:14:25-07:00 summary: Fix documentation (GH-13721) Based on the source code https://github.com/python/cpython/blob/4a686504eb2bbf69adf78077458508a7ba131667/Lib/multiprocessing/pool.pyGH-L755 AsyncResult.successful() raises a ValueError, not an AssertionError. (cherry picked from commit d4cf099dff4720a25208b5fa247dc16d86b11ac3) Co-authored-by: Benjamin Yeh files: M Doc/library/multiprocessing.rst diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index a4771d3a84cd..6c07124f9790 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -2279,6 +2279,10 @@ with the :class:`Pool` class. Return whether the call completed without raising an exception. Will raise :exc:`AssertionError` if the result is not ready. + .. versionchanged:: 3.7 + If the result is not ready, :exc:`ValueError` is raised instead of + :exc:`AssertionError`. + The following example demonstrates the use of a pool:: from multiprocessing import Pool From webhook-mailer at python.org Wed Jun 5 05:33:30 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 05 Jun 2019 09:33:30 -0000 Subject: [Python-checkins] bpo-34767: Do not always create a collections.deque() in asyncio.Lock() (GH-13834) Message-ID: https://github.com/python/cpython/commit/9aa78566fbeeb8cdaa669ad22f92cf63765f4135 commit: 9aa78566fbeeb8cdaa669ad22f92cf63765f4135 branch: master author: Zackery Spytz committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-06-05T02:33:26-07:00 summary: bpo-34767: Do not always create a collections.deque() in asyncio.Lock() (GH-13834) https://bugs.python.org/issue34767 files: A Misc/NEWS.d/next/Library/2019-06-04-23-44-52.bpo-34767.BpDShN.rst M Lib/asyncio/locks.py diff --git a/Lib/asyncio/locks.py b/Lib/asyncio/locks.py index d59eb8f210c7..1324eefb5ff4 100644 --- a/Lib/asyncio/locks.py +++ b/Lib/asyncio/locks.py @@ -158,7 +158,7 @@ class Lock(_ContextManagerMixin): """ def __init__(self, *, loop=None): - self._waiters = collections.deque() + self._waiters = None self._locked = False if loop is not None: self._loop = loop @@ -182,10 +182,13 @@ def locked(self): This method blocks until the lock is unlocked, then sets it to locked and returns True. """ - if not self._locked and all(w.cancelled() for w in self._waiters): + if (not self._locked and (self._waiters is None or + all(w.cancelled() for w in self._waiters))): self._locked = True return True + if self._waiters is None: + self._waiters = collections.deque() fut = self._loop.create_future() self._waiters.append(fut) @@ -224,6 +227,8 @@ def release(self): def _wake_up_first(self): """Wake up the first waiter if it isn't done.""" + if not self._waiters: + return try: fut = next(iter(self._waiters)) except StopIteration: diff --git a/Misc/NEWS.d/next/Library/2019-06-04-23-44-52.bpo-34767.BpDShN.rst b/Misc/NEWS.d/next/Library/2019-06-04-23-44-52.bpo-34767.BpDShN.rst new file mode 100644 index 000000000000..b46bc44506f4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-04-23-44-52.bpo-34767.BpDShN.rst @@ -0,0 +1 @@ +Do not always create a :class:`collections.deque` in :class:`asyncio.Lock`. From webhook-mailer at python.org Wed Jun 5 06:17:51 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 05 Jun 2019 10:17:51 -0000 Subject: [Python-checkins] bpo-34767: Do not always create a collections.deque() in asyncio.Lock() (GH-13834) Message-ID: https://github.com/python/cpython/commit/87a865ec15fa899a1f12be81f41a4c5e649a2833 commit: 87a865ec15fa899a1f12be81f41a4c5e649a2833 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-05T03:17:42-07:00 summary: bpo-34767: Do not always create a collections.deque() in asyncio.Lock() (GH-13834) https://bugs.python.org/issue34767 (cherry picked from commit 9aa78566fbeeb8cdaa669ad22f92cf63765f4135) Co-authored-by: Zackery Spytz files: A Misc/NEWS.d/next/Library/2019-06-04-23-44-52.bpo-34767.BpDShN.rst M Lib/asyncio/locks.py diff --git a/Lib/asyncio/locks.py b/Lib/asyncio/locks.py index d59eb8f210c7..1324eefb5ff4 100644 --- a/Lib/asyncio/locks.py +++ b/Lib/asyncio/locks.py @@ -158,7 +158,7 @@ class Lock(_ContextManagerMixin): """ def __init__(self, *, loop=None): - self._waiters = collections.deque() + self._waiters = None self._locked = False if loop is not None: self._loop = loop @@ -182,10 +182,13 @@ def locked(self): This method blocks until the lock is unlocked, then sets it to locked and returns True. """ - if not self._locked and all(w.cancelled() for w in self._waiters): + if (not self._locked and (self._waiters is None or + all(w.cancelled() for w in self._waiters))): self._locked = True return True + if self._waiters is None: + self._waiters = collections.deque() fut = self._loop.create_future() self._waiters.append(fut) @@ -224,6 +227,8 @@ def release(self): def _wake_up_first(self): """Wake up the first waiter if it isn't done.""" + if not self._waiters: + return try: fut = next(iter(self._waiters)) except StopIteration: diff --git a/Misc/NEWS.d/next/Library/2019-06-04-23-44-52.bpo-34767.BpDShN.rst b/Misc/NEWS.d/next/Library/2019-06-04-23-44-52.bpo-34767.BpDShN.rst new file mode 100644 index 000000000000..b46bc44506f4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-04-23-44-52.bpo-34767.BpDShN.rst @@ -0,0 +1 @@ +Do not always create a :class:`collections.deque` in :class:`asyncio.Lock`. From webhook-mailer at python.org Wed Jun 5 06:23:42 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 05 Jun 2019 10:23:42 -0000 Subject: [Python-checkins] bpo-30835: email: Fix AttributeError when parsing invalid CTE (GH-13598) Message-ID: https://github.com/python/cpython/commit/f62a372928fbf6a2ba722f12f069b75ca6ad16fb commit: f62a372928fbf6a2ba722f12f069b75ca6ad16fb branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-05T03:23:37-07:00 summary: bpo-30835: email: Fix AttributeError when parsing invalid CTE (GH-13598) * bpo-30835: email: Fix AttributeError when parsing invalid Content-Transfer-Encoding Parsing an email containing a multipart Content-Type, along with a Content-Transfer-Encoding containing an invalid (non-ASCII-decodable) byte will fail. email.feedparser.FeedParser._parsegen() gets the header and attempts to convert it to lowercase before comparing it with the accepted encodings, but as the header contains an invalid byte, it's returned as a Header object rather than a str. Cast the Content-Transfer-Encoding header to a str to avoid this. Found using the AFL fuzzer. Reported-by: Daniel Axtens Signed-off-by: Andrew Donnellan * Add email and NEWS entry for the bugfix. (cherry picked from commit aa79707262f893428665ef45b5e879129abca4aa) Co-authored-by: Abhilash Raj files: A Misc/NEWS.d/next/Library/2019-05-27-15-29-46.bpo-30835.3FoaWH.rst M Lib/email/feedparser.py M Lib/test/test_email/test_email.py diff --git a/Lib/email/feedparser.py b/Lib/email/feedparser.py index 7c07ca86457a..97d3f5144d60 100644 --- a/Lib/email/feedparser.py +++ b/Lib/email/feedparser.py @@ -320,7 +320,7 @@ def _parsegen(self): self._cur.set_payload(EMPTYSTRING.join(lines)) return # Make sure a valid content type was specified per RFC 2045:6.4. - if (self._cur.get('content-transfer-encoding', '8bit').lower() + if (str(self._cur.get('content-transfer-encoding', '8bit')).lower() not in ('7bit', '8bit', 'binary')): defect = errors.InvalidMultipartContentTransferEncodingDefect() self.policy.handle_defect(self._cur, defect) diff --git a/Lib/test/test_email/test_email.py b/Lib/test/test_email/test_email.py index dfb3be84384a..c29cc56203b1 100644 --- a/Lib/test/test_email/test_email.py +++ b/Lib/test/test_email/test_email.py @@ -1466,6 +1466,15 @@ def test_mangled_from_with_bad_bytes(self): g.flatten(msg) self.assertEqual(b.getvalue(), source + b'>From R\xc3\xb6lli\n') + def test_mutltipart_with_bad_bytes_in_cte(self): + # bpo30835 + source = textwrap.dedent("""\ + From: aperson at example.com + Content-Type: multipart/mixed; boundary="1" + Content-Transfer-Encoding: \xc8 + """).encode('utf-8') + msg = email.message_from_bytes(source) + # Test the basic MIMEAudio class class TestMIMEAudio(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Library/2019-05-27-15-29-46.bpo-30835.3FoaWH.rst b/Misc/NEWS.d/next/Library/2019-05-27-15-29-46.bpo-30835.3FoaWH.rst new file mode 100644 index 000000000000..019321d6f1d7 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-27-15-29-46.bpo-30835.3FoaWH.rst @@ -0,0 +1,3 @@ +Fixed a bug in email parsing where a message with invalid bytes in +content-transfer-encoding of a multipart message can cause an AttributeError. +Patch by Andrew Donnellan. From webhook-mailer at python.org Wed Jun 5 06:24:56 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 05 Jun 2019 10:24:56 -0000 Subject: [Python-checkins] bpo-26836: Document os.memfd_create() name parameter (GH-13838) Message-ID: https://github.com/python/cpython/commit/ccf0efbb21f6bbf6efd5f8cb560fed11079ce1a2 commit: ccf0efbb21f6bbf6efd5f8cb560fed11079ce1a2 branch: master author: Victor Stinner committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-06-05T03:24:52-07:00 summary: bpo-26836: Document os.memfd_create() name parameter (GH-13838) https://bugs.python.org/issue26836 files: M Doc/library/os.rst diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 107764ba4d53..f0df35e9ddd5 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -3011,6 +3011,13 @@ features: (or a bitwise ORed combination of them). By default, the new file descriptor is :ref:`non-inheritable `. + The name supplied in *name* is used as a filename and will be displayed as + the target of the corresponding symbolic link in the directory + ``/proc/self/fd/``. The displayed name is always prefixed with ``memfd:`` + and serves only for debugging purposes. Names do not affect the behavior of + the file descriptor, and as such multiple files can have the same name + without any side effects. + .. availability:: Linux 3.17 or newer with glibc 2.27 or newer. .. versionadded:: 3.8 From webhook-mailer at python.org Wed Jun 5 07:16:05 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 05 Jun 2019 11:16:05 -0000 Subject: [Python-checkins] bpo-26836: Document os.memfd_create() name parameter (GH-13838) (GH-13839) Message-ID: https://github.com/python/cpython/commit/b496c2672131ea51a55b5a414aeda271562f18d3 commit: b496c2672131ea51a55b5a414aeda271562f18d3 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Victor Stinner date: 2019-06-05T13:16:00+02:00 summary: bpo-26836: Document os.memfd_create() name parameter (GH-13838) (GH-13839) https://bugs.python.org/issue26836 (cherry picked from commit ccf0efbb21f6bbf6efd5f8cb560fed11079ce1a2) Co-authored-by: Victor Stinner files: M Doc/library/os.rst diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 107764ba4d53..f0df35e9ddd5 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -3011,6 +3011,13 @@ features: (or a bitwise ORed combination of them). By default, the new file descriptor is :ref:`non-inheritable `. + The name supplied in *name* is used as a filename and will be displayed as + the target of the corresponding symbolic link in the directory + ``/proc/self/fd/``. The displayed name is always prefixed with ``memfd:`` + and serves only for debugging purposes. Names do not affect the behavior of + the file descriptor, and as such multiple files can have the same name + without any side effects. + .. availability:: Linux 3.17 or newer with glibc 2.27 or newer. .. versionadded:: 3.8 From webhook-mailer at python.org Wed Jun 5 10:40:01 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Wed, 05 Jun 2019 14:40:01 -0000 Subject: [Python-checkins] bpo-37158: Simplify and speed-up statistics.fmean() (GH-13832) Message-ID: https://github.com/python/cpython/commit/6c01ebcc0dfc6be22950fabb46bdc10dcb6202c9 commit: 6c01ebcc0dfc6be22950fabb46bdc10dcb6202c9 branch: master author: Raymond Hettinger committer: GitHub date: 2019-06-05T07:39:38-07:00 summary: bpo-37158: Simplify and speed-up statistics.fmean() (GH-13832) files: A Misc/NEWS.d/next/Library/2019-06-04-22-25-38.bpo-37158.JKm15S.rst M Lib/statistics.py diff --git a/Lib/statistics.py b/Lib/statistics.py index 012845b8d2ef..5be70e5ebf4e 100644 --- a/Lib/statistics.py +++ b/Lib/statistics.py @@ -320,11 +320,11 @@ def fmean(data): except TypeError: # Handle iterators that do not define __len__(). n = 0 - def count(x): + def count(iterable): nonlocal n - n += 1 - return x - total = fsum(map(count, data)) + for n, x in enumerate(iterable, start=1): + yield x + total = fsum(count(data)) else: total = fsum(data) try: diff --git a/Misc/NEWS.d/next/Library/2019-06-04-22-25-38.bpo-37158.JKm15S.rst b/Misc/NEWS.d/next/Library/2019-06-04-22-25-38.bpo-37158.JKm15S.rst new file mode 100644 index 000000000000..4a5ec4122f94 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-04-22-25-38.bpo-37158.JKm15S.rst @@ -0,0 +1 @@ +Speed-up statistics.fmean() by switching from a function to a generator. From webhook-mailer at python.org Wed Jun 5 11:18:27 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Wed, 05 Jun 2019 15:18:27 -0000 Subject: [Python-checkins] bpo-37158: Simplify and speed-up statistics.fmean() (GH-13832) (GH-13843) Message-ID: https://github.com/python/cpython/commit/9ddb77741e041966d64739353393bcba33cc3bdd commit: 9ddb77741e041966d64739353393bcba33cc3bdd branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Raymond Hettinger date: 2019-06-05T08:18:13-07:00 summary: bpo-37158: Simplify and speed-up statistics.fmean() (GH-13832) (GH-13843) (cherry picked from commit 6c01ebcc0dfc6be22950fabb46bdc10dcb6202c9) Co-authored-by: Raymond Hettinger files: A Misc/NEWS.d/next/Library/2019-06-04-22-25-38.bpo-37158.JKm15S.rst M Lib/statistics.py diff --git a/Lib/statistics.py b/Lib/statistics.py index 012845b8d2ef..5be70e5ebf4e 100644 --- a/Lib/statistics.py +++ b/Lib/statistics.py @@ -320,11 +320,11 @@ def fmean(data): except TypeError: # Handle iterators that do not define __len__(). n = 0 - def count(x): + def count(iterable): nonlocal n - n += 1 - return x - total = fsum(map(count, data)) + for n, x in enumerate(iterable, start=1): + yield x + total = fsum(count(data)) else: total = fsum(data) try: diff --git a/Misc/NEWS.d/next/Library/2019-06-04-22-25-38.bpo-37158.JKm15S.rst b/Misc/NEWS.d/next/Library/2019-06-04-22-25-38.bpo-37158.JKm15S.rst new file mode 100644 index 000000000000..4a5ec4122f94 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-04-22-25-38.bpo-37158.JKm15S.rst @@ -0,0 +1 @@ +Speed-up statistics.fmean() by switching from a function to a generator. From webhook-mailer at python.org Wed Jun 5 11:22:39 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Wed, 05 Jun 2019 15:22:39 -0000 Subject: [Python-checkins] [3.9] bpo-37116: Use PEP 570 syntax for positional-only parameters. (GH-12620) Message-ID: https://github.com/python/cpython/commit/142566c028720934325f0b7fe28680afd046e00f commit: 142566c028720934325f0b7fe28680afd046e00f branch: master author: Serhiy Storchaka committer: GitHub date: 2019-06-05T18:22:31+03:00 summary: [3.9] bpo-37116: Use PEP 570 syntax for positional-only parameters. (GH-12620) Turn deprecation warnings added in 3.8 into TypeError. files: M Doc/library/bdb.rst M Doc/library/concurrent.futures.rst M Doc/library/contextlib.rst M Doc/library/curses.rst M Doc/library/profile.rst M Doc/library/trace.rst M Doc/library/unittest.rst M Doc/library/weakref.rst M Lib/bdb.py M Lib/cProfile.py M Lib/collections/__init__.py M Lib/concurrent/futures/_base.py M Lib/concurrent/futures/process.py M Lib/concurrent/futures/thread.py M Lib/contextlib.py M Lib/curses/__init__.py M Lib/functools.py M Lib/multiprocessing/managers.py M Lib/profile.py M Lib/test/test_concurrent_futures.py M Lib/test/test_contextlib.py M Lib/test/test_contextlib_async.py M Lib/test/test_functools.py M Lib/test/test_trace.py M Lib/test/test_userdict.py M Lib/test/test_weakref.py M Lib/trace.py M Lib/unittest/case.py M Lib/unittest/test/test_runner.py M Lib/weakref.py diff --git a/Doc/library/bdb.rst b/Doc/library/bdb.rst index 116ffcf88e3b..7e4066cd436a 100644 --- a/Doc/library/bdb.rst +++ b/Doc/library/bdb.rst @@ -343,7 +343,7 @@ The :mod:`bdb` module also defines two classes: For backwards compatibility. Calls the :meth:`run` method. - .. method:: runcall(func, *args, **kwds) + .. method:: runcall(func, /, *args, **kwds) Debug a single function call, and return its result. diff --git a/Doc/library/concurrent.futures.rst b/Doc/library/concurrent.futures.rst index f2491dd24571..34905c449d7f 100644 --- a/Doc/library/concurrent.futures.rst +++ b/Doc/library/concurrent.futures.rst @@ -28,7 +28,7 @@ Executor Objects An abstract class that provides methods to execute calls asynchronously. It should not be used directly, but through its concrete subclasses. - .. method:: submit(fn, *args, **kwargs) + .. method:: submit(fn, /, *args, **kwargs) Schedules the callable, *fn*, to be executed as ``fn(*args **kwargs)`` and returns a :class:`Future` object representing the execution of the diff --git a/Doc/library/contextlib.rst b/Doc/library/contextlib.rst index 73b24e5f251a..0aa4ad765234 100644 --- a/Doc/library/contextlib.rst +++ b/Doc/library/contextlib.rst @@ -416,7 +416,7 @@ Functions and classes provided: The passed in object is returned from the function, allowing this method to be used as a function decorator. - .. method:: callback(callback, *args, **kwds) + .. method:: callback(callback, /, *args, **kwds) Accepts an arbitrary callback function and arguments and adds it to the callback stack. @@ -473,7 +473,7 @@ Functions and classes provided: Similar to :meth:`push` but expects either an asynchronous context manager or a coroutine function. - .. method:: push_async_callback(callback, *args, **kwds) + .. method:: push_async_callback(callback, /, *args, **kwds) Similar to :meth:`callback` but expects a coroutine function. diff --git a/Doc/library/curses.rst b/Doc/library/curses.rst index 7d1e7538a292..c88d3520e988 100644 --- a/Doc/library/curses.rst +++ b/Doc/library/curses.rst @@ -656,7 +656,7 @@ The module :mod:`curses` defines the following functions: foreground color on the default background. -.. function:: wrapper(func, ...) +.. function:: wrapper(func, /, *args, **kwargs) Initialize curses and call another callable object, *func*, which should be the rest of your curses-using application. If the application raises an exception, diff --git a/Doc/library/profile.rst b/Doc/library/profile.rst index d8039fd28e0d..8d589d247b77 100644 --- a/Doc/library/profile.rst +++ b/Doc/library/profile.rst @@ -309,7 +309,7 @@ functions: Profile the cmd via :func:`exec` with the specified global and local environment. - .. method:: runcall(func, *args, **kwargs) + .. method:: runcall(func, /, *args, **kwargs) Profile ``func(*args, **kwargs)`` diff --git a/Doc/library/trace.rst b/Doc/library/trace.rst index 85fec6830006..c2732d900bc1 100644 --- a/Doc/library/trace.rst +++ b/Doc/library/trace.rst @@ -166,7 +166,7 @@ Programmatic Interface environments. If not defined, *globals* and *locals* default to empty dictionaries. - .. method:: runfunc(func, *args, **kwds) + .. method:: runfunc(func, /, *args, **kwds) Call *func* with the given arguments under control of the :class:`Trace` object with the current tracing parameters. diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst index 5ec4b40856ae..320d898fc8d4 100644 --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -1427,7 +1427,7 @@ Test cases :class:`TextTestResult` in Python 3.2. - .. method:: addCleanup(function, *args, **kwargs) + .. method:: addCleanup(function, /, *args, **kwargs) Add a function to be called after :meth:`tearDown` to cleanup resources used during the test. Functions will be called in reverse order to the diff --git a/Doc/library/weakref.rst b/Doc/library/weakref.rst index a28d71060f38..a5c4295ef1fa 100644 --- a/Doc/library/weakref.rst +++ b/Doc/library/weakref.rst @@ -240,7 +240,7 @@ objects. .. versionadded:: 3.4 -.. class:: finalize(obj, func, *args, **kwargs) +.. class:: finalize(obj, func, /, *args, **kwargs) Return a callable finalizer object which will be called when *obj* is garbage collected. Unlike an ordinary weak reference, a finalizer diff --git a/Lib/bdb.py b/Lib/bdb.py index 96e7d18d718d..fd34976a4d0b 100644 --- a/Lib/bdb.py +++ b/Lib/bdb.py @@ -618,26 +618,11 @@ def runctx(self, cmd, globals, locals): # This method is more useful to debug a single function call. - def runcall(*args, **kwds): + def runcall(self, func, /, *args, **kwds): """Debug a single function call. Return the result of the function call. """ - if len(args) >= 2: - self, func, *args = args - elif not args: - raise TypeError("descriptor 'runcall' of 'Bdb' object " - "needs an argument") - elif 'func' in kwds: - func = kwds.pop('func') - self, *args = args - import warnings - warnings.warn("Passing 'func' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError('runcall expected at least 1 positional argument, ' - 'got %d' % (len(args)-1)) - self.reset() sys.settrace(self.trace_dispatch) res = None @@ -649,7 +634,6 @@ def runcall(*args, **kwds): self.quitting = True sys.settrace(None) return res - runcall.__text_signature__ = '($self, func, /, *args, **kwds)' def set_trace(): diff --git a/Lib/cProfile.py b/Lib/cProfile.py index 369d02e22e24..4f202038d612 100755 --- a/Lib/cProfile.py +++ b/Lib/cProfile.py @@ -103,28 +103,12 @@ def runctx(self, cmd, globals, locals): return self # This method is more useful to profile a single function call. - def runcall(*args, **kw): - if len(args) >= 2: - self, func, *args = args - elif not args: - raise TypeError("descriptor 'runcall' of 'Profile' object " - "needs an argument") - elif 'func' in kw: - func = kw.pop('func') - self, *args = args - import warnings - warnings.warn("Passing 'func' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError('runcall expected at least 1 positional argument, ' - 'got %d' % (len(args)-1)) - + def runcall(self, func, /, *args, **kw): self.enable() try: return func(*args, **kw) finally: self.disable() - runcall.__text_signature__ = '($self, func, /, *args, **kw)' def __enter__(self): self.enable() diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py index e9999e27d5f5..2264efe94a7d 100644 --- a/Lib/collections/__init__.py +++ b/Lib/collections/__init__.py @@ -971,28 +971,12 @@ def clear(self): class UserDict(_collections_abc.MutableMapping): # Start by filling-out the abstract methods - def __init__(*args, **kwargs): - if not args: - raise TypeError("descriptor '__init__' of 'UserDict' object " - "needs an argument") - self, *args = args - if len(args) > 1: - raise TypeError('expected at most 1 arguments, got %d' % len(args)) - if args: - dict = args[0] - elif 'dict' in kwargs: - dict = kwargs.pop('dict') - import warnings - warnings.warn("Passing 'dict' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - dict = None + def __init__(self, dict=None, /, **kwargs): self.data = {} if dict is not None: self.update(dict) if kwargs: self.update(kwargs) - __init__.__text_signature__ = '($self, dict=None, /, **kwargs)' def __len__(self): return len(self.data) def __getitem__(self, key): diff --git a/Lib/concurrent/futures/_base.py b/Lib/concurrent/futures/_base.py index 6001e3bdb81b..fd0acec55d04 100644 --- a/Lib/concurrent/futures/_base.py +++ b/Lib/concurrent/futures/_base.py @@ -547,7 +547,7 @@ def set_exception(self, exception): class Executor(object): """This is an abstract base class for concrete asynchronous executors.""" - def submit(*args, **kwargs): + def submit(self, fn, /, *args, **kwargs): """Submits a callable to be executed with the given arguments. Schedules the callable to be executed as fn(*args, **kwargs) and returns @@ -556,21 +556,7 @@ def submit(*args, **kwargs): Returns: A Future representing the given call. """ - if len(args) >= 2: - pass - elif not args: - raise TypeError("descriptor 'submit' of 'Executor' object " - "needs an argument") - elif 'fn' in kwargs: - import warnings - warnings.warn("Passing 'fn' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError('submit expected at least 1 positional argument, ' - 'got %d' % (len(args)-1)) - raise NotImplementedError() - submit.__text_signature__ = '($self, fn, /, *args, **kwargs)' def map(self, fn, *iterables, timeout=None, chunksize=1): """Returns an iterator equivalent to map(fn, iter). diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py index dd14eaec907d..cfdcd3ed7ea9 100644 --- a/Lib/concurrent/futures/process.py +++ b/Lib/concurrent/futures/process.py @@ -608,22 +608,7 @@ def _adjust_process_count(self): p.start() self._processes[p.pid] = p - def submit(*args, **kwargs): - if len(args) >= 2: - self, fn, *args = args - elif not args: - raise TypeError("descriptor 'submit' of 'ProcessPoolExecutor' object " - "needs an argument") - elif 'fn' in kwargs: - fn = kwargs.pop('fn') - self, *args = args - import warnings - warnings.warn("Passing 'fn' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError('submit expected at least 1 positional argument, ' - 'got %d' % (len(args)-1)) - + def submit(self, fn, /, *args, **kwargs): with self._shutdown_lock: if self._broken: raise BrokenProcessPool(self._broken) @@ -644,7 +629,6 @@ def submit(*args, **kwargs): self._start_queue_management_thread() return f - submit.__text_signature__ = _base.Executor.submit.__text_signature__ submit.__doc__ = _base.Executor.submit.__doc__ def map(self, fn, *iterables, timeout=None, chunksize=1): diff --git a/Lib/concurrent/futures/thread.py b/Lib/concurrent/futures/thread.py index 2426e94de91f..75d05a76be3f 100644 --- a/Lib/concurrent/futures/thread.py +++ b/Lib/concurrent/futures/thread.py @@ -155,22 +155,7 @@ def __init__(self, max_workers=None, thread_name_prefix='', self._initializer = initializer self._initargs = initargs - def submit(*args, **kwargs): - if len(args) >= 2: - self, fn, *args = args - elif not args: - raise TypeError("descriptor 'submit' of 'ThreadPoolExecutor' object " - "needs an argument") - elif 'fn' in kwargs: - fn = kwargs.pop('fn') - self, *args = args - import warnings - warnings.warn("Passing 'fn' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError('submit expected at least 1 positional argument, ' - 'got %d' % (len(args)-1)) - + def submit(self, fn, /, *args, **kwargs): with self._shutdown_lock: if self._broken: raise BrokenThreadPool(self._broken) @@ -187,7 +172,6 @@ def submit(*args, **kwargs): self._work_queue.put(w) self._adjust_thread_count() return f - submit.__text_signature__ = _base.Executor.submit.__text_signature__ submit.__doc__ = _base.Executor.submit.__doc__ def _adjust_thread_count(self): diff --git a/Lib/contextlib.py b/Lib/contextlib.py index 94dc2bfed06c..69c272831a55 100644 --- a/Lib/contextlib.py +++ b/Lib/contextlib.py @@ -426,26 +426,11 @@ def enter_context(self, cm): self._push_cm_exit(cm, _exit) return result - def callback(*args, **kwds): + def callback(self, callback, /, *args, **kwds): """Registers an arbitrary callback and arguments. Cannot suppress exceptions. """ - if len(args) >= 2: - self, callback, *args = args - elif not args: - raise TypeError("descriptor 'callback' of '_BaseExitStack' object " - "needs an argument") - elif 'callback' in kwds: - callback = kwds.pop('callback') - self, *args = args - import warnings - warnings.warn("Passing 'callback' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError('callback expected at least 1 positional argument, ' - 'got %d' % (len(args)-1)) - _exit_wrapper = self._create_cb_wrapper(callback, *args, **kwds) # We changed the signature, so using @wraps is not appropriate, but @@ -453,7 +438,6 @@ def callback(*args, **kwds): _exit_wrapper.__wrapped__ = callback self._push_exit_callback(_exit_wrapper) return callback # Allow use as a decorator - callback.__text_signature__ = '($self, callback, /, *args, **kwds)' def _push_cm_exit(self, cm, cm_exit): """Helper to correctly register callbacks to __exit__ methods.""" @@ -587,26 +571,11 @@ def push_async_exit(self, exit): self._push_async_cm_exit(exit, exit_method) return exit # Allow use as a decorator - def push_async_callback(*args, **kwds): + def push_async_callback(self, callback, /, *args, **kwds): """Registers an arbitrary coroutine function and arguments. Cannot suppress exceptions. """ - if len(args) >= 2: - self, callback, *args = args - elif not args: - raise TypeError("descriptor 'push_async_callback' of " - "'AsyncExitStack' object needs an argument") - elif 'callback' in kwds: - callback = kwds.pop('callback') - self, *args = args - import warnings - warnings.warn("Passing 'callback' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError('push_async_callback expected at least 1 ' - 'positional argument, got %d' % (len(args)-1)) - _exit_wrapper = self._create_async_cb_wrapper(callback, *args, **kwds) # We changed the signature, so using @wraps is not appropriate, but @@ -614,7 +583,6 @@ def push_async_callback(*args, **kwds): _exit_wrapper.__wrapped__ = callback self._push_exit_callback(_exit_wrapper, False) return callback # Allow use as a decorator - push_async_callback.__text_signature__ = '($self, callback, /, *args, **kwds)' async def aclose(self): """Immediately unwind the context stack.""" diff --git a/Lib/curses/__init__.py b/Lib/curses/__init__.py index 24ff3ca93a89..69270bfcd2b2 100644 --- a/Lib/curses/__init__.py +++ b/Lib/curses/__init__.py @@ -60,7 +60,7 @@ def start_color(): # raises an exception, wrapper() will restore the terminal to a sane state so # you can read the resulting traceback. -def wrapper(*args, **kwds): +def wrapper(func, /, *args, **kwds): """Wrapper function that initializes curses and calls another function, restoring normal keyboard/screen behavior on error. The callable object 'func' is then passed the main window 'stdscr' @@ -68,17 +68,6 @@ def wrapper(*args, **kwds): wrapper(). """ - if args: - func, *args = args - elif 'func' in kwds: - func = kwds.pop('func') - import warnings - warnings.warn("Passing 'func' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError('wrapper expected at least 1 positional argument, ' - 'got %d' % len(args)) - try: # Initialize curses stdscr = initscr() @@ -110,4 +99,3 @@ def wrapper(*args, **kwds): echo() nocbreak() endwin() -wrapper.__text_signature__ = '(func, /, *args, **kwds)' diff --git a/Lib/functools.py b/Lib/functools.py index 64d120182bb0..9495fbe56eba 100644 --- a/Lib/functools.py +++ b/Lib/functools.py @@ -345,23 +345,7 @@ class partialmethod(object): callables as instance methods. """ - def __init__(*args, **keywords): - if len(args) >= 2: - self, func, *args = args - elif not args: - raise TypeError("descriptor '__init__' of partialmethod " - "needs an argument") - elif 'func' in keywords: - func = keywords.pop('func') - self, *args = args - import warnings - warnings.warn("Passing 'func' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError("type 'partialmethod' takes at least one argument, " - "got %d" % (len(args)-1)) - args = tuple(args) - + def __init__(self, func, /, *args, **keywords): if not callable(func) and not hasattr(func, "__get__"): raise TypeError("{!r} is not callable or a descriptor" .format(func)) @@ -379,7 +363,6 @@ def __init__(*args, **keywords): self.func = func self.args = args self.keywords = keywords - __init__.__text_signature__ = '($self, func, /, *args, **keywords)' def __repr__(self): args = ", ".join(map(repr, self.args)) diff --git a/Lib/multiprocessing/managers.py b/Lib/multiprocessing/managers.py index 7e1818bb0996..75b5150f821b 100644 --- a/Lib/multiprocessing/managers.py +++ b/Lib/multiprocessing/managers.py @@ -360,36 +360,10 @@ def shutdown(self, c): finally: self.stop_event.set() - def create(*args, **kwds): + def create(self, c, typeid, /, *args, **kwds): ''' Create a new shared object and return its id ''' - if len(args) >= 3: - self, c, typeid, *args = args - elif not args: - raise TypeError("descriptor 'create' of 'Server' object " - "needs an argument") - else: - if 'typeid' not in kwds: - raise TypeError('create expected at least 2 positional ' - 'arguments, got %d' % (len(args)-1)) - typeid = kwds.pop('typeid') - if len(args) >= 2: - self, c, *args = args - import warnings - warnings.warn("Passing 'typeid' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - if 'c' not in kwds: - raise TypeError('create expected at least 2 positional ' - 'arguments, got %d' % (len(args)-1)) - c = kwds.pop('c') - self, *args = args - import warnings - warnings.warn("Passing 'c' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - args = tuple(args) - with self.mutex: callable, exposed, method_to_typeid, proxytype = \ self.registry[typeid] @@ -421,7 +395,6 @@ def create(*args, **kwds): self.incref(c, ident) return ident, tuple(exposed) - create.__text_signature__ = '($self, c, typeid, /, *args, **kwds)' def get_methods(self, c, token): ''' @@ -1293,26 +1266,15 @@ def __init__(self, *args, **kwargs): _SharedMemoryTracker(f"shmm_{self.address}_{getpid()}") util.debug(f"SharedMemoryServer started by pid {getpid()}") - def create(*args, **kwargs): + def create(self, c, typeid, /, *args, **kwargs): """Create a new distributed-shared object (not backed by a shared memory block) and return its id to be used in a Proxy Object.""" # Unless set up as a shared proxy, don't make shared_memory_context # a standard part of kwargs. This makes things easier for supplying # simple functions. - if len(args) >= 3: - typeod = args[2] - elif 'typeid' in kwargs: - typeid = kwargs['typeid'] - elif not args: - raise TypeError("descriptor 'create' of 'SharedMemoryServer' " - "object needs an argument") - else: - raise TypeError('create expected at least 2 positional ' - 'arguments, got %d' % (len(args)-1)) if hasattr(self.registry[typeid][-1], "_shared_memory_proxy"): kwargs['shared_memory_context'] = self.shared_memory_context - return Server.create(*args, **kwargs) - create.__text_signature__ = '($self, c, typeid, /, *args, **kwargs)' + return Server.create(self, c, typeid, *args, **kwargs) def shutdown(self, c): "Call unlink() on all tracked shared memory, terminate the Server." diff --git a/Lib/profile.py b/Lib/profile.py index 1346297c04a5..aad458dc951f 100755 --- a/Lib/profile.py +++ b/Lib/profile.py @@ -425,29 +425,13 @@ def runctx(self, cmd, globals, locals): return self # This method is more useful to profile a single function call. - def runcall(*args, **kw): - if len(args) >= 2: - self, func, *args = args - elif not args: - raise TypeError("descriptor 'runcall' of 'Profile' object " - "needs an argument") - elif 'func' in kw: - func = kw.pop('func') - self, *args = args - import warnings - warnings.warn("Passing 'func' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError('runcall expected at least 1 positional argument, ' - 'got %d' % (len(args)-1)) - + def runcall(self, func, /, *args, **kw): self.set_cmd(repr(func)) sys.setprofile(self.dispatcher) try: return func(*args, **kw) finally: sys.setprofile(None) - runcall.__text_signature__ = '($self, func, /, *args, **kw)' #****************************************************************** diff --git a/Lib/test/test_concurrent_futures.py b/Lib/test/test_concurrent_futures.py index b27ae7194822..2497c2b57275 100644 --- a/Lib/test/test_concurrent_futures.py +++ b/Lib/test/test_concurrent_futures.py @@ -668,9 +668,8 @@ def test_submit_keyword(self): self.assertEqual(16, future.result()) future = self.executor.submit(capture, 1, self=2, fn=3) self.assertEqual(future.result(), ((1,), {'self': 2, 'fn': 3})) - with self.assertWarns(DeprecationWarning): - future = self.executor.submit(fn=capture, arg=1) - self.assertEqual(future.result(), ((), {'arg': 1})) + with self.assertRaises(TypeError): + self.executor.submit(fn=capture, arg=1) with self.assertRaises(TypeError): self.executor.submit(arg=1) diff --git a/Lib/test/test_contextlib.py b/Lib/test/test_contextlib.py index 188a29d9f9fd..024f91264729 100644 --- a/Lib/test/test_contextlib.py +++ b/Lib/test/test_contextlib.py @@ -603,9 +603,9 @@ def _exit(*args, **kwds): stack.callback(arg=1) with self.assertRaises(TypeError): self.exit_stack.callback(arg=2) - with self.assertWarns(DeprecationWarning): + with self.assertRaises(TypeError): stack.callback(callback=_exit, arg=3) - self.assertEqual(result, [((), {'arg': 3})]) + self.assertEqual(result, []) def test_push(self): exc_raised = ZeroDivisionError diff --git a/Lib/test/test_contextlib_async.py b/Lib/test/test_contextlib_async.py index 492b226a0d54..43fb7fced1bf 100644 --- a/Lib/test/test_contextlib_async.py +++ b/Lib/test/test_contextlib_async.py @@ -358,9 +358,9 @@ def setUp(self): stack.push_async_callback(arg=1) with self.assertRaises(TypeError): self.exit_stack.push_async_callback(arg=2) - with self.assertWarns(DeprecationWarning): + with self.assertRaises(TypeError): stack.push_async_callback(callback=_exit, arg=3) - self.assertEqual(result, [((), {'arg': 3})]) + self.assertEqual(result, []) @_async_test async def test_async_push(self): diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py index 8fee1c6afdd4..c300270d49e5 100644 --- a/Lib/test/test_functools.py +++ b/Lib/test/test_functools.py @@ -556,11 +556,9 @@ class B(object): with self.assertRaises(TypeError): class B: method = functools.partialmethod() - with self.assertWarns(DeprecationWarning): + with self.assertRaises(TypeError): class B: method = functools.partialmethod(func=capture, a=1) - b = B() - self.assertEqual(b.method(2, x=3), ((b, 2), {'a': 1, 'x': 3})) def test_repr(self): self.assertEqual(repr(vars(self.A)['both']), diff --git a/Lib/test/test_trace.py b/Lib/test/test_trace.py index 4bc21eae02ce..912badb409d9 100644 --- a/Lib/test/test_trace.py +++ b/Lib/test/test_trace.py @@ -276,9 +276,8 @@ def test_simple_caller(self): def test_arg_errors(self): res = self.tracer.runfunc(traced_capturer, 1, 2, self=3, func=4) self.assertEqual(res, ((1, 2), {'self': 3, 'func': 4})) - with self.assertWarns(DeprecationWarning): - res = self.tracer.runfunc(func=traced_capturer, arg=1) - self.assertEqual(res, ((), {'arg': 1})) + with self.assertRaises(TypeError): + self.tracer.runfunc(func=traced_capturer, arg=1) with self.assertRaises(TypeError): self.tracer.runfunc() diff --git a/Lib/test/test_userdict.py b/Lib/test/test_userdict.py index 662c7f641af2..483910aaa462 100644 --- a/Lib/test/test_userdict.py +++ b/Lib/test/test_userdict.py @@ -30,8 +30,8 @@ def test_all(self): self.assertEqual(collections.UserDict(one=1, two=2), d2) # item sequence constructor self.assertEqual(collections.UserDict([('one',1), ('two',2)]), d2) - with self.assertWarnsRegex(DeprecationWarning, "'dict'"): - self.assertEqual(collections.UserDict(dict=[('one',1), ('two',2)]), d2) + self.assertEqual(collections.UserDict(dict=[('one',1), ('two',2)]), + {'dict': [('one', 1), ('two', 2)]}) # both together self.assertEqual(collections.UserDict([('one',1), ('two',2)], two=3, three=5), d3) @@ -149,9 +149,8 @@ def test_init(self): [('dict', 42)]) self.assertEqual(list(collections.UserDict({}, dict=None).items()), [('dict', None)]) - with self.assertWarnsRegex(DeprecationWarning, "'dict'"): - self.assertEqual(list(collections.UserDict(dict={'a': 42}).items()), - [('a', 42)]) + self.assertEqual(list(collections.UserDict(dict={'a': 42}).items()), + [('dict', {'a': 42})]) self.assertRaises(TypeError, collections.UserDict, 42) self.assertRaises(TypeError, collections.UserDict, (), ()) self.assertRaises(TypeError, collections.UserDict.__init__) diff --git a/Lib/test/test_weakref.py b/Lib/test/test_weakref.py index 6f15c03ac529..ce5bbfccd787 100644 --- a/Lib/test/test_weakref.py +++ b/Lib/test/test_weakref.py @@ -1866,20 +1866,10 @@ def fin(*args, **kwargs): f() self.assertEqual(res, [((1, 2), {'func': 3, 'obj': 4})]) - res = [] - with self.assertWarns(DeprecationWarning): - f = weakref.finalize(a, func=fin, arg=1) - self.assertEqual(f.peek(), (a, fin, (), {'arg': 1})) - f() - self.assertEqual(res, [((), {'arg': 1})]) - - res = [] - with self.assertWarns(DeprecationWarning): - f = weakref.finalize(obj=a, func=fin, arg=1) - self.assertEqual(f.peek(), (a, fin, (), {'arg': 1})) - f() - self.assertEqual(res, [((), {'arg': 1})]) - + with self.assertRaises(TypeError): + weakref.finalize(a, func=fin, arg=1) + with self.assertRaises(TypeError): + weakref.finalize(obj=a, func=fin, arg=1) self.assertRaises(TypeError, weakref.finalize, a) self.assertRaises(TypeError, weakref.finalize) diff --git a/Lib/trace.py b/Lib/trace.py index 62325d3f238a..681c3f9d05f8 100755 --- a/Lib/trace.py +++ b/Lib/trace.py @@ -451,22 +451,7 @@ def runctx(self, cmd, globals=None, locals=None): sys.settrace(None) threading.settrace(None) - def runfunc(*args, **kw): - if len(args) >= 2: - self, func, *args = args - elif not args: - raise TypeError("descriptor 'runfunc' of 'Trace' object " - "needs an argument") - elif 'func' in kw: - func = kw.pop('func') - self, *args = args - import warnings - warnings.warn("Passing 'func' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError('runfunc expected at least 1 positional argument, ' - 'got %d' % (len(args)-1)) - + def runfunc(self, func, /, *args, **kw): result = None if not self.donothing: sys.settrace(self.globaltrace) @@ -476,7 +461,6 @@ def runfunc(*args, **kw): if not self.donothing: sys.settrace(None) return result - runfunc.__text_signature__ = '($self, func, /, *args, **kw)' def file_module_function_of(self, frame): code = frame.f_code diff --git a/Lib/unittest/case.py b/Lib/unittest/case.py index b363c6351007..8afb84513590 100644 --- a/Lib/unittest/case.py +++ b/Lib/unittest/case.py @@ -463,30 +463,13 @@ def addTypeEqualityFunc(self, typeobj, function): """ self._type_equality_funcs[typeobj] = function - def addCleanup(*args, **kwargs): + def addCleanup(self, function, /, *args, **kwargs): """Add a function, with arguments, to be called when the test is completed. Functions added are called on a LIFO basis and are called after tearDown on test failure or success. Cleanup items are called even if setUp fails (unlike tearDown).""" - if len(args) >= 2: - self, function, *args = args - elif not args: - raise TypeError("descriptor 'addCleanup' of 'TestCase' object " - "needs an argument") - elif 'function' in kwargs: - function = kwargs.pop('function') - self, *args = args - import warnings - warnings.warn("Passing 'function' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError('addCleanup expected at least 1 positional ' - 'argument, got %d' % (len(args)-1)) - args = tuple(args) - self._cleanups.append((function, args, kwargs)) - addCleanup.__text_signature__ = '($self, function, /, *args, **kwargs)' @classmethod def addClassCleanup(cls, function, /, *args, **kwargs): diff --git a/Lib/unittest/test/test_runner.py b/Lib/unittest/test/test_runner.py index 7d36340741f4..dd9a1b6d9aed 100644 --- a/Lib/unittest/test/test_runner.py +++ b/Lib/unittest/test/test_runner.py @@ -592,7 +592,7 @@ def cleanup(*args, **kwargs): class TestableTest(unittest.TestCase): def setUp(self2): self2.addCleanup(cleanup, 1, 2, function=3, self=4) - with self.assertWarns(DeprecationWarning): + with self.assertRaises(TypeError): self2.addCleanup(function=cleanup, arg='hello') def testNothing(self): pass @@ -603,8 +603,7 @@ def testNothing(self): unittest.TestCase.addCleanup(self=TestableTest(), function=cleanup) runTests(TestableTest) self.assertEqual(cleanups, - [((), {'arg': 'hello'}), - ((1, 2), {'function': 3, 'self': 4})]) + [((1, 2), {'function': 3, 'self': 4})]) def test_with_errors_in_addClassCleanup(self): ordering = [] diff --git a/Lib/weakref.py b/Lib/weakref.py index 8d71af653b7e..fa7559bb3dbf 100644 --- a/Lib/weakref.py +++ b/Lib/weakref.py @@ -514,33 +514,7 @@ class finalize: class _Info: __slots__ = ("weakref", "func", "args", "kwargs", "atexit", "index") - def __init__(*args, **kwargs): - if len(args) >= 3: - self, obj, func, *args = args - elif not args: - raise TypeError("descriptor '__init__' of 'finalize' object " - "needs an argument") - else: - if 'func' not in kwargs: - raise TypeError('finalize expected at least 2 positional ' - 'arguments, got %d' % (len(args)-1)) - func = kwargs.pop('func') - if len(args) >= 2: - self, obj, *args = args - import warnings - warnings.warn("Passing 'func' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - if 'obj' not in kwargs: - raise TypeError('finalize expected at least 2 positional ' - 'arguments, got %d' % (len(args)-1)) - obj = kwargs.pop('obj') - self, *args = args - import warnings - warnings.warn("Passing 'obj' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - args = tuple(args) - + def __init__(self, obj, func, /, *args, **kwargs): if not self._registered_with_atexit: # We may register the exit function more than once because # of a thread race, but that is harmless @@ -556,7 +530,6 @@ def __init__(*args, **kwargs): info.index = next(self._index_iter) self._registry[self] = info finalize._dirty = True - __init__.__text_signature__ = '($self, obj, func, /, *args, **kwargs)' def __call__(self, _=None): """If alive then mark as dead and return func(*args, **kwargs); From webhook-mailer at python.org Wed Jun 5 12:56:39 2019 From: webhook-mailer at python.org (Barry Warsaw) Date: Wed, 05 Jun 2019 16:56:39 -0000 Subject: [Python-checkins] bpo-21315: Fix parsing of encoded words with missing leading ws. (#13425) Message-ID: https://github.com/python/cpython/commit/66c4f3f38b867d8329b28c032bb907fd1a2f22d2 commit: 66c4f3f38b867d8329b28c032bb907fd1a2f22d2 branch: master author: Abhilash Raj committer: Barry Warsaw date: 2019-06-05T09:56:33-07:00 summary: bpo-21315: Fix parsing of encoded words with missing leading ws. (#13425) * bpo-21315: Fix parsing of encoded words with missing leading ws. Because of missing leading whitespace, encoded word would get parsed as unstructured token. This patch fixes that by looking for encoded words when splitting tokens with whitespace. Missing trailing whitespace around encoded word now register a defect instead. Original patch suggestion by David R. Murray on bpo-21315. files: A Misc/NEWS.d/next/Library/2019-05-19-10-48-46.bpo-21315.PgXVqF.rst M Lib/email/_header_value_parser.py M Lib/test/test_email/test__header_value_parser.py M Lib/test/test_email/test_headerregistry.py diff --git a/Lib/email/_header_value_parser.py b/Lib/email/_header_value_parser.py index 34969ab59151..35d746aa5082 100644 --- a/Lib/email/_header_value_parser.py +++ b/Lib/email/_header_value_parser.py @@ -96,6 +96,18 @@ def quote_string(value): return '"'+str(value).replace('\\', '\\\\').replace('"', r'\"')+'"' +# Match a RFC 2047 word, looks like =?utf-8?q?someword?= +rfc2047_matcher = re.compile(r''' + =\? # literal =? + [^?]* # charset + \? # literal ? + [qQbB] # literal 'q' or 'b', case insensitive + \? # literal ? + .*? # encoded word + \?= # literal ?= +''', re.VERBOSE | re.MULTILINE) + + # # TokenList and its subclasses # @@ -1052,6 +1064,10 @@ def get_encoded_word(value): _validate_xtext(vtext) ew.append(vtext) text = ''.join(remainder) + # Encoded words should be followed by a WS + if value and value[0] not in WSP: + ew.defects.append(errors.InvalidHeaderDefect( + "missing trailing whitespace after encoded-word")) return ew, value def get_unstructured(value): @@ -1104,6 +1120,11 @@ def get_unstructured(value): unstructured.append(token) continue tok, *remainder = _wsp_splitter(value, 1) + # Split in the middle of an atom if there is a rfc2047 encoded word + # which does not have WSP on both sides. The defect will be registered + # the next time through the loop. + if rfc2047_matcher.search(tok): + tok, *remainder = value.partition('=?') vtext = ValueTerminal(tok, 'vtext') _validate_xtext(vtext) unstructured.append(vtext) diff --git a/Lib/test/test_email/test__header_value_parser.py b/Lib/test/test_email/test__header_value_parser.py index 12da3cffb84c..649923fa6c86 100644 --- a/Lib/test/test_email/test__header_value_parser.py +++ b/Lib/test/test_email/test__header_value_parser.py @@ -118,7 +118,7 @@ def test_get_encoded_word_gets_first_even_if_no_space(self): '=?us-ascii?q?first?==?utf-8?q?second?=', 'first', 'first', - [], + [errors.InvalidHeaderDefect], '=?utf-8?q?second?=') def test_get_encoded_word_sets_extra_attributes(self): @@ -361,6 +361,25 @@ def test_get_unstructured_no_whitespace_between_ews(self): '=?utf-8?q?foo?==?utf-8?q?bar?=', 'foobar', 'foobar', + [errors.InvalidHeaderDefect, + errors.InvalidHeaderDefect], + '') + + def test_get_unstructured_ew_without_leading_whitespace(self): + self._test_get_x( + self._get_unst, + 'nowhitespace=?utf-8?q?somevalue?=', + 'nowhitespacesomevalue', + 'nowhitespacesomevalue', + [errors.InvalidHeaderDefect], + '') + + def test_get_unstructured_ew_without_trailing_whitespace(self): + self._test_get_x( + self._get_unst, + '=?utf-8?q?somevalue?=nowhitespace', + 'somevaluenowhitespace', + 'somevaluenowhitespace', [errors.InvalidHeaderDefect], '') @@ -546,7 +565,8 @@ def test_encoded_word_inside_quotes(self): '"=?utf-8?Q?not_really_valid?="', '"not really valid"', 'not really valid', - [errors.InvalidHeaderDefect], + [errors.InvalidHeaderDefect, + errors.InvalidHeaderDefect], '') # get_comment diff --git a/Lib/test/test_email/test_headerregistry.py b/Lib/test/test_email/test_headerregistry.py index 75505460aba8..5d9b3576d306 100644 --- a/Lib/test/test_email/test_headerregistry.py +++ b/Lib/test/test_email/test_headerregistry.py @@ -1180,7 +1180,8 @@ class TestAddressHeader(TestHeaderBase): 'rfc2047_atom_in_quoted_string_is_decoded': ('"=?utf-8?q?=C3=89ric?=" ', - [errors.InvalidHeaderDefect], + [errors.InvalidHeaderDefect, + errors.InvalidHeaderDefect], '?ric ', '?ric', 'foo at example.com', diff --git a/Misc/NEWS.d/next/Library/2019-05-19-10-48-46.bpo-21315.PgXVqF.rst b/Misc/NEWS.d/next/Library/2019-05-19-10-48-46.bpo-21315.PgXVqF.rst new file mode 100644 index 000000000000..dd0dd7f72c0a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-19-10-48-46.bpo-21315.PgXVqF.rst @@ -0,0 +1,4 @@ +Email headers containing RFC2047 encoded words are parsed despite the missing +whitespace, and a defect registered. Also missing trailing whitespace after +encoded words is now registered as a defect. + From webhook-mailer at python.org Wed Jun 5 15:59:58 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 05 Jun 2019 19:59:58 -0000 Subject: [Python-checkins] bpo-33725, multiprocessing doc: rephase warning against fork on macOS (GH-13841) Message-ID: https://github.com/python/cpython/commit/1e77ab0a35cf95318bb4893f7253a30f73201163 commit: 1e77ab0a35cf95318bb4893f7253a30f73201163 branch: master author: Victor Stinner committer: GitHub date: 2019-06-05T21:59:33+02:00 summary: bpo-33725, multiprocessing doc: rephase warning against fork on macOS (GH-13841) Co-Authored-By: Barry Warsaw files: M Doc/library/multiprocessing.rst diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index 6c07124f9790..d8182feab963 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -126,8 +126,9 @@ to start a process. These *start methods* are .. versionchanged:: 3.8 - On macOS, *spawn* start method is now the default: *fork* start method is no - longer reliable on macOS, see :issue:`33725`. + On macOS, the *spawn* start method is now the default. The *fork* start + method should be considered unsafe as it can lead to crashes of the + subprocess. See :issue:`33725`. .. versionchanged:: 3.4 *spawn* added on all unix platforms, and *forkserver* added for From webhook-mailer at python.org Wed Jun 5 16:07:25 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 05 Jun 2019 20:07:25 -0000 Subject: [Python-checkins] bpo-33725, multiprocessing doc: rephase warning against fork on macOS (GH-13841) Message-ID: https://github.com/python/cpython/commit/d74438b633184bbd8d775d7118d6f12f6f825a96 commit: d74438b633184bbd8d775d7118d6f12f6f825a96 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-05T13:07:19-07:00 summary: bpo-33725, multiprocessing doc: rephase warning against fork on macOS (GH-13841) Co-Authored-By: Barry Warsaw (cherry picked from commit 1e77ab0a35cf95318bb4893f7253a30f73201163) Co-authored-by: Victor Stinner files: M Doc/library/multiprocessing.rst diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index 6c07124f9790..d8182feab963 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -126,8 +126,9 @@ to start a process. These *start methods* are .. versionchanged:: 3.8 - On macOS, *spawn* start method is now the default: *fork* start method is no - longer reliable on macOS, see :issue:`33725`. + On macOS, the *spawn* start method is now the default. The *fork* start + method should be considered unsafe as it can lead to crashes of the + subprocess. See :issue:`33725`. .. versionchanged:: 3.4 *spawn* added on all unix platforms, and *forkserver* added for From webhook-mailer at python.org Wed Jun 5 16:24:32 2019 From: webhook-mailer at python.org (Carol Willing) Date: Wed, 05 Jun 2019 20:24:32 -0000 Subject: [Python-checkins] bpo-37134: Add PEP570 notation to the documentation (GH-13743) Message-ID: https://github.com/python/cpython/commit/54edb04aa688c8247570b4f59b5145e3fa417576 commit: 54edb04aa688c8247570b4f59b5145e3fa417576 branch: master author: Pablo Galindo committer: Carol Willing date: 2019-06-05T13:24:28-07:00 summary: bpo-37134: Add PEP570 notation to the documentation (GH-13743) files: M Doc/library/struct.rst M Doc/library/zlib.rst diff --git a/Doc/library/struct.rst b/Doc/library/struct.rst index 1a0fd73c6758..a06d90344ba3 100644 --- a/Doc/library/struct.rst +++ b/Doc/library/struct.rst @@ -70,7 +70,7 @@ The module defines the following exception and functions: size required by the format, as reflected by :func:`calcsize`. -.. function:: unpack_from(format, buffer, offset=0) +.. function:: unpack_from(format, /, buffer, offset=0) Unpack from *buffer* starting at position *offset*, according to the format string *format*. The result is a tuple even if it contains exactly one diff --git a/Doc/library/zlib.rst b/Doc/library/zlib.rst index aa61278e099a..339acfd0e578 100644 --- a/Doc/library/zlib.rst +++ b/Doc/library/zlib.rst @@ -47,7 +47,7 @@ The available exception and functions in this module are: platforms, use ``adler32(data) & 0xffffffff``. -.. function:: compress(data, level=-1) +.. function:: compress(data, /, level=-1) Compresses the bytes in *data*, returning a bytes object containing compressed data. *level* is an integer from ``0`` to ``9`` or ``-1`` controlling the level of compression; @@ -132,7 +132,7 @@ The available exception and functions in this module are: platforms, use ``crc32(data) & 0xffffffff``. -.. function:: decompress(data, wbits=MAX_WBITS, bufsize=DEF_BUF_SIZE) +.. function:: decompress(data, /, wbits=MAX_WBITS, bufsize=DEF_BUF_SIZE) Decompresses the bytes in *data*, returning a bytes object containing the uncompressed data. The *wbits* parameter depends on From webhook-mailer at python.org Wed Jun 5 18:18:15 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Wed, 05 Jun 2019 22:18:15 -0000 Subject: [Python-checkins] bpo-35551: encodings update (GH-11446) Message-ID: https://github.com/python/cpython/commit/c4c15ed7a2c7c2a1983e88b89c244d121eb3e512 commit: c4c15ed7a2c7c2a1983e88b89c244d121eb3e512 branch: master author: Ashwin Ramaswami committer: Cheryl Sabella date: 2019-06-05T18:18:06-04:00 summary: bpo-35551: encodings update (GH-11446) files: A Misc/NEWS.d/next/Core and Builtins/2019-01-18-16-16-27.bpo-35551.oF5pbO.rst M Doc/library/codecs.rst M Lib/encodings/aliases.py diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst index 2e9314e0fab7..5048621bf0ad 100644 --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -1198,7 +1198,8 @@ particular, the following variants typically exist: +-----------------+--------------------------------+--------------------------------+ | mac_iceland | maciceland | Icelandic | +-----------------+--------------------------------+--------------------------------+ -| mac_latin2 | maclatin2, maccentraleurope | Central and Eastern Europe | +| mac_latin2 | maclatin2, maccentraleurope, | Central and Eastern Europe | +| | mac_centeuro | | +-----------------+--------------------------------+--------------------------------+ | mac_roman | macroman, macintosh | Western Europe | +-----------------+--------------------------------+--------------------------------+ diff --git a/Lib/encodings/aliases.py b/Lib/encodings/aliases.py index 5ef40a3438b9..8b621add1b1b 100644 --- a/Lib/encodings/aliases.py +++ b/Lib/encodings/aliases.py @@ -448,6 +448,7 @@ # mac_latin2 codec 'maccentraleurope' : 'mac_latin2', + 'mac_centeuro' : 'mac_latin2', 'maclatin2' : 'mac_latin2', # mac_roman codec @@ -491,9 +492,6 @@ 'sjisx0213' : 'shift_jisx0213', 's_jisx0213' : 'shift_jisx0213', - # tactis codec - 'tis260' : 'tactis', - # tis_620 codec 'tis620' : 'tis_620', 'tis_620_0' : 'tis_620', diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-01-18-16-16-27.bpo-35551.oF5pbO.rst b/Misc/NEWS.d/next/Core and Builtins/2019-01-18-16-16-27.bpo-35551.oF5pbO.rst new file mode 100644 index 000000000000..bd7946e6d947 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-01-18-16-16-27.bpo-35551.oF5pbO.rst @@ -0,0 +1,3 @@ +Updated encodings: +- Removed the "tis260" encoding, which was an alias for the nonexistent "tactis" codec. +- Added "mac_centeuro" as an alias for the mac_latin2 encoding. \ No newline at end of file From webhook-mailer at python.org Wed Jun 5 19:05:32 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Wed, 05 Jun 2019 23:05:32 -0000 Subject: [Python-checkins] bpo-37165: Convert _count_elements to the argument clinic (GH-13848) Message-ID: https://github.com/python/cpython/commit/e985804207473796a1326585b3e1b9e18c764345 commit: e985804207473796a1326585b3e1b9e18c764345 branch: master author: Raymond Hettinger committer: GitHub date: 2019-06-05T16:05:25-07:00 summary: bpo-37165: Convert _count_elements to the argument clinic (GH-13848) files: A Misc/NEWS.d/next/Library/2019-06-05-11-48-19.bpo-37165.V_rwfE.rst M Modules/_collectionsmodule.c M Modules/clinic/_collectionsmodule.c.h diff --git a/Misc/NEWS.d/next/Library/2019-06-05-11-48-19.bpo-37165.V_rwfE.rst b/Misc/NEWS.d/next/Library/2019-06-05-11-48-19.bpo-37165.V_rwfE.rst new file mode 100644 index 000000000000..5430a57ef54c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-05-11-48-19.bpo-37165.V_rwfE.rst @@ -0,0 +1 @@ +Converted _collections._count_elements to use the Argument Clinic. diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c index dacea3a02439..45169ecd11af 100644 --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -8,9 +8,10 @@ #endif /*[clinic input] +module _collections class _tuplegetter "_tuplegetterobject *" "&tuplegetter_type" [clinic start generated code]*/ -/*[clinic end generated code: output=da39a3ee5e6b4b0d input=ee5ed5baabe35068]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=a8ece4ccad7e30ac]*/ static PyTypeObject tuplegetter_type; #include "clinic/_collectionsmodule.c.h" @@ -2228,17 +2229,24 @@ static PyTypeObject defdict_type = { /* helper function for Counter *********************************************/ -PyDoc_STRVAR(_count_elements_doc, -"_count_elements(mapping, iterable) -> None\n\ -\n\ -Count elements in the iterable, updating the mapping"); +/*[clinic input] +_collections._count_elements + + mapping: object + iterable: object + / + +Count elements in the iterable, updating the mapping +[clinic start generated code]*/ static PyObject * -_count_elements(PyObject *self, PyObject *args) +_collections__count_elements_impl(PyObject *module, PyObject *mapping, + PyObject *iterable) +/*[clinic end generated code: output=7e0c1789636b3d8f input=e79fad04534a0b45]*/ { _Py_IDENTIFIER(get); _Py_IDENTIFIER(__setitem__); - PyObject *it, *iterable, *mapping, *oldval; + PyObject *it, *oldval; PyObject *newval = NULL; PyObject *key = NULL; PyObject *bound_get = NULL; @@ -2247,9 +2255,6 @@ _count_elements(PyObject *self, PyObject *args) PyObject *mapping_setitem; PyObject *dict_setitem; - if (!PyArg_UnpackTuple(args, "_count_elements", 2, 2, &mapping, &iterable)) - return NULL; - it = PyObject_GetIter(iterable); if (it == NULL) return NULL; @@ -2510,7 +2515,7 @@ PyDoc_STRVAR(module_doc, "); static struct PyMethodDef module_functions[] = { - {"_count_elements", _count_elements, METH_VARARGS, _count_elements_doc}, + _COLLECTIONS__COUNT_ELEMENTS_METHODDEF {NULL, NULL} /* sentinel */ }; diff --git a/Modules/clinic/_collectionsmodule.c.h b/Modules/clinic/_collectionsmodule.c.h index ed3b1b50f9b5..c3ba1a669857 100644 --- a/Modules/clinic/_collectionsmodule.c.h +++ b/Modules/clinic/_collectionsmodule.c.h @@ -2,6 +2,37 @@ preserve [clinic start generated code]*/ +PyDoc_STRVAR(_collections__count_elements__doc__, +"_count_elements($module, mapping, iterable, /)\n" +"--\n" +"\n" +"Count elements in the iterable, updating the mapping"); + +#define _COLLECTIONS__COUNT_ELEMENTS_METHODDEF \ + {"_count_elements", (PyCFunction)(void(*)(void))_collections__count_elements, METH_FASTCALL, _collections__count_elements__doc__}, + +static PyObject * +_collections__count_elements_impl(PyObject *module, PyObject *mapping, + PyObject *iterable); + +static PyObject * +_collections__count_elements(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + PyObject *mapping; + PyObject *iterable; + + if (!_PyArg_CheckPositional("_count_elements", nargs, 2, 2)) { + goto exit; + } + mapping = args[0]; + iterable = args[1]; + return_value = _collections__count_elements_impl(module, mapping, iterable); + +exit: + return return_value; +} + static PyObject * tuplegetter_new_impl(PyTypeObject *type, Py_ssize_t index, PyObject *doc); @@ -42,4 +73,4 @@ tuplegetter_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) exit: return return_value; } -/*[clinic end generated code: output=51bd572577ca7111 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=9d2bfcc9df5faf35 input=a9049054013a1b77]*/ From webhook-mailer at python.org Wed Jun 5 19:11:50 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Wed, 05 Jun 2019 23:11:50 -0000 Subject: [Python-checkins] bpo-37134: Use PEP570 syntax for sum() (GH-13851) Message-ID: https://github.com/python/cpython/commit/c4c421d619baf2ff2f7e09f55b7ae22b8f863c7b commit: c4c421d619baf2ff2f7e09f55b7ae22b8f863c7b branch: master author: Pablo Galindo committer: GitHub date: 2019-06-06T00:11:46+01:00 summary: bpo-37134: Use PEP570 syntax for sum() (GH-13851) files: M Doc/library/functions.rst diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 415a65b4946f..88977056723f 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -1562,11 +1562,11 @@ are always available. They are listed here in alphabetical order. about strings, see :ref:`textseq`. -.. function:: sum(iterable[, start]) +.. function:: sum(iterable, /, start=0) Sums *start* and the items of an *iterable* from left to right and returns the - total. *start* defaults to ``0``. The *iterable*'s items are normally numbers, - and the start value is not allowed to be a string. + total. The *iterable*'s items are normally numbers, and the start value is not + allowed to be a string. For some use cases, there are good alternatives to :func:`sum`. The preferred, fast way to concatenate a sequence of strings is by calling From webhook-mailer at python.org Wed Jun 5 19:21:01 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 05 Jun 2019 23:21:01 -0000 Subject: [Python-checkins] bpo-37165: Convert _count_elements to the argument clinic (GH-13848) Message-ID: https://github.com/python/cpython/commit/21ce2454de57caaa532d11d76544632608f4b86b commit: 21ce2454de57caaa532d11d76544632608f4b86b branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-05T16:20:58-07:00 summary: bpo-37165: Convert _count_elements to the argument clinic (GH-13848) (cherry picked from commit e985804207473796a1326585b3e1b9e18c764345) Co-authored-by: Raymond Hettinger files: A Misc/NEWS.d/next/Library/2019-06-05-11-48-19.bpo-37165.V_rwfE.rst M Modules/_collectionsmodule.c M Modules/clinic/_collectionsmodule.c.h diff --git a/Misc/NEWS.d/next/Library/2019-06-05-11-48-19.bpo-37165.V_rwfE.rst b/Misc/NEWS.d/next/Library/2019-06-05-11-48-19.bpo-37165.V_rwfE.rst new file mode 100644 index 000000000000..5430a57ef54c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-05-11-48-19.bpo-37165.V_rwfE.rst @@ -0,0 +1 @@ +Converted _collections._count_elements to use the Argument Clinic. diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c index dacea3a02439..45169ecd11af 100644 --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -8,9 +8,10 @@ #endif /*[clinic input] +module _collections class _tuplegetter "_tuplegetterobject *" "&tuplegetter_type" [clinic start generated code]*/ -/*[clinic end generated code: output=da39a3ee5e6b4b0d input=ee5ed5baabe35068]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=a8ece4ccad7e30ac]*/ static PyTypeObject tuplegetter_type; #include "clinic/_collectionsmodule.c.h" @@ -2228,17 +2229,24 @@ static PyTypeObject defdict_type = { /* helper function for Counter *********************************************/ -PyDoc_STRVAR(_count_elements_doc, -"_count_elements(mapping, iterable) -> None\n\ -\n\ -Count elements in the iterable, updating the mapping"); +/*[clinic input] +_collections._count_elements + + mapping: object + iterable: object + / + +Count elements in the iterable, updating the mapping +[clinic start generated code]*/ static PyObject * -_count_elements(PyObject *self, PyObject *args) +_collections__count_elements_impl(PyObject *module, PyObject *mapping, + PyObject *iterable) +/*[clinic end generated code: output=7e0c1789636b3d8f input=e79fad04534a0b45]*/ { _Py_IDENTIFIER(get); _Py_IDENTIFIER(__setitem__); - PyObject *it, *iterable, *mapping, *oldval; + PyObject *it, *oldval; PyObject *newval = NULL; PyObject *key = NULL; PyObject *bound_get = NULL; @@ -2247,9 +2255,6 @@ _count_elements(PyObject *self, PyObject *args) PyObject *mapping_setitem; PyObject *dict_setitem; - if (!PyArg_UnpackTuple(args, "_count_elements", 2, 2, &mapping, &iterable)) - return NULL; - it = PyObject_GetIter(iterable); if (it == NULL) return NULL; @@ -2510,7 +2515,7 @@ PyDoc_STRVAR(module_doc, "); static struct PyMethodDef module_functions[] = { - {"_count_elements", _count_elements, METH_VARARGS, _count_elements_doc}, + _COLLECTIONS__COUNT_ELEMENTS_METHODDEF {NULL, NULL} /* sentinel */ }; diff --git a/Modules/clinic/_collectionsmodule.c.h b/Modules/clinic/_collectionsmodule.c.h index ed3b1b50f9b5..c3ba1a669857 100644 --- a/Modules/clinic/_collectionsmodule.c.h +++ b/Modules/clinic/_collectionsmodule.c.h @@ -2,6 +2,37 @@ preserve [clinic start generated code]*/ +PyDoc_STRVAR(_collections__count_elements__doc__, +"_count_elements($module, mapping, iterable, /)\n" +"--\n" +"\n" +"Count elements in the iterable, updating the mapping"); + +#define _COLLECTIONS__COUNT_ELEMENTS_METHODDEF \ + {"_count_elements", (PyCFunction)(void(*)(void))_collections__count_elements, METH_FASTCALL, _collections__count_elements__doc__}, + +static PyObject * +_collections__count_elements_impl(PyObject *module, PyObject *mapping, + PyObject *iterable); + +static PyObject * +_collections__count_elements(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + PyObject *mapping; + PyObject *iterable; + + if (!_PyArg_CheckPositional("_count_elements", nargs, 2, 2)) { + goto exit; + } + mapping = args[0]; + iterable = args[1]; + return_value = _collections__count_elements_impl(module, mapping, iterable); + +exit: + return return_value; +} + static PyObject * tuplegetter_new_impl(PyTypeObject *type, Py_ssize_t index, PyObject *doc); @@ -42,4 +73,4 @@ tuplegetter_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) exit: return return_value; } -/*[clinic end generated code: output=51bd572577ca7111 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=9d2bfcc9df5faf35 input=a9049054013a1b77]*/ From webhook-mailer at python.org Wed Jun 5 19:21:12 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 05 Jun 2019 23:21:12 -0000 Subject: [Python-checkins] bpo-37134: Use PEP570 syntax for sum() (GH-13851) Message-ID: https://github.com/python/cpython/commit/23f41a64ea668296fa89e25f3cfa11f63026ecac commit: 23f41a64ea668296fa89e25f3cfa11f63026ecac branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-05T16:21:08-07:00 summary: bpo-37134: Use PEP570 syntax for sum() (GH-13851) (cherry picked from commit c4c421d619baf2ff2f7e09f55b7ae22b8f863c7b) Co-authored-by: Pablo Galindo files: M Doc/library/functions.rst diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 415a65b4946f..88977056723f 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -1562,11 +1562,11 @@ are always available. They are listed here in alphabetical order. about strings, see :ref:`textseq`. -.. function:: sum(iterable[, start]) +.. function:: sum(iterable, /, start=0) Sums *start* and the items of an *iterable* from left to right and returns the - total. *start* defaults to ``0``. The *iterable*'s items are normally numbers, - and the start value is not allowed to be a string. + total. The *iterable*'s items are normally numbers, and the start value is not + allowed to be a string. For some use cases, there are good alternatives to :func:`sum`. The preferred, fast way to concatenate a sequence of strings is by calling From webhook-mailer at python.org Wed Jun 5 22:40:26 2019 From: webhook-mailer at python.org (Barry Warsaw) Date: Thu, 06 Jun 2019 02:40:26 -0000 Subject: [Python-checkins] Add importlib.metadata to what's new. (#13855) Message-ID: https://github.com/python/cpython/commit/4867eaa294c5f5fb360e111d54f3543d502b4f46 commit: 4867eaa294c5f5fb360e111d54f3543d502b4f46 branch: master author: Barry Warsaw committer: GitHub date: 2019-06-05T19:40:19-07:00 summary: Add importlib.metadata to what's new. (#13855) files: M Doc/whatsnew/3.8.rst diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 8456a17aedcc..bf75387d9517 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -330,7 +330,10 @@ Other Language Changes New Modules =========== -* None yet. +* The new :mod:`importlib.metadata` module provides (provisional) support for + reading metadata from third-party packages. For example, you can extract an + installed package's version number, list of entry points, and more. See + :issue:`34632` for additional details. Improved Modules From webhook-mailer at python.org Thu Jun 6 01:39:05 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Thu, 06 Jun 2019 05:39:05 -0000 Subject: [Python-checkins] bpo-35551: remove mac_centeuro encoding (GH-13856) Message-ID: https://github.com/python/cpython/commit/cb65202520e7959196a2df8215692de155bf0cc8 commit: cb65202520e7959196a2df8215692de155bf0cc8 branch: master author: Inada Naoki committer: GitHub date: 2019-06-06T14:38:52+09:00 summary: bpo-35551: remove mac_centeuro encoding (GH-13856) It is alias to mac_latin2 now. files: D Lib/encodings/mac_centeuro.py diff --git a/Lib/encodings/mac_centeuro.py b/Lib/encodings/mac_centeuro.py deleted file mode 100644 index 5785a0ec12df..000000000000 --- a/Lib/encodings/mac_centeuro.py +++ /dev/null @@ -1,307 +0,0 @@ -""" Python Character Mapping Codec mac_centeuro generated from 'MAPPINGS/VENDORS/APPLE/CENTEURO.TXT' with gencodec.py. - -"""#" - -import codecs - -### Codec APIs - -class Codec(codecs.Codec): - - def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_table) - - def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) - -class IncrementalEncoder(codecs.IncrementalEncoder): - def encode(self, input, final=False): - return codecs.charmap_encode(input,self.errors,encoding_table)[0] - -class IncrementalDecoder(codecs.IncrementalDecoder): - def decode(self, input, final=False): - return codecs.charmap_decode(input,self.errors,decoding_table)[0] - -class StreamWriter(Codec,codecs.StreamWriter): - pass - -class StreamReader(Codec,codecs.StreamReader): - pass - -### encodings module API - -def getregentry(): - return codecs.CodecInfo( - name='mac-centeuro', - encode=Codec().encode, - decode=Codec().decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamreader=StreamReader, - streamwriter=StreamWriter, - ) - - -### Decoding Table - -decoding_table = ( - '\x00' # 0x00 -> CONTROL CHARACTER - '\x01' # 0x01 -> CONTROL CHARACTER - '\x02' # 0x02 -> CONTROL CHARACTER - '\x03' # 0x03 -> CONTROL CHARACTER - '\x04' # 0x04 -> CONTROL CHARACTER - '\x05' # 0x05 -> CONTROL CHARACTER - '\x06' # 0x06 -> CONTROL CHARACTER - '\x07' # 0x07 -> CONTROL CHARACTER - '\x08' # 0x08 -> CONTROL CHARACTER - '\t' # 0x09 -> CONTROL CHARACTER - '\n' # 0x0A -> CONTROL CHARACTER - '\x0b' # 0x0B -> CONTROL CHARACTER - '\x0c' # 0x0C -> CONTROL CHARACTER - '\r' # 0x0D -> CONTROL CHARACTER - '\x0e' # 0x0E -> CONTROL CHARACTER - '\x0f' # 0x0F -> CONTROL CHARACTER - '\x10' # 0x10 -> CONTROL CHARACTER - '\x11' # 0x11 -> CONTROL CHARACTER - '\x12' # 0x12 -> CONTROL CHARACTER - '\x13' # 0x13 -> CONTROL CHARACTER - '\x14' # 0x14 -> CONTROL CHARACTER - '\x15' # 0x15 -> CONTROL CHARACTER - '\x16' # 0x16 -> CONTROL CHARACTER - '\x17' # 0x17 -> CONTROL CHARACTER - '\x18' # 0x18 -> CONTROL CHARACTER - '\x19' # 0x19 -> CONTROL CHARACTER - '\x1a' # 0x1A -> CONTROL CHARACTER - '\x1b' # 0x1B -> CONTROL CHARACTER - '\x1c' # 0x1C -> CONTROL CHARACTER - '\x1d' # 0x1D -> CONTROL CHARACTER - '\x1e' # 0x1E -> CONTROL CHARACTER - '\x1f' # 0x1F -> CONTROL CHARACTER - ' ' # 0x20 -> SPACE - '!' # 0x21 -> EXCLAMATION MARK - '"' # 0x22 -> QUOTATION MARK - '#' # 0x23 -> NUMBER SIGN - '$' # 0x24 -> DOLLAR SIGN - '%' # 0x25 -> PERCENT SIGN - '&' # 0x26 -> AMPERSAND - "'" # 0x27 -> APOSTROPHE - '(' # 0x28 -> LEFT PARENTHESIS - ')' # 0x29 -> RIGHT PARENTHESIS - '*' # 0x2A -> ASTERISK - '+' # 0x2B -> PLUS SIGN - ',' # 0x2C -> COMMA - '-' # 0x2D -> HYPHEN-MINUS - '.' # 0x2E -> FULL STOP - '/' # 0x2F -> SOLIDUS - '0' # 0x30 -> DIGIT ZERO - '1' # 0x31 -> DIGIT ONE - '2' # 0x32 -> DIGIT TWO - '3' # 0x33 -> DIGIT THREE - '4' # 0x34 -> DIGIT FOUR - '5' # 0x35 -> DIGIT FIVE - '6' # 0x36 -> DIGIT SIX - '7' # 0x37 -> DIGIT SEVEN - '8' # 0x38 -> DIGIT EIGHT - '9' # 0x39 -> DIGIT NINE - ':' # 0x3A -> COLON - ';' # 0x3B -> SEMICOLON - '<' # 0x3C -> LESS-THAN SIGN - '=' # 0x3D -> EQUALS SIGN - '>' # 0x3E -> GREATER-THAN SIGN - '?' # 0x3F -> QUESTION MARK - '@' # 0x40 -> COMMERCIAL AT - 'A' # 0x41 -> LATIN CAPITAL LETTER A - 'B' # 0x42 -> LATIN CAPITAL LETTER B - 'C' # 0x43 -> LATIN CAPITAL LETTER C - 'D' # 0x44 -> LATIN CAPITAL LETTER D - 'E' # 0x45 -> LATIN CAPITAL LETTER E - 'F' # 0x46 -> LATIN CAPITAL LETTER F - 'G' # 0x47 -> LATIN CAPITAL LETTER G - 'H' # 0x48 -> LATIN CAPITAL LETTER H - 'I' # 0x49 -> LATIN CAPITAL LETTER I - 'J' # 0x4A -> LATIN CAPITAL LETTER J - 'K' # 0x4B -> LATIN CAPITAL LETTER K - 'L' # 0x4C -> LATIN CAPITAL LETTER L - 'M' # 0x4D -> LATIN CAPITAL LETTER M - 'N' # 0x4E -> LATIN CAPITAL LETTER N - 'O' # 0x4F -> LATIN CAPITAL LETTER O - 'P' # 0x50 -> LATIN CAPITAL LETTER P - 'Q' # 0x51 -> LATIN CAPITAL LETTER Q - 'R' # 0x52 -> LATIN CAPITAL LETTER R - 'S' # 0x53 -> LATIN CAPITAL LETTER S - 'T' # 0x54 -> LATIN CAPITAL LETTER T - 'U' # 0x55 -> LATIN CAPITAL LETTER U - 'V' # 0x56 -> LATIN CAPITAL LETTER V - 'W' # 0x57 -> LATIN CAPITAL LETTER W - 'X' # 0x58 -> LATIN CAPITAL LETTER X - 'Y' # 0x59 -> LATIN CAPITAL LETTER Y - 'Z' # 0x5A -> LATIN CAPITAL LETTER Z - '[' # 0x5B -> LEFT SQUARE BRACKET - '\\' # 0x5C -> REVERSE SOLIDUS - ']' # 0x5D -> RIGHT SQUARE BRACKET - '^' # 0x5E -> CIRCUMFLEX ACCENT - '_' # 0x5F -> LOW LINE - '`' # 0x60 -> GRAVE ACCENT - 'a' # 0x61 -> LATIN SMALL LETTER A - 'b' # 0x62 -> LATIN SMALL LETTER B - 'c' # 0x63 -> LATIN SMALL LETTER C - 'd' # 0x64 -> LATIN SMALL LETTER D - 'e' # 0x65 -> LATIN SMALL LETTER E - 'f' # 0x66 -> LATIN SMALL LETTER F - 'g' # 0x67 -> LATIN SMALL LETTER G - 'h' # 0x68 -> LATIN SMALL LETTER H - 'i' # 0x69 -> LATIN SMALL LETTER I - 'j' # 0x6A -> LATIN SMALL LETTER J - 'k' # 0x6B -> LATIN SMALL LETTER K - 'l' # 0x6C -> LATIN SMALL LETTER L - 'm' # 0x6D -> LATIN SMALL LETTER M - 'n' # 0x6E -> LATIN SMALL LETTER N - 'o' # 0x6F -> LATIN SMALL LETTER O - 'p' # 0x70 -> LATIN SMALL LETTER P - 'q' # 0x71 -> LATIN SMALL LETTER Q - 'r' # 0x72 -> LATIN SMALL LETTER R - 's' # 0x73 -> LATIN SMALL LETTER S - 't' # 0x74 -> LATIN SMALL LETTER T - 'u' # 0x75 -> LATIN SMALL LETTER U - 'v' # 0x76 -> LATIN SMALL LETTER V - 'w' # 0x77 -> LATIN SMALL LETTER W - 'x' # 0x78 -> LATIN SMALL LETTER X - 'y' # 0x79 -> LATIN SMALL LETTER Y - 'z' # 0x7A -> LATIN SMALL LETTER Z - '{' # 0x7B -> LEFT CURLY BRACKET - '|' # 0x7C -> VERTICAL LINE - '}' # 0x7D -> RIGHT CURLY BRACKET - '~' # 0x7E -> TILDE - '\x7f' # 0x7F -> CONTROL CHARACTER - '\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS - '\u0100' # 0x81 -> LATIN CAPITAL LETTER A WITH MACRON - '\u0101' # 0x82 -> LATIN SMALL LETTER A WITH MACRON - '\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE - '\u0104' # 0x84 -> LATIN CAPITAL LETTER A WITH OGONEK - '\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS - '\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS - '\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE - '\u0105' # 0x88 -> LATIN SMALL LETTER A WITH OGONEK - '\u010c' # 0x89 -> LATIN CAPITAL LETTER C WITH CARON - '\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS - '\u010d' # 0x8B -> LATIN SMALL LETTER C WITH CARON - '\u0106' # 0x8C -> LATIN CAPITAL LETTER C WITH ACUTE - '\u0107' # 0x8D -> LATIN SMALL LETTER C WITH ACUTE - '\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE - '\u0179' # 0x8F -> LATIN CAPITAL LETTER Z WITH ACUTE - '\u017a' # 0x90 -> LATIN SMALL LETTER Z WITH ACUTE - '\u010e' # 0x91 -> LATIN CAPITAL LETTER D WITH CARON - '\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE - '\u010f' # 0x93 -> LATIN SMALL LETTER D WITH CARON - '\u0112' # 0x94 -> LATIN CAPITAL LETTER E WITH MACRON - '\u0113' # 0x95 -> LATIN SMALL LETTER E WITH MACRON - '\u0116' # 0x96 -> LATIN CAPITAL LETTER E WITH DOT ABOVE - '\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE - '\u0117' # 0x98 -> LATIN SMALL LETTER E WITH DOT ABOVE - '\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - '\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS - '\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE - '\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE - '\u011a' # 0x9D -> LATIN CAPITAL LETTER E WITH CARON - '\u011b' # 0x9E -> LATIN SMALL LETTER E WITH CARON - '\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS - '\u2020' # 0xA0 -> DAGGER - '\xb0' # 0xA1 -> DEGREE SIGN - '\u0118' # 0xA2 -> LATIN CAPITAL LETTER E WITH OGONEK - '\xa3' # 0xA3 -> POUND SIGN - '\xa7' # 0xA4 -> SECTION SIGN - '\u2022' # 0xA5 -> BULLET - '\xb6' # 0xA6 -> PILCROW SIGN - '\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S - '\xae' # 0xA8 -> REGISTERED SIGN - '\xa9' # 0xA9 -> COPYRIGHT SIGN - '\u2122' # 0xAA -> TRADE MARK SIGN - '\u0119' # 0xAB -> LATIN SMALL LETTER E WITH OGONEK - '\xa8' # 0xAC -> DIAERESIS - '\u2260' # 0xAD -> NOT EQUAL TO - '\u0123' # 0xAE -> LATIN SMALL LETTER G WITH CEDILLA - '\u012e' # 0xAF -> LATIN CAPITAL LETTER I WITH OGONEK - '\u012f' # 0xB0 -> LATIN SMALL LETTER I WITH OGONEK - '\u012a' # 0xB1 -> LATIN CAPITAL LETTER I WITH MACRON - '\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO - '\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO - '\u012b' # 0xB4 -> LATIN SMALL LETTER I WITH MACRON - '\u0136' # 0xB5 -> LATIN CAPITAL LETTER K WITH CEDILLA - '\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL - '\u2211' # 0xB7 -> N-ARY SUMMATION - '\u0142' # 0xB8 -> LATIN SMALL LETTER L WITH STROKE - '\u013b' # 0xB9 -> LATIN CAPITAL LETTER L WITH CEDILLA - '\u013c' # 0xBA -> LATIN SMALL LETTER L WITH CEDILLA - '\u013d' # 0xBB -> LATIN CAPITAL LETTER L WITH CARON - '\u013e' # 0xBC -> LATIN SMALL LETTER L WITH CARON - '\u0139' # 0xBD -> LATIN CAPITAL LETTER L WITH ACUTE - '\u013a' # 0xBE -> LATIN SMALL LETTER L WITH ACUTE - '\u0145' # 0xBF -> LATIN CAPITAL LETTER N WITH CEDILLA - '\u0146' # 0xC0 -> LATIN SMALL LETTER N WITH CEDILLA - '\u0143' # 0xC1 -> LATIN CAPITAL LETTER N WITH ACUTE - '\xac' # 0xC2 -> NOT SIGN - '\u221a' # 0xC3 -> SQUARE ROOT - '\u0144' # 0xC4 -> LATIN SMALL LETTER N WITH ACUTE - '\u0147' # 0xC5 -> LATIN CAPITAL LETTER N WITH CARON - '\u2206' # 0xC6 -> INCREMENT - '\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - '\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - '\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS - '\xa0' # 0xCA -> NO-BREAK SPACE - '\u0148' # 0xCB -> LATIN SMALL LETTER N WITH CARON - '\u0150' # 0xCC -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE - '\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE - '\u0151' # 0xCE -> LATIN SMALL LETTER O WITH DOUBLE ACUTE - '\u014c' # 0xCF -> LATIN CAPITAL LETTER O WITH MACRON - '\u2013' # 0xD0 -> EN DASH - '\u2014' # 0xD1 -> EM DASH - '\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK - '\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK - '\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK - '\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK - '\xf7' # 0xD6 -> DIVISION SIGN - '\u25ca' # 0xD7 -> LOZENGE - '\u014d' # 0xD8 -> LATIN SMALL LETTER O WITH MACRON - '\u0154' # 0xD9 -> LATIN CAPITAL LETTER R WITH ACUTE - '\u0155' # 0xDA -> LATIN SMALL LETTER R WITH ACUTE - '\u0158' # 0xDB -> LATIN CAPITAL LETTER R WITH CARON - '\u2039' # 0xDC -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK - '\u203a' # 0xDD -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - '\u0159' # 0xDE -> LATIN SMALL LETTER R WITH CARON - '\u0156' # 0xDF -> LATIN CAPITAL LETTER R WITH CEDILLA - '\u0157' # 0xE0 -> LATIN SMALL LETTER R WITH CEDILLA - '\u0160' # 0xE1 -> LATIN CAPITAL LETTER S WITH CARON - '\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK - '\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK - '\u0161' # 0xE4 -> LATIN SMALL LETTER S WITH CARON - '\u015a' # 0xE5 -> LATIN CAPITAL LETTER S WITH ACUTE - '\u015b' # 0xE6 -> LATIN SMALL LETTER S WITH ACUTE - '\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE - '\u0164' # 0xE8 -> LATIN CAPITAL LETTER T WITH CARON - '\u0165' # 0xE9 -> LATIN SMALL LETTER T WITH CARON - '\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE - '\u017d' # 0xEB -> LATIN CAPITAL LETTER Z WITH CARON - '\u017e' # 0xEC -> LATIN SMALL LETTER Z WITH CARON - '\u016a' # 0xED -> LATIN CAPITAL LETTER U WITH MACRON - '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE - '\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - '\u016b' # 0xF0 -> LATIN SMALL LETTER U WITH MACRON - '\u016e' # 0xF1 -> LATIN CAPITAL LETTER U WITH RING ABOVE - '\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE - '\u016f' # 0xF3 -> LATIN SMALL LETTER U WITH RING ABOVE - '\u0170' # 0xF4 -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE - '\u0171' # 0xF5 -> LATIN SMALL LETTER U WITH DOUBLE ACUTE - '\u0172' # 0xF6 -> LATIN CAPITAL LETTER U WITH OGONEK - '\u0173' # 0xF7 -> LATIN SMALL LETTER U WITH OGONEK - '\xdd' # 0xF8 -> LATIN CAPITAL LETTER Y WITH ACUTE - '\xfd' # 0xF9 -> LATIN SMALL LETTER Y WITH ACUTE - '\u0137' # 0xFA -> LATIN SMALL LETTER K WITH CEDILLA - '\u017b' # 0xFB -> LATIN CAPITAL LETTER Z WITH DOT ABOVE - '\u0141' # 0xFC -> LATIN CAPITAL LETTER L WITH STROKE - '\u017c' # 0xFD -> LATIN SMALL LETTER Z WITH DOT ABOVE - '\u0122' # 0xFE -> LATIN CAPITAL LETTER G WITH CEDILLA - '\u02c7' # 0xFF -> CARON -) - -### Encoding table -encoding_table=codecs.charmap_build(decoding_table) From webhook-mailer at python.org Thu Jun 6 06:13:14 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 06 Jun 2019 10:13:14 -0000 Subject: [Python-checkins] bpo-2661: Make mapping tests better usable for custom mapping classes. (GH-11157) Message-ID: https://github.com/python/cpython/commit/6af230359e57122708247dac970e05e05529cde6 commit: 6af230359e57122708247dac970e05e05529cde6 branch: master author: Walter D?rwald committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-06-06T03:13:08-07:00 summary: bpo-2661: Make mapping tests better usable for custom mapping classes. (GH-11157) In test_fromkeys() the derived test class now supports all arguments in its constructor so that the class to be tested can use its own constructor in its fromkeys() implementation. In test_mutatingiteration() the test fails as soon as iterating over a dictionary with one entry and adding new entries in the loop iterates more than once (to avoid endless loops in faulty implementations). https://bugs.python.org/issue2661 files: M Lib/test/mapping_tests.py diff --git a/Lib/test/mapping_tests.py b/Lib/test/mapping_tests.py index 53f29f605386..613206a0855a 100644 --- a/Lib/test/mapping_tests.py +++ b/Lib/test/mapping_tests.py @@ -448,7 +448,7 @@ def __new__(cls): class Exc(Exception): pass class baddict1(self.type2test): - def __init__(self): + def __init__(self, *args, **kwargs): raise Exc() self.assertRaises(Exc, baddict1.fromkeys, [1]) @@ -595,12 +595,14 @@ def test_mutatingiteration(self): d = self._empty_mapping() d[1] = 1 try: + count = 0 for i in d: d[i+1] = 1 + if count >= 1: + self.fail("changing dict size during iteration doesn't raise Error") + count += 1 except RuntimeError: pass - else: - self.fail("changing dict size during iteration doesn't raise Error") def test_repr(self): d = self._empty_mapping() From webhook-mailer at python.org Thu Jun 6 06:39:34 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 06 Jun 2019 10:39:34 -0000 Subject: [Python-checkins] Don't report deleted attributes in __dir__ (GHGH-10148) Message-ID: https://github.com/python/cpython/commit/28be388e69c6e88d5c04abcc714db5ec526e4f5e commit: 28be388e69c6e88d5c04abcc714db5ec526e4f5e branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-06T03:39:30-07:00 summary: Don't report deleted attributes in __dir__ (GHGH-10148) When an attribute is deleted from a Mock, a sentinel is added rather than just deleting the attribute. This commit checks for such sentinels when returning the child mocks in the __dir__ method as users won't expect deleted attributes to appear when performing dir(mock). (cherry picked from commit 0df635c7f8aa69e56a092bd4f142f0f164741ab2) Co-authored-by: Mario Corchero files: A Misc/NEWS.d/next/Library/2018-10-27-11-54-12.bpo-35082.HDj1nr.rst M Lib/unittest/mock.py M Lib/unittest/test/testmock/testmock.py diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 1e577dff2f41..569a5146c8c1 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -684,12 +684,14 @@ def __dir__(self): extras = self._mock_methods or [] from_type = dir(type(self)) from_dict = list(self.__dict__) + from_child_mocks = [ + m_name for m_name, m_value in self._mock_children.items() + if m_value is not _deleted] from_type = [e for e in from_type if not e.startswith('_')] from_dict = [e for e in from_dict if not e.startswith('_') or _is_magic(e)] - return sorted(set(extras + from_type + from_dict + - list(self._mock_children))) + return sorted(set(extras + from_type + from_dict + from_child_mocks)) def __setattr__(self, name, value): diff --git a/Lib/unittest/test/testmock/testmock.py b/Lib/unittest/test/testmock/testmock.py index 76a648e57f12..f92b921fe664 100644 --- a/Lib/unittest/test/testmock/testmock.py +++ b/Lib/unittest/test/testmock/testmock.py @@ -870,6 +870,15 @@ def test_filter_dir(self): patcher.stop() + def test_dir_does_not_include_deleted_attributes(self): + mock = Mock() + mock.child.return_value = 1 + + self.assertIn('child', dir(mock)) + del mock.child + self.assertNotIn('child', dir(mock)) + + def test_configure_mock(self): mock = Mock(foo='bar') self.assertEqual(mock.foo, 'bar') diff --git a/Misc/NEWS.d/next/Library/2018-10-27-11-54-12.bpo-35082.HDj1nr.rst b/Misc/NEWS.d/next/Library/2018-10-27-11-54-12.bpo-35082.HDj1nr.rst new file mode 100644 index 000000000000..45a0729506e3 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-10-27-11-54-12.bpo-35082.HDj1nr.rst @@ -0,0 +1,2 @@ +Don't return deleted attributes when calling dir on a +:class:`unittest.mock.Mock`. From webhook-mailer at python.org Thu Jun 6 08:25:35 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 06 Jun 2019 12:25:35 -0000 Subject: [Python-checkins] bpo-36763, _testembed: enable assert() in release mode (GH-13857) Message-ID: https://github.com/python/cpython/commit/013a18a65167725f140c0395211050ae03501b12 commit: 013a18a65167725f140c0395211050ae03501b12 branch: master author: Victor Stinner committer: GitHub date: 2019-06-06T14:25:18+02:00 summary: bpo-36763, _testembed: enable assert() in release mode (GH-13857) files: M Programs/_testembed.c diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 3e1210e04d82..9633f4610b54 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -1,10 +1,13 @@ -/* FIXME: PEP 587 makes these functions public */ #ifndef Py_BUILD_CORE_MODULE # define Py_BUILD_CORE_MODULE #endif +/* Always enable assertion (even in release mode) */ +#undef NDEBUG + #include -#include "pycore_initconfig.h" /* FIXME: PEP 587 makes these functions public */ +#include "pycore_initconfig.h" /* _PyConfig_InitCompatConfig() */ +#include "pycore_pystate.h" /* _PyRuntime */ #include #include "pythread.h" #include From webhook-mailer at python.org Thu Jun 6 08:43:03 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 06 Jun 2019 12:43:03 -0000 Subject: [Python-checkins] bpo-36763, _testembed: enable assert() in release mode (GH-13857) Message-ID: https://github.com/python/cpython/commit/406284173a43f5c34643133e2f132ae15a071a23 commit: 406284173a43f5c34643133e2f132ae15a071a23 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-06T05:42:53-07:00 summary: bpo-36763, _testembed: enable assert() in release mode (GH-13857) (cherry picked from commit 013a18a65167725f140c0395211050ae03501b12) Co-authored-by: Victor Stinner files: M Programs/_testembed.c diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 3e1210e04d82..9633f4610b54 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -1,10 +1,13 @@ -/* FIXME: PEP 587 makes these functions public */ #ifndef Py_BUILD_CORE_MODULE # define Py_BUILD_CORE_MODULE #endif +/* Always enable assertion (even in release mode) */ +#undef NDEBUG + #include -#include "pycore_initconfig.h" /* FIXME: PEP 587 makes these functions public */ +#include "pycore_initconfig.h" /* _PyConfig_InitCompatConfig() */ +#include "pycore_pystate.h" /* _PyRuntime */ #include #include "pythread.h" #include From webhook-mailer at python.org Thu Jun 6 12:07:01 2019 From: webhook-mailer at python.org (Steve Dower) Date: Thu, 06 Jun 2019 16:07:01 -0000 Subject: [Python-checkins] bpo-37156: Fix libssl DLL tag in MSI sources (GH-13866) Message-ID: https://github.com/python/cpython/commit/e0c0c7e8c9f8153a54b92e43aa3d09e69a9fd0c0 commit: e0c0c7e8c9f8153a54b92e43aa3d09e69a9fd0c0 branch: master author: Steve Dower committer: GitHub date: 2019-06-06T09:06:51-07:00 summary: bpo-37156: Fix libssl DLL tag in MSI sources (GH-13866) files: M Tools/msi/msi.props diff --git a/Tools/msi/msi.props b/Tools/msi/msi.props index 0fe822af9319..5da901c0215a 100644 --- a/Tools/msi/msi.props +++ b/Tools/msi/msi.props @@ -87,15 +87,16 @@ PyArchExt=$(PyArchExt); PyTestExt=$(PyTestExt); OptionalFeatureName=$(OutputName); + ssltag=-1_1; $(DefineConstants);CRTRedist=$(CRTRedist); - $(DefineConstants);Suffix32=-32;ssltag=-1_1; + $(DefineConstants);Suffix32=-32; - $(DefineConstants);Suffix32=;ssltag=-1_1-x64; + $(DefineConstants);Suffix32=; From webhook-mailer at python.org Thu Jun 6 12:38:02 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 06 Jun 2019 16:38:02 -0000 Subject: [Python-checkins] bpo-37156: Fix libssl DLL tag in MSI sources (GH-13866) Message-ID: https://github.com/python/cpython/commit/1c4084f4c13d7ec516abc0439288cbeb2c96489a commit: 1c4084f4c13d7ec516abc0439288cbeb2c96489a branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-06T09:37:59-07:00 summary: bpo-37156: Fix libssl DLL tag in MSI sources (GH-13866) (cherry picked from commit e0c0c7e8c9f8153a54b92e43aa3d09e69a9fd0c0) Co-authored-by: Steve Dower files: M Tools/msi/msi.props diff --git a/Tools/msi/msi.props b/Tools/msi/msi.props index 0fe822af9319..5da901c0215a 100644 --- a/Tools/msi/msi.props +++ b/Tools/msi/msi.props @@ -87,15 +87,16 @@ PyArchExt=$(PyArchExt); PyTestExt=$(PyTestExt); OptionalFeatureName=$(OutputName); + ssltag=-1_1; $(DefineConstants);CRTRedist=$(CRTRedist); - $(DefineConstants);Suffix32=-32;ssltag=-1_1; + $(DefineConstants);Suffix32=-32; - $(DefineConstants);Suffix32=;ssltag=-1_1-x64; + $(DefineConstants);Suffix32=; From webhook-mailer at python.org Thu Jun 6 13:08:47 2019 From: webhook-mailer at python.org (Barry Warsaw) Date: Thu, 06 Jun 2019 17:08:47 -0000 Subject: [Python-checkins] bpo-21315: Fix parsing of encoded words with missing leading ws. (GH-13425) (#13846) Message-ID: https://github.com/python/cpython/commit/dc20fc4311dece19488299a7cd11317ffbe4d3c3 commit: dc20fc4311dece19488299a7cd11317ffbe4d3c3 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Barry Warsaw date: 2019-06-06T10:08:43-07:00 summary: bpo-21315: Fix parsing of encoded words with missing leading ws. (GH-13425) (#13846) * bpo-21315: Fix parsing of encoded words with missing leading ws. Because of missing leading whitespace, encoded word would get parsed as unstructured token. This patch fixes that by looking for encoded words when splitting tokens with whitespace. Missing trailing whitespace around encoded word now register a defect instead. Original patch suggestion by David R. Murray on bpo-21315. (cherry picked from commit 66c4f3f38b867d8329b28c032bb907fd1a2f22d2) Co-authored-by: Abhilash Raj files: A Misc/NEWS.d/next/Library/2019-05-19-10-48-46.bpo-21315.PgXVqF.rst M Lib/email/_header_value_parser.py M Lib/test/test_email/test__header_value_parser.py M Lib/test/test_email/test_headerregistry.py diff --git a/Lib/email/_header_value_parser.py b/Lib/email/_header_value_parser.py index 958ef5018c25..18aecbffa71a 100644 --- a/Lib/email/_header_value_parser.py +++ b/Lib/email/_header_value_parser.py @@ -97,6 +97,18 @@ def quote_string(value): return '"'+str(value).replace('\\', '\\\\').replace('"', r'\"')+'"' +# Match a RFC 2047 word, looks like =?utf-8?q?someword?= +rfc2047_matcher = re.compile(r''' + =\? # literal =? + [^?]* # charset + \? # literal ? + [qQbB] # literal 'q' or 'b', case insensitive + \? # literal ? + .*? # encoded word + \?= # literal ?= +''', re.VERBOSE | re.MULTILINE) + + # # TokenList and its subclasses # @@ -1050,6 +1062,10 @@ def get_encoded_word(value): _validate_xtext(vtext) ew.append(vtext) text = ''.join(remainder) + # Encoded words should be followed by a WS + if value and value[0] not in WSP: + ew.defects.append(errors.InvalidHeaderDefect( + "missing trailing whitespace after encoded-word")) return ew, value def get_unstructured(value): @@ -1102,6 +1118,11 @@ def get_unstructured(value): unstructured.append(token) continue tok, *remainder = _wsp_splitter(value, 1) + # Split in the middle of an atom if there is a rfc2047 encoded word + # which does not have WSP on both sides. The defect will be registered + # the next time through the loop. + if rfc2047_matcher.search(tok): + tok, *remainder = value.partition('=?') vtext = ValueTerminal(tok, 'vtext') _validate_xtext(vtext) unstructured.append(vtext) diff --git a/Lib/test/test_email/test__header_value_parser.py b/Lib/test/test_email/test__header_value_parser.py index 676732bb3d02..693487bc960f 100644 --- a/Lib/test/test_email/test__header_value_parser.py +++ b/Lib/test/test_email/test__header_value_parser.py @@ -118,7 +118,7 @@ def test_get_encoded_word_gets_first_even_if_no_space(self): '=?us-ascii?q?first?==?utf-8?q?second?=', 'first', 'first', - [], + [errors.InvalidHeaderDefect], '=?utf-8?q?second?=') def test_get_encoded_word_sets_extra_attributes(self): @@ -361,6 +361,25 @@ def test_get_unstructured_no_whitespace_between_ews(self): '=?utf-8?q?foo?==?utf-8?q?bar?=', 'foobar', 'foobar', + [errors.InvalidHeaderDefect, + errors.InvalidHeaderDefect], + '') + + def test_get_unstructured_ew_without_leading_whitespace(self): + self._test_get_x( + self._get_unst, + 'nowhitespace=?utf-8?q?somevalue?=', + 'nowhitespacesomevalue', + 'nowhitespacesomevalue', + [errors.InvalidHeaderDefect], + '') + + def test_get_unstructured_ew_without_trailing_whitespace(self): + self._test_get_x( + self._get_unst, + '=?utf-8?q?somevalue?=nowhitespace', + 'somevaluenowhitespace', + 'somevaluenowhitespace', [errors.InvalidHeaderDefect], '') @@ -546,7 +565,8 @@ def test_encoded_word_inside_quotes(self): '"=?utf-8?Q?not_really_valid?="', '"not really valid"', 'not really valid', - [errors.InvalidHeaderDefect], + [errors.InvalidHeaderDefect, + errors.InvalidHeaderDefect], '') # get_comment diff --git a/Lib/test/test_email/test_headerregistry.py b/Lib/test/test_email/test_headerregistry.py index d1007099f666..e6db3acedcc1 100644 --- a/Lib/test/test_email/test_headerregistry.py +++ b/Lib/test/test_email/test_headerregistry.py @@ -1180,7 +1180,8 @@ class TestAddressHeader(TestHeaderBase): 'rfc2047_atom_in_quoted_string_is_decoded': ('"=?utf-8?q?=C3=89ric?=" ', - [errors.InvalidHeaderDefect], + [errors.InvalidHeaderDefect, + errors.InvalidHeaderDefect], '?ric ', '?ric', 'foo at example.com', diff --git a/Misc/NEWS.d/next/Library/2019-05-19-10-48-46.bpo-21315.PgXVqF.rst b/Misc/NEWS.d/next/Library/2019-05-19-10-48-46.bpo-21315.PgXVqF.rst new file mode 100644 index 000000000000..dd0dd7f72c0a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-19-10-48-46.bpo-21315.PgXVqF.rst @@ -0,0 +1,4 @@ +Email headers containing RFC2047 encoded words are parsed despite the missing +whitespace, and a defect registered. Also missing trailing whitespace after +encoded words is now registered as a defect. + From webhook-mailer at python.org Thu Jun 6 15:53:50 2019 From: webhook-mailer at python.org (Barry Warsaw) Date: Thu, 06 Jun 2019 19:53:50 -0000 Subject: [Python-checkins] bpo-36520: Email header folded incorrectly (#13608) Message-ID: https://github.com/python/cpython/commit/f6713e84afc5addcfa8477dbdf2c027787f711c0 commit: f6713e84afc5addcfa8477dbdf2c027787f711c0 branch: master author: websurfer5 <49998481+websurfer5 at users.noreply.github.com> committer: Barry Warsaw date: 2019-06-06T12:53:27-07:00 summary: bpo-36520: Email header folded incorrectly (#13608) * bpo-36520: reset the encoded word offset when starting a new line during an email header folding operation * ?? Added by blurb_it. * bpo-36520: add an additional test case, and provide descriptive comments for the test_folding_with_utf8_encoding_* tests * bpo-36520: fix whitespace issue * bpo-36520: changes per reviewer request -- remove extraneous backslashes; add whitespace between terminating quotes and line-continuation backslashes; use "bpo-" instead of "issue #" in comments files: A Misc/NEWS.d/next/Library/2019-05-28-02-37-00.bpo-36520.W4tday.rst M Lib/email/_header_value_parser.py M Lib/test/test_email/test_message.py diff --git a/Lib/email/_header_value_parser.py b/Lib/email/_header_value_parser.py index 35d746aa5082..bb5ff8dc7e80 100644 --- a/Lib/email/_header_value_parser.py +++ b/Lib/email/_header_value_parser.py @@ -2789,6 +2789,7 @@ def _refold_parse_tree(parse_tree, *, policy): newline = _steal_trailing_WSP_if_exists(lines) if newline or part.startswith_fws(): lines.append(newline + tstr) + last_ew = None continue if not hasattr(part, 'encode'): # It's not a terminal, try folding the subparts. diff --git a/Lib/test/test_email/test_message.py b/Lib/test/test_email/test_message.py index f3a57df9e9cf..5dc46e1b812c 100644 --- a/Lib/test/test_email/test_message.py +++ b/Lib/test/test_email/test_message.py @@ -784,6 +784,137 @@ def test_str_defaults_to_utf8(self): m['Subject'] = 'unic?de' self.assertEqual(str(m), 'Subject: unic?de\n\n') + def test_folding_with_utf8_encoding_1(self): + # bpo-36520 + # + # Fold a line that contains UTF-8 words before + # and after the whitespace fold point, where the + # line length limit is reached within an ASCII + # word. + + m = EmailMessage() + m['Subject'] = 'Hello W?rld! Hello W?rld! ' \ + 'Hello W?rld! Hello W?rld!Hello W?rld!' + self.assertEqual(bytes(m), + b'Subject: Hello =?utf-8?q?W=C3=B6rld!_Hello_W' + b'=C3=B6rld!_Hello_W=C3=B6rld!?=\n' + b' Hello =?utf-8?q?W=C3=B6rld!Hello_W=C3=B6rld!?=\n\n') + + + def test_folding_with_utf8_encoding_2(self): + # bpo-36520 + # + # Fold a line that contains UTF-8 words before + # and after the whitespace fold point, where the + # line length limit is reached at the end of an + # encoded word. + + m = EmailMessage() + m['Subject'] = 'Hello W?rld! Hello W?rld! ' \ + 'Hello W?rlds123! Hello W?rld!Hello W?rld!' + self.assertEqual(bytes(m), + b'Subject: Hello =?utf-8?q?W=C3=B6rld!_Hello_W' + b'=C3=B6rld!_Hello_W=C3=B6rlds123!?=\n' + b' Hello =?utf-8?q?W=C3=B6rld!Hello_W=C3=B6rld!?=\n\n') + + def test_folding_with_utf8_encoding_3(self): + # bpo-36520 + # + # Fold a line that contains UTF-8 words before + # and after the whitespace fold point, where the + # line length limit is reached at the end of the + # first word. + + m = EmailMessage() + m['Subject'] = 'Hello-W?rld!-Hello-W?rld!-Hello-W?rlds123! ' \ + 'Hello W?rld!Hello W?rld!' + self.assertEqual(bytes(m), \ + b'Subject: =?utf-8?q?Hello-W=C3=B6rld!-Hello-W' + b'=C3=B6rld!-Hello-W=C3=B6rlds123!?=\n' + b' Hello =?utf-8?q?W=C3=B6rld!Hello_W=C3=B6rld!?=\n\n') + + def test_folding_with_utf8_encoding_4(self): + # bpo-36520 + # + # Fold a line that contains UTF-8 words before + # and after the fold point, where the first + # word is UTF-8 and the fold point is within + # the word. + + m = EmailMessage() + m['Subject'] = 'Hello-W?rld!-Hello-W?rld!-Hello-W?rlds123!-Hello' \ + ' W?rld!Hello W?rld!' + self.assertEqual(bytes(m), + b'Subject: =?utf-8?q?Hello-W=C3=B6rld!-Hello-W' + b'=C3=B6rld!-Hello-W=C3=B6rlds123!?=\n' + b' =?utf-8?q?-Hello_W=C3=B6rld!Hello_W=C3=B6rld!?=\n\n') + + def test_folding_with_utf8_encoding_5(self): + # bpo-36520 + # + # Fold a line that contains a UTF-8 word after + # the fold point. + + m = EmailMessage() + m['Subject'] = '123456789 123456789 123456789 123456789 123456789' \ + ' 123456789 123456789 Hello W?rld!' + self.assertEqual(bytes(m), + b'Subject: 123456789 123456789 123456789 123456789' + b' 123456789 123456789 123456789\n' + b' Hello =?utf-8?q?W=C3=B6rld!?=\n\n') + + def test_folding_with_utf8_encoding_6(self): + # bpo-36520 + # + # Fold a line that contains a UTF-8 word before + # the fold point and ASCII words after + + m = EmailMessage() + m['Subject'] = '123456789 123456789 123456789 123456789 Hello W?rld!' \ + ' 123456789 123456789 123456789 123456789 123456789' \ + ' 123456789' + self.assertEqual(bytes(m), + b'Subject: 123456789 123456789 123456789 123456789' + b' Hello =?utf-8?q?W=C3=B6rld!?=\n 123456789 ' + b'123456789 123456789 123456789 123456789 ' + b'123456789\n\n') + + def test_folding_with_utf8_encoding_7(self): + # bpo-36520 + # + # Fold a line twice that contains UTF-8 words before + # and after the first fold point, and ASCII words + # after the second fold point. + + m = EmailMessage() + m['Subject'] = '123456789 123456789 Hello W?rld! Hello W?rld! ' \ + '123456789-123456789 123456789 Hello W?rld! 123456789' \ + ' 123456789' + self.assertEqual(bytes(m), + b'Subject: 123456789 123456789 Hello =?utf-8?q?' + b'W=C3=B6rld!_Hello_W=C3=B6rld!?=\n' + b' 123456789-123456789 123456789 Hello ' + b'=?utf-8?q?W=C3=B6rld!?= 123456789\n 123456789\n\n') + + def test_folding_with_utf8_encoding_8(self): + # bpo-36520 + # + # Fold a line twice that contains UTF-8 words before + # the first fold point, and ASCII words after the + # first fold point, and UTF-8 words after the second + # fold point. + + m = EmailMessage() + m['Subject'] = '123456789 123456789 Hello W?rld! Hello W?rld! ' \ + '123456789 123456789 123456789 123456789 123456789 ' \ + '123456789-123456789 123456789 Hello W?rld! 123456789' \ + ' 123456789' + self.assertEqual(bytes(m), + b'Subject: 123456789 123456789 Hello ' + b'=?utf-8?q?W=C3=B6rld!_Hello_W=C3=B6rld!?=\n 123456789 ' + b'123456789 123456789 123456789 123456789 ' + b'123456789-123456789\n 123456789 Hello ' + b'=?utf-8?q?W=C3=B6rld!?= 123456789 123456789\n\n') class TestMIMEPart(TestEmailMessageBase, TestEmailBase): # Doing the full test run here may seem a bit redundant, since the two diff --git a/Misc/NEWS.d/next/Library/2019-05-28-02-37-00.bpo-36520.W4tday.rst b/Misc/NEWS.d/next/Library/2019-05-28-02-37-00.bpo-36520.W4tday.rst new file mode 100644 index 000000000000..8171bfe9e2df --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-28-02-37-00.bpo-36520.W4tday.rst @@ -0,0 +1 @@ +Lengthy email headers with UTF-8 characters are now properly encoded when they are folded. Patch by Jeffrey Kintscher. From webhook-mailer at python.org Thu Jun 6 16:39:40 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 06 Jun 2019 20:39:40 -0000 Subject: [Python-checkins] bpo-37170: Fix the cast on error in PyLong_AsUnsignedLongLongMask() (GH-13860) Message-ID: https://github.com/python/cpython/commit/dc2476500d91082f0c907772c83a044bf49af279 commit: dc2476500d91082f0c907772c83a044bf49af279 branch: master author: Zackery Spytz committer: Victor Stinner date: 2019-06-06T22:39:23+02:00 summary: bpo-37170: Fix the cast on error in PyLong_AsUnsignedLongLongMask() (GH-13860) files: A Misc/NEWS.d/next/C API/2019-06-06-08-47-04.bpo-37170.hO_fpM.rst M Doc/c-api/long.rst M Modules/_testcapimodule.c M Objects/longobject.c diff --git a/Doc/c-api/long.rst b/Doc/c-api/long.rst index 6be29f9cd32e..fdaefafe21ba 100644 --- a/Doc/c-api/long.rst +++ b/Doc/c-api/long.rst @@ -288,7 +288,8 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. If the value of *obj* is out of range for an :c:type:`unsigned long`, return the reduction of that value modulo ``ULONG_MAX + 1``. - Returns ``-1`` on error. Use :c:func:`PyErr_Occurred` to disambiguate. + Returns ``(unsigned long)-1`` on error. Use :c:func:`PyErr_Occurred` to + disambiguate. .. versionchanged:: 3.8 Use :meth:`__index__` if available. @@ -307,7 +308,8 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. If the value of *obj* is out of range for an :c:type:`unsigned long long`, return the reduction of that value modulo ``PY_ULLONG_MAX + 1``. - Returns ``-1`` on error. Use :c:func:`PyErr_Occurred` to disambiguate. + Returns ``(unsigned long long)-1`` on error. Use :c:func:`PyErr_Occurred` + to disambiguate. .. versionchanged:: 3.8 Use :meth:`__index__` if available. diff --git a/Misc/NEWS.d/next/C API/2019-06-06-08-47-04.bpo-37170.hO_fpM.rst b/Misc/NEWS.d/next/C API/2019-06-06-08-47-04.bpo-37170.hO_fpM.rst new file mode 100644 index 000000000000..7a35c9583d69 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2019-06-06-08-47-04.bpo-37170.hO_fpM.rst @@ -0,0 +1 @@ +Fix the cast on error in :c:func:`PyLong_AsUnsignedLongLongMask()`. diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index f059b4df11b7..c1ae237f2e6c 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -825,6 +825,26 @@ test_long_as_size_t(PyObject *self, PyObject *Py_UNUSED(ignored)) return Py_None; } +static PyObject * +test_long_as_unsigned_long_long_mask(PyObject *self, + PyObject *Py_UNUSED(ignored)) +{ + unsigned long long res = PyLong_AsUnsignedLongLongMask(NULL); + + if (res != (unsigned long long)-1 || !PyErr_Occurred()) { + return raiseTestError("test_long_as_unsigned_long_long_mask", + "PyLong_AsUnsignedLongLongMask(NULL) didn't " + "complain"); + } + if (!PyErr_ExceptionMatches(PyExc_SystemError)) { + return raiseTestError("test_long_as_unsigned_long_long_mask", + "PyLong_AsUnsignedLongLongMask(NULL) raised " + "something other than SystemError"); + } + PyErr_Clear(); + Py_RETURN_NONE; +} + /* Test the PyLong_AsDouble API. At present this just tests that non-integer arguments are handled correctly. */ @@ -5070,6 +5090,8 @@ static PyMethodDef TestMethods[] = { {"test_long_and_overflow", test_long_and_overflow, METH_NOARGS}, {"test_long_as_double", test_long_as_double, METH_NOARGS}, {"test_long_as_size_t", test_long_as_size_t, METH_NOARGS}, + {"test_long_as_unsigned_long_long_mask", + test_long_as_unsigned_long_long_mask, METH_NOARGS}, {"test_long_numbits", test_long_numbits, METH_NOARGS}, {"test_k_code", test_k_code, METH_NOARGS}, {"test_empty_argparse", test_empty_argparse, METH_NOARGS}, diff --git a/Objects/longobject.c b/Objects/longobject.c index a1103f697c73..50ea2a4e54a4 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -1376,7 +1376,7 @@ _PyLong_AsUnsignedLongLongMask(PyObject *vv) if (vv == NULL || !PyLong_Check(vv)) { PyErr_BadInternalCall(); - return (unsigned long) -1; + return (unsigned long long) -1; } v = (PyLongObject *)vv; switch(Py_SIZE(v)) { @@ -1404,7 +1404,7 @@ PyLong_AsUnsignedLongLongMask(PyObject *op) if (op == NULL) { PyErr_BadInternalCall(); - return (unsigned long)-1; + return (unsigned long long)-1; } if (PyLong_Check(op)) { From webhook-mailer at python.org Thu Jun 6 19:38:48 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Thu, 06 Jun 2019 23:38:48 -0000 Subject: [Python-checkins] bpo-37134: Add PEP570 notation to the signature of byte{array}.translate (GH-13874) Message-ID: https://github.com/python/cpython/commit/de76c07a8cd0216c3dce215e4d542e2f45aa022f commit: de76c07a8cd0216c3dce215e4d542e2f45aa022f branch: master author: Pablo Galindo committer: GitHub date: 2019-06-07T00:38:41+01:00 summary: bpo-37134: Add PEP570 notation to the signature of byte{array}.translate (GH-13874) files: M Doc/library/stdtypes.rst diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index fcb0da74e158..35a17a180809 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -2736,8 +2736,8 @@ arbitrary binary data. The prefix(es) to search for may be any :term:`bytes-like object`. -.. method:: bytes.translate(table, delete=b'') - bytearray.translate(table, delete=b'') +.. method:: bytes.translate(table, /, delete=b'') + bytearray.translate(table, /, delete=b'') Return a copy of the bytes or bytearray object where all bytes occurring in the optional argument *delete* are removed, and the remaining bytes have From webhook-mailer at python.org Thu Jun 6 19:44:54 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 06 Jun 2019 23:44:54 -0000 Subject: [Python-checkins] bpo-37134: Add PEP570 notation to the signature of byte{array}.translate (GH-13874) Message-ID: https://github.com/python/cpython/commit/dba4448c63b687204813a5b04c89dd458d5ac45b commit: dba4448c63b687204813a5b04c89dd458d5ac45b branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-06T16:44:50-07:00 summary: bpo-37134: Add PEP570 notation to the signature of byte{array}.translate (GH-13874) (cherry picked from commit de76c07a8cd0216c3dce215e4d542e2f45aa022f) Co-authored-by: Pablo Galindo files: M Doc/library/stdtypes.rst diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index fcb0da74e158..35a17a180809 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -2736,8 +2736,8 @@ arbitrary binary data. The prefix(es) to search for may be any :term:`bytes-like object`. -.. method:: bytes.translate(table, delete=b'') - bytearray.translate(table, delete=b'') +.. method:: bytes.translate(table, /, delete=b'') + bytearray.translate(table, /, delete=b'') Return a copy of the bytes or bytearray object where all bytes occurring in the optional argument *delete* are removed, and the remaining bytes have From webhook-mailer at python.org Fri Jun 7 01:54:44 2019 From: webhook-mailer at python.org (Tal Einat) Date: Fri, 07 Jun 2019 05:54:44 -0000 Subject: [Python-checkins] bpo-37177: make IDLE's search dialogs transient (GH-13869) Message-ID: https://github.com/python/cpython/commit/554450fb4e95066e825bdb4a2d544a490daeebdc commit: 554450fb4e95066e825bdb4a2d544a490daeebdc branch: master author: Tal Einat committer: GitHub date: 2019-06-07T08:54:40+03:00 summary: bpo-37177: make IDLE's search dialogs transient (GH-13869) This avoids the search dialogs being hidden behind the editor window. files: A Misc/NEWS.d/next/IDLE/2019-06-07-00-17-41.bpo-37177.voU6pQ.rst M Lib/idlelib/idle_test/test_searchbase.py M Lib/idlelib/searchbase.py diff --git a/Lib/idlelib/idle_test/test_searchbase.py b/Lib/idlelib/idle_test/test_searchbase.py index 6dd4d7933737..e08268fde257 100644 --- a/Lib/idlelib/idle_test/test_searchbase.py +++ b/Lib/idlelib/idle_test/test_searchbase.py @@ -4,7 +4,7 @@ import unittest from test.support import requires -from tkinter import Tk +from tkinter import Text, Tk, Toplevel from tkinter.ttk import Frame from idlelib import searchengine as se from idlelib import searchbase as sdb @@ -47,14 +47,15 @@ def test_open_and_close(self): # open calls create_widgets, which needs default_command self.dialog.default_command = None - # Since text parameter of .open is not used in base class, - # pass dummy 'text' instead of tk.Text(). - self.dialog.open('text') + toplevel = Toplevel(self.root) + self.addCleanup(toplevel.destroy) + text = Text(toplevel) + self.dialog.open(text) self.assertEqual(self.dialog.top.state(), 'normal') self.dialog.close() self.assertEqual(self.dialog.top.state(), 'withdrawn') - self.dialog.open('text', searchphrase="hello") + self.dialog.open(text, searchphrase="hello") self.assertEqual(self.dialog.ent.get(), 'hello') self.dialog.close() diff --git a/Lib/idlelib/searchbase.py b/Lib/idlelib/searchbase.py index 4ed94f186b04..6fba0b8e583f 100644 --- a/Lib/idlelib/searchbase.py +++ b/Lib/idlelib/searchbase.py @@ -54,6 +54,7 @@ def open(self, text, searchphrase=None): else: self.top.deiconify() self.top.tkraise() + self.top.transient(text.winfo_toplevel()) if searchphrase: self.ent.delete(0,"end") self.ent.insert("end",searchphrase) @@ -66,6 +67,7 @@ def close(self, event=None): "Put dialog away for later use." if self.top: self.top.grab_release() + self.top.transient('') self.top.withdraw() def create_widgets(self): diff --git a/Misc/NEWS.d/next/IDLE/2019-06-07-00-17-41.bpo-37177.voU6pQ.rst b/Misc/NEWS.d/next/IDLE/2019-06-07-00-17-41.bpo-37177.voU6pQ.rst new file mode 100644 index 000000000000..74e48eef89a6 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-06-07-00-17-41.bpo-37177.voU6pQ.rst @@ -0,0 +1,2 @@ +Properly 'attach' search dialogs to their main window so that they behave +like other dialogs and do not get hidden behind their main window. From webhook-mailer at python.org Fri Jun 7 02:17:16 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 07 Jun 2019 06:17:16 -0000 Subject: [Python-checkins] bpo-37177: make IDLE's search dialogs transient (GH-13869) Message-ID: https://github.com/python/cpython/commit/295fe32e393280464feef7c6fb616ea2d1e73e37 commit: 295fe32e393280464feef7c6fb616ea2d1e73e37 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-06T23:17:13-07:00 summary: bpo-37177: make IDLE's search dialogs transient (GH-13869) This avoids the search dialogs being hidden behind the editor window. (cherry picked from commit 554450fb4e95066e825bdb4a2d544a490daeebdc) Co-authored-by: Tal Einat files: A Misc/NEWS.d/next/IDLE/2019-06-07-00-17-41.bpo-37177.voU6pQ.rst M Lib/idlelib/idle_test/test_searchbase.py M Lib/idlelib/searchbase.py diff --git a/Lib/idlelib/idle_test/test_searchbase.py b/Lib/idlelib/idle_test/test_searchbase.py index 6dd4d7933737..e08268fde257 100644 --- a/Lib/idlelib/idle_test/test_searchbase.py +++ b/Lib/idlelib/idle_test/test_searchbase.py @@ -4,7 +4,7 @@ import unittest from test.support import requires -from tkinter import Tk +from tkinter import Text, Tk, Toplevel from tkinter.ttk import Frame from idlelib import searchengine as se from idlelib import searchbase as sdb @@ -47,14 +47,15 @@ def test_open_and_close(self): # open calls create_widgets, which needs default_command self.dialog.default_command = None - # Since text parameter of .open is not used in base class, - # pass dummy 'text' instead of tk.Text(). - self.dialog.open('text') + toplevel = Toplevel(self.root) + self.addCleanup(toplevel.destroy) + text = Text(toplevel) + self.dialog.open(text) self.assertEqual(self.dialog.top.state(), 'normal') self.dialog.close() self.assertEqual(self.dialog.top.state(), 'withdrawn') - self.dialog.open('text', searchphrase="hello") + self.dialog.open(text, searchphrase="hello") self.assertEqual(self.dialog.ent.get(), 'hello') self.dialog.close() diff --git a/Lib/idlelib/searchbase.py b/Lib/idlelib/searchbase.py index 4ed94f186b04..6fba0b8e583f 100644 --- a/Lib/idlelib/searchbase.py +++ b/Lib/idlelib/searchbase.py @@ -54,6 +54,7 @@ def open(self, text, searchphrase=None): else: self.top.deiconify() self.top.tkraise() + self.top.transient(text.winfo_toplevel()) if searchphrase: self.ent.delete(0,"end") self.ent.insert("end",searchphrase) @@ -66,6 +67,7 @@ def close(self, event=None): "Put dialog away for later use." if self.top: self.top.grab_release() + self.top.transient('') self.top.withdraw() def create_widgets(self): diff --git a/Misc/NEWS.d/next/IDLE/2019-06-07-00-17-41.bpo-37177.voU6pQ.rst b/Misc/NEWS.d/next/IDLE/2019-06-07-00-17-41.bpo-37177.voU6pQ.rst new file mode 100644 index 000000000000..74e48eef89a6 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-06-07-00-17-41.bpo-37177.voU6pQ.rst @@ -0,0 +1,2 @@ +Properly 'attach' search dialogs to their main window so that they behave +like other dialogs and do not get hidden behind their main window. From webhook-mailer at python.org Fri Jun 7 02:37:36 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 07 Jun 2019 06:37:36 -0000 Subject: [Python-checkins] bpo-37177: make IDLE's search dialogs transient (GH-13869) Message-ID: https://github.com/python/cpython/commit/685b806549cc956aeeb3a57fe15ee5a4d1704aed commit: 685b806549cc956aeeb3a57fe15ee5a4d1704aed branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-06T23:37:32-07:00 summary: bpo-37177: make IDLE's search dialogs transient (GH-13869) This avoids the search dialogs being hidden behind the editor window. (cherry picked from commit 554450fb4e95066e825bdb4a2d544a490daeebdc) Co-authored-by: Tal Einat files: A Misc/NEWS.d/next/IDLE/2019-06-07-00-17-41.bpo-37177.voU6pQ.rst M Lib/idlelib/idle_test/test_searchbase.py M Lib/idlelib/searchbase.py diff --git a/Lib/idlelib/idle_test/test_searchbase.py b/Lib/idlelib/idle_test/test_searchbase.py index 6dd4d7933737..e08268fde257 100644 --- a/Lib/idlelib/idle_test/test_searchbase.py +++ b/Lib/idlelib/idle_test/test_searchbase.py @@ -4,7 +4,7 @@ import unittest from test.support import requires -from tkinter import Tk +from tkinter import Text, Tk, Toplevel from tkinter.ttk import Frame from idlelib import searchengine as se from idlelib import searchbase as sdb @@ -47,14 +47,15 @@ def test_open_and_close(self): # open calls create_widgets, which needs default_command self.dialog.default_command = None - # Since text parameter of .open is not used in base class, - # pass dummy 'text' instead of tk.Text(). - self.dialog.open('text') + toplevel = Toplevel(self.root) + self.addCleanup(toplevel.destroy) + text = Text(toplevel) + self.dialog.open(text) self.assertEqual(self.dialog.top.state(), 'normal') self.dialog.close() self.assertEqual(self.dialog.top.state(), 'withdrawn') - self.dialog.open('text', searchphrase="hello") + self.dialog.open(text, searchphrase="hello") self.assertEqual(self.dialog.ent.get(), 'hello') self.dialog.close() diff --git a/Lib/idlelib/searchbase.py b/Lib/idlelib/searchbase.py index 4ed94f186b04..6fba0b8e583f 100644 --- a/Lib/idlelib/searchbase.py +++ b/Lib/idlelib/searchbase.py @@ -54,6 +54,7 @@ def open(self, text, searchphrase=None): else: self.top.deiconify() self.top.tkraise() + self.top.transient(text.winfo_toplevel()) if searchphrase: self.ent.delete(0,"end") self.ent.insert("end",searchphrase) @@ -66,6 +67,7 @@ def close(self, event=None): "Put dialog away for later use." if self.top: self.top.grab_release() + self.top.transient('') self.top.withdraw() def create_widgets(self): diff --git a/Misc/NEWS.d/next/IDLE/2019-06-07-00-17-41.bpo-37177.voU6pQ.rst b/Misc/NEWS.d/next/IDLE/2019-06-07-00-17-41.bpo-37177.voU6pQ.rst new file mode 100644 index 000000000000..74e48eef89a6 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-06-07-00-17-41.bpo-37177.voU6pQ.rst @@ -0,0 +1,2 @@ +Properly 'attach' search dialogs to their main window so that they behave +like other dialogs and do not get hidden behind their main window. From webhook-mailer at python.org Fri Jun 7 02:53:09 2019 From: webhook-mailer at python.org (Tal Einat) Date: Fri, 07 Jun 2019 06:53:09 -0000 Subject: [Python-checkins] [2.7] bpo-37177: make IDLE's search dialogs transient (GH-13869) Message-ID: https://github.com/python/cpython/commit/1b57ab5c6478b93cf4150bd8c475022252776598 commit: 1b57ab5c6478b93cf4150bd8c475022252776598 branch: 2.7 author: Tal Einat committer: GitHub date: 2019-06-07T09:53:05+03:00 summary: [2.7] bpo-37177: make IDLE's search dialogs transient (GH-13869) This avoids the search dialogs being hidden behind the editor window. (cherry picked from commit 554450fb4e95066e825bdb4a2d544a490daeebdc) files: A Misc/NEWS.d/next/IDLE/2019-06-07-00-17-41.bpo-37177.voU6pQ.rst M Lib/idlelib/SearchDialogBase.py M Lib/idlelib/idle_test/test_searchdialogbase.py diff --git a/Lib/idlelib/SearchDialogBase.py b/Lib/idlelib/SearchDialogBase.py index 651e7f4a3fcd..9eb8b223ffda 100644 --- a/Lib/idlelib/SearchDialogBase.py +++ b/Lib/idlelib/SearchDialogBase.py @@ -52,6 +52,7 @@ def open(self, text, searchphrase=None): else: self.top.deiconify() self.top.tkraise() + self.top.transient(text.winfo_toplevel()) if searchphrase: self.ent.delete(0,"end") self.ent.insert("end",searchphrase) @@ -64,6 +65,7 @@ def close(self, event=None): "Put dialog away for later use." if self.top: self.top.grab_release() + self.top.transient('') self.top.withdraw() def create_widgets(self): diff --git a/Lib/idlelib/idle_test/test_searchdialogbase.py b/Lib/idlelib/idle_test/test_searchdialogbase.py index 32abfe6f792d..7ca6bbf69347 100644 --- a/Lib/idlelib/idle_test/test_searchdialogbase.py +++ b/Lib/idlelib/idle_test/test_searchdialogbase.py @@ -6,7 +6,7 @@ ''' import unittest from test.test_support import requires -from Tkinter import Tk, Toplevel, Frame ## BooleanVar, StringVar +from Tkinter import Text, Tk, Toplevel, Frame ## BooleanVar, StringVar from idlelib import SearchEngine as se from idlelib import SearchDialogBase as sdb from idlelib.idle_test.mock_idle import Func @@ -45,14 +45,15 @@ def test_open_and_close(self): # open calls create_widgets, which needs default_command self.dialog.default_command = None - # Since text parameter of .open is not used in base class, - # pass dummy 'text' instead of tk.Text(). - self.dialog.open('text') + toplevel = Toplevel(self.root) + self.addCleanup(toplevel.destroy) + text = Text(toplevel) + self.dialog.open(text) self.assertEqual(self.dialog.top.state(), 'normal') self.dialog.close() self.assertEqual(self.dialog.top.state(), 'withdrawn') - self.dialog.open('text', searchphrase="hello") + self.dialog.open(text, searchphrase="hello") self.assertEqual(self.dialog.ent.get(), 'hello') self.dialog.close() diff --git a/Misc/NEWS.d/next/IDLE/2019-06-07-00-17-41.bpo-37177.voU6pQ.rst b/Misc/NEWS.d/next/IDLE/2019-06-07-00-17-41.bpo-37177.voU6pQ.rst new file mode 100644 index 000000000000..74e48eef89a6 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-06-07-00-17-41.bpo-37177.voU6pQ.rst @@ -0,0 +1,2 @@ +Properly 'attach' search dialogs to their main window so that they behave +like other dialogs and do not get hidden behind their main window. From webhook-mailer at python.org Fri Jun 7 04:13:58 2019 From: webhook-mailer at python.org (Stefan Krah) Date: Fri, 07 Jun 2019 08:13:58 -0000 Subject: [Python-checkins] bpo-37188: Fix a divide-by-zero in arrays of size-0 objects (#13881) Message-ID: https://github.com/python/cpython/commit/0690c79c419b8d2bdfe7c5b6dca57b018f5a5a54 commit: 0690c79c419b8d2bdfe7c5b6dca57b018f5a5a54 branch: master author: Eric Wieser committer: Stefan Krah date: 2019-06-07T10:13:26+02:00 summary: bpo-37188: Fix a divide-by-zero in arrays of size-0 objects (#13881) files: M Lib/ctypes/test/test_arrays.py M Modules/_ctypes/_ctypes.c diff --git a/Lib/ctypes/test/test_arrays.py b/Lib/ctypes/test/test_arrays.py index 87ecbf04e7ed..a3e6d76940e0 100644 --- a/Lib/ctypes/test/test_arrays.py +++ b/Lib/ctypes/test/test_arrays.py @@ -208,6 +208,21 @@ class T(Array): _type_ = c_int _length_ = 0 + def test_empty_element_struct(self): + class EmptyStruct(Structure): + _fields_ = [] + + obj = (EmptyStruct * 2)() # bpo37188: Floating point exception + assert sizeof(obj) == 0 + + def test_empty_element_array(self): + class EmptyArray(Array): + _type_ = c_int + _length_ = 0 + + obj = (EmptyArray * 2)() # bpo37188: Floating point exception + assert sizeof(obj) == 0 + def test_bpo36504_signed_int_overflow(self): # The overflow check in PyCArrayType_new() could cause signed integer # overflow. diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index f7513a3d74c4..2201c4520ad0 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -1518,7 +1518,7 @@ PyCArrayType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) } itemsize = itemdict->size; - if (length > PY_SSIZE_T_MAX / itemsize) { + if (itemsize != 0 && length > PY_SSIZE_T_MAX / itemsize) { PyErr_SetString(PyExc_OverflowError, "array too large"); goto error; From webhook-mailer at python.org Fri Jun 7 04:34:20 2019 From: webhook-mailer at python.org (Stefan Krah) Date: Fri, 07 Jun 2019 08:34:20 -0000 Subject: [Python-checkins] bpo-37188: Fix a divide-by-zero in arrays of size-0 objects (GH-13881) (#13882) Message-ID: https://github.com/python/cpython/commit/8f0bbbdcae73f275faff90cc4559f6111116f001 commit: 8f0bbbdcae73f275faff90cc4559f6111116f001 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Stefan Krah date: 2019-06-07T10:34:14+02:00 summary: bpo-37188: Fix a divide-by-zero in arrays of size-0 objects (GH-13881) (#13882) files: M Lib/ctypes/test/test_arrays.py M Modules/_ctypes/_ctypes.c diff --git a/Lib/ctypes/test/test_arrays.py b/Lib/ctypes/test/test_arrays.py index 37719399e277..9e41f45dc9b1 100644 --- a/Lib/ctypes/test/test_arrays.py +++ b/Lib/ctypes/test/test_arrays.py @@ -194,6 +194,21 @@ class T(Array): _type_ = c_int _length_ = 1.87 + def test_empty_element_struct(self): + class EmptyStruct(Structure): + _fields_ = [] + + obj = (EmptyStruct * 2)() # bpo37188: Floating point exception + assert sizeof(obj) == 0 + + def test_empty_element_array(self): + class EmptyArray(Array): + _type_ = c_int + _length_ = 0 + + obj = (EmptyArray * 2)() # bpo37188: Floating point exception + assert sizeof(obj) == 0 + def test_bpo36504_signed_int_overflow(self): # The overflow check in PyCArrayType_new() could cause signed integer # overflow. diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 0692b458354c..8fa662755261 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -1466,7 +1466,7 @@ PyCArrayType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) } itemsize = itemdict->size; - if (length > PY_SSIZE_T_MAX / itemsize) { + if (itemsize != 0 && length > PY_SSIZE_T_MAX / itemsize) { PyErr_SetString(PyExc_OverflowError, "array too large"); goto error; From webhook-mailer at python.org Fri Jun 7 05:08:26 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Fri, 07 Jun 2019 09:08:26 -0000 Subject: [Python-checkins] IDLE: Standardize naming convention for DummyEditwin in tests (GH-13876) Message-ID: https://github.com/python/cpython/commit/7f8a38a7c47823c17adab469fcb4f762f4e945b7 commit: 7f8a38a7c47823c17adab469fcb4f762f4e945b7 branch: master author: Cheryl Sabella committer: GitHub date: 2019-06-07T05:08:20-04:00 summary: IDLE: Standardize naming convention for DummyEditwin in tests (GH-13876) * Change from Dummy_Editwin to DummyEditwin to match other tests. files: M Lib/idlelib/idle_test/test_autoexpand.py diff --git a/Lib/idlelib/idle_test/test_autoexpand.py b/Lib/idlelib/idle_test/test_autoexpand.py index e5f44c468713..e734a8be714a 100644 --- a/Lib/idlelib/idle_test/test_autoexpand.py +++ b/Lib/idlelib/idle_test/test_autoexpand.py @@ -6,7 +6,7 @@ from tkinter import Text, Tk -class Dummy_Editwin: +class DummyEditwin: # AutoExpand.__init__ only needs .text def __init__(self, text): self.text = text @@ -18,7 +18,7 @@ def setUpClass(cls): requires('gui') cls.tk = Tk() cls.text = Text(cls.tk) - cls.auto_expand = AutoExpand(Dummy_Editwin(cls.text)) + cls.auto_expand = AutoExpand(DummyEditwin(cls.text)) cls.auto_expand.bell = lambda: None # If mock_tk.Text._decode understood indexes 'insert' with suffixed 'linestart', From webhook-mailer at python.org Fri Jun 7 05:18:38 2019 From: webhook-mailer at python.org (Stefan Krah) Date: Fri, 07 Jun 2019 09:18:38 -0000 Subject: [Python-checkins] Use assertEqual(). (#13883) Message-ID: https://github.com/python/cpython/commit/307d4cb957b9d34fdbbb40730f738c61c2e49be9 commit: 307d4cb957b9d34fdbbb40730f738c61c2e49be9 branch: master author: Stefan Krah committer: GitHub date: 2019-06-07T11:18:34+02:00 summary: Use assertEqual(). (#13883) files: M Lib/ctypes/test/test_arrays.py diff --git a/Lib/ctypes/test/test_arrays.py b/Lib/ctypes/test/test_arrays.py index a3e6d76940e0..14603b7049c9 100644 --- a/Lib/ctypes/test/test_arrays.py +++ b/Lib/ctypes/test/test_arrays.py @@ -213,7 +213,7 @@ class EmptyStruct(Structure): _fields_ = [] obj = (EmptyStruct * 2)() # bpo37188: Floating point exception - assert sizeof(obj) == 0 + self.assertEqual(sizeof(obj), 0) def test_empty_element_array(self): class EmptyArray(Array): @@ -221,7 +221,7 @@ class EmptyArray(Array): _length_ = 0 obj = (EmptyArray * 2)() # bpo37188: Floating point exception - assert sizeof(obj) == 0 + self.assertEqual(sizeof(obj), 0) def test_bpo36504_signed_int_overflow(self): # The overflow check in PyCArrayType_new() could cause signed integer From webhook-mailer at python.org Fri Jun 7 05:29:11 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 07 Jun 2019 09:29:11 -0000 Subject: [Python-checkins] IDLE: Standardize naming convention for DummyEditwin in tests (GH-13876) Message-ID: https://github.com/python/cpython/commit/f09d91552cc39c65a386f4bfb3a7d0d05cb13d01 commit: f09d91552cc39c65a386f4bfb3a7d0d05cb13d01 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-07T02:29:03-07:00 summary: IDLE: Standardize naming convention for DummyEditwin in tests (GH-13876) * Change from Dummy_Editwin to DummyEditwin to match other tests. (cherry picked from commit 7f8a38a7c47823c17adab469fcb4f762f4e945b7) Co-authored-by: Cheryl Sabella files: M Lib/idlelib/idle_test/test_autoexpand.py diff --git a/Lib/idlelib/idle_test/test_autoexpand.py b/Lib/idlelib/idle_test/test_autoexpand.py index e5f44c468713..e734a8be714a 100644 --- a/Lib/idlelib/idle_test/test_autoexpand.py +++ b/Lib/idlelib/idle_test/test_autoexpand.py @@ -6,7 +6,7 @@ from tkinter import Text, Tk -class Dummy_Editwin: +class DummyEditwin: # AutoExpand.__init__ only needs .text def __init__(self, text): self.text = text @@ -18,7 +18,7 @@ def setUpClass(cls): requires('gui') cls.tk = Tk() cls.text = Text(cls.tk) - cls.auto_expand = AutoExpand(Dummy_Editwin(cls.text)) + cls.auto_expand = AutoExpand(DummyEditwin(cls.text)) cls.auto_expand.bell = lambda: None # If mock_tk.Text._decode understood indexes 'insert' with suffixed 'linestart', From webhook-mailer at python.org Fri Jun 7 05:47:22 2019 From: webhook-mailer at python.org (Stefan Krah) Date: Fri, 07 Jun 2019 09:47:22 -0000 Subject: [Python-checkins] Use assertEqual(). (#13886) Message-ID: https://github.com/python/cpython/commit/4ea9dbda4ad823875ed79a25062a7f5415d91b22 commit: 4ea9dbda4ad823875ed79a25062a7f5415d91b22 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Stefan Krah date: 2019-06-07T11:47:16+02:00 summary: Use assertEqual(). (#13886) files: M Lib/ctypes/test/test_arrays.py diff --git a/Lib/ctypes/test/test_arrays.py b/Lib/ctypes/test/test_arrays.py index 9e41f45dc9b1..63a00b9e3cdb 100644 --- a/Lib/ctypes/test/test_arrays.py +++ b/Lib/ctypes/test/test_arrays.py @@ -199,7 +199,7 @@ class EmptyStruct(Structure): _fields_ = [] obj = (EmptyStruct * 2)() # bpo37188: Floating point exception - assert sizeof(obj) == 0 + self.assertEqual(sizeof(obj), 0) def test_empty_element_array(self): class EmptyArray(Array): @@ -207,7 +207,7 @@ class EmptyArray(Array): _length_ = 0 obj = (EmptyArray * 2)() # bpo37188: Floating point exception - assert sizeof(obj) == 0 + self.assertEqual(sizeof(obj), 0) def test_bpo36504_signed_int_overflow(self): # The overflow check in PyCArrayType_new() could cause signed integer From webhook-mailer at python.org Fri Jun 7 06:20:39 2019 From: webhook-mailer at python.org (Petr Viktorin) Date: Fri, 07 Jun 2019 10:20:39 -0000 Subject: [Python-checkins] bpo-37151: simplify classmethoddescr_call (GH-13340) Message-ID: https://github.com/python/cpython/commit/3f345c39255dc3823dd989d4e3c93b12d18c44e0 commit: 3f345c39255dc3823dd989d4e3c93b12d18c44e0 branch: master author: Jeroen Demeyer committer: Petr Viktorin date: 2019-06-07T12:20:23+02:00 summary: bpo-37151: simplify classmethoddescr_call (GH-13340) files: M Lib/test/test_descr.py M Objects/descrobject.c diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 6b018ccc56fa..301a2d2a0fd2 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -1613,8 +1613,8 @@ class SubSpam(spam.spamlist): pass spam_cm(spam.spamlist()) self.assertEqual( str(cm.exception), - "descriptor 'classmeth' requires a type " - "but received a 'xxsubtype.spamlist' instance") + "descriptor 'classmeth' for type 'xxsubtype.spamlist' " + "needs a type, not a 'xxsubtype.spamlist' as arg 2") with self.assertRaises(TypeError) as cm: spam_cm(list) diff --git a/Objects/descrobject.c b/Objects/descrobject.c index 6c95a8726c42..806c0af97e24 100644 --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -300,16 +300,19 @@ _PyMethodDescr_Vectorcall(PyObject *descrobj, return result; } +/* Instances of classmethod_descriptor are unlikely to be called directly. + For one, the analogous class "classmethod" (for Python classes) is not + callable. Second, users are not likely to access a classmethod_descriptor + directly, since it means pulling it from the class __dict__. + + This is just an excuse to say that this doesn't need to be optimized: + we implement this simply by calling __get__ and then calling the result. +*/ static PyObject * classmethoddescr_call(PyMethodDescrObject *descr, PyObject *args, PyObject *kwds) { - Py_ssize_t argc; - PyObject *self, *result; - - /* Make sure that the first argument is acceptable as 'self' */ - assert(PyTuple_Check(args)); - argc = PyTuple_GET_SIZE(args); + Py_ssize_t argc = PyTuple_GET_SIZE(args); if (argc < 1) { PyErr_Format(PyExc_TypeError, "descriptor '%V' of '%.100s' " @@ -318,30 +321,15 @@ classmethoddescr_call(PyMethodDescrObject *descr, PyObject *args, PyDescr_TYPE(descr)->tp_name); return NULL; } - self = PyTuple_GET_ITEM(args, 0); - if (!PyType_Check(self)) { - PyErr_Format(PyExc_TypeError, - "descriptor '%V' requires a type " - "but received a '%.100s' instance", - descr_name((PyDescrObject *)descr), "?", - self->ob_type->tp_name); - return NULL; - } - if (!PyType_IsSubtype((PyTypeObject *)self, PyDescr_TYPE(descr))) { - PyErr_Format(PyExc_TypeError, - "descriptor '%V' requires a subtype of '%.100s' " - "but received '%.100s'", - descr_name((PyDescrObject *)descr), "?", - PyDescr_TYPE(descr)->tp_name, - ((PyTypeObject*)self)->tp_name); + PyObject *self = PyTuple_GET_ITEM(args, 0); + PyObject *bound = classmethod_get(descr, NULL, self); + if (bound == NULL) { return NULL; } - - result = _PyMethodDef_RawFastCallDict(descr->d_method, self, - &_PyTuple_ITEMS(args)[1], argc - 1, - kwds); - result = _Py_CheckFunctionResult((PyObject *)descr, result, NULL); - return result; + PyObject *res = _PyObject_FastCallDict(bound, _PyTuple_ITEMS(args)+1, + argc-1, kwds); + Py_DECREF(bound); + return res; } Py_LOCAL_INLINE(PyObject *) From webhook-mailer at python.org Fri Jun 7 10:22:27 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 07 Jun 2019 14:22:27 -0000 Subject: [Python-checkins] bpo-37169: Rewrite _PyObject_IsFreed() unit tests (GH-13888) Message-ID: https://github.com/python/cpython/commit/3bf0f3ad2046ac674d8e8a2c074a5a8b3327797d commit: 3bf0f3ad2046ac674d8e8a2c074a5a8b3327797d branch: master author: Victor Stinner committer: GitHub date: 2019-06-07T16:22:21+02:00 summary: bpo-37169: Rewrite _PyObject_IsFreed() unit tests (GH-13888) Replace two Python function calls with a single one to ensure that no memory allocation is done between the invalid object is created and when _PyObject_IsFreed() is called. files: A Misc/NEWS.d/next/Tests/2019-06-07-12-23-15.bpo-37169.yfXTFg.rst M Lib/test/test_capi.py M Modules/_testcapimodule.c diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index 43d7a08da944..6a20f479c53f 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -705,28 +705,29 @@ def test_pyobject_malloc_without_gil(self): code = 'import _testcapi; _testcapi.pyobject_malloc_without_gil()' self.check_malloc_without_gil(code) - def check_pyobject_is_freed(self, func): - code = textwrap.dedent(''' + def check_pyobject_is_freed(self, func_name): + code = textwrap.dedent(f''' import gc, os, sys, _testcapi # Disable the GC to avoid crash on GC collection gc.disable() - obj = _testcapi.{func}() - error = (_testcapi.pyobject_is_freed(obj) == False) - # Exit immediately to avoid a crash while deallocating - # the invalid object - os._exit(int(error)) + try: + _testcapi.{func_name}() + # Exit immediately to avoid a crash while deallocating + # the invalid object + os._exit(0) + except _testcapi.error: + os._exit(1) ''') - code = code.format(func=func) assert_python_ok('-c', code, PYTHONMALLOC=self.PYTHONMALLOC) - def test_pyobject_is_freed_uninitialized(self): - self.check_pyobject_is_freed('pyobject_uninitialized') + def test_pyobject_uninitialized_is_freed(self): + self.check_pyobject_is_freed('check_pyobject_uninitialized_is_freed') - def test_pyobject_is_freed_forbidden_bytes(self): - self.check_pyobject_is_freed('pyobject_forbidden_bytes') + def test_pyobject_forbidden_bytes_is_freed(self): + self.check_pyobject_is_freed('check_pyobject_forbidden_bytes_is_freed') - def test_pyobject_is_freed_free(self): - self.check_pyobject_is_freed('pyobject_freed') + def test_pyobject_freed_is_freed(self): + self.check_pyobject_is_freed('check_pyobject_freed_is_freed') class PyMemMallocDebugTests(PyMemDebugTests): diff --git a/Misc/NEWS.d/next/Tests/2019-06-07-12-23-15.bpo-37169.yfXTFg.rst b/Misc/NEWS.d/next/Tests/2019-06-07-12-23-15.bpo-37169.yfXTFg.rst new file mode 100644 index 000000000000..f2f0a8b8d8ea --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-06-07-12-23-15.bpo-37169.yfXTFg.rst @@ -0,0 +1 @@ +Rewrite ``_PyObject_IsFreed()`` unit tests. diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index c1ae237f2e6c..07aadea3e983 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -4489,15 +4489,17 @@ test_pymem_getallocatorsname(PyObject *self, PyObject *args) static PyObject* -pyobject_is_freed(PyObject *self, PyObject *op) +test_pyobject_is_freed(const char *test_name, PyObject *op) { - int res = _PyObject_IsFreed(op); - return PyBool_FromLong(res); + if (!_PyObject_IsFreed(op)) { + return raiseTestError(test_name, "object is not seen as freed"); + } + Py_RETURN_NONE; } static PyObject* -pyobject_uninitialized(PyObject *self, PyObject *args) +check_pyobject_uninitialized_is_freed(PyObject *self, PyObject *Py_UNUSED(args)) { PyObject *op = (PyObject *)PyObject_Malloc(sizeof(PyObject)); if (op == NULL) { @@ -4506,12 +4508,12 @@ pyobject_uninitialized(PyObject *self, PyObject *args) /* Initialize reference count to avoid early crash in ceval or GC */ Py_REFCNT(op) = 1; /* object fields like ob_type are uninitialized! */ - return op; + return test_pyobject_is_freed("check_pyobject_uninitialized_is_freed", op); } static PyObject* -pyobject_forbidden_bytes(PyObject *self, PyObject *args) +check_pyobject_forbidden_bytes_is_freed(PyObject *self, PyObject *Py_UNUSED(args)) { /* Allocate an incomplete PyObject structure: truncate 'ob_type' field */ PyObject *op = (PyObject *)PyObject_Malloc(offsetof(PyObject, ob_type)); @@ -4522,12 +4524,12 @@ pyobject_forbidden_bytes(PyObject *self, PyObject *args) Py_REFCNT(op) = 1; /* ob_type field is after the memory block: part of "forbidden bytes" when using debug hooks on memory allocatrs! */ - return op; + return test_pyobject_is_freed("check_pyobject_forbidden_bytes_is_freed", op); } static PyObject* -pyobject_freed(PyObject *self, PyObject *args) +check_pyobject_freed_is_freed(PyObject *self, PyObject *Py_UNUSED(args)) { PyObject *op = _PyObject_CallNoArg((PyObject *)&PyBaseObject_Type); if (op == NULL) { @@ -4537,7 +4539,7 @@ pyobject_freed(PyObject *self, PyObject *args) /* Reset reference count to avoid early crash in ceval or GC */ Py_REFCNT(op) = 1; /* object memory is freed! */ - return op; + return test_pyobject_is_freed("check_pyobject_freed_is_freed", op); } @@ -5264,10 +5266,9 @@ static PyMethodDef TestMethods[] = { {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS}, {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS}, {"pymem_getallocatorsname", test_pymem_getallocatorsname, METH_NOARGS}, - {"pyobject_is_freed", (PyCFunction)(void(*)(void))pyobject_is_freed, METH_O}, - {"pyobject_uninitialized", pyobject_uninitialized, METH_NOARGS}, - {"pyobject_forbidden_bytes", pyobject_forbidden_bytes, METH_NOARGS}, - {"pyobject_freed", pyobject_freed, METH_NOARGS}, + {"check_pyobject_uninitialized_is_freed", check_pyobject_uninitialized_is_freed, METH_NOARGS}, + {"check_pyobject_forbidden_bytes_is_freed", check_pyobject_forbidden_bytes_is_freed, METH_NOARGS}, + {"check_pyobject_freed_is_freed", check_pyobject_freed_is_freed, METH_NOARGS}, {"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS}, {"tracemalloc_track", tracemalloc_track, METH_VARARGS}, {"tracemalloc_untrack", tracemalloc_untrack, METH_VARARGS}, From webhook-mailer at python.org Fri Jun 7 10:23:02 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 07 Jun 2019 14:23:02 -0000 Subject: [Python-checkins] [3.8] bpo-37170: Fix the cast on error in PyLong_AsUnsignedLongLongMask() (GH-13860) (GH-13891) Message-ID: https://github.com/python/cpython/commit/dd492d9c352eb0fa2bc48ea9acc47e47a7fab8a0 commit: dd492d9c352eb0fa2bc48ea9acc47e47a7fab8a0 branch: 3.8 author: Zackery Spytz committer: Victor Stinner date: 2019-06-07T16:22:58+02:00 summary: [3.8] bpo-37170: Fix the cast on error in PyLong_AsUnsignedLongLongMask() (GH-13860) (GH-13891) (cherry picked from commit dc2476500d91082f0c907772c83a044bf49af279) Co-authored-by: Zackery Spytz files: A Misc/NEWS.d/next/C API/2019-06-06-08-47-04.bpo-37170.hO_fpM.rst M Doc/c-api/long.rst M Modules/_testcapimodule.c M Objects/longobject.c diff --git a/Doc/c-api/long.rst b/Doc/c-api/long.rst index 6be29f9cd32e..fdaefafe21ba 100644 --- a/Doc/c-api/long.rst +++ b/Doc/c-api/long.rst @@ -288,7 +288,8 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. If the value of *obj* is out of range for an :c:type:`unsigned long`, return the reduction of that value modulo ``ULONG_MAX + 1``. - Returns ``-1`` on error. Use :c:func:`PyErr_Occurred` to disambiguate. + Returns ``(unsigned long)-1`` on error. Use :c:func:`PyErr_Occurred` to + disambiguate. .. versionchanged:: 3.8 Use :meth:`__index__` if available. @@ -307,7 +308,8 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. If the value of *obj* is out of range for an :c:type:`unsigned long long`, return the reduction of that value modulo ``PY_ULLONG_MAX + 1``. - Returns ``-1`` on error. Use :c:func:`PyErr_Occurred` to disambiguate. + Returns ``(unsigned long long)-1`` on error. Use :c:func:`PyErr_Occurred` + to disambiguate. .. versionchanged:: 3.8 Use :meth:`__index__` if available. diff --git a/Misc/NEWS.d/next/C API/2019-06-06-08-47-04.bpo-37170.hO_fpM.rst b/Misc/NEWS.d/next/C API/2019-06-06-08-47-04.bpo-37170.hO_fpM.rst new file mode 100644 index 000000000000..7a35c9583d69 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2019-06-06-08-47-04.bpo-37170.hO_fpM.rst @@ -0,0 +1 @@ +Fix the cast on error in :c:func:`PyLong_AsUnsignedLongLongMask()`. diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index f059b4df11b7..c1ae237f2e6c 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -825,6 +825,26 @@ test_long_as_size_t(PyObject *self, PyObject *Py_UNUSED(ignored)) return Py_None; } +static PyObject * +test_long_as_unsigned_long_long_mask(PyObject *self, + PyObject *Py_UNUSED(ignored)) +{ + unsigned long long res = PyLong_AsUnsignedLongLongMask(NULL); + + if (res != (unsigned long long)-1 || !PyErr_Occurred()) { + return raiseTestError("test_long_as_unsigned_long_long_mask", + "PyLong_AsUnsignedLongLongMask(NULL) didn't " + "complain"); + } + if (!PyErr_ExceptionMatches(PyExc_SystemError)) { + return raiseTestError("test_long_as_unsigned_long_long_mask", + "PyLong_AsUnsignedLongLongMask(NULL) raised " + "something other than SystemError"); + } + PyErr_Clear(); + Py_RETURN_NONE; +} + /* Test the PyLong_AsDouble API. At present this just tests that non-integer arguments are handled correctly. */ @@ -5070,6 +5090,8 @@ static PyMethodDef TestMethods[] = { {"test_long_and_overflow", test_long_and_overflow, METH_NOARGS}, {"test_long_as_double", test_long_as_double, METH_NOARGS}, {"test_long_as_size_t", test_long_as_size_t, METH_NOARGS}, + {"test_long_as_unsigned_long_long_mask", + test_long_as_unsigned_long_long_mask, METH_NOARGS}, {"test_long_numbits", test_long_numbits, METH_NOARGS}, {"test_k_code", test_k_code, METH_NOARGS}, {"test_empty_argparse", test_empty_argparse, METH_NOARGS}, diff --git a/Objects/longobject.c b/Objects/longobject.c index a1103f697c73..50ea2a4e54a4 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -1376,7 +1376,7 @@ _PyLong_AsUnsignedLongLongMask(PyObject *vv) if (vv == NULL || !PyLong_Check(vv)) { PyErr_BadInternalCall(); - return (unsigned long) -1; + return (unsigned long long) -1; } v = (PyLongObject *)vv; switch(Py_SIZE(v)) { @@ -1404,7 +1404,7 @@ PyLong_AsUnsignedLongLongMask(PyObject *op) if (op == NULL) { PyErr_BadInternalCall(); - return (unsigned long)-1; + return (unsigned long long)-1; } if (PyLong_Check(op)) { From webhook-mailer at python.org Fri Jun 7 11:41:33 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 07 Jun 2019 15:41:33 -0000 Subject: [Python-checkins] [3.7] bpo-37170: Fix the cast on error in PyLong_AsUnsignedLongLongMask() (GH-13860) (GH-13896) Message-ID: https://github.com/python/cpython/commit/e36ed475ea429f7cc80a4d65f80b44686a74b246 commit: e36ed475ea429f7cc80a4d65f80b44686a74b246 branch: 3.7 author: Zackery Spytz committer: Victor Stinner date: 2019-06-07T17:41:10+02:00 summary: [3.7] bpo-37170: Fix the cast on error in PyLong_AsUnsignedLongLongMask() (GH-13860) (GH-13896) (cherry picked from commit dc2476500d91082f0c907772c83a044bf49af279) Co-authored-by: Zackery Spytz files: A Misc/NEWS.d/next/C API/2019-06-06-08-47-04.bpo-37170.hO_fpM.rst M Doc/c-api/long.rst M Modules/_testcapimodule.c M Objects/longobject.c diff --git a/Doc/c-api/long.rst b/Doc/c-api/long.rst index 5b1f386fb7e5..71144f16e395 100644 --- a/Doc/c-api/long.rst +++ b/Doc/c-api/long.rst @@ -259,7 +259,8 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. If the value of *obj* is out of range for an :c:type:`unsigned long`, return the reduction of that value modulo ``ULONG_MAX + 1``. - Returns ``-1`` on error. Use :c:func:`PyErr_Occurred` to disambiguate. + Returns ``(unsigned long)-1`` on error. Use :c:func:`PyErr_Occurred` to + disambiguate. .. c:function:: unsigned long long PyLong_AsUnsignedLongLongMask(PyObject *obj) @@ -271,7 +272,8 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. If the value of *obj* is out of range for an :c:type:`unsigned long long`, return the reduction of that value modulo ``PY_ULLONG_MAX + 1``. - Returns ``-1`` on error. Use :c:func:`PyErr_Occurred` to disambiguate. + Returns ``(unsigned long long)-1`` on error. Use :c:func:`PyErr_Occurred` + to disambiguate. .. c:function:: double PyLong_AsDouble(PyObject *pylong) diff --git a/Misc/NEWS.d/next/C API/2019-06-06-08-47-04.bpo-37170.hO_fpM.rst b/Misc/NEWS.d/next/C API/2019-06-06-08-47-04.bpo-37170.hO_fpM.rst new file mode 100644 index 000000000000..7a35c9583d69 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2019-06-06-08-47-04.bpo-37170.hO_fpM.rst @@ -0,0 +1 @@ +Fix the cast on error in :c:func:`PyLong_AsUnsignedLongLongMask()`. diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index b864f9270e9d..64b7b6904939 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -816,6 +816,26 @@ test_long_as_size_t(PyObject *self) return Py_None; } +static PyObject * +test_long_as_unsigned_long_long_mask(PyObject *self, + PyObject *Py_UNUSED(ignored)) +{ + unsigned long long res = PyLong_AsUnsignedLongLongMask(NULL); + + if (res != (unsigned long long)-1 || !PyErr_Occurred()) { + return raiseTestError("test_long_as_unsigned_long_long_mask", + "PyLong_AsUnsignedLongLongMask(NULL) didn't " + "complain"); + } + if (!PyErr_ExceptionMatches(PyExc_SystemError)) { + return raiseTestError("test_long_as_unsigned_long_long_mask", + "PyLong_AsUnsignedLongLongMask(NULL) raised " + "something other than SystemError"); + } + PyErr_Clear(); + Py_RETURN_NONE; +} + /* Test the PyLong_AsDouble API. At present this just tests that non-integer arguments are handled correctly. */ @@ -4663,6 +4683,8 @@ static PyMethodDef TestMethods[] = { METH_NOARGS}, {"test_long_as_double", (PyCFunction)test_long_as_double,METH_NOARGS}, {"test_long_as_size_t", (PyCFunction)test_long_as_size_t,METH_NOARGS}, + {"test_long_as_unsigned_long_long_mask", + (PyCFunction)test_long_as_unsigned_long_long_mask, METH_NOARGS}, {"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS}, {"test_k_code", (PyCFunction)test_k_code, METH_NOARGS}, {"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS}, diff --git a/Objects/longobject.c b/Objects/longobject.c index 59c7efbfee2e..7628a114e384 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -1309,7 +1309,7 @@ _PyLong_AsUnsignedLongLongMask(PyObject *vv) if (vv == NULL || !PyLong_Check(vv)) { PyErr_BadInternalCall(); - return (unsigned long) -1; + return (unsigned long long) -1; } v = (PyLongObject *)vv; switch(Py_SIZE(v)) { @@ -1337,7 +1337,7 @@ PyLong_AsUnsignedLongLongMask(PyObject *op) if (op == NULL) { PyErr_BadInternalCall(); - return (unsigned long)-1; + return (unsigned long long)-1; } if (PyLong_Check(op)) { From webhook-mailer at python.org Fri Jun 7 11:41:43 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 07 Jun 2019 15:41:43 -0000 Subject: [Python-checkins] bpo-37169: Rewrite _PyObject_IsFreed() unit tests (GH-13888) (GH-13895) Message-ID: https://github.com/python/cpython/commit/357626676035d2bb12ea92e0edf3c7b383d627ec commit: 357626676035d2bb12ea92e0edf3c7b383d627ec branch: 3.8 author: Victor Stinner committer: GitHub date: 2019-06-07T17:41:39+02:00 summary: bpo-37169: Rewrite _PyObject_IsFreed() unit tests (GH-13888) (GH-13895) Replace two Python function calls with a single one to ensure that no memory allocation is done between the invalid object is created and when _PyObject_IsFreed() is called. (cherry picked from commit 3bf0f3ad2046ac674d8e8a2c074a5a8b3327797d) files: A Misc/NEWS.d/next/Tests/2019-06-07-12-23-15.bpo-37169.yfXTFg.rst M Lib/test/test_capi.py M Modules/_testcapimodule.c diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index 43d7a08da944..6a20f479c53f 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -705,28 +705,29 @@ def test_pyobject_malloc_without_gil(self): code = 'import _testcapi; _testcapi.pyobject_malloc_without_gil()' self.check_malloc_without_gil(code) - def check_pyobject_is_freed(self, func): - code = textwrap.dedent(''' + def check_pyobject_is_freed(self, func_name): + code = textwrap.dedent(f''' import gc, os, sys, _testcapi # Disable the GC to avoid crash on GC collection gc.disable() - obj = _testcapi.{func}() - error = (_testcapi.pyobject_is_freed(obj) == False) - # Exit immediately to avoid a crash while deallocating - # the invalid object - os._exit(int(error)) + try: + _testcapi.{func_name}() + # Exit immediately to avoid a crash while deallocating + # the invalid object + os._exit(0) + except _testcapi.error: + os._exit(1) ''') - code = code.format(func=func) assert_python_ok('-c', code, PYTHONMALLOC=self.PYTHONMALLOC) - def test_pyobject_is_freed_uninitialized(self): - self.check_pyobject_is_freed('pyobject_uninitialized') + def test_pyobject_uninitialized_is_freed(self): + self.check_pyobject_is_freed('check_pyobject_uninitialized_is_freed') - def test_pyobject_is_freed_forbidden_bytes(self): - self.check_pyobject_is_freed('pyobject_forbidden_bytes') + def test_pyobject_forbidden_bytes_is_freed(self): + self.check_pyobject_is_freed('check_pyobject_forbidden_bytes_is_freed') - def test_pyobject_is_freed_free(self): - self.check_pyobject_is_freed('pyobject_freed') + def test_pyobject_freed_is_freed(self): + self.check_pyobject_is_freed('check_pyobject_freed_is_freed') class PyMemMallocDebugTests(PyMemDebugTests): diff --git a/Misc/NEWS.d/next/Tests/2019-06-07-12-23-15.bpo-37169.yfXTFg.rst b/Misc/NEWS.d/next/Tests/2019-06-07-12-23-15.bpo-37169.yfXTFg.rst new file mode 100644 index 000000000000..f2f0a8b8d8ea --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-06-07-12-23-15.bpo-37169.yfXTFg.rst @@ -0,0 +1 @@ +Rewrite ``_PyObject_IsFreed()`` unit tests. diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index c1ae237f2e6c..07aadea3e983 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -4489,15 +4489,17 @@ test_pymem_getallocatorsname(PyObject *self, PyObject *args) static PyObject* -pyobject_is_freed(PyObject *self, PyObject *op) +test_pyobject_is_freed(const char *test_name, PyObject *op) { - int res = _PyObject_IsFreed(op); - return PyBool_FromLong(res); + if (!_PyObject_IsFreed(op)) { + return raiseTestError(test_name, "object is not seen as freed"); + } + Py_RETURN_NONE; } static PyObject* -pyobject_uninitialized(PyObject *self, PyObject *args) +check_pyobject_uninitialized_is_freed(PyObject *self, PyObject *Py_UNUSED(args)) { PyObject *op = (PyObject *)PyObject_Malloc(sizeof(PyObject)); if (op == NULL) { @@ -4506,12 +4508,12 @@ pyobject_uninitialized(PyObject *self, PyObject *args) /* Initialize reference count to avoid early crash in ceval or GC */ Py_REFCNT(op) = 1; /* object fields like ob_type are uninitialized! */ - return op; + return test_pyobject_is_freed("check_pyobject_uninitialized_is_freed", op); } static PyObject* -pyobject_forbidden_bytes(PyObject *self, PyObject *args) +check_pyobject_forbidden_bytes_is_freed(PyObject *self, PyObject *Py_UNUSED(args)) { /* Allocate an incomplete PyObject structure: truncate 'ob_type' field */ PyObject *op = (PyObject *)PyObject_Malloc(offsetof(PyObject, ob_type)); @@ -4522,12 +4524,12 @@ pyobject_forbidden_bytes(PyObject *self, PyObject *args) Py_REFCNT(op) = 1; /* ob_type field is after the memory block: part of "forbidden bytes" when using debug hooks on memory allocatrs! */ - return op; + return test_pyobject_is_freed("check_pyobject_forbidden_bytes_is_freed", op); } static PyObject* -pyobject_freed(PyObject *self, PyObject *args) +check_pyobject_freed_is_freed(PyObject *self, PyObject *Py_UNUSED(args)) { PyObject *op = _PyObject_CallNoArg((PyObject *)&PyBaseObject_Type); if (op == NULL) { @@ -4537,7 +4539,7 @@ pyobject_freed(PyObject *self, PyObject *args) /* Reset reference count to avoid early crash in ceval or GC */ Py_REFCNT(op) = 1; /* object memory is freed! */ - return op; + return test_pyobject_is_freed("check_pyobject_freed_is_freed", op); } @@ -5264,10 +5266,9 @@ static PyMethodDef TestMethods[] = { {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS}, {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS}, {"pymem_getallocatorsname", test_pymem_getallocatorsname, METH_NOARGS}, - {"pyobject_is_freed", (PyCFunction)(void(*)(void))pyobject_is_freed, METH_O}, - {"pyobject_uninitialized", pyobject_uninitialized, METH_NOARGS}, - {"pyobject_forbidden_bytes", pyobject_forbidden_bytes, METH_NOARGS}, - {"pyobject_freed", pyobject_freed, METH_NOARGS}, + {"check_pyobject_uninitialized_is_freed", check_pyobject_uninitialized_is_freed, METH_NOARGS}, + {"check_pyobject_forbidden_bytes_is_freed", check_pyobject_forbidden_bytes_is_freed, METH_NOARGS}, + {"check_pyobject_freed_is_freed", check_pyobject_freed_is_freed, METH_NOARGS}, {"pyobject_malloc_without_gil", pyobject_malloc_without_gil, METH_NOARGS}, {"tracemalloc_track", tracemalloc_track, METH_VARARGS}, {"tracemalloc_untrack", tracemalloc_untrack, METH_VARARGS}, From webhook-mailer at python.org Fri Jun 7 11:51:35 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 07 Jun 2019 15:51:35 -0000 Subject: [Python-checkins] bpo-37191: Move TestPEP590 from test_capi to test_call (GH-13892) Message-ID: https://github.com/python/cpython/commit/740a84de73ad8d02655de0a084036f4b7e49a01b commit: 740a84de73ad8d02655de0a084036f4b7e49a01b branch: master author: Victor Stinner committer: GitHub date: 2019-06-07T17:51:28+02:00 summary: bpo-37191: Move TestPEP590 from test_capi to test_call (GH-13892) files: M Lib/test/test_call.py M Lib/test/test_capi.py diff --git a/Lib/test/test_call.py b/Lib/test/test_call.py index 9f0a75b84a03..b4ab74903edb 100644 --- a/Lib/test/test_call.py +++ b/Lib/test/test_call.py @@ -475,5 +475,128 @@ def __index__(self): # called, which changes the keywords dict. compile("pass", "", "exec", x, **x.kwargs) + +Py_TPFLAGS_HAVE_VECTORCALL = 1 << 11 +Py_TPFLAGS_METHOD_DESCRIPTOR = 1 << 17 + + +def testfunction(self): + """some doc""" + return self + + +def testfunction_kw(self, *, kw): + """some doc""" + return self + + +class TestPEP590(unittest.TestCase): + + def test_method_descriptor_flag(self): + import functools + cached = functools.lru_cache(1)(testfunction) + + self.assertFalse(type(repr).__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) + self.assertTrue(type(list.append).__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) + self.assertTrue(type(list.__add__).__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) + self.assertTrue(type(testfunction).__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) + self.assertTrue(type(cached).__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) + + self.assertTrue(_testcapi.MethodDescriptorBase.__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) + self.assertTrue(_testcapi.MethodDescriptorDerived.__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) + self.assertFalse(_testcapi.MethodDescriptorNopGet.__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) + + # Heap type should not inherit Py_TPFLAGS_METHOD_DESCRIPTOR + class MethodDescriptorHeap(_testcapi.MethodDescriptorBase): + pass + self.assertFalse(MethodDescriptorHeap.__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) + + def test_vectorcall_flag(self): + self.assertTrue(_testcapi.MethodDescriptorBase.__flags__ & Py_TPFLAGS_HAVE_VECTORCALL) + self.assertTrue(_testcapi.MethodDescriptorDerived.__flags__ & Py_TPFLAGS_HAVE_VECTORCALL) + self.assertFalse(_testcapi.MethodDescriptorNopGet.__flags__ & Py_TPFLAGS_HAVE_VECTORCALL) + self.assertTrue(_testcapi.MethodDescriptor2.__flags__ & Py_TPFLAGS_HAVE_VECTORCALL) + + # Heap type should not inherit Py_TPFLAGS_HAVE_VECTORCALL + class MethodDescriptorHeap(_testcapi.MethodDescriptorBase): + pass + self.assertFalse(MethodDescriptorHeap.__flags__ & Py_TPFLAGS_HAVE_VECTORCALL) + + def test_vectorcall_override(self): + # Check that tp_call can correctly override vectorcall. + # MethodDescriptorNopGet implements tp_call but it inherits from + # MethodDescriptorBase, which implements vectorcall. Since + # MethodDescriptorNopGet returns the args tuple when called, we check + # additionally that no new tuple is created for this call. + args = tuple(range(5)) + f = _testcapi.MethodDescriptorNopGet() + self.assertIs(f(*args), args) + + def test_vectorcall(self): + # Test a bunch of different ways to call objects: + # 1. vectorcall using PyVectorcall_Call() + # (only for objects that support vectorcall directly) + # 2. normal call + # 3. vectorcall using _PyObject_Vectorcall() + # 4. call as bound method + # 5. call using functools.partial + + # A list of (function, args, kwargs, result) calls to test + calls = [(len, (range(42),), {}, 42), + (list.append, ([], 0), {}, None), + ([].append, (0,), {}, None), + (sum, ([36],), {"start":6}, 42), + (testfunction, (42,), {}, 42), + (testfunction_kw, (42,), {"kw":None}, 42), + (_testcapi.MethodDescriptorBase(), (0,), {}, True), + (_testcapi.MethodDescriptorDerived(), (0,), {}, True), + (_testcapi.MethodDescriptor2(), (0,), {}, False)] + + from _testcapi import pyobject_vectorcall, pyvectorcall_call + from types import MethodType + from functools import partial + + def vectorcall(func, args, kwargs): + args = *args, *kwargs.values() + kwnames = tuple(kwargs) + return pyobject_vectorcall(func, args, kwnames) + + for (func, args, kwargs, expected) in calls: + with self.subTest(str(func)): + if not kwargs: + self.assertEqual(expected, pyvectorcall_call(func, args)) + self.assertEqual(expected, pyvectorcall_call(func, args, kwargs)) + + # Add derived classes (which do not support vectorcall directly, + # but do support all other ways of calling). + + class MethodDescriptorHeap(_testcapi.MethodDescriptorBase): + pass + + class MethodDescriptorOverridden(_testcapi.MethodDescriptorBase): + def __call__(self, n): + return 'new' + + calls += [ + (MethodDescriptorHeap(), (0,), {}, True), + (MethodDescriptorOverridden(), (0,), {}, 'new'), + ] + + for (func, args, kwargs, expected) in calls: + with self.subTest(str(func)): + args1 = args[1:] + meth = MethodType(func, args[0]) + wrapped = partial(func) + if not kwargs: + self.assertEqual(expected, func(*args)) + self.assertEqual(expected, pyobject_vectorcall(func, args, None)) + self.assertEqual(expected, meth(*args1)) + self.assertEqual(expected, wrapped(*args)) + self.assertEqual(expected, func(*args, **kwargs)) + self.assertEqual(expected, vectorcall(func, args, kwargs)) + self.assertEqual(expected, meth(*args1, **kwargs)) + self.assertEqual(expected, wrapped(*args, **kwargs)) + + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index 6a20f479c53f..45fabd599159 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -27,18 +27,11 @@ # Were we compiled --with-pydebug or with #define Py_DEBUG? Py_DEBUG = hasattr(sys, 'gettotalrefcount') -Py_TPFLAGS_HAVE_VECTORCALL = 1 << 11 -Py_TPFLAGS_METHOD_DESCRIPTOR = 1 << 17 - def testfunction(self): """some doc""" return self -def testfunction_kw(self, *, kw): - """some doc""" - return self - class InstanceMethod: id = _testcapi.instancemethod(id) @@ -471,114 +464,6 @@ def test_pendingcalls_non_threaded(self): self.pendingcalls_wait(l, n) -class TestPEP590(unittest.TestCase): - - def test_method_descriptor_flag(self): - import functools - cached = functools.lru_cache(1)(testfunction) - - self.assertFalse(type(repr).__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) - self.assertTrue(type(list.append).__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) - self.assertTrue(type(list.__add__).__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) - self.assertTrue(type(testfunction).__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) - self.assertTrue(type(cached).__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) - - self.assertTrue(_testcapi.MethodDescriptorBase.__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) - self.assertTrue(_testcapi.MethodDescriptorDerived.__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) - self.assertFalse(_testcapi.MethodDescriptorNopGet.__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) - - # Heap type should not inherit Py_TPFLAGS_METHOD_DESCRIPTOR - class MethodDescriptorHeap(_testcapi.MethodDescriptorBase): - pass - self.assertFalse(MethodDescriptorHeap.__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) - - def test_vectorcall_flag(self): - self.assertTrue(_testcapi.MethodDescriptorBase.__flags__ & Py_TPFLAGS_HAVE_VECTORCALL) - self.assertTrue(_testcapi.MethodDescriptorDerived.__flags__ & Py_TPFLAGS_HAVE_VECTORCALL) - self.assertFalse(_testcapi.MethodDescriptorNopGet.__flags__ & Py_TPFLAGS_HAVE_VECTORCALL) - self.assertTrue(_testcapi.MethodDescriptor2.__flags__ & Py_TPFLAGS_HAVE_VECTORCALL) - - # Heap type should not inherit Py_TPFLAGS_HAVE_VECTORCALL - class MethodDescriptorHeap(_testcapi.MethodDescriptorBase): - pass - self.assertFalse(MethodDescriptorHeap.__flags__ & Py_TPFLAGS_HAVE_VECTORCALL) - - def test_vectorcall_override(self): - # Check that tp_call can correctly override vectorcall. - # MethodDescriptorNopGet implements tp_call but it inherits from - # MethodDescriptorBase, which implements vectorcall. Since - # MethodDescriptorNopGet returns the args tuple when called, we check - # additionally that no new tuple is created for this call. - args = tuple(range(5)) - f = _testcapi.MethodDescriptorNopGet() - self.assertIs(f(*args), args) - - def test_vectorcall(self): - # Test a bunch of different ways to call objects: - # 1. vectorcall using PyVectorcall_Call() - # (only for objects that support vectorcall directly) - # 2. normal call - # 3. vectorcall using _PyObject_Vectorcall() - # 4. call as bound method - # 5. call using functools.partial - - # A list of (function, args, kwargs, result) calls to test - calls = [(len, (range(42),), {}, 42), - (list.append, ([], 0), {}, None), - ([].append, (0,), {}, None), - (sum, ([36],), {"start":6}, 42), - (testfunction, (42,), {}, 42), - (testfunction_kw, (42,), {"kw":None}, 42), - (_testcapi.MethodDescriptorBase(), (0,), {}, True), - (_testcapi.MethodDescriptorDerived(), (0,), {}, True), - (_testcapi.MethodDescriptor2(), (0,), {}, False)] - - from _testcapi import pyobject_vectorcall, pyvectorcall_call - from types import MethodType - from functools import partial - - def vectorcall(func, args, kwargs): - args = *args, *kwargs.values() - kwnames = tuple(kwargs) - return pyobject_vectorcall(func, args, kwnames) - - for (func, args, kwargs, expected) in calls: - with self.subTest(str(func)): - if not kwargs: - self.assertEqual(expected, pyvectorcall_call(func, args)) - self.assertEqual(expected, pyvectorcall_call(func, args, kwargs)) - - # Add derived classes (which do not support vectorcall directly, - # but do support all other ways of calling). - - class MethodDescriptorHeap(_testcapi.MethodDescriptorBase): - pass - - class MethodDescriptorOverridden(_testcapi.MethodDescriptorBase): - def __call__(self, n): - return 'new' - - calls += [ - (MethodDescriptorHeap(), (0,), {}, True), - (MethodDescriptorOverridden(), (0,), {}, 'new'), - ] - - for (func, args, kwargs, expected) in calls: - with self.subTest(str(func)): - args1 = args[1:] - meth = MethodType(func, args[0]) - wrapped = partial(func) - if not kwargs: - self.assertEqual(expected, func(*args)) - self.assertEqual(expected, pyobject_vectorcall(func, args, None)) - self.assertEqual(expected, meth(*args1)) - self.assertEqual(expected, wrapped(*args)) - self.assertEqual(expected, func(*args, **kwargs)) - self.assertEqual(expected, vectorcall(func, args, kwargs)) - self.assertEqual(expected, meth(*args1, **kwargs)) - self.assertEqual(expected, wrapped(*args, **kwargs)) - - class SubinterpreterTest(unittest.TestCase): def test_subinterps(self): From webhook-mailer at python.org Fri Jun 7 12:13:20 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 07 Jun 2019 16:13:20 -0000 Subject: [Python-checkins] bpo-37191: Move TestPEP590 from test_capi to test_call (GH-13892) Message-ID: https://github.com/python/cpython/commit/5effd10bf14ab0a8a6695100aaf0b687eca68e6d commit: 5effd10bf14ab0a8a6695100aaf0b687eca68e6d branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-07T09:13:16-07:00 summary: bpo-37191: Move TestPEP590 from test_capi to test_call (GH-13892) (cherry picked from commit 740a84de73ad8d02655de0a084036f4b7e49a01b) Co-authored-by: Victor Stinner files: M Lib/test/test_call.py M Lib/test/test_capi.py diff --git a/Lib/test/test_call.py b/Lib/test/test_call.py index 9f0a75b84a03..b4ab74903edb 100644 --- a/Lib/test/test_call.py +++ b/Lib/test/test_call.py @@ -475,5 +475,128 @@ def __index__(self): # called, which changes the keywords dict. compile("pass", "", "exec", x, **x.kwargs) + +Py_TPFLAGS_HAVE_VECTORCALL = 1 << 11 +Py_TPFLAGS_METHOD_DESCRIPTOR = 1 << 17 + + +def testfunction(self): + """some doc""" + return self + + +def testfunction_kw(self, *, kw): + """some doc""" + return self + + +class TestPEP590(unittest.TestCase): + + def test_method_descriptor_flag(self): + import functools + cached = functools.lru_cache(1)(testfunction) + + self.assertFalse(type(repr).__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) + self.assertTrue(type(list.append).__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) + self.assertTrue(type(list.__add__).__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) + self.assertTrue(type(testfunction).__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) + self.assertTrue(type(cached).__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) + + self.assertTrue(_testcapi.MethodDescriptorBase.__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) + self.assertTrue(_testcapi.MethodDescriptorDerived.__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) + self.assertFalse(_testcapi.MethodDescriptorNopGet.__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) + + # Heap type should not inherit Py_TPFLAGS_METHOD_DESCRIPTOR + class MethodDescriptorHeap(_testcapi.MethodDescriptorBase): + pass + self.assertFalse(MethodDescriptorHeap.__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) + + def test_vectorcall_flag(self): + self.assertTrue(_testcapi.MethodDescriptorBase.__flags__ & Py_TPFLAGS_HAVE_VECTORCALL) + self.assertTrue(_testcapi.MethodDescriptorDerived.__flags__ & Py_TPFLAGS_HAVE_VECTORCALL) + self.assertFalse(_testcapi.MethodDescriptorNopGet.__flags__ & Py_TPFLAGS_HAVE_VECTORCALL) + self.assertTrue(_testcapi.MethodDescriptor2.__flags__ & Py_TPFLAGS_HAVE_VECTORCALL) + + # Heap type should not inherit Py_TPFLAGS_HAVE_VECTORCALL + class MethodDescriptorHeap(_testcapi.MethodDescriptorBase): + pass + self.assertFalse(MethodDescriptorHeap.__flags__ & Py_TPFLAGS_HAVE_VECTORCALL) + + def test_vectorcall_override(self): + # Check that tp_call can correctly override vectorcall. + # MethodDescriptorNopGet implements tp_call but it inherits from + # MethodDescriptorBase, which implements vectorcall. Since + # MethodDescriptorNopGet returns the args tuple when called, we check + # additionally that no new tuple is created for this call. + args = tuple(range(5)) + f = _testcapi.MethodDescriptorNopGet() + self.assertIs(f(*args), args) + + def test_vectorcall(self): + # Test a bunch of different ways to call objects: + # 1. vectorcall using PyVectorcall_Call() + # (only for objects that support vectorcall directly) + # 2. normal call + # 3. vectorcall using _PyObject_Vectorcall() + # 4. call as bound method + # 5. call using functools.partial + + # A list of (function, args, kwargs, result) calls to test + calls = [(len, (range(42),), {}, 42), + (list.append, ([], 0), {}, None), + ([].append, (0,), {}, None), + (sum, ([36],), {"start":6}, 42), + (testfunction, (42,), {}, 42), + (testfunction_kw, (42,), {"kw":None}, 42), + (_testcapi.MethodDescriptorBase(), (0,), {}, True), + (_testcapi.MethodDescriptorDerived(), (0,), {}, True), + (_testcapi.MethodDescriptor2(), (0,), {}, False)] + + from _testcapi import pyobject_vectorcall, pyvectorcall_call + from types import MethodType + from functools import partial + + def vectorcall(func, args, kwargs): + args = *args, *kwargs.values() + kwnames = tuple(kwargs) + return pyobject_vectorcall(func, args, kwnames) + + for (func, args, kwargs, expected) in calls: + with self.subTest(str(func)): + if not kwargs: + self.assertEqual(expected, pyvectorcall_call(func, args)) + self.assertEqual(expected, pyvectorcall_call(func, args, kwargs)) + + # Add derived classes (which do not support vectorcall directly, + # but do support all other ways of calling). + + class MethodDescriptorHeap(_testcapi.MethodDescriptorBase): + pass + + class MethodDescriptorOverridden(_testcapi.MethodDescriptorBase): + def __call__(self, n): + return 'new' + + calls += [ + (MethodDescriptorHeap(), (0,), {}, True), + (MethodDescriptorOverridden(), (0,), {}, 'new'), + ] + + for (func, args, kwargs, expected) in calls: + with self.subTest(str(func)): + args1 = args[1:] + meth = MethodType(func, args[0]) + wrapped = partial(func) + if not kwargs: + self.assertEqual(expected, func(*args)) + self.assertEqual(expected, pyobject_vectorcall(func, args, None)) + self.assertEqual(expected, meth(*args1)) + self.assertEqual(expected, wrapped(*args)) + self.assertEqual(expected, func(*args, **kwargs)) + self.assertEqual(expected, vectorcall(func, args, kwargs)) + self.assertEqual(expected, meth(*args1, **kwargs)) + self.assertEqual(expected, wrapped(*args, **kwargs)) + + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index 6a20f479c53f..45fabd599159 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -27,18 +27,11 @@ # Were we compiled --with-pydebug or with #define Py_DEBUG? Py_DEBUG = hasattr(sys, 'gettotalrefcount') -Py_TPFLAGS_HAVE_VECTORCALL = 1 << 11 -Py_TPFLAGS_METHOD_DESCRIPTOR = 1 << 17 - def testfunction(self): """some doc""" return self -def testfunction_kw(self, *, kw): - """some doc""" - return self - class InstanceMethod: id = _testcapi.instancemethod(id) @@ -471,114 +464,6 @@ def test_pendingcalls_non_threaded(self): self.pendingcalls_wait(l, n) -class TestPEP590(unittest.TestCase): - - def test_method_descriptor_flag(self): - import functools - cached = functools.lru_cache(1)(testfunction) - - self.assertFalse(type(repr).__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) - self.assertTrue(type(list.append).__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) - self.assertTrue(type(list.__add__).__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) - self.assertTrue(type(testfunction).__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) - self.assertTrue(type(cached).__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) - - self.assertTrue(_testcapi.MethodDescriptorBase.__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) - self.assertTrue(_testcapi.MethodDescriptorDerived.__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) - self.assertFalse(_testcapi.MethodDescriptorNopGet.__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) - - # Heap type should not inherit Py_TPFLAGS_METHOD_DESCRIPTOR - class MethodDescriptorHeap(_testcapi.MethodDescriptorBase): - pass - self.assertFalse(MethodDescriptorHeap.__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) - - def test_vectorcall_flag(self): - self.assertTrue(_testcapi.MethodDescriptorBase.__flags__ & Py_TPFLAGS_HAVE_VECTORCALL) - self.assertTrue(_testcapi.MethodDescriptorDerived.__flags__ & Py_TPFLAGS_HAVE_VECTORCALL) - self.assertFalse(_testcapi.MethodDescriptorNopGet.__flags__ & Py_TPFLAGS_HAVE_VECTORCALL) - self.assertTrue(_testcapi.MethodDescriptor2.__flags__ & Py_TPFLAGS_HAVE_VECTORCALL) - - # Heap type should not inherit Py_TPFLAGS_HAVE_VECTORCALL - class MethodDescriptorHeap(_testcapi.MethodDescriptorBase): - pass - self.assertFalse(MethodDescriptorHeap.__flags__ & Py_TPFLAGS_HAVE_VECTORCALL) - - def test_vectorcall_override(self): - # Check that tp_call can correctly override vectorcall. - # MethodDescriptorNopGet implements tp_call but it inherits from - # MethodDescriptorBase, which implements vectorcall. Since - # MethodDescriptorNopGet returns the args tuple when called, we check - # additionally that no new tuple is created for this call. - args = tuple(range(5)) - f = _testcapi.MethodDescriptorNopGet() - self.assertIs(f(*args), args) - - def test_vectorcall(self): - # Test a bunch of different ways to call objects: - # 1. vectorcall using PyVectorcall_Call() - # (only for objects that support vectorcall directly) - # 2. normal call - # 3. vectorcall using _PyObject_Vectorcall() - # 4. call as bound method - # 5. call using functools.partial - - # A list of (function, args, kwargs, result) calls to test - calls = [(len, (range(42),), {}, 42), - (list.append, ([], 0), {}, None), - ([].append, (0,), {}, None), - (sum, ([36],), {"start":6}, 42), - (testfunction, (42,), {}, 42), - (testfunction_kw, (42,), {"kw":None}, 42), - (_testcapi.MethodDescriptorBase(), (0,), {}, True), - (_testcapi.MethodDescriptorDerived(), (0,), {}, True), - (_testcapi.MethodDescriptor2(), (0,), {}, False)] - - from _testcapi import pyobject_vectorcall, pyvectorcall_call - from types import MethodType - from functools import partial - - def vectorcall(func, args, kwargs): - args = *args, *kwargs.values() - kwnames = tuple(kwargs) - return pyobject_vectorcall(func, args, kwnames) - - for (func, args, kwargs, expected) in calls: - with self.subTest(str(func)): - if not kwargs: - self.assertEqual(expected, pyvectorcall_call(func, args)) - self.assertEqual(expected, pyvectorcall_call(func, args, kwargs)) - - # Add derived classes (which do not support vectorcall directly, - # but do support all other ways of calling). - - class MethodDescriptorHeap(_testcapi.MethodDescriptorBase): - pass - - class MethodDescriptorOverridden(_testcapi.MethodDescriptorBase): - def __call__(self, n): - return 'new' - - calls += [ - (MethodDescriptorHeap(), (0,), {}, True), - (MethodDescriptorOverridden(), (0,), {}, 'new'), - ] - - for (func, args, kwargs, expected) in calls: - with self.subTest(str(func)): - args1 = args[1:] - meth = MethodType(func, args[0]) - wrapped = partial(func) - if not kwargs: - self.assertEqual(expected, func(*args)) - self.assertEqual(expected, pyobject_vectorcall(func, args, None)) - self.assertEqual(expected, meth(*args1)) - self.assertEqual(expected, wrapped(*args)) - self.assertEqual(expected, func(*args, **kwargs)) - self.assertEqual(expected, vectorcall(func, args, kwargs)) - self.assertEqual(expected, meth(*args1, **kwargs)) - self.assertEqual(expected, wrapped(*args, **kwargs)) - - class SubinterpreterTest(unittest.TestCase): def test_subinterps(self): From webhook-mailer at python.org Fri Jun 7 12:23:02 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 07 Jun 2019 16:23:02 -0000 Subject: [Python-checkins] [2.7] bpo-37170: Fix the cast on error in PyLong_AsUnsignedLongLongMask() (GH-13860) (GH-13898) Message-ID: https://github.com/python/cpython/commit/2bfc2dc214445550521074f428245b502d215eac commit: 2bfc2dc214445550521074f428245b502d215eac branch: 2.7 author: Zackery Spytz committer: Victor Stinner date: 2019-06-07T18:22:56+02:00 summary: [2.7] bpo-37170: Fix the cast on error in PyLong_AsUnsignedLongLongMask() (GH-13860) (GH-13898) (cherry picked from commit dc2476500d91082f0c907772c83a044bf49af279) Co-authored-by: Zackery Spytz files: A Misc/NEWS.d/next/C API/2019-06-06-08-47-04.bpo-37170.hO_fpM.rst M Doc/c-api/long.rst M Modules/_testcapimodule.c M Objects/longobject.c diff --git a/Doc/c-api/long.rst b/Doc/c-api/long.rst index 28fb589a6f0b..4684d1b9c466 100644 --- a/Doc/c-api/long.rst +++ b/Doc/c-api/long.rst @@ -217,6 +217,9 @@ Long Integer Objects Return a C :c:type:`unsigned long` from a Python long integer, without checking for overflow. + Returns ``(unsigned long)-1`` on error. Use :c:func:`PyErr_Occurred` to + disambiguate. + .. versionadded:: 2.3 @@ -225,6 +228,9 @@ Long Integer Objects Return a C :c:type:`unsigned long long` from a Python long integer, without checking for overflow. + Returns ``(unsigned PY_LONG_LONG)-1`` on error. Use + :c:func:`PyErr_Occurred` to disambiguate. + .. versionadded:: 2.3 diff --git a/Misc/NEWS.d/next/C API/2019-06-06-08-47-04.bpo-37170.hO_fpM.rst b/Misc/NEWS.d/next/C API/2019-06-06-08-47-04.bpo-37170.hO_fpM.rst new file mode 100644 index 000000000000..7a35c9583d69 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2019-06-06-08-47-04.bpo-37170.hO_fpM.rst @@ -0,0 +1 @@ +Fix the cast on error in :c:func:`PyLong_AsUnsignedLongLongMask()`. diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 67488e70e45f..af93d00daae3 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -888,6 +888,26 @@ test_long_long_and_overflow(PyObject *self) return Py_None; } +static PyObject * +test_long_as_unsigned_long_long_mask(PyObject *self) +{ + unsigned PY_LONG_LONG res = PyLong_AsUnsignedLongLongMask(NULL); + + if (res != (unsigned PY_LONG_LONG)-1 || !PyErr_Occurred()) { + return raiseTestError("test_long_as_unsigned_long_long_mask", + "PyLong_AsUnsignedLongLongMask(NULL) didn't " + "complain"); + } + if (!PyErr_ExceptionMatches(PyExc_SystemError)) { + return raiseTestError("test_long_as_unsigned_long_long_mask", + "PyLong_AsUnsignedLongLongMask(NULL) raised " + "something other than SystemError"); + } + PyErr_Clear(); + Py_INCREF(Py_None); + return Py_None; +} + /* Test the L code for PyArg_ParseTuple. This should deliver a PY_LONG_LONG for both long and int arguments. The test may leak a little memory if it fails. @@ -2715,6 +2735,8 @@ static PyMethodDef TestMethods[] = { {"test_longlong_api", test_longlong_api, METH_NOARGS}, {"test_long_long_and_overflow", (PyCFunction)test_long_long_and_overflow, METH_NOARGS}, + {"test_long_as_unsigned_long_long_mask", + (PyCFunction)test_long_as_unsigned_long_long_mask, METH_NOARGS}, {"test_L_code", (PyCFunction)test_L_code, METH_NOARGS}, #endif {"getargs_f", getargs_f, METH_VARARGS}, diff --git a/Objects/longobject.c b/Objects/longobject.c index f40ad7ab1b8c..c05f67c36c72 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -1022,7 +1022,7 @@ PyLong_AsUnsignedLongLongMask(PyObject *vv) if (vv == NULL || !PyLong_Check(vv)) { PyErr_BadInternalCall(); - return (unsigned long) -1; + return (unsigned PY_LONG_LONG) -1; } v = (PyLongObject *)vv; i = Py_SIZE(v); From webhook-mailer at python.org Fri Jun 7 12:32:01 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 07 Jun 2019 16:32:01 -0000 Subject: [Python-checkins] bpo-37191: Avoid declaration-after-statement in header included from Python.h (GH-13887) Message-ID: https://github.com/python/cpython/commit/9689f80e61e5863668a562793ebb85031ef9fd3e commit: 9689f80e61e5863668a562793ebb85031ef9fd3e branch: 3.8 author: Petr Viktorin committer: Victor Stinner date: 2019-06-07T18:31:56+02:00 summary: bpo-37191: Avoid declaration-after-statement in header included from Python.h (GH-13887) files: A Misc/NEWS.d/next/C API/2019-06-07-10-47-37.bpo-37191.iGL1_K.rst M Include/cpython/abstract.h diff --git a/Include/cpython/abstract.h b/Include/cpython/abstract.h index 7ab2045923d8..2ea3209bca10 100644 --- a/Include/cpython/abstract.h +++ b/Include/cpython/abstract.h @@ -81,13 +81,14 @@ static inline vectorcallfunc _PyVectorcall_Function(PyObject *callable) { PyTypeObject *tp = Py_TYPE(callable); + Py_ssize_t offset = tp->tp_vectorcall_offset; + vectorcallfunc *ptr; if (!PyType_HasFeature(tp, _Py_TPFLAGS_HAVE_VECTORCALL)) { return NULL; } assert(PyCallable_Check(callable)); - Py_ssize_t offset = tp->tp_vectorcall_offset; assert(offset > 0); - vectorcallfunc *ptr = (vectorcallfunc *)(((char *)callable) + offset); + ptr = (vectorcallfunc*)(((char *)callable) + offset); return *ptr; } @@ -114,14 +115,16 @@ static inline PyObject * _PyObject_Vectorcall(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwnames) { + PyObject *res; + vectorcallfunc func; assert(kwnames == NULL || PyTuple_Check(kwnames)); assert(args != NULL || PyVectorcall_NARGS(nargsf) == 0); - vectorcallfunc func = _PyVectorcall_Function(callable); + func = _PyVectorcall_Function(callable); if (func == NULL) { Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); return _PyObject_MakeTpCall(callable, args, nargs, kwnames); } - PyObject *res = func(callable, args, nargsf, kwnames); + res = func(callable, args, nargsf, kwnames); return _Py_CheckFunctionResult(callable, res, NULL); } diff --git a/Misc/NEWS.d/next/C API/2019-06-07-10-47-37.bpo-37191.iGL1_K.rst b/Misc/NEWS.d/next/C API/2019-06-07-10-47-37.bpo-37191.iGL1_K.rst new file mode 100644 index 000000000000..7cb296d33bb5 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2019-06-07-10-47-37.bpo-37191.iGL1_K.rst @@ -0,0 +1,3 @@ +Python.h does not need compiler support for intermingled declarations (GCC's +``-Wdeclaration-after-statement``), which were added in 3.8.0 Beta 1. Note +that in Python 3.9, intermingled declarations will be needed again. From webhook-mailer at python.org Fri Jun 7 13:58:53 2019 From: webhook-mailer at python.org (Steve Dower) Date: Fri, 07 Jun 2019 17:58:53 -0000 Subject: [Python-checkins] bpo-37181: Fix test_regrtest failures on Windows arm64 (GH-13872) Message-ID: https://github.com/python/cpython/commit/e7e5039d6940e41839dcef0433262ff363408dad commit: e7e5039d6940e41839dcef0433262ff363408dad branch: master author: Paul Monson committer: Steve Dower date: 2019-06-07T10:58:41-07:00 summary: bpo-37181: Fix test_regrtest failures on Windows arm64 (GH-13872) files: M Lib/test/test_regrtest.py M PCbuild/rt.bat M Tools/buildbot/test.bat diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index 9155522c273d..b616e8974b9d 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -616,7 +616,9 @@ def test_tools_buildbot_test(self): # Tools\buildbot\test.bat script = os.path.join(ROOT_DIR, 'Tools', 'buildbot', 'test.bat') test_args = ['--testdir=%s' % self.tmptestdir] - if platform.architecture()[0] == '64bit': + if platform.machine() == 'ARM64': + test_args.append('-arm64') # ARM 64-bit build + elif platform.architecture()[0] == '64bit': test_args.append('-x64') # 64-bit build if not Py_DEBUG: test_args.append('+d') # Release build, use python.exe @@ -629,7 +631,9 @@ def test_pcbuild_rt(self): if not os.path.isfile(script): self.skipTest(f'File "{script}" does not exist') rt_args = ["-q"] # Quick, don't run tests twice - if platform.architecture()[0] == '64bit': + if platform.machine() == 'ARM64': + rt_args.append('-arm64') # ARM 64-bit build + elif platform.architecture()[0] == '64bit': rt_args.append('-x64') # 64-bit build if Py_DEBUG: rt_args.append('-d') # Debug build, use python_d.exe diff --git a/PCbuild/rt.bat b/PCbuild/rt.bat index e603de6d5174..59f757c0f588 100644 --- a/PCbuild/rt.bat +++ b/PCbuild/rt.bat @@ -39,6 +39,7 @@ if "%1"=="-O" (set dashO=-O) & shift & goto CheckOpts if "%1"=="-q" (set qmode=yes) & shift & goto CheckOpts if "%1"=="-d" (set suffix=_d) & shift & goto CheckOpts if "%1"=="-x64" (set prefix=%pcbuild%amd64) & shift & goto CheckOpts +if "%1"=="-arm64" (set prefix=%pcbuild%arm64) & shift & goto CheckOpts if "%1"=="-arm32" (set prefix=%pcbuild%arm32) & shift & goto CheckOpts if NOT "%1"=="" (set regrtestargs=%regrtestargs% %1) & shift & goto CheckOpts diff --git a/Tools/buildbot/test.bat b/Tools/buildbot/test.bat index f430680f3d80..1566f46c534f 100644 --- a/Tools/buildbot/test.bat +++ b/Tools/buildbot/test.bat @@ -9,6 +9,7 @@ set arm32_ssh= :CheckOpts if "%1"=="-x64" (set rt_opts=%rt_opts% %1) & shift & goto CheckOpts +if "%1"=="-arm64" (set rt_opts=%rt_opts% %1) & shift & goto CheckOpts if "%1"=="-arm32" (set rt_opts=%rt_opts% %1) & (set arm32_ssh=true) & shift & goto CheckOpts if "%1"=="-d" (set rt_opts=%rt_opts% %1) & shift & goto CheckOpts if "%1"=="-O" (set rt_opts=%rt_opts% %1) & shift & goto CheckOpts @@ -17,7 +18,6 @@ if "%1"=="+d" (set rt_opts=%rt_opts:-d=%) & shift & goto CheckOpts if "%1"=="+q" (set rt_opts=%rt_opts:-q=%) & shift & goto CheckOpts if NOT "%1"=="" (set regrtest_args=%regrtest_args% %1) & shift & goto CheckOpts -echo on if "%arm32_ssh%"=="true" goto :Arm32Ssh call "%here%..\..\PCbuild\rt.bat" %rt_opts% -uall -rwW --slowest --timeout=1200 --fail-env-changed %regrtest_args% From webhook-mailer at python.org Fri Jun 7 14:01:59 2019 From: webhook-mailer at python.org (Gregory P. Smith) Date: Fri, 07 Jun 2019 18:01:59 -0000 Subject: [Python-checkins] bpo-37138: fix undefined behaviour with memcpy() on NULL array (GH-13867) Message-ID: https://github.com/python/cpython/commit/1f9531764cc0f8dbca1d8f429d162dc28282f4b4 commit: 1f9531764cc0f8dbca1d8f429d162dc28282f4b4 branch: master author: Jeroen Demeyer committer: Gregory P. Smith date: 2019-06-07T11:01:53-07:00 summary: bpo-37138: fix undefined behaviour with memcpy() on NULL array (GH-13867) files: M Objects/classobject.c diff --git a/Objects/classobject.c b/Objects/classobject.c index ffd3f875c0e7..2415ed14cb15 100644 --- a/Objects/classobject.c +++ b/Objects/classobject.c @@ -71,7 +71,11 @@ method_vectorcall(PyObject *method, PyObject *const *args, } /* use borrowed references */ newargs[0] = self; - memcpy(newargs + 1, args, totalargs * sizeof(PyObject *)); + if (totalargs) { /* bpo-37138: if totalargs == 0, then args may be + * NULL and calling memcpy() with a NULL pointer + * is undefined behaviour. */ + memcpy(newargs + 1, args, totalargs * sizeof(PyObject *)); + } result = _PyObject_Vectorcall(func, newargs, nargs+1, kwnames); PyMem_Free(newargs); } From webhook-mailer at python.org Fri Jun 7 14:18:06 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 07 Jun 2019 18:18:06 -0000 Subject: [Python-checkins] bpo-37181: Fix test_regrtest failures on Windows arm64 (GH-13872) Message-ID: https://github.com/python/cpython/commit/84d47bd8ad48f29ed5d333f4307408ad1e081f59 commit: 84d47bd8ad48f29ed5d333f4307408ad1e081f59 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-07T11:17:52-07:00 summary: bpo-37181: Fix test_regrtest failures on Windows arm64 (GH-13872) (cherry picked from commit e7e5039d6940e41839dcef0433262ff363408dad) Co-authored-by: Paul Monson files: M Lib/test/test_regrtest.py M PCbuild/rt.bat M Tools/buildbot/test.bat diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index 9155522c273d..b616e8974b9d 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -616,7 +616,9 @@ def test_tools_buildbot_test(self): # Tools\buildbot\test.bat script = os.path.join(ROOT_DIR, 'Tools', 'buildbot', 'test.bat') test_args = ['--testdir=%s' % self.tmptestdir] - if platform.architecture()[0] == '64bit': + if platform.machine() == 'ARM64': + test_args.append('-arm64') # ARM 64-bit build + elif platform.architecture()[0] == '64bit': test_args.append('-x64') # 64-bit build if not Py_DEBUG: test_args.append('+d') # Release build, use python.exe @@ -629,7 +631,9 @@ def test_pcbuild_rt(self): if not os.path.isfile(script): self.skipTest(f'File "{script}" does not exist') rt_args = ["-q"] # Quick, don't run tests twice - if platform.architecture()[0] == '64bit': + if platform.machine() == 'ARM64': + rt_args.append('-arm64') # ARM 64-bit build + elif platform.architecture()[0] == '64bit': rt_args.append('-x64') # 64-bit build if Py_DEBUG: rt_args.append('-d') # Debug build, use python_d.exe diff --git a/PCbuild/rt.bat b/PCbuild/rt.bat index e603de6d5174..59f757c0f588 100644 --- a/PCbuild/rt.bat +++ b/PCbuild/rt.bat @@ -39,6 +39,7 @@ if "%1"=="-O" (set dashO=-O) & shift & goto CheckOpts if "%1"=="-q" (set qmode=yes) & shift & goto CheckOpts if "%1"=="-d" (set suffix=_d) & shift & goto CheckOpts if "%1"=="-x64" (set prefix=%pcbuild%amd64) & shift & goto CheckOpts +if "%1"=="-arm64" (set prefix=%pcbuild%arm64) & shift & goto CheckOpts if "%1"=="-arm32" (set prefix=%pcbuild%arm32) & shift & goto CheckOpts if NOT "%1"=="" (set regrtestargs=%regrtestargs% %1) & shift & goto CheckOpts diff --git a/Tools/buildbot/test.bat b/Tools/buildbot/test.bat index f430680f3d80..1566f46c534f 100644 --- a/Tools/buildbot/test.bat +++ b/Tools/buildbot/test.bat @@ -9,6 +9,7 @@ set arm32_ssh= :CheckOpts if "%1"=="-x64" (set rt_opts=%rt_opts% %1) & shift & goto CheckOpts +if "%1"=="-arm64" (set rt_opts=%rt_opts% %1) & shift & goto CheckOpts if "%1"=="-arm32" (set rt_opts=%rt_opts% %1) & (set arm32_ssh=true) & shift & goto CheckOpts if "%1"=="-d" (set rt_opts=%rt_opts% %1) & shift & goto CheckOpts if "%1"=="-O" (set rt_opts=%rt_opts% %1) & shift & goto CheckOpts @@ -17,7 +18,6 @@ if "%1"=="+d" (set rt_opts=%rt_opts:-d=%) & shift & goto CheckOpts if "%1"=="+q" (set rt_opts=%rt_opts:-q=%) & shift & goto CheckOpts if NOT "%1"=="" (set regrtest_args=%regrtest_args% %1) & shift & goto CheckOpts -echo on if "%arm32_ssh%"=="true" goto :Arm32Ssh call "%here%..\..\PCbuild\rt.bat" %rt_opts% -uall -rwW --slowest --timeout=1200 --fail-env-changed %regrtest_args% From webhook-mailer at python.org Fri Jun 7 14:26:07 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 07 Jun 2019 18:26:07 -0000 Subject: [Python-checkins] bpo-37138: fix undefined behaviour with memcpy() on NULL array (GH-13867) Message-ID: https://github.com/python/cpython/commit/6e053079ac3fe50ffbe9128bcf766298168c31cb commit: 6e053079ac3fe50ffbe9128bcf766298168c31cb branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-07T11:25:53-07:00 summary: bpo-37138: fix undefined behaviour with memcpy() on NULL array (GH-13867) (cherry picked from commit 1f9531764cc0f8dbca1d8f429d162dc28282f4b4) Co-authored-by: Jeroen Demeyer files: M Objects/classobject.c diff --git a/Objects/classobject.c b/Objects/classobject.c index ffd3f875c0e7..2415ed14cb15 100644 --- a/Objects/classobject.c +++ b/Objects/classobject.c @@ -71,7 +71,11 @@ method_vectorcall(PyObject *method, PyObject *const *args, } /* use borrowed references */ newargs[0] = self; - memcpy(newargs + 1, args, totalargs * sizeof(PyObject *)); + if (totalargs) { /* bpo-37138: if totalargs == 0, then args may be + * NULL and calling memcpy() with a NULL pointer + * is undefined behaviour. */ + memcpy(newargs + 1, args, totalargs * sizeof(PyObject *)); + } result = _PyObject_Vectorcall(func, newargs, nargs+1, kwnames); PyMem_Free(newargs); } From webhook-mailer at python.org Fri Jun 7 16:05:34 2019 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Fri, 07 Jun 2019 20:05:34 -0000 Subject: [Python-checkins] IDLE: Standardize naming convention for DummyEditwin in tests (GH-13876) (#13885) Message-ID: https://github.com/python/cpython/commit/6c9effabe0054c80a38b6d02cc52ec7b581e5f91 commit: 6c9effabe0054c80a38b6d02cc52ec7b581e5f91 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Terry Jan Reedy date: 2019-06-07T16:05:18-04:00 summary: IDLE: Standardize naming convention for DummyEditwin in tests (GH-13876) (#13885) * Change from Dummy_Editwin to DummyEditwin to match other tests. (cherry picked from commit 7f8a38a7c47823c17adab469fcb4f762f4e945b7) Co-authored-by: Cheryl Sabella files: M Lib/idlelib/idle_test/test_autoexpand.py diff --git a/Lib/idlelib/idle_test/test_autoexpand.py b/Lib/idlelib/idle_test/test_autoexpand.py index e5f44c468713..e734a8be714a 100644 --- a/Lib/idlelib/idle_test/test_autoexpand.py +++ b/Lib/idlelib/idle_test/test_autoexpand.py @@ -6,7 +6,7 @@ from tkinter import Text, Tk -class Dummy_Editwin: +class DummyEditwin: # AutoExpand.__init__ only needs .text def __init__(self, text): self.text = text @@ -18,7 +18,7 @@ def setUpClass(cls): requires('gui') cls.tk = Tk() cls.text = Text(cls.tk) - cls.auto_expand = AutoExpand(Dummy_Editwin(cls.text)) + cls.auto_expand = AutoExpand(DummyEditwin(cls.text)) cls.auto_expand.bell = lambda: None # If mock_tk.Text._decode understood indexes 'insert' with suffixed 'linestart', From webhook-mailer at python.org Fri Jun 7 16:08:42 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 07 Jun 2019 20:08:42 -0000 Subject: [Python-checkins] bpo-37150: Throw ValueError if FileType class object was passed in add_argument (GH-13805) Message-ID: https://github.com/python/cpython/commit/03d5831a2d62c68654ec223168e574cd546efbf6 commit: 03d5831a2d62c68654ec223168e574cd546efbf6 branch: master author: zygocephalus committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-06-07T13:08:36-07:00 summary: bpo-37150: Throw ValueError if FileType class object was passed in add_argument (GH-13805) There is a possibility that someone (like me) accidentally will omit parentheses with `FileType` arguments after `FileType`, and parser will contain wrong file until someone will try to use it. Example: ```python parser = argparse.ArgumentParser() parser.add_argument('-x', type=argparse.FileType) ``` https://bugs.python.org/issue37150 files: A Misc/NEWS.d/next/Library/2019-06-04-14-44-41.bpo-37150.TTzHxj.rst M Lib/argparse.py M Lib/test/test_argparse.py diff --git a/Lib/argparse.py b/Lib/argparse.py index ef888f063b32..9a67b41ae00e 100644 --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -1361,6 +1361,10 @@ def add_argument(self, *args, **kwargs): if not callable(type_func): raise ValueError('%r is not callable' % (type_func,)) + if type_func is FileType: + raise ValueError('%r is a FileType class object, instance of it' + ' must be passed' % (type_func,)) + # raise an error if the metavar does not match the type if hasattr(self, "_get_formatter"): try: diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py index 9d68f40571fe..bcf2cc9b26a3 100644 --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -1619,6 +1619,24 @@ def test_open_args(self): m.assert_called_with('foo', *args) +class TestFileTypeMissingInitialization(TestCase): + """ + Test that add_argument throws an error if FileType class + object was passed instead of instance of FileType + """ + + def test(self): + parser = argparse.ArgumentParser() + with self.assertRaises(ValueError) as cm: + parser.add_argument('-x', type=argparse.FileType) + + self.assertEqual( + '%r is a FileType class object, instance of it must be passed' + % (argparse.FileType,), + str(cm.exception) + ) + + class TestTypeCallable(ParserTestCase): """Test some callables as option/argument types""" diff --git a/Misc/NEWS.d/next/Library/2019-06-04-14-44-41.bpo-37150.TTzHxj.rst b/Misc/NEWS.d/next/Library/2019-06-04-14-44-41.bpo-37150.TTzHxj.rst new file mode 100644 index 000000000000..c5be46e1e5d3 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-04-14-44-41.bpo-37150.TTzHxj.rst @@ -0,0 +1 @@ +`argparse._ActionsContainer.add_argument` now throws error, if someone accidentally pass FileType class object instead of instance of FileType as `type` argument \ No newline at end of file From webhook-mailer at python.org Fri Jun 7 17:12:05 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 07 Jun 2019 21:12:05 -0000 Subject: [Python-checkins] bpo-37150: Throw ValueError if FileType class object was passed in add_argument (GH-13805) Message-ID: https://github.com/python/cpython/commit/606ac581e2451c420117c55632f0fe13d4cec2cd commit: 606ac581e2451c420117c55632f0fe13d4cec2cd branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-07T14:11:59-07:00 summary: bpo-37150: Throw ValueError if FileType class object was passed in add_argument (GH-13805) There is a possibility that someone (like me) accidentally will omit parentheses with `FileType` arguments after `FileType`, and parser will contain wrong file until someone will try to use it. Example: ```python parser = argparse.ArgumentParser() parser.add_argument('-x', type=argparse.FileType) ``` https://bugs.python.org/issue37150 (cherry picked from commit 03d5831a2d62c68654ec223168e574cd546efbf6) Co-authored-by: zygocephalus files: A Misc/NEWS.d/next/Library/2019-06-04-14-44-41.bpo-37150.TTzHxj.rst M Lib/argparse.py M Lib/test/test_argparse.py diff --git a/Lib/argparse.py b/Lib/argparse.py index ef888f063b32..9a67b41ae00e 100644 --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -1361,6 +1361,10 @@ def add_argument(self, *args, **kwargs): if not callable(type_func): raise ValueError('%r is not callable' % (type_func,)) + if type_func is FileType: + raise ValueError('%r is a FileType class object, instance of it' + ' must be passed' % (type_func,)) + # raise an error if the metavar does not match the type if hasattr(self, "_get_formatter"): try: diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py index 9d68f40571fe..bcf2cc9b26a3 100644 --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -1619,6 +1619,24 @@ def test_open_args(self): m.assert_called_with('foo', *args) +class TestFileTypeMissingInitialization(TestCase): + """ + Test that add_argument throws an error if FileType class + object was passed instead of instance of FileType + """ + + def test(self): + parser = argparse.ArgumentParser() + with self.assertRaises(ValueError) as cm: + parser.add_argument('-x', type=argparse.FileType) + + self.assertEqual( + '%r is a FileType class object, instance of it must be passed' + % (argparse.FileType,), + str(cm.exception) + ) + + class TestTypeCallable(ParserTestCase): """Test some callables as option/argument types""" diff --git a/Misc/NEWS.d/next/Library/2019-06-04-14-44-41.bpo-37150.TTzHxj.rst b/Misc/NEWS.d/next/Library/2019-06-04-14-44-41.bpo-37150.TTzHxj.rst new file mode 100644 index 000000000000..c5be46e1e5d3 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-04-14-44-41.bpo-37150.TTzHxj.rst @@ -0,0 +1 @@ +`argparse._ActionsContainer.add_argument` now throws error, if someone accidentally pass FileType class object instead of instance of FileType as `type` argument \ No newline at end of file From webhook-mailer at python.org Fri Jun 7 17:24:00 2019 From: webhook-mailer at python.org (Barry Warsaw) Date: Fri, 07 Jun 2019 21:24:00 -0000 Subject: [Python-checkins] cross port importlib-metadata PR #76 (#13903) Message-ID: https://github.com/python/cpython/commit/65e5860fcc8ffe66f3c325d5484112f3b6540e8c commit: 65e5860fcc8ffe66f3c325d5484112f3b6540e8c branch: master author: Anthony Sottile committer: Barry Warsaw date: 2019-06-07T14:23:38-07:00 summary: cross port importlib-metadata PR #76 (#13903) https://gitlab.com/python-devs/importlib_metadata/merge_requests/76 files: M Lib/importlib/metadata/__init__.py M Lib/test/test_importlib/data/example-21.12-py3-none-any.whl M Lib/test/test_importlib/data/example-21.12-py3.6.egg M Lib/test/test_importlib/test_zip.py diff --git a/Lib/importlib/metadata/__init__.py b/Lib/importlib/metadata/__init__.py index a1abdd64815b..944dbb5fdf7e 100644 --- a/Lib/importlib/metadata/__init__.py +++ b/Lib/importlib/metadata/__init__.py @@ -89,6 +89,8 @@ def _from_config(cls, config): @classmethod def _from_text(cls, text): config = ConfigParser() + # case sensitive: https://stackoverflow.com/q/1611799/812183 + config.optionxform = str try: config.read_string(text) except AttributeError: # pragma: nocover diff --git a/Lib/test/test_importlib/data/example-21.12-py3-none-any.whl b/Lib/test/test_importlib/data/example-21.12-py3-none-any.whl index f92f7716e3e6..641ab07f7aad 100644 Binary files a/Lib/test/test_importlib/data/example-21.12-py3-none-any.whl and b/Lib/test/test_importlib/data/example-21.12-py3-none-any.whl differ diff --git a/Lib/test/test_importlib/data/example-21.12-py3.6.egg b/Lib/test/test_importlib/data/example-21.12-py3.6.egg index 1d3f998f41b8..cdb298a19b09 100644 Binary files a/Lib/test/test_importlib/data/example-21.12-py3.6.egg and b/Lib/test/test_importlib/data/example-21.12-py3.6.egg differ diff --git a/Lib/test/test_importlib/test_zip.py b/Lib/test/test_importlib/test_zip.py index db39e190ea7a..bcf7cf3618d7 100644 --- a/Lib/test/test_importlib/test_zip.py +++ b/Lib/test/test_importlib/test_zip.py @@ -26,6 +26,8 @@ def test_zip_entry_points(self): scripts = dict(entry_points()['console_scripts']) entry_point = scripts['example'] self.assertEqual(entry_point.value, 'example:main') + entry_point = scripts['Example'] + self.assertEqual(entry_point.value, 'example:main') def test_missing_metadata(self): self.assertIsNone(distribution('example').read_text('does not exist')) From webhook-mailer at python.org Fri Jun 7 17:44:13 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 07 Jun 2019 21:44:13 -0000 Subject: [Python-checkins] cross port importlib-metadata PR GH-76 (GH-13903) Message-ID: https://github.com/python/cpython/commit/3b5bac27c03d0a891ad3c5710e72e066e7f97f56 commit: 3b5bac27c03d0a891ad3c5710e72e066e7f97f56 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-07T14:44:03-07:00 summary: cross port importlib-metadata PR GH-76 (GH-13903) https://gitlab.com/python-devs/importlib_metadata/merge_requests/76 (cherry picked from commit 65e5860fcc8ffe66f3c325d5484112f3b6540e8c) Co-authored-by: Anthony Sottile files: M Lib/importlib/metadata/__init__.py M Lib/test/test_importlib/data/example-21.12-py3-none-any.whl M Lib/test/test_importlib/data/example-21.12-py3.6.egg M Lib/test/test_importlib/test_zip.py diff --git a/Lib/importlib/metadata/__init__.py b/Lib/importlib/metadata/__init__.py index a1abdd64815b..944dbb5fdf7e 100644 --- a/Lib/importlib/metadata/__init__.py +++ b/Lib/importlib/metadata/__init__.py @@ -89,6 +89,8 @@ def _from_config(cls, config): @classmethod def _from_text(cls, text): config = ConfigParser() + # case sensitive: https://stackoverflow.com/q/1611799/812183 + config.optionxform = str try: config.read_string(text) except AttributeError: # pragma: nocover diff --git a/Lib/test/test_importlib/data/example-21.12-py3-none-any.whl b/Lib/test/test_importlib/data/example-21.12-py3-none-any.whl index f92f7716e3e6..641ab07f7aad 100644 Binary files a/Lib/test/test_importlib/data/example-21.12-py3-none-any.whl and b/Lib/test/test_importlib/data/example-21.12-py3-none-any.whl differ diff --git a/Lib/test/test_importlib/data/example-21.12-py3.6.egg b/Lib/test/test_importlib/data/example-21.12-py3.6.egg index 1d3f998f41b8..cdb298a19b09 100644 Binary files a/Lib/test/test_importlib/data/example-21.12-py3.6.egg and b/Lib/test/test_importlib/data/example-21.12-py3.6.egg differ diff --git a/Lib/test/test_importlib/test_zip.py b/Lib/test/test_importlib/test_zip.py index db39e190ea7a..bcf7cf3618d7 100644 --- a/Lib/test/test_importlib/test_zip.py +++ b/Lib/test/test_importlib/test_zip.py @@ -26,6 +26,8 @@ def test_zip_entry_points(self): scripts = dict(entry_points()['console_scripts']) entry_point = scripts['example'] self.assertEqual(entry_point.value, 'example:main') + entry_point = scripts['Example'] + self.assertEqual(entry_point.value, 'example:main') def test_missing_metadata(self): self.assertIsNone(distribution('example').read_text('does not exist')) From webhook-mailer at python.org Sat Jun 8 05:19:37 2019 From: webhook-mailer at python.org (Stefan Krah) Date: Sat, 08 Jun 2019 09:19:37 -0000 Subject: [Python-checkins] [2.7] bpo-37188: Fix a divide-by-zero in arrays of size-0 objects (#13906) Message-ID: https://github.com/python/cpython/commit/48f190f79cd89f7ad4409b3c782e462368583309 commit: 48f190f79cd89f7ad4409b3c782e462368583309 branch: 2.7 author: Eric Wieser committer: Stefan Krah date: 2019-06-08T11:19:24+02:00 summary: [2.7] bpo-37188: Fix a divide-by-zero in arrays of size-0 objects (#13906) files: M Lib/ctypes/test/test_arrays.py M Modules/_ctypes/_ctypes.c diff --git a/Lib/ctypes/test/test_arrays.py b/Lib/ctypes/test/test_arrays.py index 29fd422a68cc..ec00d9f9f657 100644 --- a/Lib/ctypes/test/test_arrays.py +++ b/Lib/ctypes/test/test_arrays.py @@ -134,6 +134,21 @@ class my_int(c_int): t2 = my_int * 1 self.assertIs(t1, t2) + def test_empty_element_struct(self): + class EmptyStruct(Structure): + _fields_ = [] + + obj = (EmptyStruct * 2)() # bpo37188: Floating point exception + self.assertEqual(sizeof(obj), 0) + + def test_empty_element_array(self): + class EmptyArray(Array): + _type_ = c_int + _length_ = 0 + + obj = (EmptyArray * 2)() # bpo37188: Floating point exception + self.assertEqual(sizeof(obj), 0) + def test_bpo36504_signed_int_overflow(self): # The overflow check in PyCArrayType_new() could cause signed integer # overflow. diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index d608100243d8..bef251ef049d 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -1534,7 +1534,7 @@ PyCArrayType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) } itemsize = itemdict->size; - if (length > PY_SSIZE_T_MAX / itemsize) { + if (itemsize != 0 && length > PY_SSIZE_T_MAX / itemsize) { PyErr_SetString(PyExc_OverflowError, "array too large"); Py_DECREF(stgdict); From webhook-mailer at python.org Sat Jun 8 05:46:59 2019 From: webhook-mailer at python.org (Stefan Krah) Date: Sat, 08 Jun 2019 09:46:59 -0000 Subject: [Python-checkins] [3.8] bpo-37188: Fix a divide-by-zero in arrays of size-0 objects (#13911) Message-ID: https://github.com/python/cpython/commit/3d03a35ba0f162a350898100efc95fdf392070a2 commit: 3d03a35ba0f162a350898100efc95fdf392070a2 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Stefan Krah date: 2019-06-08T11:46:53+02:00 summary: [3.8] bpo-37188: Fix a divide-by-zero in arrays of size-0 objects (#13911) files: M Lib/ctypes/test/test_arrays.py M Modules/_ctypes/_ctypes.c diff --git a/Lib/ctypes/test/test_arrays.py b/Lib/ctypes/test/test_arrays.py index 87ecbf04e7ed..14603b7049c9 100644 --- a/Lib/ctypes/test/test_arrays.py +++ b/Lib/ctypes/test/test_arrays.py @@ -208,6 +208,21 @@ class T(Array): _type_ = c_int _length_ = 0 + def test_empty_element_struct(self): + class EmptyStruct(Structure): + _fields_ = [] + + obj = (EmptyStruct * 2)() # bpo37188: Floating point exception + self.assertEqual(sizeof(obj), 0) + + def test_empty_element_array(self): + class EmptyArray(Array): + _type_ = c_int + _length_ = 0 + + obj = (EmptyArray * 2)() # bpo37188: Floating point exception + self.assertEqual(sizeof(obj), 0) + def test_bpo36504_signed_int_overflow(self): # The overflow check in PyCArrayType_new() could cause signed integer # overflow. diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index f7513a3d74c4..2201c4520ad0 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -1518,7 +1518,7 @@ PyCArrayType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) } itemsize = itemdict->size; - if (length > PY_SSIZE_T_MAX / itemsize) { + if (itemsize != 0 && length > PY_SSIZE_T_MAX / itemsize) { PyErr_SetString(PyExc_OverflowError, "array too large"); goto error; From webhook-mailer at python.org Sat Jun 8 08:05:52 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 08 Jun 2019 12:05:52 -0000 Subject: [Python-checkins] bpo-37173: Show passed class in inspect.getfile error (GH-13861) Message-ID: https://github.com/python/cpython/commit/d407d2a7265f6102e51a1d62b3fd28b4f7a78d16 commit: d407d2a7265f6102e51a1d62b3fd28b4f7a78d16 branch: master author: Philipp A committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-06-08T05:05:46-07:00 summary: bpo-37173: Show passed class in inspect.getfile error (GH-13861) Currently, inspect.getfile(str) will report nonsense: ```pytb >>> inspect.getfile(str) TypeError: is a built-in class ``` This fixes that https://bugs.python.org/issue37173 files: A Misc/NEWS.d/next/Library/2019-06-08-11-33-48.bpo-37173.0e_8gS.rst M Lib/inspect.py M Lib/test/test_inspect.py diff --git a/Lib/inspect.py b/Lib/inspect.py index 91d209dc64bc..99a580bd2f23 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -659,9 +659,9 @@ def getfile(object): raise TypeError('{!r} is a built-in module'.format(object)) if isclass(object): if hasattr(object, '__module__'): - object = sys.modules.get(object.__module__) - if getattr(object, '__file__', None): - return object.__file__ + module = sys.modules.get(object.__module__) + if getattr(module, '__file__', None): + return module.__file__ raise TypeError('{!r} is a built-in class'.format(object)) if ismethod(object): object = object.__func__ diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index 83a5f7ec1f53..1cd4ea28939d 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -513,6 +513,24 @@ def test_getsourcefile(self): def test_getfile(self): self.assertEqual(inspect.getfile(mod.StupidGit), mod.__file__) + def test_getfile_builtin_module(self): + with self.assertRaises(TypeError) as e: + inspect.getfile(sys) + self.assertTrue(str(e.exception).startswith(' https://github.com/python/cpython/commit/c5daae4ef6d09269c95ed1023e76932cc179f309 commit: c5daae4ef6d09269c95ed1023e76932cc179f309 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-08T05:24:59-07:00 summary: bpo-37173: Show passed class in inspect.getfile error (GH-13861) Currently, inspect.getfile(str) will report nonsense: ```pytb >>> inspect.getfile(str) TypeError: is a built-in class ``` This fixes that https://bugs.python.org/issue37173 (cherry picked from commit d407d2a7265f6102e51a1d62b3fd28b4f7a78d16) Co-authored-by: Philipp A files: A Misc/NEWS.d/next/Library/2019-06-08-11-33-48.bpo-37173.0e_8gS.rst M Lib/inspect.py M Lib/test/test_inspect.py diff --git a/Lib/inspect.py b/Lib/inspect.py index 91d209dc64bc..99a580bd2f23 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -659,9 +659,9 @@ def getfile(object): raise TypeError('{!r} is a built-in module'.format(object)) if isclass(object): if hasattr(object, '__module__'): - object = sys.modules.get(object.__module__) - if getattr(object, '__file__', None): - return object.__file__ + module = sys.modules.get(object.__module__) + if getattr(module, '__file__', None): + return module.__file__ raise TypeError('{!r} is a built-in class'.format(object)) if ismethod(object): object = object.__func__ diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index 83a5f7ec1f53..1cd4ea28939d 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -513,6 +513,24 @@ def test_getsourcefile(self): def test_getfile(self): self.assertEqual(inspect.getfile(mod.StupidGit), mod.__file__) + def test_getfile_builtin_module(self): + with self.assertRaises(TypeError) as e: + inspect.getfile(sys) + self.assertTrue(str(e.exception).startswith(' https://github.com/python/cpython/commit/a15a7bcaea54e1845ab2abe27e6f583294cd715b commit: a15a7bcaea54e1845ab2abe27e6f583294cd715b branch: master author: Ammar Askar committer: Gregory P. Smith date: 2019-06-08T07:43:16-07:00 summary: bpo-29505: Fix interpreter in fuzzing targets to be relocatable (GH-13907) files: M Modules/_xxtestfuzz/fuzzer.c diff --git a/Modules/_xxtestfuzz/fuzzer.c b/Modules/_xxtestfuzz/fuzzer.c index b50eb6512710..54f816ebc93d 100644 --- a/Modules/_xxtestfuzz/fuzzer.c +++ b/Modules/_xxtestfuzz/fuzzer.c @@ -88,6 +88,14 @@ static int _run_fuzz(const uint8_t *data, size_t size, int(*fuzzer)(const char* /* CPython generates a lot of leak warnings for whatever reason. */ int __lsan_is_turned_off(void) { return 1; } +wchar_t wide_program_name[NAME_MAX]; + +int LLVMFuzzerInitialize(int *argc, char ***argv) { + wchar_t* wide_program_name = Py_DecodeLocale(*argv[0], NULL); + Py_SetProgramName(wide_program_name); + return 0; +} + /* Fuzz test interface. This returns the bitwise or of all fuzz test's return values. From webhook-mailer at python.org Sat Jun 8 10:56:28 2019 From: webhook-mailer at python.org (Gregory P. Smith) Date: Sat, 08 Jun 2019 14:56:28 -0000 Subject: [Python-checkins] bpo-34886: Fix subprocess.run handling of exclusive arguments (GH-11727) Message-ID: https://github.com/python/cpython/commit/8cc605acdda5aff250ab4c9b524a7560f90ca9f3 commit: 8cc605acdda5aff250ab4c9b524a7560f90ca9f3 branch: master author: R?mi Lapeyre committer: Gregory P. Smith date: 2019-06-08T07:56:24-07:00 summary: bpo-34886: Fix subprocess.run handling of exclusive arguments (GH-11727) Fix an unintended ValueError from :func:`subprocess.run` when checking for conflicting `input` and `stdin` or `capture_output` and `stdout` or `stderr` args when they were explicitly provided but with `None` values within a passed in `**kwargs` dict rather than as passed directly by name. files: A Misc/NEWS.d/next/Library/2019-06-08-16-03-19.bpo-34886.Ov-pc9.rst M Lib/subprocess.py diff --git a/Lib/subprocess.py b/Lib/subprocess.py index 9e36b9de6b34..d34c57828b48 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -459,12 +459,12 @@ def run(*popenargs, The other arguments are the same as for the Popen constructor. """ if input is not None: - if 'stdin' in kwargs: + if kwargs.get('stdin') is not None: raise ValueError('stdin and input arguments may not both be used.') kwargs['stdin'] = PIPE if capture_output: - if ('stdout' in kwargs) or ('stderr' in kwargs): + if kwargs.get('stdout') is not None or kwargs.get('stderr') is not None: raise ValueError('stdout and stderr arguments may not be used ' 'with capture_output.') kwargs['stdout'] = PIPE diff --git a/Misc/NEWS.d/next/Library/2019-06-08-16-03-19.bpo-34886.Ov-pc9.rst b/Misc/NEWS.d/next/Library/2019-06-08-16-03-19.bpo-34886.Ov-pc9.rst new file mode 100644 index 000000000000..1b5fc3702521 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-08-16-03-19.bpo-34886.Ov-pc9.rst @@ -0,0 +1,5 @@ +Fix an unintended ValueError from :func:`subprocess.run` when checking for +conflicting `input` and `stdin` or `capture_output` and `stdout` or `stderr` +args when they were explicitly provided but with `None` values within a +passed in `**kwargs` dict rather than as passed directly by name. Patch +contributed by R?mi Lapeyre. From webhook-mailer at python.org Sat Jun 8 11:03:09 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 08 Jun 2019 15:03:09 -0000 Subject: [Python-checkins] bpo-29505: Fix interpreter in fuzzing targets to be relocatable (GH-13907) Message-ID: https://github.com/python/cpython/commit/22b69da4c38042e923d633530bdafc1b5fb94928 commit: 22b69da4c38042e923d633530bdafc1b5fb94928 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-08T08:03:05-07:00 summary: bpo-29505: Fix interpreter in fuzzing targets to be relocatable (GH-13907) (cherry picked from commit a15a7bcaea54e1845ab2abe27e6f583294cd715b) Co-authored-by: Ammar Askar files: M Modules/_xxtestfuzz/fuzzer.c diff --git a/Modules/_xxtestfuzz/fuzzer.c b/Modules/_xxtestfuzz/fuzzer.c index b50eb6512710..54f816ebc93d 100644 --- a/Modules/_xxtestfuzz/fuzzer.c +++ b/Modules/_xxtestfuzz/fuzzer.c @@ -88,6 +88,14 @@ static int _run_fuzz(const uint8_t *data, size_t size, int(*fuzzer)(const char* /* CPython generates a lot of leak warnings for whatever reason. */ int __lsan_is_turned_off(void) { return 1; } +wchar_t wide_program_name[NAME_MAX]; + +int LLVMFuzzerInitialize(int *argc, char ***argv) { + wchar_t* wide_program_name = Py_DecodeLocale(*argv[0], NULL); + Py_SetProgramName(wide_program_name); + return 0; +} + /* Fuzz test interface. This returns the bitwise or of all fuzz test's return values. From webhook-mailer at python.org Sat Jun 8 11:03:50 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 08 Jun 2019 15:03:50 -0000 Subject: [Python-checkins] bpo-29505: Fix interpreter in fuzzing targets to be relocatable (GH-13907) Message-ID: https://github.com/python/cpython/commit/6692d35317a45905a043dccae3940ea5d5d84352 commit: 6692d35317a45905a043dccae3940ea5d5d84352 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-08T08:03:46-07:00 summary: bpo-29505: Fix interpreter in fuzzing targets to be relocatable (GH-13907) (cherry picked from commit a15a7bcaea54e1845ab2abe27e6f583294cd715b) Co-authored-by: Ammar Askar files: M Modules/_xxtestfuzz/fuzzer.c diff --git a/Modules/_xxtestfuzz/fuzzer.c b/Modules/_xxtestfuzz/fuzzer.c index b50eb6512710..54f816ebc93d 100644 --- a/Modules/_xxtestfuzz/fuzzer.c +++ b/Modules/_xxtestfuzz/fuzzer.c @@ -88,6 +88,14 @@ static int _run_fuzz(const uint8_t *data, size_t size, int(*fuzzer)(const char* /* CPython generates a lot of leak warnings for whatever reason. */ int __lsan_is_turned_off(void) { return 1; } +wchar_t wide_program_name[NAME_MAX]; + +int LLVMFuzzerInitialize(int *argc, char ***argv) { + wchar_t* wide_program_name = Py_DecodeLocale(*argv[0], NULL); + Py_SetProgramName(wide_program_name); + return 0; +} + /* Fuzz test interface. This returns the bitwise or of all fuzz test's return values. From webhook-mailer at python.org Sat Jun 8 11:15:11 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 08 Jun 2019 15:15:11 -0000 Subject: [Python-checkins] bpo-34886: Fix subprocess.run handling of exclusive arguments (GH-11727) Message-ID: https://github.com/python/cpython/commit/6324ac1293b2cf71559869b88f89f510f9a62a8e commit: 6324ac1293b2cf71559869b88f89f510f9a62a8e branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-08T08:15:02-07:00 summary: bpo-34886: Fix subprocess.run handling of exclusive arguments (GH-11727) Fix an unintended ValueError from :func:`subprocess.run` when checking for conflicting `input` and `stdin` or `capture_output` and `stdout` or `stderr` args when they were explicitly provided but with `None` values within a passed in `**kwargs` dict rather than as passed directly by name. (cherry picked from commit 8cc605acdda5aff250ab4c9b524a7560f90ca9f3) Co-authored-by: R?mi Lapeyre files: A Misc/NEWS.d/next/Library/2019-06-08-16-03-19.bpo-34886.Ov-pc9.rst M Lib/subprocess.py diff --git a/Lib/subprocess.py b/Lib/subprocess.py index 9e36b9de6b34..d34c57828b48 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -459,12 +459,12 @@ def run(*popenargs, The other arguments are the same as for the Popen constructor. """ if input is not None: - if 'stdin' in kwargs: + if kwargs.get('stdin') is not None: raise ValueError('stdin and input arguments may not both be used.') kwargs['stdin'] = PIPE if capture_output: - if ('stdout' in kwargs) or ('stderr' in kwargs): + if kwargs.get('stdout') is not None or kwargs.get('stderr') is not None: raise ValueError('stdout and stderr arguments may not be used ' 'with capture_output.') kwargs['stdout'] = PIPE diff --git a/Misc/NEWS.d/next/Library/2019-06-08-16-03-19.bpo-34886.Ov-pc9.rst b/Misc/NEWS.d/next/Library/2019-06-08-16-03-19.bpo-34886.Ov-pc9.rst new file mode 100644 index 000000000000..1b5fc3702521 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-08-16-03-19.bpo-34886.Ov-pc9.rst @@ -0,0 +1,5 @@ +Fix an unintended ValueError from :func:`subprocess.run` when checking for +conflicting `input` and `stdin` or `capture_output` and `stdout` or `stderr` +args when they were explicitly provided but with `None` values within a +passed in `**kwargs` dict rather than as passed directly by name. Patch +contributed by R?mi Lapeyre. From webhook-mailer at python.org Sat Jun 8 11:24:14 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 08 Jun 2019 15:24:14 -0000 Subject: [Python-checkins] bpo-34886: Fix subprocess.run handling of exclusive arguments (GH-11727) Message-ID: https://github.com/python/cpython/commit/10b4fd98142edef6ab7b034e10ae5c9551043999 commit: 10b4fd98142edef6ab7b034e10ae5c9551043999 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-08T08:24:10-07:00 summary: bpo-34886: Fix subprocess.run handling of exclusive arguments (GH-11727) Fix an unintended ValueError from :func:`subprocess.run` when checking for conflicting `input` and `stdin` or `capture_output` and `stdout` or `stderr` args when they were explicitly provided but with `None` values within a passed in `**kwargs` dict rather than as passed directly by name. (cherry picked from commit 8cc605acdda5aff250ab4c9b524a7560f90ca9f3) Co-authored-by: R?mi Lapeyre files: A Misc/NEWS.d/next/Library/2019-06-08-16-03-19.bpo-34886.Ov-pc9.rst M Lib/subprocess.py diff --git a/Lib/subprocess.py b/Lib/subprocess.py index 3c1abb74c26d..53a5e7209974 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -458,12 +458,12 @@ def run(*popenargs, The other arguments are the same as for the Popen constructor. """ if input is not None: - if 'stdin' in kwargs: + if kwargs.get('stdin') is not None: raise ValueError('stdin and input arguments may not both be used.') kwargs['stdin'] = PIPE if capture_output: - if ('stdout' in kwargs) or ('stderr' in kwargs): + if kwargs.get('stdout') is not None or kwargs.get('stderr') is not None: raise ValueError('stdout and stderr arguments may not be used ' 'with capture_output.') kwargs['stdout'] = PIPE diff --git a/Misc/NEWS.d/next/Library/2019-06-08-16-03-19.bpo-34886.Ov-pc9.rst b/Misc/NEWS.d/next/Library/2019-06-08-16-03-19.bpo-34886.Ov-pc9.rst new file mode 100644 index 000000000000..1b5fc3702521 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-08-16-03-19.bpo-34886.Ov-pc9.rst @@ -0,0 +1,5 @@ +Fix an unintended ValueError from :func:`subprocess.run` when checking for +conflicting `input` and `stdin` or `capture_output` and `stdout` or `stderr` +args when they were explicitly provided but with `None` values within a +passed in `**kwargs` dict rather than as passed directly by name. Patch +contributed by R?mi Lapeyre. From webhook-mailer at python.org Sat Jun 8 11:27:09 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 08 Jun 2019 15:27:09 -0000 Subject: [Python-checkins] bpo-37173: Show passed class in inspect.getfile error (GH-13861) Message-ID: https://github.com/python/cpython/commit/51c9cc73cb8768a691688755af0a8b6b12cf712c commit: 51c9cc73cb8768a691688755af0a8b6b12cf712c branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-08T08:27:06-07:00 summary: bpo-37173: Show passed class in inspect.getfile error (GH-13861) Currently, inspect.getfile(str) will report nonsense: ```pytb >>> inspect.getfile(str) TypeError: is a built-in class ``` This fixes that https://bugs.python.org/issue37173 (cherry picked from commit d407d2a7265f6102e51a1d62b3fd28b4f7a78d16) Co-authored-by: Philipp A files: A Misc/NEWS.d/next/Library/2019-06-08-11-33-48.bpo-37173.0e_8gS.rst M Lib/inspect.py M Lib/test/test_inspect.py diff --git a/Lib/inspect.py b/Lib/inspect.py index da4a424151f1..4d4f33dcc57b 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -647,9 +647,9 @@ def getfile(object): raise TypeError('{!r} is a built-in module'.format(object)) if isclass(object): if hasattr(object, '__module__'): - object = sys.modules.get(object.__module__) - if getattr(object, '__file__', None): - return object.__file__ + module = sys.modules.get(object.__module__) + if getattr(module, '__file__', None): + return module.__file__ raise TypeError('{!r} is a built-in class'.format(object)) if ismethod(object): object = object.__func__ diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index ee5a2d4c158d..f3eb2f62c37e 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -478,6 +478,24 @@ def test_getsourcefile(self): def test_getfile(self): self.assertEqual(inspect.getfile(mod.StupidGit), mod.__file__) + def test_getfile_builtin_module(self): + with self.assertRaises(TypeError) as e: + inspect.getfile(sys) + self.assertTrue(str(e.exception).startswith(' https://github.com/python/cpython/commit/e119b3d136bd94d880bce4b382096f6de3f38062 commit: e119b3d136bd94d880bce4b382096f6de3f38062 branch: master author: Raymond Hettinger committer: GitHub date: 2019-06-08T08:58:11-07:00 summary: bpo-37178: Allow a one argument form of math.perm() (GH-13905) files: A Misc/NEWS.d/next/Library/2019-06-07-17-11-34.bpo-37178.b1StSv.rst A Misc/NEWS.d/next/Library/2019-06-07-17-16-09.bpo-37178.Day_oB.rst M Doc/library/math.rst M Lib/test/test_math.py M Modules/clinic/mathmodule.c.h M Modules/mathmodule.c diff --git a/Doc/library/math.rst b/Doc/library/math.rst index 28ed5d21f03a..ff937d27c6ce 100644 --- a/Doc/library/math.rst +++ b/Doc/library/math.rst @@ -210,7 +210,7 @@ Number-theoretic and representation functions of *x* and are floats. -.. function:: perm(n, k) +.. function:: perm(n, k=None) Return the number of ways to choose *k* items from *n* items without repetition and with order. @@ -218,6 +218,9 @@ Number-theoretic and representation functions Evaluates to ``n! / (n - k)!`` when ``k <= n`` and evaluates to zero when ``k > n``. + If *k* is not specified or is None, then *k* defaults to *n* + and the function returns ``n!``. + Raises :exc:`TypeError` if either of the arguments are not integers. Raises :exc:`ValueError` if either of the arguments are negative. diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index 86e3923af6d0..adefa07a4041 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -1885,8 +1885,13 @@ def testPerm(self): self.assertEqual(perm(n, 1), n) self.assertEqual(perm(n, n), factorial(n)) + # Test one argument form + for n in range(20): + self.assertEqual(perm(n), factorial(n)) + self.assertEqual(perm(n, None), factorial(n)) + # Raises TypeError if any argument is non-integer or argument count is - # not 2 + # not 1 or 2 self.assertRaises(TypeError, perm, 10, 1.0) self.assertRaises(TypeError, perm, 10, decimal.Decimal(1.0)) self.assertRaises(TypeError, perm, 10, "1") @@ -1894,7 +1899,7 @@ def testPerm(self): self.assertRaises(TypeError, perm, decimal.Decimal(10.0), 1) self.assertRaises(TypeError, perm, "10", 1) - self.assertRaises(TypeError, perm, 10) + self.assertRaises(TypeError, perm) self.assertRaises(TypeError, perm, 10, 1, 3) self.assertRaises(TypeError, perm) diff --git a/Misc/NEWS.d/next/Library/2019-06-07-17-11-34.bpo-37178.b1StSv.rst b/Misc/NEWS.d/next/Library/2019-06-07-17-11-34.bpo-37178.b1StSv.rst new file mode 100644 index 000000000000..77b872319a91 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-07-17-11-34.bpo-37178.b1StSv.rst @@ -0,0 +1,2 @@ +For math.perm(n, k), let k default to n, giving the same result as +factorial. diff --git a/Misc/NEWS.d/next/Library/2019-06-07-17-16-09.bpo-37178.Day_oB.rst b/Misc/NEWS.d/next/Library/2019-06-07-17-16-09.bpo-37178.Day_oB.rst new file mode 100644 index 000000000000..500ef54fd615 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-07-17-16-09.bpo-37178.Day_oB.rst @@ -0,0 +1,2 @@ +Give math.perm() a one argument form that means the same as +math.factorial(). diff --git a/Modules/clinic/mathmodule.c.h b/Modules/clinic/mathmodule.c.h index cdf4305641b7..966b99b6a369 100644 --- a/Modules/clinic/mathmodule.c.h +++ b/Modules/clinic/mathmodule.c.h @@ -639,7 +639,7 @@ math_prod(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *k } PyDoc_STRVAR(math_perm__doc__, -"perm($module, n, k, /)\n" +"perm($module, n, k=None, /)\n" "--\n" "\n" "Number of ways to choose k items from n items without repetition and with order.\n" @@ -647,6 +647,9 @@ PyDoc_STRVAR(math_perm__doc__, "Evaluates to n! / (n - k)! when k <= n and evaluates\n" "to zero when k > n.\n" "\n" +"If k is not specified or is None, then k defaults to n\n" +"and the function returns n!.\n" +"\n" "Raises TypeError if either of the arguments are not integers.\n" "Raises ValueError if either of the arguments are negative."); @@ -661,13 +664,17 @@ math_perm(PyObject *module, PyObject *const *args, Py_ssize_t nargs) { PyObject *return_value = NULL; PyObject *n; - PyObject *k; + PyObject *k = Py_None; - if (!_PyArg_CheckPositional("perm", nargs, 2, 2)) { + if (!_PyArg_CheckPositional("perm", nargs, 1, 2)) { goto exit; } n = args[0]; + if (nargs < 2) { + goto skip_optional; + } k = args[1]; +skip_optional: return_value = math_perm_impl(module, n, k); exit: @@ -713,4 +720,4 @@ math_comb(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: return return_value; } -/*[clinic end generated code: output=5004266613284dcc input=a9049054013a1b77]*/ +/*[clinic end generated code: output=0eb1e76a769cdd30 input=a9049054013a1b77]*/ diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index 9a9a8159ced4..ed1147675308 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -3002,7 +3002,7 @@ math_prod_impl(PyObject *module, PyObject *iterable, PyObject *start) math.perm n: object - k: object + k: object = None / Number of ways to choose k items from n items without repetition and with order. @@ -3010,18 +3010,24 @@ Number of ways to choose k items from n items without repetition and with order. Evaluates to n! / (n - k)! when k <= n and evaluates to zero when k > n. +If k is not specified or is None, then k defaults to n +and the function returns n!. + Raises TypeError if either of the arguments are not integers. Raises ValueError if either of the arguments are negative. [clinic start generated code]*/ static PyObject * math_perm_impl(PyObject *module, PyObject *n, PyObject *k) -/*[clinic end generated code: output=e021a25469653e23 input=b2e7729d9a1949cf]*/ +/*[clinic end generated code: output=e021a25469653e23 input=5311c5a00f359b53]*/ { PyObject *result = NULL, *factor = NULL; int overflow, cmp; long long i, factors; + if (k == Py_None) { + return math_factorial(module, n); + } n = PyNumber_Index(n); if (n == NULL) { return NULL; From webhook-mailer at python.org Sat Jun 8 12:17:38 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Sat, 08 Jun 2019 16:17:38 -0000 Subject: [Python-checkins] bpo-37178: Allow a one argument form of math.perm() (GH-13905) (GH-13919) Message-ID: https://github.com/python/cpython/commit/feaceaafe816e95c4aff15eab0bea6dc2bbfe4fd commit: feaceaafe816e95c4aff15eab0bea6dc2bbfe4fd branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Raymond Hettinger date: 2019-06-08T09:17:33-07:00 summary: bpo-37178: Allow a one argument form of math.perm() (GH-13905) (GH-13919) (cherry picked from commit e119b3d136bd94d880bce4b382096f6de3f38062) Co-authored-by: Raymond Hettinger files: A Misc/NEWS.d/next/Library/2019-06-07-17-11-34.bpo-37178.b1StSv.rst A Misc/NEWS.d/next/Library/2019-06-07-17-16-09.bpo-37178.Day_oB.rst M Doc/library/math.rst M Lib/test/test_math.py M Modules/clinic/mathmodule.c.h M Modules/mathmodule.c diff --git a/Doc/library/math.rst b/Doc/library/math.rst index 28ed5d21f03a..ff937d27c6ce 100644 --- a/Doc/library/math.rst +++ b/Doc/library/math.rst @@ -210,7 +210,7 @@ Number-theoretic and representation functions of *x* and are floats. -.. function:: perm(n, k) +.. function:: perm(n, k=None) Return the number of ways to choose *k* items from *n* items without repetition and with order. @@ -218,6 +218,9 @@ Number-theoretic and representation functions Evaluates to ``n! / (n - k)!`` when ``k <= n`` and evaluates to zero when ``k > n``. + If *k* is not specified or is None, then *k* defaults to *n* + and the function returns ``n!``. + Raises :exc:`TypeError` if either of the arguments are not integers. Raises :exc:`ValueError` if either of the arguments are negative. diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index 86e3923af6d0..adefa07a4041 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -1885,8 +1885,13 @@ def testPerm(self): self.assertEqual(perm(n, 1), n) self.assertEqual(perm(n, n), factorial(n)) + # Test one argument form + for n in range(20): + self.assertEqual(perm(n), factorial(n)) + self.assertEqual(perm(n, None), factorial(n)) + # Raises TypeError if any argument is non-integer or argument count is - # not 2 + # not 1 or 2 self.assertRaises(TypeError, perm, 10, 1.0) self.assertRaises(TypeError, perm, 10, decimal.Decimal(1.0)) self.assertRaises(TypeError, perm, 10, "1") @@ -1894,7 +1899,7 @@ def testPerm(self): self.assertRaises(TypeError, perm, decimal.Decimal(10.0), 1) self.assertRaises(TypeError, perm, "10", 1) - self.assertRaises(TypeError, perm, 10) + self.assertRaises(TypeError, perm) self.assertRaises(TypeError, perm, 10, 1, 3) self.assertRaises(TypeError, perm) diff --git a/Misc/NEWS.d/next/Library/2019-06-07-17-11-34.bpo-37178.b1StSv.rst b/Misc/NEWS.d/next/Library/2019-06-07-17-11-34.bpo-37178.b1StSv.rst new file mode 100644 index 000000000000..77b872319a91 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-07-17-11-34.bpo-37178.b1StSv.rst @@ -0,0 +1,2 @@ +For math.perm(n, k), let k default to n, giving the same result as +factorial. diff --git a/Misc/NEWS.d/next/Library/2019-06-07-17-16-09.bpo-37178.Day_oB.rst b/Misc/NEWS.d/next/Library/2019-06-07-17-16-09.bpo-37178.Day_oB.rst new file mode 100644 index 000000000000..500ef54fd615 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-07-17-16-09.bpo-37178.Day_oB.rst @@ -0,0 +1,2 @@ +Give math.perm() a one argument form that means the same as +math.factorial(). diff --git a/Modules/clinic/mathmodule.c.h b/Modules/clinic/mathmodule.c.h index cdf4305641b7..966b99b6a369 100644 --- a/Modules/clinic/mathmodule.c.h +++ b/Modules/clinic/mathmodule.c.h @@ -639,7 +639,7 @@ math_prod(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *k } PyDoc_STRVAR(math_perm__doc__, -"perm($module, n, k, /)\n" +"perm($module, n, k=None, /)\n" "--\n" "\n" "Number of ways to choose k items from n items without repetition and with order.\n" @@ -647,6 +647,9 @@ PyDoc_STRVAR(math_perm__doc__, "Evaluates to n! / (n - k)! when k <= n and evaluates\n" "to zero when k > n.\n" "\n" +"If k is not specified or is None, then k defaults to n\n" +"and the function returns n!.\n" +"\n" "Raises TypeError if either of the arguments are not integers.\n" "Raises ValueError if either of the arguments are negative."); @@ -661,13 +664,17 @@ math_perm(PyObject *module, PyObject *const *args, Py_ssize_t nargs) { PyObject *return_value = NULL; PyObject *n; - PyObject *k; + PyObject *k = Py_None; - if (!_PyArg_CheckPositional("perm", nargs, 2, 2)) { + if (!_PyArg_CheckPositional("perm", nargs, 1, 2)) { goto exit; } n = args[0]; + if (nargs < 2) { + goto skip_optional; + } k = args[1]; +skip_optional: return_value = math_perm_impl(module, n, k); exit: @@ -713,4 +720,4 @@ math_comb(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: return return_value; } -/*[clinic end generated code: output=5004266613284dcc input=a9049054013a1b77]*/ +/*[clinic end generated code: output=0eb1e76a769cdd30 input=a9049054013a1b77]*/ diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index 9a9a8159ced4..ed1147675308 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -3002,7 +3002,7 @@ math_prod_impl(PyObject *module, PyObject *iterable, PyObject *start) math.perm n: object - k: object + k: object = None / Number of ways to choose k items from n items without repetition and with order. @@ -3010,18 +3010,24 @@ Number of ways to choose k items from n items without repetition and with order. Evaluates to n! / (n - k)! when k <= n and evaluates to zero when k > n. +If k is not specified or is None, then k defaults to n +and the function returns n!. + Raises TypeError if either of the arguments are not integers. Raises ValueError if either of the arguments are negative. [clinic start generated code]*/ static PyObject * math_perm_impl(PyObject *module, PyObject *n, PyObject *k) -/*[clinic end generated code: output=e021a25469653e23 input=b2e7729d9a1949cf]*/ +/*[clinic end generated code: output=e021a25469653e23 input=5311c5a00f359b53]*/ { PyObject *result = NULL, *factor = NULL; int overflow, cmp; long long i, factors; + if (k == Py_None) { + return math_factorial(module, n); + } n = PyNumber_Index(n); if (n == NULL) { return NULL; From webhook-mailer at python.org Sat Jun 8 17:05:10 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Sat, 08 Jun 2019 21:05:10 -0000 Subject: [Python-checkins] bpo-11122: fix hardcoded path checking for rpmbuild in bdist_rpm.py (GH-10594) Message-ID: https://github.com/python/cpython/commit/45a14942c969ed508b35abd5e116cb18f84ce5b4 commit: 45a14942c969ed508b35abd5e116cb18f84ce5b4 branch: master author: Marcin Niemira committer: Cheryl Sabella date: 2019-06-08T17:05:05-04:00 summary: bpo-11122: fix hardcoded path checking for rpmbuild in bdist_rpm.py (GH-10594) files: A Misc/NEWS.d/next/Library/2018-11-12-19-08-50.bpo-11122.Gj7BQn.rst M Lib/distutils/command/bdist_rpm.py diff --git a/Lib/distutils/command/bdist_rpm.py b/Lib/distutils/command/bdist_rpm.py index 20ca7ac6dcff..74381cc69a6c 100644 --- a/Lib/distutils/command/bdist_rpm.py +++ b/Lib/distutils/command/bdist_rpm.py @@ -309,10 +309,7 @@ def run(self): # build package log.info("building RPMs") - rpm_cmd = ['rpm'] - if os.path.exists('/usr/bin/rpmbuild') or \ - os.path.exists('/bin/rpmbuild'): - rpm_cmd = ['rpmbuild'] + rpm_cmd = ['rpmbuild'] if self.source_only: # what kind of RPMs? rpm_cmd.append('-bs') diff --git a/Misc/NEWS.d/next/Library/2018-11-12-19-08-50.bpo-11122.Gj7BQn.rst b/Misc/NEWS.d/next/Library/2018-11-12-19-08-50.bpo-11122.Gj7BQn.rst new file mode 100644 index 000000000000..483906613801 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-11-12-19-08-50.bpo-11122.Gj7BQn.rst @@ -0,0 +1 @@ +Distutils won't check for rpmbuild in specified paths only. From webhook-mailer at python.org Sat Jun 8 17:25:25 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 08 Jun 2019 21:25:25 -0000 Subject: [Python-checkins] bpo-11122: fix hardcoded path checking for rpmbuild in bdist_rpm.py (GH-10594) Message-ID: https://github.com/python/cpython/commit/3f7629d93c8cb3e0ee118c6a6463250f03d6c9f9 commit: 3f7629d93c8cb3e0ee118c6a6463250f03d6c9f9 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-08T14:25:21-07:00 summary: bpo-11122: fix hardcoded path checking for rpmbuild in bdist_rpm.py (GH-10594) (cherry picked from commit 45a14942c969ed508b35abd5e116cb18f84ce5b4) Co-authored-by: Marcin Niemira files: A Misc/NEWS.d/next/Library/2018-11-12-19-08-50.bpo-11122.Gj7BQn.rst M Lib/distutils/command/bdist_rpm.py diff --git a/Lib/distutils/command/bdist_rpm.py b/Lib/distutils/command/bdist_rpm.py index 20ca7ac6dcff..74381cc69a6c 100644 --- a/Lib/distutils/command/bdist_rpm.py +++ b/Lib/distutils/command/bdist_rpm.py @@ -309,10 +309,7 @@ def run(self): # build package log.info("building RPMs") - rpm_cmd = ['rpm'] - if os.path.exists('/usr/bin/rpmbuild') or \ - os.path.exists('/bin/rpmbuild'): - rpm_cmd = ['rpmbuild'] + rpm_cmd = ['rpmbuild'] if self.source_only: # what kind of RPMs? rpm_cmd.append('-bs') diff --git a/Misc/NEWS.d/next/Library/2018-11-12-19-08-50.bpo-11122.Gj7BQn.rst b/Misc/NEWS.d/next/Library/2018-11-12-19-08-50.bpo-11122.Gj7BQn.rst new file mode 100644 index 000000000000..483906613801 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-11-12-19-08-50.bpo-11122.Gj7BQn.rst @@ -0,0 +1 @@ +Distutils won't check for rpmbuild in specified paths only. From webhook-mailer at python.org Sat Jun 8 20:53:24 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 09 Jun 2019 00:53:24 -0000 Subject: [Python-checkins] Stop using deprecated logging API in Sphinx suspicious checker (GH-9875) Message-ID: https://github.com/python/cpython/commit/3621bf20e94ac3647a8f31a68bf7414dd4b50398 commit: 3621bf20e94ac3647a8f31a68bf7414dd4b50398 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-08T17:53:20-07:00 summary: Stop using deprecated logging API in Sphinx suspicious checker (GH-9875) (cherry picked from commit ee171a26c1169abfae534b08acc0d95c6e45a22a) Co-authored-by: Pablo Galindo files: M Doc/tools/extensions/suspicious.py diff --git a/Doc/tools/extensions/suspicious.py b/Doc/tools/extensions/suspicious.py index 0a70e57d2b04..8d80f6759bff 100644 --- a/Doc/tools/extensions/suspicious.py +++ b/Doc/tools/extensions/suspicious.py @@ -48,6 +48,7 @@ from docutils import nodes from sphinx.builders import Builder +import sphinx.util detect_all = re.compile(r''' ::(?=[^=])| # two :: (but NOT ::=) @@ -85,6 +86,7 @@ class CheckSuspiciousMarkupBuilder(Builder): Checks for possibly invalid markup that may leak into the output. """ name = 'suspicious' + logger = sphinx.util.logging.getLogger("CheckSuspiciousMarkupBuilder") def init(self): # create output file @@ -116,7 +118,7 @@ def finish(self): self.warn('Found %s/%s unused rules:' % (len(unused_rules), len(self.rules))) for rule in unused_rules: - self.info(repr(rule)) + self.logger.info(repr(rule)) return def check_issue(self, line, lineno, issue): @@ -146,7 +148,7 @@ def is_ignored(self, line, lineno, issue): return False def report_issue(self, text, lineno, issue): - if not self.any_issue: self.info() + if not self.any_issue: self.logger.info() self.any_issue = True self.write_log_entry(lineno, issue, text) if py3: @@ -181,7 +183,7 @@ def load_rules(self, filename): A csv file, with exactly the same format as suspicious.csv Fields: document name (normalized), line number, issue, surrounding text """ - self.info("loading ignore rules... ", nonl=1) + self.logger.info("loading ignore rules... ", nonl=1) self.rules = rules = [] try: if py3: @@ -206,7 +208,7 @@ def load_rules(self, filename): rule = Rule(docname, lineno, issue, text) rules.append(rule) f.close() - self.info('done, %d rules loaded' % len(self.rules)) + self.logger.info('done, %d rules loaded' % len(self.rules)) def get_lineno(node): From webhook-mailer at python.org Sat Jun 8 20:55:01 2019 From: webhook-mailer at python.org (Ned Deily) Date: Sun, 09 Jun 2019 00:55:01 -0000 Subject: [Python-checkins] Stop using deprecated logging API in Sphinx suspicious checker (GH-9875) (GH-13923) Message-ID: https://github.com/python/cpython/commit/9393e19a95ca2df373690cccf93f7109833f9004 commit: 9393e19a95ca2df373690cccf93f7109833f9004 branch: 3.6 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Ned Deily date: 2019-06-08T20:54:57-04:00 summary: Stop using deprecated logging API in Sphinx suspicious checker (GH-9875) (GH-13923) (cherry picked from commit ee171a26c1169abfae534b08acc0d95c6e45a22a) Co-authored-by: Pablo Galindo files: M Doc/tools/extensions/suspicious.py diff --git a/Doc/tools/extensions/suspicious.py b/Doc/tools/extensions/suspicious.py index 0a70e57d2b04..8d80f6759bff 100644 --- a/Doc/tools/extensions/suspicious.py +++ b/Doc/tools/extensions/suspicious.py @@ -48,6 +48,7 @@ from docutils import nodes from sphinx.builders import Builder +import sphinx.util detect_all = re.compile(r''' ::(?=[^=])| # two :: (but NOT ::=) @@ -85,6 +86,7 @@ class CheckSuspiciousMarkupBuilder(Builder): Checks for possibly invalid markup that may leak into the output. """ name = 'suspicious' + logger = sphinx.util.logging.getLogger("CheckSuspiciousMarkupBuilder") def init(self): # create output file @@ -116,7 +118,7 @@ def finish(self): self.warn('Found %s/%s unused rules:' % (len(unused_rules), len(self.rules))) for rule in unused_rules: - self.info(repr(rule)) + self.logger.info(repr(rule)) return def check_issue(self, line, lineno, issue): @@ -146,7 +148,7 @@ def is_ignored(self, line, lineno, issue): return False def report_issue(self, text, lineno, issue): - if not self.any_issue: self.info() + if not self.any_issue: self.logger.info() self.any_issue = True self.write_log_entry(lineno, issue, text) if py3: @@ -181,7 +183,7 @@ def load_rules(self, filename): A csv file, with exactly the same format as suspicious.csv Fields: document name (normalized), line number, issue, surrounding text """ - self.info("loading ignore rules... ", nonl=1) + self.logger.info("loading ignore rules... ", nonl=1) self.rules = rules = [] try: if py3: @@ -206,7 +208,7 @@ def load_rules(self, filename): rule = Rule(docname, lineno, issue, text) rules.append(rule) f.close() - self.info('done, %d rules loaded' % len(self.rules)) + self.logger.info('done, %d rules loaded' % len(self.rules)) def get_lineno(node): From webhook-mailer at python.org Sun Jun 9 01:45:10 2019 From: webhook-mailer at python.org (Nick Coghlan) Date: Sun, 09 Jun 2019 05:45:10 -0000 Subject: [Python-checkins] [2.7] bpo-34836: fix test_default_ecdh_curve, needs no tlsv1.3. (GH-9626) Message-ID: https://github.com/python/cpython/commit/99b5c940d3471e0ed6579771d94e7342d7c733e0 commit: 99b5c940d3471e0ed6579771d94e7342d7c733e0 branch: 2.7 author: Dimitri John Ledkov committer: Nick Coghlan date: 2019-06-09T15:44:57+10:00 summary: [2.7] bpo-34836: fix test_default_ecdh_curve, needs no tlsv1.3. (GH-9626) Signed-off-by: Dimitri John Ledkov https://bugs.python.org/issue34836 files: A Misc/NEWS.d/next/Tests/2019-01-11-14-01-19.bpo-34836.7fat9-.rst diff --git a/Misc/NEWS.d/next/Tests/2019-01-11-14-01-19.bpo-34836.7fat9-.rst b/Misc/NEWS.d/next/Tests/2019-01-11-14-01-19.bpo-34836.7fat9-.rst new file mode 100644 index 000000000000..aed4d3f75c93 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-01-11-14-01-19.bpo-34836.7fat9-.rst @@ -0,0 +1 @@ +Fix ``test_default_ecdh_curve`` when TLSv1.3 is enabled by default. From tjreedy at udel.edu Sun Jun 9 11:55:54 2019 From: tjreedy at udel.edu (Terry Reedy) Date: Sun, 9 Jun 2019 11:55:54 -0400 Subject: [Python-checkins] Fwd: Python-checkins post from webhook-mailer@python.org requires approval In-Reply-To: References: Message-ID: <74626090-0359-a696-8b15-934cefe8ff85@udel.edu> Some years ago I was added to python-checkins as a moderator, but not a full list owner, to occasionally discard the very occasional spam. I don't know who the real list owner is, if anyone. Recently, checkins from ?ukasz Langa are being held. I have no idea why, or what implicit destination means. Whoever understands this part of the infrastructure and know how to fix this should do do. I will not continue to approve these on anything like a timely basis. This list should have a knowledgable list owner who pays attention to proper checkins improperly held for moderation. --------------------------------------------------------------------- As list administrator, your authorization is requested for the following mailing list posting: List: Python-checkins at python.org From: webhook-mailer at python.org Subject: (no subject) Reason: Message has implicit destination At your convenience, visit: https://mail.python.org/mailman/admindb/python-checkins to approve or deny the request. ----------------------------------------------------------------------------- ForwardedMessage.eml From: ?ukasz Langa To: python-checkins at python.org Subject: Add some placeholder notes for major 3.8 features (GH-13927) Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 https://github.com/python/cpython/commit/b9438ceb20635b00f10615c5b6d8dbe56e1d= 486b commit: b9438ceb20635b00f10615c5b6d8dbe56e1d486b branch: master author: Nick Coghlan committer: =C5=81ukasz Langa date: 2019-06-09T11:07:42+02:00 summary: Add some placeholder notes for major 3.8 features (GH-13927) files: M Doc/whatsnew/3.8.rst diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index bf75387d9517..99bb793830bc 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -52,6 +52,13 @@ For full details, see the :ref:`changelog `. form. It will be updated substantially as Python 3.8 moves towards releas= e, so it's worth checking back even after reading earlier versions. =20 + Some notable items not yet covered here: + + * :pep:`574` - Pickle protocol 5 with out-of-band data buffer support + * :pep:`578` - Runtime audit hooks for potentially sensitive operations + * ``python -m asyncio`` runs a natively async REPL + * ... + =20 Summary -- Release highlights =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D ------------------------------------------------------------------------- ForwardedMessage.eml From: ?ukasz Langa To: python-checkins at python.org Subject: bpo-36785: PEP 574 What's New entry (#13931) Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 https://github.com/python/cpython/commit/c879ff247ae1b67a790ff98d2d59145302cd= 4e4e commit: c879ff247ae1b67a790ff98d2d59145302cd4e4e branch: master author: Antoine Pitrou committer: =C5=81ukasz Langa date: 2019-06-09T14:47:15+02:00 summary: bpo-36785: PEP 574 What's New entry (#13931) files: M Doc/whatsnew/3.8.rst diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 99bb793830bc..e2f9ce8dd6e5 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -54,7 +54,6 @@ For full details, see the :ref:`changelog `. =20 Some notable items not yet covered here: =20 - * :pep:`574` - Pickle protocol 5 with out-of-band data buffer support * :pep:`578` - Runtime audit hooks for potentially sensitive operations * ``python -m asyncio`` runs a natively async REPL * ... @@ -261,6 +260,23 @@ See :pep:`590` for a full description. (Contributed by Jeroen Demeyer and Mark Shannon in :issue:`36974`.) =20 =20 +Pickle protocol 5 with out-of-band data buffers +----------------------------------------------- + +When :mod:`pickle` is used to transfer large data between Python processes +in order to take advantage of multi-core or multi-machine processing, +it is important to optimize the transfer by reducing memory copies, and +possibly by applying custom techniques such as data-dependent compression. + +The :mod:`pickle` protocol 5 introduces support for out-of-band buffers +where :pep:`3118`-compatible data can be transmitted separately from the +main pickle stream, at the discretion of the communication layer. + +See :pep:`574` for a full description. + +(Contributed by Antoine Pitrou in :issue:`36785`.) + + Other Language Changes =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =20 From webhook-mailer at python.org Sun Jun 9 05:08:04 2019 From: webhook-mailer at python.org (=?utf-8?q?=C5=81ukasz?= Langa) Date: Sun, 09 Jun 2019 09:08:04 -0000 Subject: [Python-checkins] (no subject) Message-ID: To: python-checkins at python.org Subject: Add some placeholder notes for major 3.8 features (GH-13927) Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 https://github.com/python/cpython/commit/b9438ceb20635b00f10615c5b6d8dbe56e1d= 486b commit: b9438ceb20635b00f10615c5b6d8dbe56e1d486b branch: master author: Nick Coghlan committer: =C5=81ukasz Langa date: 2019-06-09T11:07:42+02:00 summary: Add some placeholder notes for major 3.8 features (GH-13927) files: M Doc/whatsnew/3.8.rst diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index bf75387d9517..99bb793830bc 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -52,6 +52,13 @@ For full details, see the :ref:`changelog `. form. It will be updated substantially as Python 3.8 moves towards releas= e, so it's worth checking back even after reading earlier versions. =20 + Some notable items not yet covered here: + + * :pep:`574` - Pickle protocol 5 with out-of-band data buffer support + * :pep:`578` - Runtime audit hooks for potentially sensitive operations + * ``python -m asyncio`` runs a natively async REPL + * ... + =20 Summary -- Release highlights =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D From webhook-mailer at python.org Sun Jun 9 08:47:21 2019 From: webhook-mailer at python.org (=?utf-8?q?=C5=81ukasz?= Langa) Date: Sun, 09 Jun 2019 12:47:21 -0000 Subject: [Python-checkins] (no subject) Message-ID: To: python-checkins at python.org Subject: bpo-36785: PEP 574 What's New entry (#13931) Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 https://github.com/python/cpython/commit/c879ff247ae1b67a790ff98d2d59145302cd= 4e4e commit: c879ff247ae1b67a790ff98d2d59145302cd4e4e branch: master author: Antoine Pitrou committer: =C5=81ukasz Langa date: 2019-06-09T14:47:15+02:00 summary: bpo-36785: PEP 574 What's New entry (#13931) files: M Doc/whatsnew/3.8.rst diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 99bb793830bc..e2f9ce8dd6e5 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -54,7 +54,6 @@ For full details, see the :ref:`changelog `. =20 Some notable items not yet covered here: =20 - * :pep:`574` - Pickle protocol 5 with out-of-band data buffer support * :pep:`578` - Runtime audit hooks for potentially sensitive operations * ``python -m asyncio`` runs a natively async REPL * ... @@ -261,6 +260,23 @@ See :pep:`590` for a full description. (Contributed by Jeroen Demeyer and Mark Shannon in :issue:`36974`.) =20 =20 +Pickle protocol 5 with out-of-band data buffers +----------------------------------------------- + +When :mod:`pickle` is used to transfer large data between Python processes +in order to take advantage of multi-core or multi-machine processing, +it is important to optimize the transfer by reducing memory copies, and +possibly by applying custom techniques such as data-dependent compression. + +The :mod:`pickle` protocol 5 introduces support for out-of-band buffers +where :pep:`3118`-compatible data can be transmitted separately from the +main pickle stream, at the discretion of the communication layer. + +See :pep:`574` for a full description. + +(Contributed by Antoine Pitrou in :issue:`36785`.) + + Other Language Changes =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =20 From webhook-mailer at python.org Mon Jun 10 06:36:01 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Mon, 10 Jun 2019 10:36:01 -0000 Subject: [Python-checkins] Do not use explicit inheritance from object in the documentation. (GH-13936) Message-ID: https://github.com/python/cpython/commit/e042a4553efd0ceca2234f68a4f1878f2ca04973 commit: e042a4553efd0ceca2234f68a4f1878f2ca04973 branch: master author: Serhiy Storchaka committer: GitHub date: 2019-06-10T13:35:52+03:00 summary: Do not use explicit inheritance from object in the documentation. (GH-13936) files: M Doc/howto/descriptor.rst M Doc/library/copyreg.rst M Doc/library/functools.rst diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst index b29e590b20cb..324625d7b3e8 100644 --- a/Doc/howto/descriptor.rst +++ b/Doc/howto/descriptor.rst @@ -145,7 +145,7 @@ print a message for each get or set. Overriding :meth:`__getattribute__` is alternate approach that could do this for every attribute. However, this descriptor is useful for monitoring just a few chosen attributes:: - class RevealAccess(object): + class RevealAccess: """A data descriptor that sets and returns values normally and prints a message logging their access. """ @@ -162,7 +162,7 @@ descriptor is useful for monitoring just a few chosen attributes:: print('Updating', self.name) self.val = val - >>> class MyClass(object): + >>> class MyClass: ... x = RevealAccess(10, 'var "x"') ... y = 5 ... @@ -194,7 +194,7 @@ triggers function calls upon access to an attribute. Its signature is:: The documentation shows a typical use to define a managed attribute ``x``:: - class C(object): + class C: def getx(self): return self.__x def setx(self, value): self.__x = value def delx(self): del self.__x @@ -203,7 +203,7 @@ The documentation shows a typical use to define a managed attribute ``x``:: To see how :func:`property` is implemented in terms of the descriptor protocol, here is a pure Python equivalent:: - class Property(object): + class Property: "Emulate PyProperty_Type() in Objects/descrobject.c" def __init__(self, fget=None, fset=None, fdel=None, doc=None): @@ -250,7 +250,7 @@ to be recalculated on every access; however, the programmer does not want to affect existing client code accessing the attribute directly. The solution is to wrap access to the value attribute in a property data descriptor:: - class Cell(object): + class Cell: . . . def getvalue(self): "Recalculate the cell before returning value" @@ -277,7 +277,7 @@ binding methods during attribute access. This means that all functions are non-data descriptors which return bound methods when they are invoked from an object. In pure Python, it works like this:: - class Function(object): + class Function: . . . def __get__(self, obj, objtype=None): "Simulate func_descr_get() in Objects/funcobject.c" @@ -287,7 +287,7 @@ object. In pure Python, it works like this:: Running the interpreter shows how the function descriptor works in practice:: - >>> class D(object): + >>> class D: ... def f(self, x): ... return x ... @@ -367,7 +367,7 @@ It can be called either from an object or the class: ``s.erf(1.5) --> .9332`` o Since staticmethods return the underlying function with no changes, the example calls are unexciting:: - >>> class E(object): + >>> class E: ... def f(x): ... print(x) ... f = staticmethod(f) @@ -380,7 +380,7 @@ calls are unexciting:: Using the non-data descriptor protocol, a pure Python version of :func:`staticmethod` would look like this:: - class StaticMethod(object): + class StaticMethod: "Emulate PyStaticMethod_Type() in Objects/funcobject.c" def __init__(self, f): @@ -393,7 +393,7 @@ Unlike static methods, class methods prepend the class reference to the argument list before calling the function. This format is the same for whether the caller is an object or a class:: - >>> class E(object): + >>> class E: ... def f(klass, x): ... return klass.__name__, x ... f = classmethod(f) @@ -410,7 +410,7 @@ is to create alternate class constructors. In Python 2.3, the classmethod :func:`dict.fromkeys` creates a new dictionary from a list of keys. The pure Python equivalent is:: - class Dict(object): + class Dict: . . . def fromkeys(klass, iterable, value=None): "Emulate dict_fromkeys() in Objects/dictobject.c" @@ -428,7 +428,7 @@ Now a new dictionary of unique keys can be constructed like this:: Using the non-data descriptor protocol, a pure Python version of :func:`classmethod` would look like this:: - class ClassMethod(object): + class ClassMethod: "Emulate PyClassMethod_Type() in Objects/funcobject.c" def __init__(self, f): diff --git a/Doc/library/copyreg.rst b/Doc/library/copyreg.rst index 40fca56d8029..439202100959 100644 --- a/Doc/library/copyreg.rst +++ b/Doc/library/copyreg.rst @@ -49,7 +49,7 @@ The example below would like to show how to register a pickle function and how it will be used: >>> import copyreg, copy, pickle - >>> class C(object): + >>> class C: ... def __init__(self, a): ... self.a = a ... diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst index 3a0b554e923c..d3debac8432b 100644 --- a/Doc/library/functools.rst +++ b/Doc/library/functools.rst @@ -275,7 +275,7 @@ The :mod:`functools` module defines the following functions: Example:: - >>> class Cell(object): + >>> class Cell: ... def __init__(self): ... self._alive = False ... @property From webhook-mailer at python.org Mon Jun 10 11:19:57 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 10 Jun 2019 15:19:57 -0000 Subject: [Python-checkins] bpo-37215: Fix dtrace issue introduce by bpo-36842 (GH-13940) Message-ID: https://github.com/python/cpython/commit/8a8b59c9794674b50b2242698c29038034f4864c commit: 8a8b59c9794674b50b2242698c29038034f4864c branch: master author: Christian Heimes committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-06-10T08:19:48-07:00 summary: bpo-37215: Fix dtrace issue introduce by bpo-36842 (GH-13940) Signed-off-by: Christian Heimes https://bugs.python.org/issue37215 files: A Misc/NEWS.d/next/C API/2019-06-10-15-32-34.bpo-37215.yzoNyU.rst M Makefile.pre.in diff --git a/Makefile.pre.in b/Makefile.pre.in index a0bc9c1f1cc8..2b4e2d776ea9 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -438,7 +438,7 @@ LIBRARY_OBJS= \ # On some systems, object files that reference DTrace probes need to be modified # in-place by dtrace(1). DTRACE_DEPS = \ - Python/ceval.o Python/import.o Modules/gcmodule.o + Python/ceval.o Python/import.o Python/sysmodule.o Modules/gcmodule.o ######################################################################### # Rules @@ -780,7 +780,7 @@ Python/dynload_hpux.o: $(srcdir)/Python/dynload_hpux.c Makefile -DSHLIB_EXT='"$(EXT_SUFFIX)"' \ -o $@ $(srcdir)/Python/dynload_hpux.c -Python/sysmodule.o: $(srcdir)/Python/sysmodule.c Makefile +Python/sysmodule.o: $(srcdir)/Python/sysmodule.c Makefile $(srcdir)/Include/pydtrace.h $(CC) -c $(PY_CORE_CFLAGS) \ -DABIFLAGS='"$(ABIFLAGS)"' \ $(MULTIARCH_CPPFLAGS) \ @@ -938,9 +938,9 @@ Include/pydtrace_probes.h: $(srcdir)/Include/pydtrace.d sed 's/PYTHON_/PyDTrace_/' $@ > $@.tmp mv $@.tmp $@ -Python/ceval.o: Include/pydtrace.h -Python/import.o: Include/pydtrace.h -Modules/gcmodule.o: Include/pydtrace.h +Python/ceval.o: $(srcdir)/Include/pydtrace.h +Python/import.o: $(srcdir)/Include/pydtrace.h +Modules/gcmodule.o: $(srcdir)/Include/pydtrace.h Python/pydtrace.o: $(srcdir)/Include/pydtrace.d $(DTRACE_DEPS) $(DTRACE) $(DFLAGS) -o $@ -G -s $< $(DTRACE_DEPS) diff --git a/Misc/NEWS.d/next/C API/2019-06-10-15-32-34.bpo-37215.yzoNyU.rst b/Misc/NEWS.d/next/C API/2019-06-10-15-32-34.bpo-37215.yzoNyU.rst new file mode 100644 index 000000000000..58038b21729b --- /dev/null +++ b/Misc/NEWS.d/next/C API/2019-06-10-15-32-34.bpo-37215.yzoNyU.rst @@ -0,0 +1 @@ +Fix dtrace issue introduce by bpo-36842 From webhook-mailer at python.org Mon Jun 10 11:38:32 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 10 Jun 2019 15:38:32 -0000 Subject: [Python-checkins] bpo-37215: Fix dtrace issue introduce by bpo-36842 (GH-13940) Message-ID: https://github.com/python/cpython/commit/bac6e63fd63960a1ab862befab42de05d32667c2 commit: bac6e63fd63960a1ab862befab42de05d32667c2 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-10T08:38:23-07:00 summary: bpo-37215: Fix dtrace issue introduce by bpo-36842 (GH-13940) Signed-off-by: Christian Heimes https://bugs.python.org/issue37215 (cherry picked from commit 8a8b59c9794674b50b2242698c29038034f4864c) Co-authored-by: Christian Heimes files: A Misc/NEWS.d/next/C API/2019-06-10-15-32-34.bpo-37215.yzoNyU.rst M Makefile.pre.in diff --git a/Makefile.pre.in b/Makefile.pre.in index a0bc9c1f1cc8..2b4e2d776ea9 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -438,7 +438,7 @@ LIBRARY_OBJS= \ # On some systems, object files that reference DTrace probes need to be modified # in-place by dtrace(1). DTRACE_DEPS = \ - Python/ceval.o Python/import.o Modules/gcmodule.o + Python/ceval.o Python/import.o Python/sysmodule.o Modules/gcmodule.o ######################################################################### # Rules @@ -780,7 +780,7 @@ Python/dynload_hpux.o: $(srcdir)/Python/dynload_hpux.c Makefile -DSHLIB_EXT='"$(EXT_SUFFIX)"' \ -o $@ $(srcdir)/Python/dynload_hpux.c -Python/sysmodule.o: $(srcdir)/Python/sysmodule.c Makefile +Python/sysmodule.o: $(srcdir)/Python/sysmodule.c Makefile $(srcdir)/Include/pydtrace.h $(CC) -c $(PY_CORE_CFLAGS) \ -DABIFLAGS='"$(ABIFLAGS)"' \ $(MULTIARCH_CPPFLAGS) \ @@ -938,9 +938,9 @@ Include/pydtrace_probes.h: $(srcdir)/Include/pydtrace.d sed 's/PYTHON_/PyDTrace_/' $@ > $@.tmp mv $@.tmp $@ -Python/ceval.o: Include/pydtrace.h -Python/import.o: Include/pydtrace.h -Modules/gcmodule.o: Include/pydtrace.h +Python/ceval.o: $(srcdir)/Include/pydtrace.h +Python/import.o: $(srcdir)/Include/pydtrace.h +Modules/gcmodule.o: $(srcdir)/Include/pydtrace.h Python/pydtrace.o: $(srcdir)/Include/pydtrace.d $(DTRACE_DEPS) $(DTRACE) $(DFLAGS) -o $@ -G -s $< $(DTRACE_DEPS) diff --git a/Misc/NEWS.d/next/C API/2019-06-10-15-32-34.bpo-37215.yzoNyU.rst b/Misc/NEWS.d/next/C API/2019-06-10-15-32-34.bpo-37215.yzoNyU.rst new file mode 100644 index 000000000000..58038b21729b --- /dev/null +++ b/Misc/NEWS.d/next/C API/2019-06-10-15-32-34.bpo-37215.yzoNyU.rst @@ -0,0 +1 @@ +Fix dtrace issue introduce by bpo-36842 From webhook-mailer at python.org Mon Jun 10 20:49:17 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 11 Jun 2019 00:49:17 -0000 Subject: [Python-checkins] bpo-18748: Fix _pyio.IOBase destructor (closed case) (GH-13952) Message-ID: https://github.com/python/cpython/commit/4f6f7c5a611905fb6b81671547f268c226bc646a commit: 4f6f7c5a611905fb6b81671547f268c226bc646a branch: master author: Victor Stinner committer: GitHub date: 2019-06-11T02:49:06+02:00 summary: bpo-18748: Fix _pyio.IOBase destructor (closed case) (GH-13952) _pyio.IOBase destructor now does nothing if getting the closed attribute fails to better mimick _io.IOBase finalizer. files: A Misc/NEWS.d/next/Library/2019-06-11-01-54-19.bpo-18748.ADqCkq.rst M Lib/_pyio.py diff --git a/Lib/_pyio.py b/Lib/_pyio.py index 43c24342ad61..0b6493bc8dc9 100644 --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -405,6 +405,16 @@ def close(self): def __del__(self): """Destructor. Calls close().""" + try: + closed = self.closed + except Exception: + # If getting closed fails, then the object is probably + # in an unusable state, so ignore. + return + + if closed: + return + if _IOBASE_EMITS_UNRAISABLE: self.close() else: diff --git a/Misc/NEWS.d/next/Library/2019-06-11-01-54-19.bpo-18748.ADqCkq.rst b/Misc/NEWS.d/next/Library/2019-06-11-01-54-19.bpo-18748.ADqCkq.rst new file mode 100644 index 000000000000..295ddebb2a40 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-11-01-54-19.bpo-18748.ADqCkq.rst @@ -0,0 +1,2 @@ +:class:`_pyio.IOBase` destructor now does nothing if getting the ``closed`` +attribute fails to better mimick :class:`_io.IOBase` finalizer. From webhook-mailer at python.org Mon Jun 10 21:11:03 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 11 Jun 2019 01:11:03 -0000 Subject: [Python-checkins] bpo-37223: test_io: silence destructor errors (GH-13954) Message-ID: https://github.com/python/cpython/commit/b589cef9c4dada2fb84ce0fae5040ecf16d9d5ef commit: b589cef9c4dada2fb84ce0fae5040ecf16d9d5ef branch: master author: Victor Stinner committer: GitHub date: 2019-06-11T03:10:59+02:00 summary: bpo-37223: test_io: silence destructor errors (GH-13954) Implement also MockNonBlockWriterIO.seek() method. files: M Lib/test/test_io.py diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 3a1f5ba5b666..102679b1d342 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -277,6 +277,10 @@ def readable(self): def seekable(self): return True + def seek(self, pos, whence=0): + # naive implementation, enough for tests + return 0 + def writable(self): return True @@ -1486,6 +1490,9 @@ def test_misbehaved_io(self): self.assertRaises(OSError, bufio.seek, 0) self.assertRaises(OSError, bufio.tell) + # Silence destructor error + bufio.close = lambda: None + def test_no_extraneous_read(self): # Issue #9550; when the raw IO object has satisfied the read request, # we should not issue any additional reads, otherwise it may block @@ -1834,6 +1841,9 @@ def test_misbehaved_io(self): self.assertRaises(OSError, bufio.tell) self.assertRaises(OSError, bufio.write, b"abcdef") + # Silence destructor error + bufio.close = lambda: None + def test_max_buffer_size_removal(self): with self.assertRaises(TypeError): self.tp(self.MockRawIO(), 8, 12) From webhook-mailer at python.org Mon Jun 10 21:54:27 2019 From: webhook-mailer at python.org (Benjamin Peterson) Date: Tue, 11 Jun 2019 01:54:27 -0000 Subject: [Python-checkins] closes bpo-35184: Fix XML_POOR_ENTROPY option that breaks makesetup parsing of pyexpat line in Setup. (GH-13064) Message-ID: https://github.com/python/cpython/commit/408a2ef1aceff1f4270c44552fa39ef93d9283e3 commit: 408a2ef1aceff1f4270c44552fa39ef93d9283e3 branch: master author: aaronpaulhurst committer: Benjamin Peterson date: 2019-06-10T18:54:24-07:00 summary: closes bpo-35184: Fix XML_POOR_ENTROPY option that breaks makesetup parsing of pyexpat line in Setup. (GH-13064) When the line is uncommented, the equals character causes it to be incorrectly interpreted as a macro definition by makesetup. This results in invalid Makefile output. The expat code only requires XML_POOR_ENTROPY to be defined; the value is unnecessary. files: M Modules/Setup diff --git a/Modules/Setup b/Modules/Setup index e729ab883f41..ed5ee6c5033b 100644 --- a/Modules/Setup +++ b/Modules/Setup @@ -338,7 +338,7 @@ _symtable symtablemodule.c # Interface to the Expat XML parser # More information on Expat can be found at www.libexpat.org. # -#pyexpat expat/xmlparse.c expat/xmlrole.c expat/xmltok.c pyexpat.c -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DXML_POOR_ENTROPY=1 -DUSE_PYEXPAT_CAPI +#pyexpat expat/xmlparse.c expat/xmlrole.c expat/xmltok.c pyexpat.c -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DXML_POOR_ENTROPY -DUSE_PYEXPAT_CAPI # Hye-Shik Chang's CJKCodecs From webhook-mailer at python.org Mon Jun 10 22:14:38 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 11 Jun 2019 02:14:38 -0000 Subject: [Python-checkins] closes bpo-35184: Fix XML_POOR_ENTROPY option that breaks makesetup parsing of pyexpat line in Setup. (GH-13064) Message-ID: https://github.com/python/cpython/commit/5b94b857f590db80aab69c31f88dd2a4978f8329 commit: 5b94b857f590db80aab69c31f88dd2a4978f8329 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-10T19:14:23-07:00 summary: closes bpo-35184: Fix XML_POOR_ENTROPY option that breaks makesetup parsing of pyexpat line in Setup. (GH-13064) When the line is uncommented, the equals character causes it to be incorrectly interpreted as a macro definition by makesetup. This results in invalid Makefile output. The expat code only requires XML_POOR_ENTROPY to be defined; the value is unnecessary. (cherry picked from commit 408a2ef1aceff1f4270c44552fa39ef93d9283e3) Co-authored-by: aaronpaulhurst files: M Modules/Setup diff --git a/Modules/Setup b/Modules/Setup index e729ab883f41..ed5ee6c5033b 100644 --- a/Modules/Setup +++ b/Modules/Setup @@ -338,7 +338,7 @@ _symtable symtablemodule.c # Interface to the Expat XML parser # More information on Expat can be found at www.libexpat.org. # -#pyexpat expat/xmlparse.c expat/xmlrole.c expat/xmltok.c pyexpat.c -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DXML_POOR_ENTROPY=1 -DUSE_PYEXPAT_CAPI +#pyexpat expat/xmlparse.c expat/xmlrole.c expat/xmltok.c pyexpat.c -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DXML_POOR_ENTROPY -DUSE_PYEXPAT_CAPI # Hye-Shik Chang's CJKCodecs From webhook-mailer at python.org Mon Jun 10 22:15:28 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 11 Jun 2019 02:15:28 -0000 Subject: [Python-checkins] closes bpo-35184: Fix XML_POOR_ENTROPY option that breaks makesetup parsing of pyexpat line in Setup. (GH-13064) Message-ID: https://github.com/python/cpython/commit/30fd7a476bbd6bb8096c1349698463fa8a3bca18 commit: 30fd7a476bbd6bb8096c1349698463fa8a3bca18 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-10T19:15:24-07:00 summary: closes bpo-35184: Fix XML_POOR_ENTROPY option that breaks makesetup parsing of pyexpat line in Setup. (GH-13064) When the line is uncommented, the equals character causes it to be incorrectly interpreted as a macro definition by makesetup. This results in invalid Makefile output. The expat code only requires XML_POOR_ENTROPY to be defined; the value is unnecessary. (cherry picked from commit 408a2ef1aceff1f4270c44552fa39ef93d9283e3) Co-authored-by: aaronpaulhurst files: M Modules/Setup.dist diff --git a/Modules/Setup.dist b/Modules/Setup.dist index 8cc6bf0540d4..344e03ada990 100644 --- a/Modules/Setup.dist +++ b/Modules/Setup.dist @@ -340,7 +340,7 @@ _symtable symtablemodule.c # Interface to the Expat XML parser # More information on Expat can be found at www.libexpat.org. # -#pyexpat expat/xmlparse.c expat/xmlrole.c expat/xmltok.c pyexpat.c -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DXML_POOR_ENTROPY=1 -DUSE_PYEXPAT_CAPI +#pyexpat expat/xmlparse.c expat/xmlrole.c expat/xmltok.c pyexpat.c -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DXML_POOR_ENTROPY -DUSE_PYEXPAT_CAPI # Hye-Shik Chang's CJKCodecs From webhook-mailer at python.org Tue Jun 11 01:37:40 2019 From: webhook-mailer at python.org (Ned Deily) Date: Tue, 11 Jun 2019 05:37:40 -0000 Subject: [Python-checkins] [3.8] bpo-37216: Fix version and filename in Mac using document (GH-13964) Message-ID: https://github.com/python/cpython/commit/fe5f8b9ce2e504d4510cc82129d595015d239634 commit: fe5f8b9ce2e504d4510cc82129d595015d239634 branch: 3.8 author: Makdon committer: Ned Deily date: 2019-06-11T01:37:34-04:00 summary: [3.8] bpo-37216: Fix version and filename in Mac using document (GH-13964) files: M Doc/using/mac.rst diff --git a/Doc/using/mac.rst b/Doc/using/mac.rst index bc022fa58c04..b411fa282049 100644 --- a/Doc/using/mac.rst +++ b/Doc/using/mac.rst @@ -25,7 +25,7 @@ there. What you get after installing is a number of things: -* A :file:`MacPython 3.6` folder in your :file:`Applications` folder. In here +* A :file:`Python 3.8` folder in your :file:`Applications` folder. In here you find IDLE, the development environment that is a standard part of official Python distributions; PythonLauncher, which handles double-clicking Python scripts from the Finder; and the "Build Applet" tool, which allows you to @@ -93,7 +93,7 @@ aware of: programs that talk to the Aqua window manager (in other words, anything that has a GUI) need to be run in a special way. Use :program:`pythonw` instead of :program:`python` to start such scripts. -With Python 3.6, you can use either :program:`python` or :program:`pythonw`. +With Python 3.8, you can use either :program:`python` or :program:`pythonw`. Configuration From webhook-mailer at python.org Tue Jun 11 01:38:29 2019 From: webhook-mailer at python.org (Ned Deily) Date: Tue, 11 Jun 2019 05:38:29 -0000 Subject: [Python-checkins] [3.7] bpo-37216: Fix version and filename in Mac using document (GH-13963) Message-ID: https://github.com/python/cpython/commit/c59b1bbbb37bbfc7eb7a9386bb51c7fea838fc2a commit: c59b1bbbb37bbfc7eb7a9386bb51c7fea838fc2a branch: 3.7 author: Makdon committer: Ned Deily date: 2019-06-11T01:38:25-04:00 summary: [3.7] bpo-37216: Fix version and filename in Mac using document (GH-13963) files: M Doc/using/mac.rst diff --git a/Doc/using/mac.rst b/Doc/using/mac.rst index bc022fa58c04..e685993b65d5 100644 --- a/Doc/using/mac.rst +++ b/Doc/using/mac.rst @@ -25,7 +25,7 @@ there. What you get after installing is a number of things: -* A :file:`MacPython 3.6` folder in your :file:`Applications` folder. In here +* A :file:`Python 3.7` folder in your :file:`Applications` folder. In here you find IDLE, the development environment that is a standard part of official Python distributions; PythonLauncher, which handles double-clicking Python scripts from the Finder; and the "Build Applet" tool, which allows you to @@ -93,7 +93,7 @@ aware of: programs that talk to the Aqua window manager (in other words, anything that has a GUI) need to be run in a special way. Use :program:`pythonw` instead of :program:`python` to start such scripts. -With Python 3.6, you can use either :program:`python` or :program:`pythonw`. +With Python 3.7, you can use either :program:`python` or :program:`pythonw`. Configuration From webhook-mailer at python.org Tue Jun 11 04:16:07 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Tue, 11 Jun 2019 08:16:07 -0000 Subject: [Python-checkins] bpo-37219: Remove erroneous optimization for differencing an empty set (GH-13965) Message-ID: https://github.com/python/cpython/commit/1f11cf9521114447b3e32e2ac88f075ffaa37555 commit: 1f11cf9521114447b3e32e2ac88f075ffaa37555 branch: master author: Raymond Hettinger committer: GitHub date: 2019-06-11T01:15:24-07:00 summary: bpo-37219: Remove erroneous optimization for differencing an empty set (GH-13965) files: A Misc/NEWS.d/next/Core and Builtins/2019-06-10-23-18-31.bpo-37219.jPSufq.rst M Lib/test/test_set.py M Objects/setobject.c diff --git a/Lib/test/test_set.py b/Lib/test/test_set.py index bb1081f034fe..e4766ab190be 100644 --- a/Lib/test/test_set.py +++ b/Lib/test/test_set.py @@ -895,6 +895,12 @@ def test_pickling(self): self.assertEqual(self.set, copy, "%s != %s" % (self.set, copy)) + def test_issue_37219(self): + with self.assertRaises(TypeError): + set().difference(123) + with self.assertRaises(TypeError): + set().difference_update(123) + #------------------------------------------------------------------------------ class TestBasicOpsEmpty(TestBasicOps, unittest.TestCase): diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-06-10-23-18-31.bpo-37219.jPSufq.rst b/Misc/NEWS.d/next/Core and Builtins/2019-06-10-23-18-31.bpo-37219.jPSufq.rst new file mode 100644 index 000000000000..ef8f52dce678 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-06-10-23-18-31.bpo-37219.jPSufq.rst @@ -0,0 +1 @@ +Remove errorneous optimization for empty set differences. diff --git a/Objects/setobject.c b/Objects/setobject.c index bd031600c1be..8cd95ba890dd 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -1456,10 +1456,6 @@ PyDoc_STRVAR(isdisjoint_doc, static int set_difference_update_internal(PySetObject *so, PyObject *other) { - if (PySet_GET_SIZE(so) == 0) { - return 0; - } - if ((PyObject *)so == other) return set_clear_internal(so); @@ -1534,10 +1530,6 @@ set_difference(PySetObject *so, PyObject *other) Py_ssize_t pos = 0, other_size; int rv; - if (PySet_GET_SIZE(so) == 0) { - return set_copy(so, NULL); - } - if (PyAnySet_Check(other)) { other_size = PySet_GET_SIZE(other); } From webhook-mailer at python.org Tue Jun 11 04:41:31 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Tue, 11 Jun 2019 08:41:31 -0000 Subject: [Python-checkins] bpo-37219: Remove erroneous optimization for differencing an empty set (GH-13965) (GH-13967) Message-ID: https://github.com/python/cpython/commit/583ff84351e528976aa93d383e5a81aee9f3bac3 commit: 583ff84351e528976aa93d383e5a81aee9f3bac3 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Raymond Hettinger date: 2019-06-11T01:41:23-07:00 summary: bpo-37219: Remove erroneous optimization for differencing an empty set (GH-13965) (GH-13967) (cherry picked from commit 1f11cf9521114447b3e32e2ac88f075ffaa37555) Co-authored-by: Raymond Hettinger files: A Misc/NEWS.d/next/Core and Builtins/2019-06-10-23-18-31.bpo-37219.jPSufq.rst M Lib/test/test_set.py M Objects/setobject.c diff --git a/Lib/test/test_set.py b/Lib/test/test_set.py index bb1081f034fe..e4766ab190be 100644 --- a/Lib/test/test_set.py +++ b/Lib/test/test_set.py @@ -895,6 +895,12 @@ def test_pickling(self): self.assertEqual(self.set, copy, "%s != %s" % (self.set, copy)) + def test_issue_37219(self): + with self.assertRaises(TypeError): + set().difference(123) + with self.assertRaises(TypeError): + set().difference_update(123) + #------------------------------------------------------------------------------ class TestBasicOpsEmpty(TestBasicOps, unittest.TestCase): diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-06-10-23-18-31.bpo-37219.jPSufq.rst b/Misc/NEWS.d/next/Core and Builtins/2019-06-10-23-18-31.bpo-37219.jPSufq.rst new file mode 100644 index 000000000000..ef8f52dce678 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-06-10-23-18-31.bpo-37219.jPSufq.rst @@ -0,0 +1 @@ +Remove errorneous optimization for empty set differences. diff --git a/Objects/setobject.c b/Objects/setobject.c index bd031600c1be..8cd95ba890dd 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -1456,10 +1456,6 @@ PyDoc_STRVAR(isdisjoint_doc, static int set_difference_update_internal(PySetObject *so, PyObject *other) { - if (PySet_GET_SIZE(so) == 0) { - return 0; - } - if ((PyObject *)so == other) return set_clear_internal(so); @@ -1534,10 +1530,6 @@ set_difference(PySetObject *so, PyObject *other) Py_ssize_t pos = 0, other_size; int rv; - if (PySet_GET_SIZE(so) == 0) { - return set_copy(so, NULL); - } - if (PyAnySet_Check(other)) { other_size = PySet_GET_SIZE(other); } From webhook-mailer at python.org Tue Jun 11 05:01:28 2019 From: webhook-mailer at python.org (Raymond Hettinger) Date: Tue, 11 Jun 2019 09:01:28 -0000 Subject: [Python-checkins] [3.7] bpo-37219: Remove erroneous optimization for differencing an empty set (GH-13965) (GH-13968) Message-ID: https://github.com/python/cpython/commit/1b615b2f035d207941e44259a92ed0bdcc56ac45 commit: 1b615b2f035d207941e44259a92ed0bdcc56ac45 branch: 3.7 author: Raymond Hettinger committer: GitHub date: 2019-06-11T02:01:06-07:00 summary: [3.7] bpo-37219: Remove erroneous optimization for differencing an empty set (GH-13965) (GH-13968) files: A Misc/NEWS.d/next/Core and Builtins/2019-06-11-01-37-34.bpo-37219.jPSufq.rst M Lib/test/test_set.py M Objects/setobject.c diff --git a/Lib/test/test_set.py b/Lib/test/test_set.py index bb1081f034fe..e4766ab190be 100644 --- a/Lib/test/test_set.py +++ b/Lib/test/test_set.py @@ -895,6 +895,12 @@ def test_pickling(self): self.assertEqual(self.set, copy, "%s != %s" % (self.set, copy)) + def test_issue_37219(self): + with self.assertRaises(TypeError): + set().difference(123) + with self.assertRaises(TypeError): + set().difference_update(123) + #------------------------------------------------------------------------------ class TestBasicOpsEmpty(TestBasicOps, unittest.TestCase): diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-06-11-01-37-34.bpo-37219.jPSufq.rst b/Misc/NEWS.d/next/Core and Builtins/2019-06-11-01-37-34.bpo-37219.jPSufq.rst new file mode 100644 index 000000000000..ef8f52dce678 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-06-11-01-37-34.bpo-37219.jPSufq.rst @@ -0,0 +1 @@ +Remove errorneous optimization for empty set differences. diff --git a/Objects/setobject.c b/Objects/setobject.c index 357e48ca3ce0..1e4781fe11ee 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -1478,10 +1478,6 @@ PyDoc_STRVAR(isdisjoint_doc, static int set_difference_update_internal(PySetObject *so, PyObject *other) { - if (PySet_GET_SIZE(so) == 0) { - return 0; - } - if ((PyObject *)so == other) return set_clear_internal(so); @@ -1556,10 +1552,6 @@ set_difference(PySetObject *so, PyObject *other) Py_ssize_t pos = 0, other_size; int rv; - if (PySet_GET_SIZE(so) == 0) { - return set_copy(so); - } - if (PyAnySet_Check(other)) { other_size = PySet_GET_SIZE(other); } From webhook-mailer at python.org Tue Jun 11 06:45:40 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Tue, 11 Jun 2019 10:45:40 -0000 Subject: [Python-checkins] [2.7] bpo-36742: Fix urlparse.urlsplit() error message for Unicode URL (GH-13937) Message-ID: https://github.com/python/cpython/commit/2b578479b96aa3deeeb8bac313a02b5cf3cb1aff commit: 2b578479b96aa3deeeb8bac313a02b5cf3cb1aff branch: 2.7 author: Victor Stinner committer: GitHub date: 2019-06-11T12:45:35+02:00 summary: [2.7] bpo-36742: Fix urlparse.urlsplit() error message for Unicode URL (GH-13937) If urlparse.urlsplit() detects an invalid netloc according to NFKC normalization, the error message type is now str rather than unicode, and use repr() to format the URL, to prevent when display the error message. files: A Misc/NEWS.d/next/Library/2019-06-10-12-02-45.bpo-36742.UEdHXJ.rst M Lib/test/test_urlparse.py M Lib/urlparse.py diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py index 857ed96d92fe..86c4a0595c4f 100644 --- a/Lib/test/test_urlparse.py +++ b/Lib/test/test_urlparse.py @@ -656,6 +656,15 @@ def test_urlsplit_normalization(self): with self.assertRaises(ValueError): urlparse.urlsplit(url) + # check error message: invalid netloc must be formated with repr() + # to get an ASCII error message + with self.assertRaises(ValueError) as cm: + urlparse.urlsplit(u'http://example.com\uFF03 at bing.com') + self.assertEqual(str(cm.exception), + "netloc u'example.com\\uff03 at bing.com' contains invalid characters " + "under NFKC normalization") + self.assertIsInstance(cm.exception.args[0], str) + def test_main(): test_support.run_unittest(UrlParseTestCase) diff --git a/Lib/urlparse.py b/Lib/urlparse.py index 6834f3c1798b..798b467b605f 100644 --- a/Lib/urlparse.py +++ b/Lib/urlparse.py @@ -180,8 +180,9 @@ def _checknetloc(netloc): return for c in '/?#@:': if c in netloc2: - raise ValueError(u"netloc '" + netloc + u"' contains invalid " + - u"characters under NFKC normalization") + raise ValueError("netloc %r contains invalid characters " + "under NFKC normalization" + % netloc) def urlsplit(url, scheme='', allow_fragments=True): """Parse a URL into 5 components: diff --git a/Misc/NEWS.d/next/Library/2019-06-10-12-02-45.bpo-36742.UEdHXJ.rst b/Misc/NEWS.d/next/Library/2019-06-10-12-02-45.bpo-36742.UEdHXJ.rst new file mode 100644 index 000000000000..3ba774056f15 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-10-12-02-45.bpo-36742.UEdHXJ.rst @@ -0,0 +1,3 @@ +:func:`urlparse.urlsplit` error message for invalid ``netloc`` according to +NFKC normalization is now a :class:`str` string, rather than a +:class:`unicode` string, to prevent error when displaying the error. From webhook-mailer at python.org Tue Jun 11 11:27:36 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 11 Jun 2019 15:27:36 -0000 Subject: [Python-checkins] bpo-36607: Eliminate RuntimeError raised by asyncio.all_tasks() (GH-13971) Message-ID: https://github.com/python/cpython/commit/65aa64fae89a24491aae84ba0329eb8f3c68c389 commit: 65aa64fae89a24491aae84ba0329eb8f3c68c389 branch: master author: Andrew Svetlov committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-06-11T08:27:30-07:00 summary: bpo-36607: Eliminate RuntimeError raised by asyncio.all_tasks() (GH-13971) If internal tasks weak set is changed by another thread during iteration. https://bugs.python.org/issue36607 files: A Misc/NEWS.d/next/Library/2019-06-11-13-52-04.bpo-36607.5_mJkQ.rst M Lib/asyncio/tasks.py diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index 95e85600a2e8..cd4832cfee24 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -42,9 +42,22 @@ def all_tasks(loop=None): """Return a set of all tasks for the loop.""" if loop is None: loop = events.get_running_loop() - # NB: set(_all_tasks) is required to protect - # from https://bugs.python.org/issue34970 bug - return {t for t in list(_all_tasks) + # Looping over a WeakSet (_all_tasks) isn't safe as it can be updated from another + # thread while we do so. Therefore we cast it to list prior to filtering. The list + # cast itself requires iteration, so we repeat it several times ignoring + # RuntimeErrors (which are not very likely to occur). See issues 34970 and 36607 for + # details. + i = 0 + while True: + try: + tasks = list(_all_tasks) + except RuntimeError: + i += 1 + if i >= 1000: + raise + else: + break + return {t for t in tasks if futures._get_loop(t) is loop and not t.done()} @@ -54,9 +67,22 @@ def _all_tasks_compat(loop=None): # method. if loop is None: loop = events.get_event_loop() - # NB: set(_all_tasks) is required to protect - # from https://bugs.python.org/issue34970 bug - return {t for t in list(_all_tasks) if futures._get_loop(t) is loop} + # Looping over a WeakSet (_all_tasks) isn't safe as it can be updated from another + # thread while we do so. Therefore we cast it to list prior to filtering. The list + # cast itself requires iteration, so we repeat it several times ignoring + # RuntimeErrors (which are not very likely to occur). See issues 34970 and 36607 for + # details. + i = 0 + while True: + try: + tasks = list(_all_tasks) + except RuntimeError: + i += 1 + if i >= 1000: + raise + else: + break + return {t for t in tasks if futures._get_loop(t) is loop} def _set_task_name(task, name): diff --git a/Misc/NEWS.d/next/Library/2019-06-11-13-52-04.bpo-36607.5_mJkQ.rst b/Misc/NEWS.d/next/Library/2019-06-11-13-52-04.bpo-36607.5_mJkQ.rst new file mode 100644 index 000000000000..337c8e2668c4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-11-13-52-04.bpo-36607.5_mJkQ.rst @@ -0,0 +1,2 @@ +Eliminate :exc:`RuntimeError` raised by :func:`asyncio.all_tasks()` if +internal tasks weak set is changed by another thread during iteration. From webhook-mailer at python.org Tue Jun 11 12:01:39 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 11 Jun 2019 16:01:39 -0000 Subject: [Python-checkins] bpo-36607: Eliminate RuntimeError raised by asyncio.all_tasks() (GH-13971) Message-ID: https://github.com/python/cpython/commit/5d1d4e3179ffd4d2d72462d870cf86dcc11450ce commit: 5d1d4e3179ffd4d2d72462d870cf86dcc11450ce branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-11T09:01:20-07:00 summary: bpo-36607: Eliminate RuntimeError raised by asyncio.all_tasks() (GH-13971) If internal tasks weak set is changed by another thread during iteration. https://bugs.python.org/issue36607 (cherry picked from commit 65aa64fae89a24491aae84ba0329eb8f3c68c389) Co-authored-by: Andrew Svetlov files: A Misc/NEWS.d/next/Library/2019-06-11-13-52-04.bpo-36607.5_mJkQ.rst M Lib/asyncio/tasks.py diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index 402c6e26a79b..c82b95e3beea 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -35,9 +35,22 @@ def all_tasks(loop=None): """Return a set of all tasks for the loop.""" if loop is None: loop = events.get_running_loop() - # NB: set(_all_tasks) is required to protect - # from https://bugs.python.org/issue34970 bug - return {t for t in list(_all_tasks) + # Looping over a WeakSet (_all_tasks) isn't safe as it can be updated from another + # thread while we do so. Therefore we cast it to list prior to filtering. The list + # cast itself requires iteration, so we repeat it several times ignoring + # RuntimeErrors (which are not very likely to occur). See issues 34970 and 36607 for + # details. + i = 0 + while True: + try: + tasks = list(_all_tasks) + except RuntimeError: + i += 1 + if i >= 1000: + raise + else: + break + return {t for t in tasks if futures._get_loop(t) is loop and not t.done()} @@ -47,9 +60,22 @@ def _all_tasks_compat(loop=None): # method. if loop is None: loop = events.get_event_loop() - # NB: set(_all_tasks) is required to protect - # from https://bugs.python.org/issue34970 bug - return {t for t in list(_all_tasks) if futures._get_loop(t) is loop} + # Looping over a WeakSet (_all_tasks) isn't safe as it can be updated from another + # thread while we do so. Therefore we cast it to list prior to filtering. The list + # cast itself requires iteration, so we repeat it several times ignoring + # RuntimeErrors (which are not very likely to occur). See issues 34970 and 36607 for + # details. + i = 0 + while True: + try: + tasks = list(_all_tasks) + except RuntimeError: + i += 1 + if i >= 1000: + raise + else: + break + return {t for t in tasks if futures._get_loop(t) is loop} class Task(futures._PyFuture): # Inherit Python Task implementation diff --git a/Misc/NEWS.d/next/Library/2019-06-11-13-52-04.bpo-36607.5_mJkQ.rst b/Misc/NEWS.d/next/Library/2019-06-11-13-52-04.bpo-36607.5_mJkQ.rst new file mode 100644 index 000000000000..337c8e2668c4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-11-13-52-04.bpo-36607.5_mJkQ.rst @@ -0,0 +1,2 @@ +Eliminate :exc:`RuntimeError` raised by :func:`asyncio.all_tasks()` if +internal tasks weak set is changed by another thread during iteration. From webhook-mailer at python.org Tue Jun 11 12:18:37 2019 From: webhook-mailer at python.org (Benjamin Peterson) Date: Tue, 11 Jun 2019 16:18:37 -0000 Subject: [Python-checkins] closes bpo-33758: Skip test_get_type_hints_modules_forwardref. (GH-13977) Message-ID: https://github.com/python/cpython/commit/910b3fcb01c29f18ffd53086e36cd2cb9e5fae55 commit: 910b3fcb01c29f18ffd53086e36cd2cb9e5fae55 branch: master author: Benjamin Peterson committer: GitHub date: 2019-06-11T09:18:31-07:00 summary: closes bpo-33758: Skip test_get_type_hints_modules_forwardref. (GH-13977) This test "works" if things are run in the right order, so it's better to use @skip than @expectedFailure here. files: M Lib/test/test_typing.py diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index a65d639fe9e1..ba001c3462fc 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -3,7 +3,7 @@ import pickle import re import sys -from unittest import TestCase, main, skipUnless, SkipTest, expectedFailure +from unittest import TestCase, main, skipUnless, SkipTest, skip from copy import copy, deepcopy from typing import Any, NoReturn @@ -2654,7 +2654,7 @@ def test_get_type_hints_modules(self): self.assertEqual(gth(ann_module2), {}) self.assertEqual(gth(ann_module3), {}) - @expectedFailure + @skip("known bug") def test_get_type_hints_modules_forwardref(self): # FIXME: This currently exposes a bug in typing. Cached forward references # don't account for the case where there are multiple types of the same From webhook-mailer at python.org Tue Jun 11 12:38:13 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 11 Jun 2019 16:38:13 -0000 Subject: [Python-checkins] closes bpo-33758: Skip test_get_type_hints_modules_forwardref. (GH-13977) Message-ID: https://github.com/python/cpython/commit/1c31d19e35172c7de1beec5c48a5b632d16385d9 commit: 1c31d19e35172c7de1beec5c48a5b632d16385d9 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-11T09:37:59-07:00 summary: closes bpo-33758: Skip test_get_type_hints_modules_forwardref. (GH-13977) This test "works" if things are run in the right order, so it's better to use @skip than @expectedFailure here. (cherry picked from commit 910b3fcb01c29f18ffd53086e36cd2cb9e5fae55) Co-authored-by: Benjamin Peterson files: M Lib/test/test_typing.py diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index a65d639fe9e1..ba001c3462fc 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -3,7 +3,7 @@ import pickle import re import sys -from unittest import TestCase, main, skipUnless, SkipTest, expectedFailure +from unittest import TestCase, main, skipUnless, SkipTest, skip from copy import copy, deepcopy from typing import Any, NoReturn @@ -2654,7 +2654,7 @@ def test_get_type_hints_modules(self): self.assertEqual(gth(ann_module2), {}) self.assertEqual(gth(ann_module3), {}) - @expectedFailure + @skip("known bug") def test_get_type_hints_modules_forwardref(self): # FIXME: This currently exposes a bug in typing. Cached forward references # don't account for the case where there are multiple types of the same From webhook-mailer at python.org Tue Jun 11 12:52:43 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 11 Jun 2019 16:52:43 -0000 Subject: [Python-checkins] closes bpo-33758: Skip test_get_type_hints_modules_forwardref. (GH-13977) Message-ID: https://github.com/python/cpython/commit/fad89046e14b271b2eeb399f7c7b45131d65e5f2 commit: fad89046e14b271b2eeb399f7c7b45131d65e5f2 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-11T09:52:15-07:00 summary: closes bpo-33758: Skip test_get_type_hints_modules_forwardref. (GH-13977) This test "works" if things are run in the right order, so it's better to use @skip than @expectedFailure here. (cherry picked from commit 910b3fcb01c29f18ffd53086e36cd2cb9e5fae55) Co-authored-by: Benjamin Peterson files: M Lib/test/test_typing.py diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index ffd2007ee70d..b396283a02ee 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -3,7 +3,7 @@ import pickle import re import sys -from unittest import TestCase, main, skipUnless, SkipTest, expectedFailure +from unittest import TestCase, main, skipUnless, SkipTest, skip from copy import copy, deepcopy from typing import Any, NoReturn @@ -1804,7 +1804,7 @@ def test_get_type_hints_modules(self): self.assertEqual(gth(ann_module2), {}) self.assertEqual(gth(ann_module3), {}) - @expectedFailure + @skip("known bug") def test_get_type_hints_modules_forwardref(self): # FIXME: This currently exposes a bug in typing. Cached forward references # don't account for the case where there are multiple types of the same From webhook-mailer at python.org Tue Jun 11 13:15:35 2019 From: webhook-mailer at python.org (Benjamin Peterson) Date: Tue, 11 Jun 2019 17:15:35 -0000 Subject: [Python-checkins] Fix test_posix if RWF_HIPRI is defined but not preadv2. (GH-13980) Message-ID: https://github.com/python/cpython/commit/44867bb9376e324493f0149ac8b3c33f23c9050d commit: 44867bb9376e324493f0149ac8b3c33f23c9050d branch: master author: Benjamin Peterson committer: GitHub date: 2019-06-11T10:15:31-07:00 summary: Fix test_posix if RWF_HIPRI is defined but not preadv2. (GH-13980) If preadv2 is not available, preadv will raise NotImplementedError. files: M Lib/test/test_posix.py diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py index 5c93d0d507d2..0f07a8f2e68d 100644 --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -310,6 +310,8 @@ def test_preadv_flags(self): buf = [bytearray(i) for i in [5, 3, 2]] self.assertEqual(posix.preadv(fd, buf, 3, os.RWF_HIPRI), 10) self.assertEqual([b't1tt2', b't3t', b'5t'], list(buf)) + except NotImplementedError: + self.skipTest("preadv2 not available") except OSError as inst: # Is possible that the macro RWF_HIPRI was defined at compilation time # but the option is not supported by the kernel or the runtime libc shared From webhook-mailer at python.org Tue Jun 11 13:33:56 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 11 Jun 2019 17:33:56 -0000 Subject: [Python-checkins] Fix test_posix if RWF_HIPRI is defined but not preadv2. (GH-13980) Message-ID: https://github.com/python/cpython/commit/22e8a6d013c14f8724f396011fe22f13ea1641aa commit: 22e8a6d013c14f8724f396011fe22f13ea1641aa branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-11T10:33:36-07:00 summary: Fix test_posix if RWF_HIPRI is defined but not preadv2. (GH-13980) If preadv2 is not available, preadv will raise NotImplementedError. (cherry picked from commit 44867bb9376e324493f0149ac8b3c33f23c9050d) Co-authored-by: Benjamin Peterson files: M Lib/test/test_posix.py diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py index 55077354589d..233fea4d57bb 100644 --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -308,6 +308,8 @@ def test_preadv_flags(self): buf = [bytearray(i) for i in [5, 3, 2]] self.assertEqual(posix.preadv(fd, buf, 3, os.RWF_HIPRI), 10) self.assertEqual([b't1tt2', b't3t', b'5t'], list(buf)) + except NotImplementedError: + self.skipTest("preadv2 not available") except OSError as inst: # Is possible that the macro RWF_HIPRI was defined at compilation time # but the option is not supported by the kernel or the runtime libc shared From webhook-mailer at python.org Tue Jun 11 13:59:23 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 11 Jun 2019 17:59:23 -0000 Subject: [Python-checkins] Fix test_posix if RWF_HIPRI is defined but not preadv2. (GH-13980) Message-ID: https://github.com/python/cpython/commit/b9ecc0fadaf04aa5f7c9cec9addb4c9c97380fee commit: b9ecc0fadaf04aa5f7c9cec9addb4c9c97380fee branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-11T10:58:57-07:00 summary: Fix test_posix if RWF_HIPRI is defined but not preadv2. (GH-13980) If preadv2 is not available, preadv will raise NotImplementedError. (cherry picked from commit 44867bb9376e324493f0149ac8b3c33f23c9050d) Co-authored-by: Benjamin Peterson files: M Lib/test/test_posix.py diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py index 5c93d0d507d2..0f07a8f2e68d 100644 --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -310,6 +310,8 @@ def test_preadv_flags(self): buf = [bytearray(i) for i in [5, 3, 2]] self.assertEqual(posix.preadv(fd, buf, 3, os.RWF_HIPRI), 10) self.assertEqual([b't1tt2', b't3t', b'5t'], list(buf)) + except NotImplementedError: + self.skipTest("preadv2 not available") except OSError as inst: # Is possible that the macro RWF_HIPRI was defined at compilation time # but the option is not supported by the kernel or the runtime libc shared From webhook-mailer at python.org Tue Jun 11 16:32:29 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 11 Jun 2019 20:32:29 -0000 Subject: [Python-checkins] bpo-36607: Eliminate RuntimeError raised by asyncio.all_tasks() (GH-13971) Message-ID: https://github.com/python/cpython/commit/83abd9658b4845299452be06c9ce92cbceee944d commit: 83abd9658b4845299452be06c9ce92cbceee944d branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-11T13:32:12-07:00 summary: bpo-36607: Eliminate RuntimeError raised by asyncio.all_tasks() (GH-13971) If internal tasks weak set is changed by another thread during iteration. https://bugs.python.org/issue36607 (cherry picked from commit 65aa64fae89a24491aae84ba0329eb8f3c68c389) Co-authored-by: Andrew Svetlov files: A Misc/NEWS.d/next/Library/2019-06-11-13-52-04.bpo-36607.5_mJkQ.rst M Lib/asyncio/tasks.py diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index 95e85600a2e8..cd4832cfee24 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -42,9 +42,22 @@ def all_tasks(loop=None): """Return a set of all tasks for the loop.""" if loop is None: loop = events.get_running_loop() - # NB: set(_all_tasks) is required to protect - # from https://bugs.python.org/issue34970 bug - return {t for t in list(_all_tasks) + # Looping over a WeakSet (_all_tasks) isn't safe as it can be updated from another + # thread while we do so. Therefore we cast it to list prior to filtering. The list + # cast itself requires iteration, so we repeat it several times ignoring + # RuntimeErrors (which are not very likely to occur). See issues 34970 and 36607 for + # details. + i = 0 + while True: + try: + tasks = list(_all_tasks) + except RuntimeError: + i += 1 + if i >= 1000: + raise + else: + break + return {t for t in tasks if futures._get_loop(t) is loop and not t.done()} @@ -54,9 +67,22 @@ def _all_tasks_compat(loop=None): # method. if loop is None: loop = events.get_event_loop() - # NB: set(_all_tasks) is required to protect - # from https://bugs.python.org/issue34970 bug - return {t for t in list(_all_tasks) if futures._get_loop(t) is loop} + # Looping over a WeakSet (_all_tasks) isn't safe as it can be updated from another + # thread while we do so. Therefore we cast it to list prior to filtering. The list + # cast itself requires iteration, so we repeat it several times ignoring + # RuntimeErrors (which are not very likely to occur). See issues 34970 and 36607 for + # details. + i = 0 + while True: + try: + tasks = list(_all_tasks) + except RuntimeError: + i += 1 + if i >= 1000: + raise + else: + break + return {t for t in tasks if futures._get_loop(t) is loop} def _set_task_name(task, name): diff --git a/Misc/NEWS.d/next/Library/2019-06-11-13-52-04.bpo-36607.5_mJkQ.rst b/Misc/NEWS.d/next/Library/2019-06-11-13-52-04.bpo-36607.5_mJkQ.rst new file mode 100644 index 000000000000..337c8e2668c4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-11-13-52-04.bpo-36607.5_mJkQ.rst @@ -0,0 +1,2 @@ +Eliminate :exc:`RuntimeError` raised by :func:`asyncio.all_tasks()` if +internal tasks weak set is changed by another thread during iteration. From webhook-mailer at python.org Tue Jun 11 16:42:52 2019 From: webhook-mailer at python.org (Guido van Rossum) Date: Tue, 11 Jun 2019 20:42:52 -0000 Subject: [Python-checkins] bpo-35766: What's new in the ast and typing modules (#13984) Message-ID: https://github.com/python/cpython/commit/9b33ce48a7846dbdad32d4f8936b08e6b78a2faf commit: 9b33ce48a7846dbdad32d4f8936b08e6b78a2faf branch: master author: Guido van Rossum committer: GitHub date: 2019-06-11T13:42:35-07:00 summary: bpo-35766: What's new in the ast and typing modules (#13984) files: M Doc/whatsnew/3.8.rst diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index e2f9ce8dd6e5..eb276139192d 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -363,6 +363,29 @@ Improved Modules ================ +ast +--- + +AST nodes now have ``end_lineno`` and ``end_col_offset`` attributes, +which give the precise location of the end of the node. (This only +applies to nodes that have ``lineno`` and ``col_offset`` attributes.) + +The :func:`ast.parse` function has some new flags: + +* ``type_comments=True`` causes it to return the text of :pep:`484` and + :pep:`526` type comments associated with certain AST nodes; + +* ``mode='func_type'`` can be used to parse :pep:`484` "signature type + comments" (returned for function definition AST nodes); + +* ``feature_version=N`` allows specifying the minor version of an + earlier Python 3 version. (For example, ``feature_version=4`` will + treat ``async`` and ``await`` as non-reserved words.) + +New function :func:`ast.get_source_segment` returns the source code +for a specific AST node. + + asyncio ------- @@ -762,6 +785,29 @@ time Added new clock :data:`~time.CLOCK_UPTIME_RAW` for macOS 10.12. (Contributed by Joannah Nanjekye in :issue:`35702`.) + +typing +------ + +The :mod:`typing` module incorporates several new features: + +* Protocol definitions. See :pep:`544`, :class:`typing.Protocol` and + :func:`typing.runtime_checkable`. Simple ABCs like + :class:`typing.SupportsInt` are now ``Protocol`` subclasses. + +* A dictionary type with per-key types. See :pep:`589` and + :class:`typing.TypedDict`. + +* Literal types. See :pep:`586` and :class:`typing.Literal`. + +* "Final" variables, functions, methods and classes. See :pep:`591`, + :class:`typing.Final` and :func:`typing.final`. + +* New protocol class :class:`typing.SupportsIndex`. + +* New functions :func:`typing.get_origin` and :func:`typing.get_args`. + + unicodedata ----------- From webhook-mailer at python.org Tue Jun 11 17:13:36 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 11 Jun 2019 21:13:36 -0000 Subject: [Python-checkins] bpo-35766: What's new in the ast and typing modules (GH-13984) Message-ID: https://github.com/python/cpython/commit/785688832de699270530a9418e99c5c4caedbffb commit: 785688832de699270530a9418e99c5c4caedbffb branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-11T14:13:25-07:00 summary: bpo-35766: What's new in the ast and typing modules (GH-13984) (cherry picked from commit 9b33ce48a7846dbdad32d4f8936b08e6b78a2faf) Co-authored-by: Guido van Rossum files: M Doc/whatsnew/3.8.rst diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 8456a17aedcc..64e2e8eaef48 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -337,6 +337,29 @@ Improved Modules ================ +ast +--- + +AST nodes now have ``end_lineno`` and ``end_col_offset`` attributes, +which give the precise location of the end of the node. (This only +applies to nodes that have ``lineno`` and ``col_offset`` attributes.) + +The :func:`ast.parse` function has some new flags: + +* ``type_comments=True`` causes it to return the text of :pep:`484` and + :pep:`526` type comments associated with certain AST nodes; + +* ``mode='func_type'`` can be used to parse :pep:`484` "signature type + comments" (returned for function definition AST nodes); + +* ``feature_version=N`` allows specifying the minor version of an + earlier Python 3 version. (For example, ``feature_version=4`` will + treat ``async`` and ``await`` as non-reserved words.) + +New function :func:`ast.get_source_segment` returns the source code +for a specific AST node. + + asyncio ------- @@ -736,6 +759,29 @@ time Added new clock :data:`~time.CLOCK_UPTIME_RAW` for macOS 10.12. (Contributed by Joannah Nanjekye in :issue:`35702`.) + +typing +------ + +The :mod:`typing` module incorporates several new features: + +* Protocol definitions. See :pep:`544`, :class:`typing.Protocol` and + :func:`typing.runtime_checkable`. Simple ABCs like + :class:`typing.SupportsInt` are now ``Protocol`` subclasses. + +* A dictionary type with per-key types. See :pep:`589` and + :class:`typing.TypedDict`. + +* Literal types. See :pep:`586` and :class:`typing.Literal`. + +* "Final" variables, functions, methods and classes. See :pep:`591`, + :class:`typing.Final` and :func:`typing.final`. + +* New protocol class :class:`typing.SupportsIndex`. + +* New functions :func:`typing.get_origin` and :func:`typing.get_args`. + + unicodedata ----------- From webhook-mailer at python.org Tue Jun 11 18:03:21 2019 From: webhook-mailer at python.org (Steve Dower) Date: Tue, 11 Jun 2019 22:03:21 -0000 Subject: [Python-checkins] bpo-37238: Enable building for Windows using Visual Studio 2019 (GH-13988) Message-ID: https://github.com/python/cpython/commit/04856c2193eb72d72c46b57fa08095235d732a73 commit: 04856c2193eb72d72c46b57fa08095235d732a73 branch: master author: Paul Monson committer: Steve Dower date: 2019-06-11T15:03:17-07:00 summary: bpo-37238: Enable building for Windows using Visual Studio 2019 (GH-13988) files: M PCbuild/python.props M PCbuild/pythoncore.vcxproj diff --git a/PCbuild/python.props b/PCbuild/python.props index 11638fe348c8..e6642fc4818a 100644 --- a/PCbuild/python.props +++ b/PCbuild/python.props @@ -10,6 +10,7 @@ We set BasePlatformToolset for ICC's benefit, it's otherwise ignored. --> + v142 v141 v140 v120 diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 89625da944e1..09a63c04eab8 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -511,7 +511,7 @@ - + From webhook-mailer at python.org Tue Jun 11 18:35:59 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 11 Jun 2019 22:35:59 -0000 Subject: [Python-checkins] bpo-37238: Enable building for Windows using Visual Studio 2019 (GH-13988) Message-ID: https://github.com/python/cpython/commit/36926df8341827fb2a5323f559daab8e34d33ed8 commit: 36926df8341827fb2a5323f559daab8e34d33ed8 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-11T15:35:55-07:00 summary: bpo-37238: Enable building for Windows using Visual Studio 2019 (GH-13988) (cherry picked from commit 04856c2193eb72d72c46b57fa08095235d732a73) Co-authored-by: Paul Monson files: M PCbuild/python.props M PCbuild/pythoncore.vcxproj diff --git a/PCbuild/python.props b/PCbuild/python.props index 11638fe348c8..e6642fc4818a 100644 --- a/PCbuild/python.props +++ b/PCbuild/python.props @@ -10,6 +10,7 @@ We set BasePlatformToolset for ICC's benefit, it's otherwise ignored. --> + v142 v141 v140 v120 diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 89625da944e1..09a63c04eab8 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -511,7 +511,7 @@ - + From webhook-mailer at python.org Tue Jun 11 19:27:17 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 11 Jun 2019 23:27:17 -0000 Subject: [Python-checkins] [3.7] bpo-36520: Email header folded incorrectly (GH-13608) (GH-13910) Message-ID: https://github.com/python/cpython/commit/0745cc66db3acbe7951073071cf063db6337dd10 commit: 0745cc66db3acbe7951073071cf063db6337dd10 branch: 3.7 author: Abhilash Raj committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-06-11T16:27:06-07:00 summary: [3.7] bpo-36520: Email header folded incorrectly (GH-13608) (GH-13910) * [bpo-36520](https://bugs.python.org/issue36520): reset the encoded word offset when starting a new line during an email header folding operation * ?? Added by blurb_it. * [bpo-36520](https://bugs.python.org/issue36520): add an additional test case, and provide descriptive comments for the test_folding_with_utf8_encoding_* tests * [bpo-36520](https://bugs.python.org/issue36520): fix whitespace issue * [bpo-36520](https://bugs.python.org/issue36520): changes per reviewer request -- remove extraneous backslashes; add whitespace between terminating quotes and line-continuation backslashes; use "bpo-" instead of "issue GH-" in comments (cherry picked from commit f6713e84afc5addcfa8477dbdf2c027787f711c0) Co-authored-by: websurfer5 <49998481+websurfer5 at users.noreply.github.com> https://bugs.python.org/issue36520 files: A Misc/NEWS.d/next/Library/2019-05-28-02-37-00.bpo-36520.W4tday.rst M Lib/email/_header_value_parser.py M Lib/test/test_email/test_message.py diff --git a/Lib/email/_header_value_parser.py b/Lib/email/_header_value_parser.py index 18aecbffa71a..fc00b4a098cb 100644 --- a/Lib/email/_header_value_parser.py +++ b/Lib/email/_header_value_parser.py @@ -2683,6 +2683,7 @@ def _refold_parse_tree(parse_tree, *, policy): newline = _steal_trailing_WSP_if_exists(lines) if newline or part.startswith_fws(): lines.append(newline + tstr) + last_ew = None continue if not hasattr(part, 'encode'): # It's not a terminal, try folding the subparts. diff --git a/Lib/test/test_email/test_message.py b/Lib/test/test_email/test_message.py index f3a57df9e9cf..5dc46e1b812c 100644 --- a/Lib/test/test_email/test_message.py +++ b/Lib/test/test_email/test_message.py @@ -784,6 +784,137 @@ def test_str_defaults_to_utf8(self): m['Subject'] = 'unic?de' self.assertEqual(str(m), 'Subject: unic?de\n\n') + def test_folding_with_utf8_encoding_1(self): + # bpo-36520 + # + # Fold a line that contains UTF-8 words before + # and after the whitespace fold point, where the + # line length limit is reached within an ASCII + # word. + + m = EmailMessage() + m['Subject'] = 'Hello W?rld! Hello W?rld! ' \ + 'Hello W?rld! Hello W?rld!Hello W?rld!' + self.assertEqual(bytes(m), + b'Subject: Hello =?utf-8?q?W=C3=B6rld!_Hello_W' + b'=C3=B6rld!_Hello_W=C3=B6rld!?=\n' + b' Hello =?utf-8?q?W=C3=B6rld!Hello_W=C3=B6rld!?=\n\n') + + + def test_folding_with_utf8_encoding_2(self): + # bpo-36520 + # + # Fold a line that contains UTF-8 words before + # and after the whitespace fold point, where the + # line length limit is reached at the end of an + # encoded word. + + m = EmailMessage() + m['Subject'] = 'Hello W?rld! Hello W?rld! ' \ + 'Hello W?rlds123! Hello W?rld!Hello W?rld!' + self.assertEqual(bytes(m), + b'Subject: Hello =?utf-8?q?W=C3=B6rld!_Hello_W' + b'=C3=B6rld!_Hello_W=C3=B6rlds123!?=\n' + b' Hello =?utf-8?q?W=C3=B6rld!Hello_W=C3=B6rld!?=\n\n') + + def test_folding_with_utf8_encoding_3(self): + # bpo-36520 + # + # Fold a line that contains UTF-8 words before + # and after the whitespace fold point, where the + # line length limit is reached at the end of the + # first word. + + m = EmailMessage() + m['Subject'] = 'Hello-W?rld!-Hello-W?rld!-Hello-W?rlds123! ' \ + 'Hello W?rld!Hello W?rld!' + self.assertEqual(bytes(m), \ + b'Subject: =?utf-8?q?Hello-W=C3=B6rld!-Hello-W' + b'=C3=B6rld!-Hello-W=C3=B6rlds123!?=\n' + b' Hello =?utf-8?q?W=C3=B6rld!Hello_W=C3=B6rld!?=\n\n') + + def test_folding_with_utf8_encoding_4(self): + # bpo-36520 + # + # Fold a line that contains UTF-8 words before + # and after the fold point, where the first + # word is UTF-8 and the fold point is within + # the word. + + m = EmailMessage() + m['Subject'] = 'Hello-W?rld!-Hello-W?rld!-Hello-W?rlds123!-Hello' \ + ' W?rld!Hello W?rld!' + self.assertEqual(bytes(m), + b'Subject: =?utf-8?q?Hello-W=C3=B6rld!-Hello-W' + b'=C3=B6rld!-Hello-W=C3=B6rlds123!?=\n' + b' =?utf-8?q?-Hello_W=C3=B6rld!Hello_W=C3=B6rld!?=\n\n') + + def test_folding_with_utf8_encoding_5(self): + # bpo-36520 + # + # Fold a line that contains a UTF-8 word after + # the fold point. + + m = EmailMessage() + m['Subject'] = '123456789 123456789 123456789 123456789 123456789' \ + ' 123456789 123456789 Hello W?rld!' + self.assertEqual(bytes(m), + b'Subject: 123456789 123456789 123456789 123456789' + b' 123456789 123456789 123456789\n' + b' Hello =?utf-8?q?W=C3=B6rld!?=\n\n') + + def test_folding_with_utf8_encoding_6(self): + # bpo-36520 + # + # Fold a line that contains a UTF-8 word before + # the fold point and ASCII words after + + m = EmailMessage() + m['Subject'] = '123456789 123456789 123456789 123456789 Hello W?rld!' \ + ' 123456789 123456789 123456789 123456789 123456789' \ + ' 123456789' + self.assertEqual(bytes(m), + b'Subject: 123456789 123456789 123456789 123456789' + b' Hello =?utf-8?q?W=C3=B6rld!?=\n 123456789 ' + b'123456789 123456789 123456789 123456789 ' + b'123456789\n\n') + + def test_folding_with_utf8_encoding_7(self): + # bpo-36520 + # + # Fold a line twice that contains UTF-8 words before + # and after the first fold point, and ASCII words + # after the second fold point. + + m = EmailMessage() + m['Subject'] = '123456789 123456789 Hello W?rld! Hello W?rld! ' \ + '123456789-123456789 123456789 Hello W?rld! 123456789' \ + ' 123456789' + self.assertEqual(bytes(m), + b'Subject: 123456789 123456789 Hello =?utf-8?q?' + b'W=C3=B6rld!_Hello_W=C3=B6rld!?=\n' + b' 123456789-123456789 123456789 Hello ' + b'=?utf-8?q?W=C3=B6rld!?= 123456789\n 123456789\n\n') + + def test_folding_with_utf8_encoding_8(self): + # bpo-36520 + # + # Fold a line twice that contains UTF-8 words before + # the first fold point, and ASCII words after the + # first fold point, and UTF-8 words after the second + # fold point. + + m = EmailMessage() + m['Subject'] = '123456789 123456789 Hello W?rld! Hello W?rld! ' \ + '123456789 123456789 123456789 123456789 123456789 ' \ + '123456789-123456789 123456789 Hello W?rld! 123456789' \ + ' 123456789' + self.assertEqual(bytes(m), + b'Subject: 123456789 123456789 Hello ' + b'=?utf-8?q?W=C3=B6rld!_Hello_W=C3=B6rld!?=\n 123456789 ' + b'123456789 123456789 123456789 123456789 ' + b'123456789-123456789\n 123456789 Hello ' + b'=?utf-8?q?W=C3=B6rld!?= 123456789 123456789\n\n') class TestMIMEPart(TestEmailMessageBase, TestEmailBase): # Doing the full test run here may seem a bit redundant, since the two diff --git a/Misc/NEWS.d/next/Library/2019-05-28-02-37-00.bpo-36520.W4tday.rst b/Misc/NEWS.d/next/Library/2019-05-28-02-37-00.bpo-36520.W4tday.rst new file mode 100644 index 000000000000..8171bfe9e2df --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-28-02-37-00.bpo-36520.W4tday.rst @@ -0,0 +1 @@ +Lengthy email headers with UTF-8 characters are now properly encoded when they are folded. Patch by Jeffrey Kintscher. From webhook-mailer at python.org Tue Jun 11 19:28:18 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Tue, 11 Jun 2019 23:28:18 -0000 Subject: [Python-checkins] [3.8] bpo-36520: Email header folded incorrectly (GH-13608) (GH-13909) Message-ID: https://github.com/python/cpython/commit/36eea7af48ca0a1c96b78c82bf95bbd29d2332da commit: 36eea7af48ca0a1c96b78c82bf95bbd29d2332da branch: 3.8 author: Abhilash Raj committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-06-11T16:28:10-07:00 summary: [3.8] bpo-36520: Email header folded incorrectly (GH-13608) (GH-13909) * [bpo-36520](https://bugs.python.org/issue36520): reset the encoded word offset when starting a new line during an email header folding operation * ?? Added by blurb_it. * [bpo-36520](https://bugs.python.org/issue36520): add an additional test case, and provide descriptive comments for the test_folding_with_utf8_encoding_* tests * [bpo-36520](https://bugs.python.org/issue36520): fix whitespace issue * [bpo-36520](https://bugs.python.org/issue36520): changes per reviewer request -- remove extraneous backslashes; add whitespace between terminating quotes and line-continuation backslashes; use "bpo-" instead of "issue GH-" in comments (cherry picked from commit f6713e84afc5addcfa8477dbdf2c027787f711c0) Co-authored-by: websurfer5 <49998481+websurfer5 at users.noreply.github.com> https://bugs.python.org/issue36520 files: A Misc/NEWS.d/next/Library/2019-05-28-02-37-00.bpo-36520.W4tday.rst M Lib/email/_header_value_parser.py M Lib/test/test_email/test_message.py diff --git a/Lib/email/_header_value_parser.py b/Lib/email/_header_value_parser.py index 34969ab59151..308db4d91054 100644 --- a/Lib/email/_header_value_parser.py +++ b/Lib/email/_header_value_parser.py @@ -2768,6 +2768,7 @@ def _refold_parse_tree(parse_tree, *, policy): newline = _steal_trailing_WSP_if_exists(lines) if newline or part.startswith_fws(): lines.append(newline + tstr) + last_ew = None continue if not hasattr(part, 'encode'): # It's not a terminal, try folding the subparts. diff --git a/Lib/test/test_email/test_message.py b/Lib/test/test_email/test_message.py index f3a57df9e9cf..5dc46e1b812c 100644 --- a/Lib/test/test_email/test_message.py +++ b/Lib/test/test_email/test_message.py @@ -784,6 +784,137 @@ def test_str_defaults_to_utf8(self): m['Subject'] = 'unic?de' self.assertEqual(str(m), 'Subject: unic?de\n\n') + def test_folding_with_utf8_encoding_1(self): + # bpo-36520 + # + # Fold a line that contains UTF-8 words before + # and after the whitespace fold point, where the + # line length limit is reached within an ASCII + # word. + + m = EmailMessage() + m['Subject'] = 'Hello W?rld! Hello W?rld! ' \ + 'Hello W?rld! Hello W?rld!Hello W?rld!' + self.assertEqual(bytes(m), + b'Subject: Hello =?utf-8?q?W=C3=B6rld!_Hello_W' + b'=C3=B6rld!_Hello_W=C3=B6rld!?=\n' + b' Hello =?utf-8?q?W=C3=B6rld!Hello_W=C3=B6rld!?=\n\n') + + + def test_folding_with_utf8_encoding_2(self): + # bpo-36520 + # + # Fold a line that contains UTF-8 words before + # and after the whitespace fold point, where the + # line length limit is reached at the end of an + # encoded word. + + m = EmailMessage() + m['Subject'] = 'Hello W?rld! Hello W?rld! ' \ + 'Hello W?rlds123! Hello W?rld!Hello W?rld!' + self.assertEqual(bytes(m), + b'Subject: Hello =?utf-8?q?W=C3=B6rld!_Hello_W' + b'=C3=B6rld!_Hello_W=C3=B6rlds123!?=\n' + b' Hello =?utf-8?q?W=C3=B6rld!Hello_W=C3=B6rld!?=\n\n') + + def test_folding_with_utf8_encoding_3(self): + # bpo-36520 + # + # Fold a line that contains UTF-8 words before + # and after the whitespace fold point, where the + # line length limit is reached at the end of the + # first word. + + m = EmailMessage() + m['Subject'] = 'Hello-W?rld!-Hello-W?rld!-Hello-W?rlds123! ' \ + 'Hello W?rld!Hello W?rld!' + self.assertEqual(bytes(m), \ + b'Subject: =?utf-8?q?Hello-W=C3=B6rld!-Hello-W' + b'=C3=B6rld!-Hello-W=C3=B6rlds123!?=\n' + b' Hello =?utf-8?q?W=C3=B6rld!Hello_W=C3=B6rld!?=\n\n') + + def test_folding_with_utf8_encoding_4(self): + # bpo-36520 + # + # Fold a line that contains UTF-8 words before + # and after the fold point, where the first + # word is UTF-8 and the fold point is within + # the word. + + m = EmailMessage() + m['Subject'] = 'Hello-W?rld!-Hello-W?rld!-Hello-W?rlds123!-Hello' \ + ' W?rld!Hello W?rld!' + self.assertEqual(bytes(m), + b'Subject: =?utf-8?q?Hello-W=C3=B6rld!-Hello-W' + b'=C3=B6rld!-Hello-W=C3=B6rlds123!?=\n' + b' =?utf-8?q?-Hello_W=C3=B6rld!Hello_W=C3=B6rld!?=\n\n') + + def test_folding_with_utf8_encoding_5(self): + # bpo-36520 + # + # Fold a line that contains a UTF-8 word after + # the fold point. + + m = EmailMessage() + m['Subject'] = '123456789 123456789 123456789 123456789 123456789' \ + ' 123456789 123456789 Hello W?rld!' + self.assertEqual(bytes(m), + b'Subject: 123456789 123456789 123456789 123456789' + b' 123456789 123456789 123456789\n' + b' Hello =?utf-8?q?W=C3=B6rld!?=\n\n') + + def test_folding_with_utf8_encoding_6(self): + # bpo-36520 + # + # Fold a line that contains a UTF-8 word before + # the fold point and ASCII words after + + m = EmailMessage() + m['Subject'] = '123456789 123456789 123456789 123456789 Hello W?rld!' \ + ' 123456789 123456789 123456789 123456789 123456789' \ + ' 123456789' + self.assertEqual(bytes(m), + b'Subject: 123456789 123456789 123456789 123456789' + b' Hello =?utf-8?q?W=C3=B6rld!?=\n 123456789 ' + b'123456789 123456789 123456789 123456789 ' + b'123456789\n\n') + + def test_folding_with_utf8_encoding_7(self): + # bpo-36520 + # + # Fold a line twice that contains UTF-8 words before + # and after the first fold point, and ASCII words + # after the second fold point. + + m = EmailMessage() + m['Subject'] = '123456789 123456789 Hello W?rld! Hello W?rld! ' \ + '123456789-123456789 123456789 Hello W?rld! 123456789' \ + ' 123456789' + self.assertEqual(bytes(m), + b'Subject: 123456789 123456789 Hello =?utf-8?q?' + b'W=C3=B6rld!_Hello_W=C3=B6rld!?=\n' + b' 123456789-123456789 123456789 Hello ' + b'=?utf-8?q?W=C3=B6rld!?= 123456789\n 123456789\n\n') + + def test_folding_with_utf8_encoding_8(self): + # bpo-36520 + # + # Fold a line twice that contains UTF-8 words before + # the first fold point, and ASCII words after the + # first fold point, and UTF-8 words after the second + # fold point. + + m = EmailMessage() + m['Subject'] = '123456789 123456789 Hello W?rld! Hello W?rld! ' \ + '123456789 123456789 123456789 123456789 123456789 ' \ + '123456789-123456789 123456789 Hello W?rld! 123456789' \ + ' 123456789' + self.assertEqual(bytes(m), + b'Subject: 123456789 123456789 Hello ' + b'=?utf-8?q?W=C3=B6rld!_Hello_W=C3=B6rld!?=\n 123456789 ' + b'123456789 123456789 123456789 123456789 ' + b'123456789-123456789\n 123456789 Hello ' + b'=?utf-8?q?W=C3=B6rld!?= 123456789 123456789\n\n') class TestMIMEPart(TestEmailMessageBase, TestEmailBase): # Doing the full test run here may seem a bit redundant, since the two diff --git a/Misc/NEWS.d/next/Library/2019-05-28-02-37-00.bpo-36520.W4tday.rst b/Misc/NEWS.d/next/Library/2019-05-28-02-37-00.bpo-36520.W4tday.rst new file mode 100644 index 000000000000..8171bfe9e2df --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-28-02-37-00.bpo-36520.W4tday.rst @@ -0,0 +1 @@ +Lengthy email headers with UTF-8 characters are now properly encoded when they are folded. Patch by Jeffrey Kintscher. From webhook-mailer at python.org Tue Jun 11 20:23:18 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 12 Jun 2019 00:23:18 -0000 Subject: [Python-checkins] bpo-35766: Change format for feature_version to (major, minor) (GH-13992) Message-ID: https://github.com/python/cpython/commit/10b55c1643b512b3a2cae8ab89c53683a13ca43e commit: 10b55c1643b512b3a2cae8ab89c53683a13ca43e branch: master author: Guido van Rossum committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-06-11T17:23:12-07:00 summary: bpo-35766: Change format for feature_version to (major, minor) (GH-13992) (A single int is still allowed, but undocumented.) https://bugs.python.org/issue35766 files: A Misc/NEWS.d/next/Library/2019-06-11-16-41-40.bpo-35766.v1Kj-T.rst M Doc/library/ast.rst M Doc/whatsnew/3.8.rst M Lib/ast.py diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst index 1884bea80e80..1e718382589c 100644 --- a/Doc/library/ast.rst +++ b/Doc/library/ast.rst @@ -126,7 +126,7 @@ The abstract grammar is currently defined as follows: Apart from the node classes, the :mod:`ast` module defines these utility functions and classes for traversing abstract syntax trees: -.. function:: parse(source, filename='', mode='exec', *, type_comments=False, feature_version=-1) +.. function:: parse(source, filename='', mode='exec', *, type_comments=False, feature_version=None) Parse the source into an AST node. Equivalent to ``compile(source, filename, mode, ast.PyCF_ONLY_AST)``. @@ -145,11 +145,12 @@ and classes for traversing abstract syntax trees: modified to correspond to :pep:`484` "signature type comments", e.g. ``(str, int) -> List[str]``. - Also, setting ``feature_version`` to the minor version of an - earlier Python 3 version will attempt to parse using that version's - grammar. For example, setting ``feature_version=4`` will allow - the use of ``async`` and ``await`` as variable names. The lowest - supported value is 4; the highest is ``sys.version_info[1]``. + Also, setting ``feature_version`` to a tuple ``(major, minor)`` + will attempt to parse using that Python version's grammar. + Currently ``major`` must equal to ``3``. For example, setting + ``feature_version=(3, 4)`` will allow the use of ``async`` and + ``await`` as variable names. The lowest supported version is + ``(3, 4)``; the highest is ``sys.version_info[0:2]``. .. warning:: It is possible to crash the Python interpreter with a diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index eb276139192d..264586434b9b 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -378,9 +378,9 @@ The :func:`ast.parse` function has some new flags: * ``mode='func_type'`` can be used to parse :pep:`484` "signature type comments" (returned for function definition AST nodes); -* ``feature_version=N`` allows specifying the minor version of an - earlier Python 3 version. (For example, ``feature_version=4`` will - treat ``async`` and ``await`` as non-reserved words.) +* ``feature_version=(3, N)`` allows specifying an earlier Python 3 + version. (For example, ``feature_version=(3, 4)`` will treat + ``async`` and ``await`` as non-reserved words.) New function :func:`ast.get_source_segment` returns the source code for a specific AST node. diff --git a/Lib/ast.py b/Lib/ast.py index 64e7a2551fb1..70fbbdd2ffbd 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -28,7 +28,7 @@ def parse(source, filename='', mode='exec', *, - type_comments=False, feature_version=-1): + type_comments=False, feature_version=None): """ Parse the source into an AST node. Equivalent to compile(source, filename, mode, PyCF_ONLY_AST). @@ -37,6 +37,13 @@ def parse(source, filename='', mode='exec', *, flags = PyCF_ONLY_AST if type_comments: flags |= PyCF_TYPE_COMMENTS + if isinstance(feature_version, tuple): + major, minor = feature_version # Should be a 2-tuple. + assert major == 3 + feature_version = minor + elif feature_version is None: + feature_version = -1 + # Else it should be an int giving the minor version for 3.x. return compile(source, filename, mode, flags, feature_version=feature_version) diff --git a/Misc/NEWS.d/next/Library/2019-06-11-16-41-40.bpo-35766.v1Kj-T.rst b/Misc/NEWS.d/next/Library/2019-06-11-16-41-40.bpo-35766.v1Kj-T.rst new file mode 100644 index 000000000000..6dd49998cb4c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-11-16-41-40.bpo-35766.v1Kj-T.rst @@ -0,0 +1 @@ +Change the format of feature_version to be a (major, minor) tuple. From webhook-mailer at python.org Tue Jun 11 20:52:25 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 12 Jun 2019 00:52:25 -0000 Subject: [Python-checkins] bpo-35766: compile(): rename feature_version parameter (GH-13994) Message-ID: https://github.com/python/cpython/commit/efdf6ca90f7702824e7aeee1ceca949e7c20288a commit: efdf6ca90f7702824e7aeee1ceca949e7c20288a branch: master author: Victor Stinner committer: GitHub date: 2019-06-12T02:52:16+02:00 summary: bpo-35766: compile(): rename feature_version parameter (GH-13994) Rename compile() feature_version parameter to _feature_version and convert it to a keyword-only parameter. Update also test_type_comments to pass feature_version as a tuple. files: M Lib/ast.py M Lib/test/test_type_comments.py M Python/bltinmodule.c M Python/clinic/bltinmodule.c.h diff --git a/Lib/ast.py b/Lib/ast.py index 70fbbdd2ffbd..ffeba179e510 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -45,7 +45,7 @@ def parse(source, filename='', mode='exec', *, feature_version = -1 # Else it should be an int giving the minor version for 3.x. return compile(source, filename, mode, flags, - feature_version=feature_version) + _feature_version=feature_version) def literal_eval(node_or_string): diff --git a/Lib/test/test_type_comments.py b/Lib/test/test_type_comments.py index 55b54e7f203e..43be54efdbd9 100644 --- a/Lib/test/test_type_comments.py +++ b/Lib/test/test_type_comments.py @@ -228,8 +228,9 @@ def parse(self, source, feature_version=highest): feature_version=feature_version) def parse_all(self, source, minver=lowest, maxver=highest, expected_regex=""): - for feature_version in range(self.lowest, self.highest + 1): - if minver <= feature_version <= maxver: + for version in range(self.lowest, self.highest + 1): + feature_version = (3, version) + if minver <= version <= maxver: try: yield self.parse(source, feature_version) except SyntaxError as err: diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 56d882d387ee..abf807a408f7 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -696,7 +696,8 @@ compile as builtin_compile flags: int = 0 dont_inherit: bool(accept={int}) = False optimize: int = -1 - feature_version: int = -1 + * + _feature_version as feature_version: int = -1 Compile source into a code object that can be executed by exec() or eval(). @@ -716,7 +717,7 @@ static PyObject * builtin_compile_impl(PyObject *module, PyObject *source, PyObject *filename, const char *mode, int flags, int dont_inherit, int optimize, int feature_version) -/*[clinic end generated code: output=b0c09c84f116d3d7 input=5fcc30651a6acaa9]*/ +/*[clinic end generated code: output=b0c09c84f116d3d7 input=40171fb92c1d580d]*/ { PyObject *source_copy; const char *str; diff --git a/Python/clinic/bltinmodule.c.h b/Python/clinic/bltinmodule.c.h index 0ed11bceeb87..abed6cc3e174 100644 --- a/Python/clinic/bltinmodule.c.h +++ b/Python/clinic/bltinmodule.c.h @@ -151,7 +151,7 @@ builtin_chr(PyObject *module, PyObject *arg) PyDoc_STRVAR(builtin_compile__doc__, "compile($module, /, source, filename, mode, flags=0,\n" -" dont_inherit=False, optimize=-1, feature_version=-1)\n" +" dont_inherit=False, optimize=-1, *, _feature_version=-1)\n" "--\n" "\n" "Compile source into a code object that can be executed by exec() or eval().\n" @@ -179,7 +179,7 @@ static PyObject * builtin_compile(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"source", "filename", "mode", "flags", "dont_inherit", "optimize", "feature_version", NULL}; + static const char * const _keywords[] = {"source", "filename", "mode", "flags", "dont_inherit", "optimize", "_feature_version", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "compile", 0}; PyObject *argsbuf[7]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 3; @@ -191,7 +191,7 @@ builtin_compile(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObj int optimize = -1; int feature_version = -1; - args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 7, 0, argsbuf); + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 6, 0, argsbuf); if (!args) { goto exit; } @@ -257,6 +257,10 @@ builtin_compile(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObj goto skip_optional_pos; } } +skip_optional_pos: + if (!noptargs) { + goto skip_optional_kwonly; + } if (PyFloat_Check(args[6])) { PyErr_SetString(PyExc_TypeError, "integer argument expected, got float" ); @@ -266,7 +270,7 @@ builtin_compile(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObj if (feature_version == -1 && PyErr_Occurred()) { goto exit; } -skip_optional_pos: +skip_optional_kwonly: return_value = builtin_compile_impl(module, source, filename, mode, flags, dont_inherit, optimize, feature_version); exit: @@ -845,4 +849,4 @@ builtin_issubclass(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: return return_value; } -/*[clinic end generated code: output=3f690311ac556c31 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=e173df340a9e4516 input=a9049054013a1b77]*/ From webhook-mailer at python.org Tue Jun 11 20:55:32 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 12 Jun 2019 00:55:32 -0000 Subject: [Python-checkins] bpo-35766: Change format for feature_version to (major, minor) (GH-13992) (GH-13993) Message-ID: https://github.com/python/cpython/commit/3ba21070c6ecab83c23cea41a92b42fa651c7ea2 commit: 3ba21070c6ecab83c23cea41a92b42fa651c7ea2 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Victor Stinner date: 2019-06-12T02:55:28+02:00 summary: bpo-35766: Change format for feature_version to (major, minor) (GH-13992) (GH-13993) (A single int is still allowed, but undocumented.) https://bugs.python.org/issue35766 (cherry picked from commit 10b55c1643b512b3a2cae8ab89c53683a13ca43e) Co-authored-by: Guido van Rossum files: A Misc/NEWS.d/next/Library/2019-06-11-16-41-40.bpo-35766.v1Kj-T.rst M Doc/library/ast.rst M Doc/whatsnew/3.8.rst M Lib/ast.py diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst index 1884bea80e80..1e718382589c 100644 --- a/Doc/library/ast.rst +++ b/Doc/library/ast.rst @@ -126,7 +126,7 @@ The abstract grammar is currently defined as follows: Apart from the node classes, the :mod:`ast` module defines these utility functions and classes for traversing abstract syntax trees: -.. function:: parse(source, filename='', mode='exec', *, type_comments=False, feature_version=-1) +.. function:: parse(source, filename='', mode='exec', *, type_comments=False, feature_version=None) Parse the source into an AST node. Equivalent to ``compile(source, filename, mode, ast.PyCF_ONLY_AST)``. @@ -145,11 +145,12 @@ and classes for traversing abstract syntax trees: modified to correspond to :pep:`484` "signature type comments", e.g. ``(str, int) -> List[str]``. - Also, setting ``feature_version`` to the minor version of an - earlier Python 3 version will attempt to parse using that version's - grammar. For example, setting ``feature_version=4`` will allow - the use of ``async`` and ``await`` as variable names. The lowest - supported value is 4; the highest is ``sys.version_info[1]``. + Also, setting ``feature_version`` to a tuple ``(major, minor)`` + will attempt to parse using that Python version's grammar. + Currently ``major`` must equal to ``3``. For example, setting + ``feature_version=(3, 4)`` will allow the use of ``async`` and + ``await`` as variable names. The lowest supported version is + ``(3, 4)``; the highest is ``sys.version_info[0:2]``. .. warning:: It is possible to crash the Python interpreter with a diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 64e2e8eaef48..eb2a00589832 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -352,9 +352,9 @@ The :func:`ast.parse` function has some new flags: * ``mode='func_type'`` can be used to parse :pep:`484` "signature type comments" (returned for function definition AST nodes); -* ``feature_version=N`` allows specifying the minor version of an - earlier Python 3 version. (For example, ``feature_version=4`` will - treat ``async`` and ``await`` as non-reserved words.) +* ``feature_version=(3, N)`` allows specifying an earlier Python 3 + version. (For example, ``feature_version=(3, 4)`` will treat + ``async`` and ``await`` as non-reserved words.) New function :func:`ast.get_source_segment` returns the source code for a specific AST node. diff --git a/Lib/ast.py b/Lib/ast.py index 64e7a2551fb1..70fbbdd2ffbd 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -28,7 +28,7 @@ def parse(source, filename='', mode='exec', *, - type_comments=False, feature_version=-1): + type_comments=False, feature_version=None): """ Parse the source into an AST node. Equivalent to compile(source, filename, mode, PyCF_ONLY_AST). @@ -37,6 +37,13 @@ def parse(source, filename='', mode='exec', *, flags = PyCF_ONLY_AST if type_comments: flags |= PyCF_TYPE_COMMENTS + if isinstance(feature_version, tuple): + major, minor = feature_version # Should be a 2-tuple. + assert major == 3 + feature_version = minor + elif feature_version is None: + feature_version = -1 + # Else it should be an int giving the minor version for 3.x. return compile(source, filename, mode, flags, feature_version=feature_version) diff --git a/Misc/NEWS.d/next/Library/2019-06-11-16-41-40.bpo-35766.v1Kj-T.rst b/Misc/NEWS.d/next/Library/2019-06-11-16-41-40.bpo-35766.v1Kj-T.rst new file mode 100644 index 000000000000..6dd49998cb4c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-11-16-41-40.bpo-35766.v1Kj-T.rst @@ -0,0 +1 @@ +Change the format of feature_version to be a (major, minor) tuple. From webhook-mailer at python.org Tue Jun 11 22:07:42 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 12 Jun 2019 02:07:42 -0000 Subject: [Python-checkins] bpo-36918: Fix "Exception ignored in" in test_urllib (GH-13996) Message-ID: https://github.com/python/cpython/commit/eb976e47e261760330c1bed224019b073b05e994 commit: eb976e47e261760330c1bed224019b073b05e994 branch: master author: Victor Stinner committer: GitHub date: 2019-06-12T04:07:38+02:00 summary: bpo-36918: Fix "Exception ignored in" in test_urllib (GH-13996) Mock the HTTPConnection.close() method in a few unit tests to avoid logging "Exception ignored in: ..." messages. files: M Lib/test/test_urllib.py diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index f9b2799d25bf..801f0fd647f4 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -56,7 +56,7 @@ def FancyURLopener(): return urllib.request.FancyURLopener() -def fakehttp(fakedata): +def fakehttp(fakedata, mock_close=False): class FakeSocket(io.BytesIO): io_refs = 1 @@ -90,15 +90,24 @@ class FakeHTTPConnection(http.client.HTTPConnection): def connect(self): self.sock = FakeSocket(self.fakedata) type(self).fakesock = self.sock + + if mock_close: + # bpo-36918: HTTPConnection destructor calls close() which calls + # flush(). Problem: flush() calls self.fp.flush() which raises + # "ValueError: I/O operation on closed file" which is logged as an + # "Exception ignored in". Override close() to silence this error. + def close(self): + pass FakeHTTPConnection.fakedata = fakedata return FakeHTTPConnection class FakeHTTPMixin(object): - def fakehttp(self, fakedata): + def fakehttp(self, fakedata, mock_close=False): + fake_http_class = fakehttp(fakedata, mock_close=mock_close) self._connection_class = http.client.HTTPConnection - http.client.HTTPConnection = fakehttp(fakedata) + http.client.HTTPConnection = fake_http_class def unfakehttp(self): http.client.HTTPConnection = self._connection_class @@ -400,7 +409,7 @@ def test_read_bogus(self): Server: Apache/1.3.33 (Debian GNU/Linux) mod_ssl/2.8.22 OpenSSL/0.9.7e Connection: close Content-Type: text/html; charset=iso-8859-1 -''') +''', mock_close=True) try: self.assertRaises(OSError, urlopen, "http://python.org/") finally: @@ -414,7 +423,7 @@ def test_invalid_redirect(self): Location: file://guidocomputer.athome.com:/python/license Connection: close Content-Type: text/html; charset=iso-8859-1 -''') +''', mock_close=True) try: msg = "Redirection to url 'file:" with self.assertRaisesRegex(urllib.error.HTTPError, msg): @@ -429,7 +438,7 @@ def test_redirect_limit_independent(self): self.fakehttp(b'''HTTP/1.1 302 Found Location: file://guidocomputer.athome.com:/python/license Connection: close -''') +''', mock_close=True) try: self.assertRaises(urllib.error.HTTPError, urlopen, "http://something") From webhook-mailer at python.org Tue Jun 11 22:26:08 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 12 Jun 2019 02:26:08 -0000 Subject: [Python-checkins] bpo-36918: Fix "Exception ignored in" in test_urllib (GH-13996) Message-ID: https://github.com/python/cpython/commit/9d37ae0bee25692572c201378cd0692df22fa2ac commit: 9d37ae0bee25692572c201378cd0692df22fa2ac branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-11T19:26:02-07:00 summary: bpo-36918: Fix "Exception ignored in" in test_urllib (GH-13996) Mock the HTTPConnection.close() method in a few unit tests to avoid logging "Exception ignored in: ..." messages. (cherry picked from commit eb976e47e261760330c1bed224019b073b05e994) Co-authored-by: Victor Stinner files: M Lib/test/test_urllib.py diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index f9b2799d25bf..801f0fd647f4 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -56,7 +56,7 @@ def FancyURLopener(): return urllib.request.FancyURLopener() -def fakehttp(fakedata): +def fakehttp(fakedata, mock_close=False): class FakeSocket(io.BytesIO): io_refs = 1 @@ -90,15 +90,24 @@ class FakeHTTPConnection(http.client.HTTPConnection): def connect(self): self.sock = FakeSocket(self.fakedata) type(self).fakesock = self.sock + + if mock_close: + # bpo-36918: HTTPConnection destructor calls close() which calls + # flush(). Problem: flush() calls self.fp.flush() which raises + # "ValueError: I/O operation on closed file" which is logged as an + # "Exception ignored in". Override close() to silence this error. + def close(self): + pass FakeHTTPConnection.fakedata = fakedata return FakeHTTPConnection class FakeHTTPMixin(object): - def fakehttp(self, fakedata): + def fakehttp(self, fakedata, mock_close=False): + fake_http_class = fakehttp(fakedata, mock_close=mock_close) self._connection_class = http.client.HTTPConnection - http.client.HTTPConnection = fakehttp(fakedata) + http.client.HTTPConnection = fake_http_class def unfakehttp(self): http.client.HTTPConnection = self._connection_class @@ -400,7 +409,7 @@ def test_read_bogus(self): Server: Apache/1.3.33 (Debian GNU/Linux) mod_ssl/2.8.22 OpenSSL/0.9.7e Connection: close Content-Type: text/html; charset=iso-8859-1 -''') +''', mock_close=True) try: self.assertRaises(OSError, urlopen, "http://python.org/") finally: @@ -414,7 +423,7 @@ def test_invalid_redirect(self): Location: file://guidocomputer.athome.com:/python/license Connection: close Content-Type: text/html; charset=iso-8859-1 -''') +''', mock_close=True) try: msg = "Redirection to url 'file:" with self.assertRaisesRegex(urllib.error.HTTPError, msg): @@ -429,7 +438,7 @@ def test_redirect_limit_independent(self): self.fakehttp(b'''HTTP/1.1 302 Found Location: file://guidocomputer.athome.com:/python/license Connection: close -''') +''', mock_close=True) try: self.assertRaises(urllib.error.HTTPError, urlopen, "http://something") From webhook-mailer at python.org Tue Jun 11 22:41:22 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 12 Jun 2019 02:41:22 -0000 Subject: [Python-checkins] bpo-26219: Fix compiler warning in _PyCode_InitOpcache() (GH-13997) Message-ID: https://github.com/python/cpython/commit/376ce9852eec4e97745c723f0dd0fe64383c6cd3 commit: 376ce9852eec4e97745c723f0dd0fe64383c6cd3 branch: master author: Victor Stinner committer: GitHub date: 2019-06-12T04:41:16+02:00 summary: bpo-26219: Fix compiler warning in _PyCode_InitOpcache() (GH-13997) Fix MSVC warning: objects\codeobject.c(285): warning C4244: '=': conversion from 'Py_ssize_t' to 'unsigned char', possible loss of data files: M Objects/codeobject.c diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 63ce4793597a..1333cc833e1e 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -282,7 +282,7 @@ _PyCode_InitOpcache(PyCodeObject *co) co->co_opcache = NULL; } - co->co_opcache_size = opts; + co->co_opcache_size = (unsigned char)opts; return 0; } From webhook-mailer at python.org Tue Jun 11 23:46:14 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Wed, 12 Jun 2019 03:46:14 -0000 Subject: [Python-checkins] bpo-32625: Updated documentation for EXTENDED_ARG. (GH-13985) Message-ID: https://github.com/python/cpython/commit/405f648db7c44b07348582b5101d4716e0ce5ac3 commit: 405f648db7c44b07348582b5101d4716e0ce5ac3 branch: master author: Yao Zuo committer: Serhiy Storchaka date: 2019-06-12T06:46:09+03:00 summary: bpo-32625: Updated documentation for EXTENDED_ARG. (GH-13985) Python 3.6 changed the size of bytecode instruction, while the documentation for `EXTENDED_ARG` was not updated accordingly. files: M Doc/library/dis.rst diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index 2a3ffb5e8271..5b79be626626 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -1219,10 +1219,10 @@ All of the following opcodes use their arguments. .. opcode:: EXTENDED_ARG (ext) - Prefixes any opcode which has an argument too big to fit into the default two - bytes. *ext* holds two additional bytes which, taken together with the - subsequent opcode's argument, comprise a four-byte argument, *ext* being the - two most-significant bytes. + Prefixes any opcode which has an argument too big to fit into the default one + byte. *ext* holds an additional byte which act as higher bits in the argument. + For each opcode, at most three prefixal ``EXTENDED_ARG`` are allowed, forming + an argument from two-byte to four-byte. .. opcode:: FORMAT_VALUE (flags) From webhook-mailer at python.org Tue Jun 11 23:51:46 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 12 Jun 2019 03:51:46 -0000 Subject: [Python-checkins] bpo-32625: Updated documentation for EXTENDED_ARG. (GH-13985) Message-ID: https://github.com/python/cpython/commit/f0cc1a91f72c7f60adc47ec9a4305d8d85dcb1f2 commit: f0cc1a91f72c7f60adc47ec9a4305d8d85dcb1f2 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-11T20:51:42-07:00 summary: bpo-32625: Updated documentation for EXTENDED_ARG. (GH-13985) Python 3.6 changed the size of bytecode instruction, while the documentation for `EXTENDED_ARG` was not updated accordingly. (cherry picked from commit 405f648db7c44b07348582b5101d4716e0ce5ac3) Co-authored-by: Yao Zuo files: M Doc/library/dis.rst diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index b8cf4463d935..5e6f002dcd76 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -1165,10 +1165,10 @@ All of the following opcodes use their arguments. .. opcode:: EXTENDED_ARG (ext) - Prefixes any opcode which has an argument too big to fit into the default two - bytes. *ext* holds two additional bytes which, taken together with the - subsequent opcode's argument, comprise a four-byte argument, *ext* being the - two most-significant bytes. + Prefixes any opcode which has an argument too big to fit into the default one + byte. *ext* holds an additional byte which act as higher bits in the argument. + For each opcode, at most three prefixal ``EXTENDED_ARG`` are allowed, forming + an argument from two-byte to four-byte. .. opcode:: FORMAT_VALUE (flags) From webhook-mailer at python.org Tue Jun 11 23:54:01 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 12 Jun 2019 03:54:01 -0000 Subject: [Python-checkins] bpo-32625: Updated documentation for EXTENDED_ARG. (GH-13985) Message-ID: https://github.com/python/cpython/commit/811f84d55d156e3d05889806d00a8c028d304089 commit: 811f84d55d156e3d05889806d00a8c028d304089 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-11T20:53:58-07:00 summary: bpo-32625: Updated documentation for EXTENDED_ARG. (GH-13985) Python 3.6 changed the size of bytecode instruction, while the documentation for `EXTENDED_ARG` was not updated accordingly. (cherry picked from commit 405f648db7c44b07348582b5101d4716e0ce5ac3) Co-authored-by: Yao Zuo files: M Doc/library/dis.rst diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index 2a3ffb5e8271..5b79be626626 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -1219,10 +1219,10 @@ All of the following opcodes use their arguments. .. opcode:: EXTENDED_ARG (ext) - Prefixes any opcode which has an argument too big to fit into the default two - bytes. *ext* holds two additional bytes which, taken together with the - subsequent opcode's argument, comprise a four-byte argument, *ext* being the - two most-significant bytes. + Prefixes any opcode which has an argument too big to fit into the default one + byte. *ext* holds an additional byte which act as higher bits in the argument. + For each opcode, at most three prefixal ``EXTENDED_ARG`` are allowed, forming + an argument from two-byte to four-byte. .. opcode:: FORMAT_VALUE (flags) From webhook-mailer at python.org Wed Jun 12 00:31:00 2019 From: webhook-mailer at python.org (Gregory P. Smith) Date: Wed, 12 Jun 2019 04:31:00 -0000 Subject: [Python-checkins] bpo-29505: Fuzz json module, enforce size limit on int(x) fuzz (GH-13991) Message-ID: https://github.com/python/cpython/commit/a6e190e94b47324f14e22a09200c68b722d55699 commit: a6e190e94b47324f14e22a09200c68b722d55699 branch: master author: Ammar Askar committer: Gregory P. Smith date: 2019-06-11T21:30:34-07:00 summary: bpo-29505: Fuzz json module, enforce size limit on int(x) fuzz (GH-13991) * bpo-29505: Enable fuzz testing of the json module, enforce size limit on int(x) fuzz and json input size to avoid timeouts. Contributed by by Ammar Askar for Google. files: A Modules/_xxtestfuzz/dictionaries/fuzz_json_loads.dict A Modules/_xxtestfuzz/fuzz_json_loads_corpus/empty_array.json A Modules/_xxtestfuzz/fuzz_json_loads_corpus/empty_object.json A Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass1.json A Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass2.json A Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass3.json A Modules/_xxtestfuzz/fuzz_json_loads_corpus/simple_array.json M Modules/_xxtestfuzz/README.rst M Modules/_xxtestfuzz/fuzz_tests.txt M Modules/_xxtestfuzz/fuzzer.c diff --git a/Modules/_xxtestfuzz/README.rst b/Modules/_xxtestfuzz/README.rst index b48f3c89a42b..42bd02a03cbe 100644 --- a/Modules/_xxtestfuzz/README.rst +++ b/Modules/_xxtestfuzz/README.rst @@ -35,6 +35,16 @@ And invoke it from ``LLVMFuzzerTestOneInput``:: ``LLVMFuzzerTestOneInput`` will run in oss-fuzz, with each test in ``fuzz_tests.txt`` run separately. +Seed data (corpus) for the test can be provided in a subfolder called +``_corpus`` such as ``fuzz_json_loads_corpus``. A wide variety +of good input samples allows the fuzzer to more easily explore a diverse +set of paths and provides a better base to find buggy input from. + +Dictionaries of tokens (see oss-fuzz documentation for more details) can +be placed in the ``dictionaries`` folder with the name of the test. +For example, ``dictionaries/fuzz_json_loads.dict`` contains JSON tokens +to guide the fuzzer. + What makes a good fuzz test --------------------------- diff --git a/Modules/_xxtestfuzz/dictionaries/fuzz_json_loads.dict b/Modules/_xxtestfuzz/dictionaries/fuzz_json_loads.dict new file mode 100644 index 000000000000..ad64917ccc2c --- /dev/null +++ b/Modules/_xxtestfuzz/dictionaries/fuzz_json_loads.dict @@ -0,0 +1,40 @@ +"0" +",0" +":0" +"0:" +"-1.2e+3" + +"true" +"false" +"null" + +"\"\"" +",\"\"" +":\"\"" +"\"\":" + +"{}" +",{}" +":{}" +"{\"\":0}" +"{{}}" + +"[]" +",[]" +":[]" +"[0]" +"[[]]" + +"''" +"\\" +"\\b" +"\\f" +"\\n" +"\\r" +"\\t" +"\\u0000" +"\\x00" +"\\0" +"\\uD800\\uDC00" +"\\uDBFF\\uDFFF" + diff --git a/Modules/_xxtestfuzz/fuzz_json_loads_corpus/empty_array.json b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/empty_array.json new file mode 100644 index 000000000000..fe51488c7066 --- /dev/null +++ b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/empty_array.json @@ -0,0 +1 @@ +[] diff --git a/Modules/_xxtestfuzz/fuzz_json_loads_corpus/empty_object.json b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/empty_object.json new file mode 100644 index 000000000000..0967ef424bce --- /dev/null +++ b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/empty_object.json @@ -0,0 +1 @@ +{} diff --git a/Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass1.json b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass1.json new file mode 100644 index 000000000000..70e268543692 --- /dev/null +++ b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass1.json @@ -0,0 +1,58 @@ +[ + "JSON Test Pattern pass1", + {"object with 1 member":["array with 1 element"]}, + {}, + [], + -42, + true, + false, + null, + { + "integer": 1234567890, + "real": -9876.543210, + "e": 0.123456789e-12, + "E": 1.234567890E+34, + "": 23456789012E66, + "zero": 0, + "one": 1, + "space": " ", + "quote": "\"", + "backslash": "\\", + "controls": "\b\f\n\r\t", + "slash": "/ & \/", + "alpha": "abcdefghijklmnopqrstuvwyz", + "ALPHA": "ABCDEFGHIJKLMNOPQRSTUVWYZ", + "digit": "0123456789", + "0123456789": "digit", + "special": "`1~!@#$%^&*()_+-={':[,]}|;.?", + "hex": "\u0123\u4567\u89AB\uCDEF\uabcd\uef4A", + "true": true, + "false": false, + "null": null, + "array":[ ], + "object":{ }, + "address": "50 St. James Street", + "url": "http://www.JSON.org/", + "comment": "// /* */": " ", + " s p a c e d " :[1,2 , 3 + +, + +4 , 5 , 6 ,7 ],"compact":[1,2,3,4,5,6,7], + "jsontext": "{\"object with 1 member\":[\"array with 1 element\"]}", + "quotes": "" \u0022 %22 0x22 034 "", + "\/\\\"\uCAFE\uBABE\uAB98\uFCDE\ubcda\uef4A\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?" +: "A key can be any string" + }, + 0.5 ,98.6 +, +99.44 +, + +1066, +1e1, +0.1e1, +1e-1, +1e00,2e+00,2e-00 +,"rosebud"] \ No newline at end of file diff --git a/Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass2.json b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass2.json new file mode 100644 index 000000000000..d3c63c7ad845 --- /dev/null +++ b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass2.json @@ -0,0 +1 @@ +[[[[[[[[[[[[[[[[[[["Not too deep"]]]]]]]]]]]]]]]]]]] \ No newline at end of file diff --git a/Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass3.json b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass3.json new file mode 100644 index 000000000000..4528d51f1ac6 --- /dev/null +++ b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass3.json @@ -0,0 +1,6 @@ +{ + "JSON Test Pattern pass3": { + "The outermost value": "must be an object or array.", + "In this test": "It is an object." + } +} diff --git a/Modules/_xxtestfuzz/fuzz_json_loads_corpus/simple_array.json b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/simple_array.json new file mode 100644 index 000000000000..ce1e6ecaec72 --- /dev/null +++ b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/simple_array.json @@ -0,0 +1 @@ +[1, 2, 3, "abcd", "xyz"] diff --git a/Modules/_xxtestfuzz/fuzz_tests.txt b/Modules/_xxtestfuzz/fuzz_tests.txt index 2e53bfdc7161..f0121291eaa0 100644 --- a/Modules/_xxtestfuzz/fuzz_tests.txt +++ b/Modules/_xxtestfuzz/fuzz_tests.txt @@ -1,3 +1,4 @@ fuzz_builtin_float fuzz_builtin_int fuzz_builtin_unicode +fuzz_json_loads diff --git a/Modules/_xxtestfuzz/fuzzer.c b/Modules/_xxtestfuzz/fuzzer.c index 54f816ebc93d..e862a99cfb34 100644 --- a/Modules/_xxtestfuzz/fuzzer.c +++ b/Modules/_xxtestfuzz/fuzzer.c @@ -28,8 +28,15 @@ static int fuzz_builtin_float(const char* data, size_t size) { return 0; } +#define MAX_INT_TEST_SIZE 0x10000 + /* Fuzz PyLong_FromUnicodeObject as a proxy for int(str). */ static int fuzz_builtin_int(const char* data, size_t size) { + /* Ignore test cases with very long ints to avoid timeouts + int("9" * 1000000) is not a very interesting test caase */ + if (size > MAX_INT_TEST_SIZE) { + return 0; + } /* Pick a random valid base. (When the fuzzed function takes extra parameters, it's somewhat normal to hash the input to generate those parameters. We want to exercise all code paths, so we do so here.) */ @@ -72,6 +79,42 @@ static int fuzz_builtin_unicode(const char* data, size_t size) { return 0; } +#define MAX_JSON_TEST_SIZE 0x10000 + +/* Initialized in LLVMFuzzerTestOneInput */ +PyObject* json_loads_method = NULL; +/* Fuzz json.loads(x) */ +static int fuzz_json_loads(const char* data, size_t size) { + /* Since python supports arbitrarily large ints in JSON, + long inputs can lead to timeouts on boring inputs like + `json.loads("9" * 100000)` */ + if (size > MAX_JSON_TEST_SIZE) { + return 0; + } + PyObject* input_bytes = PyBytes_FromStringAndSize(data, size); + if (input_bytes == NULL) { + return 0; + } + PyObject* parsed = PyObject_CallFunctionObjArgs(json_loads_method, input_bytes, NULL); + /* Ignore ValueError as the fuzzer will more than likely + generate some invalid json and values */ + if (parsed == NULL && PyErr_ExceptionMatches(PyExc_ValueError)) { + PyErr_Clear(); + } + /* Ignore RecursionError as the fuzzer generates long sequences of + arrays such as `[[[...` */ + if (parsed == NULL && PyErr_ExceptionMatches(PyExc_RecursionError)) { + PyErr_Clear(); + } + /* Ignore unicode errors, invalid byte sequences are common */ + if (parsed == NULL && PyErr_ExceptionMatches(PyExc_UnicodeDecodeError)) { + PyErr_Clear(); + } + Py_DECREF(input_bytes); + Py_XDECREF(parsed); + return 0; +} + /* Run fuzzer and abort on failure. */ static int _run_fuzz(const uint8_t *data, size_t size, int(*fuzzer)(const char* , size_t)) { int rv = fuzzer((const char*) data, size); @@ -88,7 +131,6 @@ static int _run_fuzz(const uint8_t *data, size_t size, int(*fuzzer)(const char* /* CPython generates a lot of leak warnings for whatever reason. */ int __lsan_is_turned_off(void) { return 1; } -wchar_t wide_program_name[NAME_MAX]; int LLVMFuzzerInitialize(int *argc, char ***argv) { wchar_t* wide_program_name = Py_DecodeLocale(*argv[0], NULL); @@ -110,6 +152,12 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { initialize CPython ourselves on the first run. */ Py_InitializeEx(0); } +#if !defined(_Py_FUZZ_ONE) || defined(_Py_FUZZ_fuzz_json_loads) + if (json_loads_method == NULL) { + PyObject* json_module = PyImport_ImportModule("json"); + json_loads_method = PyObject_GetAttrString(json_module, "loads"); + } +#endif int rv = 0; @@ -121,6 +169,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { #endif #if !defined(_Py_FUZZ_ONE) || defined(_Py_FUZZ_fuzz_builtin_unicode) rv |= _run_fuzz(data, size, fuzz_builtin_unicode); +#endif +#if !defined(_Py_FUZZ_ONE) || defined(_Py_FUZZ_fuzz_json_loads) + rv |= _run_fuzz(data, size, fuzz_json_loads); #endif return rv; } From webhook-mailer at python.org Wed Jun 12 00:47:45 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 12 Jun 2019 04:47:45 -0000 Subject: [Python-checkins] bpo-29505: Fuzz json module, enforce size limit on int(x) fuzz (GH-13991) Message-ID: https://github.com/python/cpython/commit/534136ac6790a701e24f364a9b7f1e34bf5f3ce7 commit: 534136ac6790a701e24f364a9b7f1e34bf5f3ce7 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-11T21:47:42-07:00 summary: bpo-29505: Fuzz json module, enforce size limit on int(x) fuzz (GH-13991) * bpo-29505: Enable fuzz testing of the json module, enforce size limit on int(x) fuzz and json input size to avoid timeouts. Contributed by by Ammar Askar for Google. (cherry picked from commit a6e190e94b47324f14e22a09200c68b722d55699) Co-authored-by: Ammar Askar files: A Modules/_xxtestfuzz/dictionaries/fuzz_json_loads.dict A Modules/_xxtestfuzz/fuzz_json_loads_corpus/empty_array.json A Modules/_xxtestfuzz/fuzz_json_loads_corpus/empty_object.json A Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass1.json A Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass2.json A Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass3.json A Modules/_xxtestfuzz/fuzz_json_loads_corpus/simple_array.json M Modules/_xxtestfuzz/README.rst M Modules/_xxtestfuzz/fuzz_tests.txt M Modules/_xxtestfuzz/fuzzer.c diff --git a/Modules/_xxtestfuzz/README.rst b/Modules/_xxtestfuzz/README.rst index b48f3c89a42b..42bd02a03cbe 100644 --- a/Modules/_xxtestfuzz/README.rst +++ b/Modules/_xxtestfuzz/README.rst @@ -35,6 +35,16 @@ And invoke it from ``LLVMFuzzerTestOneInput``:: ``LLVMFuzzerTestOneInput`` will run in oss-fuzz, with each test in ``fuzz_tests.txt`` run separately. +Seed data (corpus) for the test can be provided in a subfolder called +``_corpus`` such as ``fuzz_json_loads_corpus``. A wide variety +of good input samples allows the fuzzer to more easily explore a diverse +set of paths and provides a better base to find buggy input from. + +Dictionaries of tokens (see oss-fuzz documentation for more details) can +be placed in the ``dictionaries`` folder with the name of the test. +For example, ``dictionaries/fuzz_json_loads.dict`` contains JSON tokens +to guide the fuzzer. + What makes a good fuzz test --------------------------- diff --git a/Modules/_xxtestfuzz/dictionaries/fuzz_json_loads.dict b/Modules/_xxtestfuzz/dictionaries/fuzz_json_loads.dict new file mode 100644 index 000000000000..ad64917ccc2c --- /dev/null +++ b/Modules/_xxtestfuzz/dictionaries/fuzz_json_loads.dict @@ -0,0 +1,40 @@ +"0" +",0" +":0" +"0:" +"-1.2e+3" + +"true" +"false" +"null" + +"\"\"" +",\"\"" +":\"\"" +"\"\":" + +"{}" +",{}" +":{}" +"{\"\":0}" +"{{}}" + +"[]" +",[]" +":[]" +"[0]" +"[[]]" + +"''" +"\\" +"\\b" +"\\f" +"\\n" +"\\r" +"\\t" +"\\u0000" +"\\x00" +"\\0" +"\\uD800\\uDC00" +"\\uDBFF\\uDFFF" + diff --git a/Modules/_xxtestfuzz/fuzz_json_loads_corpus/empty_array.json b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/empty_array.json new file mode 100644 index 000000000000..fe51488c7066 --- /dev/null +++ b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/empty_array.json @@ -0,0 +1 @@ +[] diff --git a/Modules/_xxtestfuzz/fuzz_json_loads_corpus/empty_object.json b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/empty_object.json new file mode 100644 index 000000000000..0967ef424bce --- /dev/null +++ b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/empty_object.json @@ -0,0 +1 @@ +{} diff --git a/Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass1.json b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass1.json new file mode 100644 index 000000000000..70e268543692 --- /dev/null +++ b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass1.json @@ -0,0 +1,58 @@ +[ + "JSON Test Pattern pass1", + {"object with 1 member":["array with 1 element"]}, + {}, + [], + -42, + true, + false, + null, + { + "integer": 1234567890, + "real": -9876.543210, + "e": 0.123456789e-12, + "E": 1.234567890E+34, + "": 23456789012E66, + "zero": 0, + "one": 1, + "space": " ", + "quote": "\"", + "backslash": "\\", + "controls": "\b\f\n\r\t", + "slash": "/ & \/", + "alpha": "abcdefghijklmnopqrstuvwyz", + "ALPHA": "ABCDEFGHIJKLMNOPQRSTUVWYZ", + "digit": "0123456789", + "0123456789": "digit", + "special": "`1~!@#$%^&*()_+-={':[,]}|;.?", + "hex": "\u0123\u4567\u89AB\uCDEF\uabcd\uef4A", + "true": true, + "false": false, + "null": null, + "array":[ ], + "object":{ }, + "address": "50 St. James Street", + "url": "http://www.JSON.org/", + "comment": "// /* */": " ", + " s p a c e d " :[1,2 , 3 + +, + +4 , 5 , 6 ,7 ],"compact":[1,2,3,4,5,6,7], + "jsontext": "{\"object with 1 member\":[\"array with 1 element\"]}", + "quotes": "" \u0022 %22 0x22 034 "", + "\/\\\"\uCAFE\uBABE\uAB98\uFCDE\ubcda\uef4A\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?" +: "A key can be any string" + }, + 0.5 ,98.6 +, +99.44 +, + +1066, +1e1, +0.1e1, +1e-1, +1e00,2e+00,2e-00 +,"rosebud"] \ No newline at end of file diff --git a/Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass2.json b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass2.json new file mode 100644 index 000000000000..d3c63c7ad845 --- /dev/null +++ b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass2.json @@ -0,0 +1 @@ +[[[[[[[[[[[[[[[[[[["Not too deep"]]]]]]]]]]]]]]]]]]] \ No newline at end of file diff --git a/Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass3.json b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass3.json new file mode 100644 index 000000000000..4528d51f1ac6 --- /dev/null +++ b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass3.json @@ -0,0 +1,6 @@ +{ + "JSON Test Pattern pass3": { + "The outermost value": "must be an object or array.", + "In this test": "It is an object." + } +} diff --git a/Modules/_xxtestfuzz/fuzz_json_loads_corpus/simple_array.json b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/simple_array.json new file mode 100644 index 000000000000..ce1e6ecaec72 --- /dev/null +++ b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/simple_array.json @@ -0,0 +1 @@ +[1, 2, 3, "abcd", "xyz"] diff --git a/Modules/_xxtestfuzz/fuzz_tests.txt b/Modules/_xxtestfuzz/fuzz_tests.txt index 2e53bfdc7161..f0121291eaa0 100644 --- a/Modules/_xxtestfuzz/fuzz_tests.txt +++ b/Modules/_xxtestfuzz/fuzz_tests.txt @@ -1,3 +1,4 @@ fuzz_builtin_float fuzz_builtin_int fuzz_builtin_unicode +fuzz_json_loads diff --git a/Modules/_xxtestfuzz/fuzzer.c b/Modules/_xxtestfuzz/fuzzer.c index 54f816ebc93d..e862a99cfb34 100644 --- a/Modules/_xxtestfuzz/fuzzer.c +++ b/Modules/_xxtestfuzz/fuzzer.c @@ -28,8 +28,15 @@ static int fuzz_builtin_float(const char* data, size_t size) { return 0; } +#define MAX_INT_TEST_SIZE 0x10000 + /* Fuzz PyLong_FromUnicodeObject as a proxy for int(str). */ static int fuzz_builtin_int(const char* data, size_t size) { + /* Ignore test cases with very long ints to avoid timeouts + int("9" * 1000000) is not a very interesting test caase */ + if (size > MAX_INT_TEST_SIZE) { + return 0; + } /* Pick a random valid base. (When the fuzzed function takes extra parameters, it's somewhat normal to hash the input to generate those parameters. We want to exercise all code paths, so we do so here.) */ @@ -72,6 +79,42 @@ static int fuzz_builtin_unicode(const char* data, size_t size) { return 0; } +#define MAX_JSON_TEST_SIZE 0x10000 + +/* Initialized in LLVMFuzzerTestOneInput */ +PyObject* json_loads_method = NULL; +/* Fuzz json.loads(x) */ +static int fuzz_json_loads(const char* data, size_t size) { + /* Since python supports arbitrarily large ints in JSON, + long inputs can lead to timeouts on boring inputs like + `json.loads("9" * 100000)` */ + if (size > MAX_JSON_TEST_SIZE) { + return 0; + } + PyObject* input_bytes = PyBytes_FromStringAndSize(data, size); + if (input_bytes == NULL) { + return 0; + } + PyObject* parsed = PyObject_CallFunctionObjArgs(json_loads_method, input_bytes, NULL); + /* Ignore ValueError as the fuzzer will more than likely + generate some invalid json and values */ + if (parsed == NULL && PyErr_ExceptionMatches(PyExc_ValueError)) { + PyErr_Clear(); + } + /* Ignore RecursionError as the fuzzer generates long sequences of + arrays such as `[[[...` */ + if (parsed == NULL && PyErr_ExceptionMatches(PyExc_RecursionError)) { + PyErr_Clear(); + } + /* Ignore unicode errors, invalid byte sequences are common */ + if (parsed == NULL && PyErr_ExceptionMatches(PyExc_UnicodeDecodeError)) { + PyErr_Clear(); + } + Py_DECREF(input_bytes); + Py_XDECREF(parsed); + return 0; +} + /* Run fuzzer and abort on failure. */ static int _run_fuzz(const uint8_t *data, size_t size, int(*fuzzer)(const char* , size_t)) { int rv = fuzzer((const char*) data, size); @@ -88,7 +131,6 @@ static int _run_fuzz(const uint8_t *data, size_t size, int(*fuzzer)(const char* /* CPython generates a lot of leak warnings for whatever reason. */ int __lsan_is_turned_off(void) { return 1; } -wchar_t wide_program_name[NAME_MAX]; int LLVMFuzzerInitialize(int *argc, char ***argv) { wchar_t* wide_program_name = Py_DecodeLocale(*argv[0], NULL); @@ -110,6 +152,12 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { initialize CPython ourselves on the first run. */ Py_InitializeEx(0); } +#if !defined(_Py_FUZZ_ONE) || defined(_Py_FUZZ_fuzz_json_loads) + if (json_loads_method == NULL) { + PyObject* json_module = PyImport_ImportModule("json"); + json_loads_method = PyObject_GetAttrString(json_module, "loads"); + } +#endif int rv = 0; @@ -121,6 +169,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { #endif #if !defined(_Py_FUZZ_ONE) || defined(_Py_FUZZ_fuzz_builtin_unicode) rv |= _run_fuzz(data, size, fuzz_builtin_unicode); +#endif +#if !defined(_Py_FUZZ_ONE) || defined(_Py_FUZZ_fuzz_json_loads) + rv |= _run_fuzz(data, size, fuzz_json_loads); #endif return rv; } From webhook-mailer at python.org Wed Jun 12 00:48:21 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 12 Jun 2019 04:48:21 -0000 Subject: [Python-checkins] bpo-29505: Fuzz json module, enforce size limit on int(x) fuzz (GH-13991) Message-ID: https://github.com/python/cpython/commit/878227e7217f3363f9c095b7fb8c1dbdde1ec34f commit: 878227e7217f3363f9c095b7fb8c1dbdde1ec34f branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-11T21:48:17-07:00 summary: bpo-29505: Fuzz json module, enforce size limit on int(x) fuzz (GH-13991) * bpo-29505: Enable fuzz testing of the json module, enforce size limit on int(x) fuzz and json input size to avoid timeouts. Contributed by by Ammar Askar for Google. (cherry picked from commit a6e190e94b47324f14e22a09200c68b722d55699) Co-authored-by: Ammar Askar files: A Modules/_xxtestfuzz/dictionaries/fuzz_json_loads.dict A Modules/_xxtestfuzz/fuzz_json_loads_corpus/empty_array.json A Modules/_xxtestfuzz/fuzz_json_loads_corpus/empty_object.json A Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass1.json A Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass2.json A Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass3.json A Modules/_xxtestfuzz/fuzz_json_loads_corpus/simple_array.json M Modules/_xxtestfuzz/README.rst M Modules/_xxtestfuzz/fuzz_tests.txt M Modules/_xxtestfuzz/fuzzer.c diff --git a/Modules/_xxtestfuzz/README.rst b/Modules/_xxtestfuzz/README.rst index b48f3c89a42b..42bd02a03cbe 100644 --- a/Modules/_xxtestfuzz/README.rst +++ b/Modules/_xxtestfuzz/README.rst @@ -35,6 +35,16 @@ And invoke it from ``LLVMFuzzerTestOneInput``:: ``LLVMFuzzerTestOneInput`` will run in oss-fuzz, with each test in ``fuzz_tests.txt`` run separately. +Seed data (corpus) for the test can be provided in a subfolder called +``_corpus`` such as ``fuzz_json_loads_corpus``. A wide variety +of good input samples allows the fuzzer to more easily explore a diverse +set of paths and provides a better base to find buggy input from. + +Dictionaries of tokens (see oss-fuzz documentation for more details) can +be placed in the ``dictionaries`` folder with the name of the test. +For example, ``dictionaries/fuzz_json_loads.dict`` contains JSON tokens +to guide the fuzzer. + What makes a good fuzz test --------------------------- diff --git a/Modules/_xxtestfuzz/dictionaries/fuzz_json_loads.dict b/Modules/_xxtestfuzz/dictionaries/fuzz_json_loads.dict new file mode 100644 index 000000000000..ad64917ccc2c --- /dev/null +++ b/Modules/_xxtestfuzz/dictionaries/fuzz_json_loads.dict @@ -0,0 +1,40 @@ +"0" +",0" +":0" +"0:" +"-1.2e+3" + +"true" +"false" +"null" + +"\"\"" +",\"\"" +":\"\"" +"\"\":" + +"{}" +",{}" +":{}" +"{\"\":0}" +"{{}}" + +"[]" +",[]" +":[]" +"[0]" +"[[]]" + +"''" +"\\" +"\\b" +"\\f" +"\\n" +"\\r" +"\\t" +"\\u0000" +"\\x00" +"\\0" +"\\uD800\\uDC00" +"\\uDBFF\\uDFFF" + diff --git a/Modules/_xxtestfuzz/fuzz_json_loads_corpus/empty_array.json b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/empty_array.json new file mode 100644 index 000000000000..fe51488c7066 --- /dev/null +++ b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/empty_array.json @@ -0,0 +1 @@ +[] diff --git a/Modules/_xxtestfuzz/fuzz_json_loads_corpus/empty_object.json b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/empty_object.json new file mode 100644 index 000000000000..0967ef424bce --- /dev/null +++ b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/empty_object.json @@ -0,0 +1 @@ +{} diff --git a/Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass1.json b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass1.json new file mode 100644 index 000000000000..70e268543692 --- /dev/null +++ b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass1.json @@ -0,0 +1,58 @@ +[ + "JSON Test Pattern pass1", + {"object with 1 member":["array with 1 element"]}, + {}, + [], + -42, + true, + false, + null, + { + "integer": 1234567890, + "real": -9876.543210, + "e": 0.123456789e-12, + "E": 1.234567890E+34, + "": 23456789012E66, + "zero": 0, + "one": 1, + "space": " ", + "quote": "\"", + "backslash": "\\", + "controls": "\b\f\n\r\t", + "slash": "/ & \/", + "alpha": "abcdefghijklmnopqrstuvwyz", + "ALPHA": "ABCDEFGHIJKLMNOPQRSTUVWYZ", + "digit": "0123456789", + "0123456789": "digit", + "special": "`1~!@#$%^&*()_+-={':[,]}|;.?", + "hex": "\u0123\u4567\u89AB\uCDEF\uabcd\uef4A", + "true": true, + "false": false, + "null": null, + "array":[ ], + "object":{ }, + "address": "50 St. James Street", + "url": "http://www.JSON.org/", + "comment": "// /* */": " ", + " s p a c e d " :[1,2 , 3 + +, + +4 , 5 , 6 ,7 ],"compact":[1,2,3,4,5,6,7], + "jsontext": "{\"object with 1 member\":[\"array with 1 element\"]}", + "quotes": "" \u0022 %22 0x22 034 "", + "\/\\\"\uCAFE\uBABE\uAB98\uFCDE\ubcda\uef4A\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?" +: "A key can be any string" + }, + 0.5 ,98.6 +, +99.44 +, + +1066, +1e1, +0.1e1, +1e-1, +1e00,2e+00,2e-00 +,"rosebud"] \ No newline at end of file diff --git a/Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass2.json b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass2.json new file mode 100644 index 000000000000..d3c63c7ad845 --- /dev/null +++ b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass2.json @@ -0,0 +1 @@ +[[[[[[[[[[[[[[[[[[["Not too deep"]]]]]]]]]]]]]]]]]]] \ No newline at end of file diff --git a/Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass3.json b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass3.json new file mode 100644 index 000000000000..4528d51f1ac6 --- /dev/null +++ b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/pass3.json @@ -0,0 +1,6 @@ +{ + "JSON Test Pattern pass3": { + "The outermost value": "must be an object or array.", + "In this test": "It is an object." + } +} diff --git a/Modules/_xxtestfuzz/fuzz_json_loads_corpus/simple_array.json b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/simple_array.json new file mode 100644 index 000000000000..ce1e6ecaec72 --- /dev/null +++ b/Modules/_xxtestfuzz/fuzz_json_loads_corpus/simple_array.json @@ -0,0 +1 @@ +[1, 2, 3, "abcd", "xyz"] diff --git a/Modules/_xxtestfuzz/fuzz_tests.txt b/Modules/_xxtestfuzz/fuzz_tests.txt index 2e53bfdc7161..f0121291eaa0 100644 --- a/Modules/_xxtestfuzz/fuzz_tests.txt +++ b/Modules/_xxtestfuzz/fuzz_tests.txt @@ -1,3 +1,4 @@ fuzz_builtin_float fuzz_builtin_int fuzz_builtin_unicode +fuzz_json_loads diff --git a/Modules/_xxtestfuzz/fuzzer.c b/Modules/_xxtestfuzz/fuzzer.c index 54f816ebc93d..e862a99cfb34 100644 --- a/Modules/_xxtestfuzz/fuzzer.c +++ b/Modules/_xxtestfuzz/fuzzer.c @@ -28,8 +28,15 @@ static int fuzz_builtin_float(const char* data, size_t size) { return 0; } +#define MAX_INT_TEST_SIZE 0x10000 + /* Fuzz PyLong_FromUnicodeObject as a proxy for int(str). */ static int fuzz_builtin_int(const char* data, size_t size) { + /* Ignore test cases with very long ints to avoid timeouts + int("9" * 1000000) is not a very interesting test caase */ + if (size > MAX_INT_TEST_SIZE) { + return 0; + } /* Pick a random valid base. (When the fuzzed function takes extra parameters, it's somewhat normal to hash the input to generate those parameters. We want to exercise all code paths, so we do so here.) */ @@ -72,6 +79,42 @@ static int fuzz_builtin_unicode(const char* data, size_t size) { return 0; } +#define MAX_JSON_TEST_SIZE 0x10000 + +/* Initialized in LLVMFuzzerTestOneInput */ +PyObject* json_loads_method = NULL; +/* Fuzz json.loads(x) */ +static int fuzz_json_loads(const char* data, size_t size) { + /* Since python supports arbitrarily large ints in JSON, + long inputs can lead to timeouts on boring inputs like + `json.loads("9" * 100000)` */ + if (size > MAX_JSON_TEST_SIZE) { + return 0; + } + PyObject* input_bytes = PyBytes_FromStringAndSize(data, size); + if (input_bytes == NULL) { + return 0; + } + PyObject* parsed = PyObject_CallFunctionObjArgs(json_loads_method, input_bytes, NULL); + /* Ignore ValueError as the fuzzer will more than likely + generate some invalid json and values */ + if (parsed == NULL && PyErr_ExceptionMatches(PyExc_ValueError)) { + PyErr_Clear(); + } + /* Ignore RecursionError as the fuzzer generates long sequences of + arrays such as `[[[...` */ + if (parsed == NULL && PyErr_ExceptionMatches(PyExc_RecursionError)) { + PyErr_Clear(); + } + /* Ignore unicode errors, invalid byte sequences are common */ + if (parsed == NULL && PyErr_ExceptionMatches(PyExc_UnicodeDecodeError)) { + PyErr_Clear(); + } + Py_DECREF(input_bytes); + Py_XDECREF(parsed); + return 0; +} + /* Run fuzzer and abort on failure. */ static int _run_fuzz(const uint8_t *data, size_t size, int(*fuzzer)(const char* , size_t)) { int rv = fuzzer((const char*) data, size); @@ -88,7 +131,6 @@ static int _run_fuzz(const uint8_t *data, size_t size, int(*fuzzer)(const char* /* CPython generates a lot of leak warnings for whatever reason. */ int __lsan_is_turned_off(void) { return 1; } -wchar_t wide_program_name[NAME_MAX]; int LLVMFuzzerInitialize(int *argc, char ***argv) { wchar_t* wide_program_name = Py_DecodeLocale(*argv[0], NULL); @@ -110,6 +152,12 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { initialize CPython ourselves on the first run. */ Py_InitializeEx(0); } +#if !defined(_Py_FUZZ_ONE) || defined(_Py_FUZZ_fuzz_json_loads) + if (json_loads_method == NULL) { + PyObject* json_module = PyImport_ImportModule("json"); + json_loads_method = PyObject_GetAttrString(json_module, "loads"); + } +#endif int rv = 0; @@ -121,6 +169,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { #endif #if !defined(_Py_FUZZ_ONE) || defined(_Py_FUZZ_fuzz_builtin_unicode) rv |= _run_fuzz(data, size, fuzz_builtin_unicode); +#endif +#if !defined(_Py_FUZZ_ONE) || defined(_Py_FUZZ_fuzz_json_loads) + rv |= _run_fuzz(data, size, fuzz_json_loads); #endif return rv; } From webhook-mailer at python.org Wed Jun 12 06:15:14 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 12 Jun 2019 10:15:14 -0000 Subject: [Python-checkins] bpo-26219: Fix compiler warning in _PyCode_InitOpcache() (GH-13997) (GH-14000) Message-ID: https://github.com/python/cpython/commit/996e52623af3854552d41751e0c2522bc0a7e84f commit: 996e52623af3854552d41751e0c2522bc0a7e84f branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Victor Stinner date: 2019-06-12T12:14:43+02:00 summary: bpo-26219: Fix compiler warning in _PyCode_InitOpcache() (GH-13997) (GH-14000) Fix MSVC warning: objects\codeobject.c(285): warning C4244: '=': conversion from 'Py_ssize_t' to 'unsigned char', possible loss of data (cherry picked from commit 376ce9852eec4e97745c723f0dd0fe64383c6cd3) Co-authored-by: Victor Stinner files: M Objects/codeobject.c diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 63ce4793597a..1333cc833e1e 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -282,7 +282,7 @@ _PyCode_InitOpcache(PyCodeObject *co) co->co_opcache = NULL; } - co->co_opcache_size = opts; + co->co_opcache_size = (unsigned char)opts; return 0; } From webhook-mailer at python.org Wed Jun 12 07:31:24 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 12 Jun 2019 11:31:24 -0000 Subject: [Python-checkins] Add some placeholder notes for major 3.8 features (GH-13927) (#13929) Message-ID: https://github.com/python/cpython/commit/669e07be4861ebb69f2ed1c62dd2f2c83402bc09 commit: 669e07be4861ebb69f2ed1c62dd2f2c83402bc09 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Victor Stinner date: 2019-06-12T13:31:13+02:00 summary: Add some placeholder notes for major 3.8 features (GH-13927) (#13929) (cherry picked from commit b9438ceb20635b00f10615c5b6d8dbe56e1d486b) Co-authored-by: Nick Coghlan files: M Doc/whatsnew/3.8.rst diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index eb2a00589832..7e5d2f1f2d02 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -52,6 +52,13 @@ For full details, see the :ref:`changelog `. form. It will be updated substantially as Python 3.8 moves towards release, so it's worth checking back even after reading earlier versions. + Some notable items not yet covered here: + + * :pep:`574` - Pickle protocol 5 with out-of-band data buffer support + * :pep:`578` - Runtime audit hooks for potentially sensitive operations + * ``python -m asyncio`` runs a natively async REPL + * ... + Summary -- Release highlights ============================= From webhook-mailer at python.org Wed Jun 12 07:50:17 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 12 Jun 2019 11:50:17 -0000 Subject: [Python-checkins] bpo-31829: Make protocol 0 pickles be loadable in text mode in Python 2. (GH-11859) Message-ID: https://github.com/python/cpython/commit/d561f848b235f2011a43b705d112055b92fa2366 commit: d561f848b235f2011a43b705d112055b92fa2366 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-12T04:50:11-07:00 summary: bpo-31829: Make protocol 0 pickles be loadable in text mode in Python 2. (GH-11859) Escape ``\r``, ``\0`` and ``\x1a`` (end-of-file on Windows) in Unicode strings. (cherry picked from commit 38ab7d4721b422547f7b46b9d68968863fa70573) Co-authored-by: Serhiy Storchaka files: A Misc/NEWS.d/next/Library/2017-10-21-12-07-56.bpo-31829.6IhP-O.rst M Lib/pickle.py M Lib/test/pickletester.py M Modules/_pickle.c diff --git a/Lib/pickle.py b/Lib/pickle.py index e6d003787bad..bfa3c0361b73 100644 --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -749,7 +749,10 @@ def save_str(self, obj): self.write(BINUNICODE + pack("= 256 || ch == '\\' || ch == '\n') { + else if (ch >= 256 || + ch == '\\' || ch == 0 || ch == '\n' || ch == '\r' || + ch == 0x1a) + { /* -1: subtract 1 preallocated byte */ p = _PyBytesWriter_Prepare(&writer, p, 6-1); if (p == NULL) From webhook-mailer at python.org Wed Jun 12 08:01:18 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 12 Jun 2019 12:01:18 -0000 Subject: [Python-checkins] bpo-35545: Skip `test_asyncio.test_create_connection_ipv6_scope` on AIX (GH-14011) Message-ID: https://github.com/python/cpython/commit/32dda263e4e8c8e0fadc2bb29b9856e2f177dde9 commit: 32dda263e4e8c8e0fadc2bb29b9856e2f177dde9 branch: master author: Michael Felt committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-06-12T05:00:56-07:00 summary: bpo-35545: Skip `test_asyncio.test_create_connection_ipv6_scope` on AIX (GH-14011) because "getaddrinfo()" behaves different on AIX https://bugs.python.org/issue35545 files: M Lib/test/test_asyncio/test_base_events.py diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py index 02a97c60ac1a..811b37425dd2 100644 --- a/Lib/test/test_asyncio/test_base_events.py +++ b/Lib/test/test_asyncio/test_base_events.py @@ -1298,6 +1298,8 @@ def _test_create_connection_ip_addr(self, m_socket, allow_inet_pton): t.close() test_utils.run_briefly(self.loop) # allow transport to close + @unittest.skipIf(sys.platform.startswith('aix'), + "bpo-25545: IPv6 scope id and getaddrinfo() behave differently on AIX") @patch_socket def test_create_connection_ipv6_scope(self, m_socket): m_socket.getaddrinfo = socket.getaddrinfo From webhook-mailer at python.org Wed Jun 12 08:20:17 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 12 Jun 2019 12:20:17 -0000 Subject: [Python-checkins] bpo-35545: Skip `test_asyncio.test_create_connection_ipv6_scope` on AIX (GH-14011) Message-ID: https://github.com/python/cpython/commit/70a4178ec47154fdcc3ff06c13149e178d014581 commit: 70a4178ec47154fdcc3ff06c13149e178d014581 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-12T05:20:12-07:00 summary: bpo-35545: Skip `test_asyncio.test_create_connection_ipv6_scope` on AIX (GH-14011) because "getaddrinfo()" behaves different on AIX https://bugs.python.org/issue35545 (cherry picked from commit 32dda263e4e8c8e0fadc2bb29b9856e2f177dde9) Co-authored-by: Michael Felt files: M Lib/test/test_asyncio/test_base_events.py diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py index 02a97c60ac1a..811b37425dd2 100644 --- a/Lib/test/test_asyncio/test_base_events.py +++ b/Lib/test/test_asyncio/test_base_events.py @@ -1298,6 +1298,8 @@ def _test_create_connection_ip_addr(self, m_socket, allow_inet_pton): t.close() test_utils.run_briefly(self.loop) # allow transport to close + @unittest.skipIf(sys.platform.startswith('aix'), + "bpo-25545: IPv6 scope id and getaddrinfo() behave differently on AIX") @patch_socket def test_create_connection_ipv6_scope(self, m_socket): m_socket.getaddrinfo = socket.getaddrinfo From webhook-mailer at python.org Wed Jun 12 10:17:18 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 12 Jun 2019 14:17:18 -0000 Subject: [Python-checkins] bpo-35766: compile(): rename feature_version parameter (GH-13994) (GH-14001) Message-ID: https://github.com/python/cpython/commit/b2fd32b2f041402bb9fc8607f01566c055aafed9 commit: b2fd32b2f041402bb9fc8607f01566c055aafed9 branch: 3.8 author: Victor Stinner committer: GitHub date: 2019-06-12T16:17:05+02:00 summary: bpo-35766: compile(): rename feature_version parameter (GH-13994) (GH-14001) Rename compile() feature_version parameter to _feature_version and convert it to a keyword-only parameter. Update also test_type_comments to pass feature_version as a tuple. (cherry picked from commit efdf6ca90f7702824e7aeee1ceca949e7c20288a) files: M Lib/ast.py M Lib/test/test_type_comments.py M Python/bltinmodule.c M Python/clinic/bltinmodule.c.h diff --git a/Lib/ast.py b/Lib/ast.py index 70fbbdd2ffbd..ffeba179e510 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -45,7 +45,7 @@ def parse(source, filename='', mode='exec', *, feature_version = -1 # Else it should be an int giving the minor version for 3.x. return compile(source, filename, mode, flags, - feature_version=feature_version) + _feature_version=feature_version) def literal_eval(node_or_string): diff --git a/Lib/test/test_type_comments.py b/Lib/test/test_type_comments.py index 55b54e7f203e..43be54efdbd9 100644 --- a/Lib/test/test_type_comments.py +++ b/Lib/test/test_type_comments.py @@ -228,8 +228,9 @@ def parse(self, source, feature_version=highest): feature_version=feature_version) def parse_all(self, source, minver=lowest, maxver=highest, expected_regex=""): - for feature_version in range(self.lowest, self.highest + 1): - if minver <= feature_version <= maxver: + for version in range(self.lowest, self.highest + 1): + feature_version = (3, version) + if minver <= version <= maxver: try: yield self.parse(source, feature_version) except SyntaxError as err: diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 56d882d387ee..abf807a408f7 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -696,7 +696,8 @@ compile as builtin_compile flags: int = 0 dont_inherit: bool(accept={int}) = False optimize: int = -1 - feature_version: int = -1 + * + _feature_version as feature_version: int = -1 Compile source into a code object that can be executed by exec() or eval(). @@ -716,7 +717,7 @@ static PyObject * builtin_compile_impl(PyObject *module, PyObject *source, PyObject *filename, const char *mode, int flags, int dont_inherit, int optimize, int feature_version) -/*[clinic end generated code: output=b0c09c84f116d3d7 input=5fcc30651a6acaa9]*/ +/*[clinic end generated code: output=b0c09c84f116d3d7 input=40171fb92c1d580d]*/ { PyObject *source_copy; const char *str; diff --git a/Python/clinic/bltinmodule.c.h b/Python/clinic/bltinmodule.c.h index 0ed11bceeb87..abed6cc3e174 100644 --- a/Python/clinic/bltinmodule.c.h +++ b/Python/clinic/bltinmodule.c.h @@ -151,7 +151,7 @@ builtin_chr(PyObject *module, PyObject *arg) PyDoc_STRVAR(builtin_compile__doc__, "compile($module, /, source, filename, mode, flags=0,\n" -" dont_inherit=False, optimize=-1, feature_version=-1)\n" +" dont_inherit=False, optimize=-1, *, _feature_version=-1)\n" "--\n" "\n" "Compile source into a code object that can be executed by exec() or eval().\n" @@ -179,7 +179,7 @@ static PyObject * builtin_compile(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"source", "filename", "mode", "flags", "dont_inherit", "optimize", "feature_version", NULL}; + static const char * const _keywords[] = {"source", "filename", "mode", "flags", "dont_inherit", "optimize", "_feature_version", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "compile", 0}; PyObject *argsbuf[7]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 3; @@ -191,7 +191,7 @@ builtin_compile(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObj int optimize = -1; int feature_version = -1; - args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 7, 0, argsbuf); + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 6, 0, argsbuf); if (!args) { goto exit; } @@ -257,6 +257,10 @@ builtin_compile(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObj goto skip_optional_pos; } } +skip_optional_pos: + if (!noptargs) { + goto skip_optional_kwonly; + } if (PyFloat_Check(args[6])) { PyErr_SetString(PyExc_TypeError, "integer argument expected, got float" ); @@ -266,7 +270,7 @@ builtin_compile(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObj if (feature_version == -1 && PyErr_Occurred()) { goto exit; } -skip_optional_pos: +skip_optional_kwonly: return_value = builtin_compile_impl(module, source, filename, mode, flags, dont_inherit, optimize, feature_version); exit: @@ -845,4 +849,4 @@ builtin_issubclass(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: return return_value; } -/*[clinic end generated code: output=3f690311ac556c31 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=e173df340a9e4516 input=a9049054013a1b77]*/ From webhook-mailer at python.org Wed Jun 12 11:38:02 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 12 Jun 2019 15:38:02 -0000 Subject: [Python-checkins] bpo-37160: Thread native ID NetBSD support (GH-13835) Message-ID: https://github.com/python/cpython/commit/5287022eeeb3c017d49fc8580b52e18377bf23f3 commit: 5287022eeeb3c017d49fc8580b52e18377bf23f3 branch: master author: David Carlier committer: Victor Stinner date: 2019-06-12T17:37:56+02:00 summary: bpo-37160: Thread native ID NetBSD support (GH-13835) files: A Misc/NEWS.d/next/Core and Builtins/2019-06-05-09-24-17.bpo-37160.O3IAY3.rst M Doc/library/_thread.rst M Doc/library/threading.rst M Include/pythread.h M Python/thread_pthread.h diff --git a/Doc/library/_thread.rst b/Doc/library/_thread.rst index 26568dcbf8f5..5b4fcde669e1 100644 --- a/Doc/library/_thread.rst +++ b/Doc/library/_thread.rst @@ -106,7 +106,7 @@ This module defines the following constants and functions: Its value may be used to uniquely identify this particular thread system-wide (until the thread terminates, after which the value may be recycled by the OS). - .. availability:: Windows, FreeBSD, Linux, macOS, OpenBSD. + .. availability:: Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD. .. versionadded:: 3.8 diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst index 7fb9ac9979e4..b4f4814c4ad3 100644 --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -82,7 +82,7 @@ This module defines the following functions: Its value may be used to uniquely identify this particular thread system-wide (until the thread terminates, after which the value may be recycled by the OS). - .. availability:: Windows, FreeBSD, Linux, macOS, OpenBSD. + .. availability:: Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD. .. versionadded:: 3.8 diff --git a/Include/pythread.h b/Include/pythread.h index 84b79c876425..79a9210af3a4 100644 --- a/Include/pythread.h +++ b/Include/pythread.h @@ -26,7 +26,7 @@ PyAPI_FUNC(unsigned long) PyThread_start_new_thread(void (*)(void *), void *); PyAPI_FUNC(void) _Py_NO_RETURN PyThread_exit_thread(void); PyAPI_FUNC(unsigned long) PyThread_get_thread_ident(void); -#if defined(__APPLE__) || defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(_WIN32) +#if defined(__APPLE__) || defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(_WIN32) #define PY_HAVE_THREAD_NATIVE_ID PyAPI_FUNC(unsigned long) PyThread_get_thread_native_id(void); #endif diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-06-05-09-24-17.bpo-37160.O3IAY3.rst b/Misc/NEWS.d/next/Core and Builtins/2019-06-05-09-24-17.bpo-37160.O3IAY3.rst new file mode 100644 index 000000000000..c2fc6804a126 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-06-05-09-24-17.bpo-37160.O3IAY3.rst @@ -0,0 +1 @@ +:func:`threading.get_native_id` now also supports NetBSD. diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h index 740b521b9446..9b4b23bdc7d7 100644 --- a/Python/thread_pthread.h +++ b/Python/thread_pthread.h @@ -18,6 +18,8 @@ # include /* pthread_getthreadid_np() */ #elif defined(__OpenBSD__) # include /* getthrid() */ +#elif defined(__NetBSD__) /* _lwp_self */ +# include #endif /* The POSIX spec requires that use of pthread_attr_setstacksize @@ -328,6 +330,9 @@ PyThread_get_thread_native_id(void) #elif defined(__OpenBSD__) pid_t native_id; native_id = getthrid(); +#elif defined(__NetBSD__) + lwpid_t native_id; + native_id = _lwp_self(); #endif return (unsigned long) native_id; } From webhook-mailer at python.org Wed Jun 12 12:03:29 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 12 Jun 2019 16:03:29 -0000 Subject: [Python-checkins] bpo-37160: Thread native ID NetBSD support (GH-13835) Message-ID: https://github.com/python/cpython/commit/c9ca96dd968176580a011e852066c95a48aab7e0 commit: c9ca96dd968176580a011e852066c95a48aab7e0 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-12T09:03:04-07:00 summary: bpo-37160: Thread native ID NetBSD support (GH-13835) (cherry picked from commit 5287022eeeb3c017d49fc8580b52e18377bf23f3) Co-authored-by: David Carlier files: A Misc/NEWS.d/next/Core and Builtins/2019-06-05-09-24-17.bpo-37160.O3IAY3.rst M Doc/library/_thread.rst M Doc/library/threading.rst M Include/pythread.h M Python/thread_pthread.h diff --git a/Doc/library/_thread.rst b/Doc/library/_thread.rst index 26568dcbf8f5..5b4fcde669e1 100644 --- a/Doc/library/_thread.rst +++ b/Doc/library/_thread.rst @@ -106,7 +106,7 @@ This module defines the following constants and functions: Its value may be used to uniquely identify this particular thread system-wide (until the thread terminates, after which the value may be recycled by the OS). - .. availability:: Windows, FreeBSD, Linux, macOS, OpenBSD. + .. availability:: Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD. .. versionadded:: 3.8 diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst index 7fb9ac9979e4..b4f4814c4ad3 100644 --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -82,7 +82,7 @@ This module defines the following functions: Its value may be used to uniquely identify this particular thread system-wide (until the thread terminates, after which the value may be recycled by the OS). - .. availability:: Windows, FreeBSD, Linux, macOS, OpenBSD. + .. availability:: Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD. .. versionadded:: 3.8 diff --git a/Include/pythread.h b/Include/pythread.h index 84b79c876425..79a9210af3a4 100644 --- a/Include/pythread.h +++ b/Include/pythread.h @@ -26,7 +26,7 @@ PyAPI_FUNC(unsigned long) PyThread_start_new_thread(void (*)(void *), void *); PyAPI_FUNC(void) _Py_NO_RETURN PyThread_exit_thread(void); PyAPI_FUNC(unsigned long) PyThread_get_thread_ident(void); -#if defined(__APPLE__) || defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(_WIN32) +#if defined(__APPLE__) || defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(_WIN32) #define PY_HAVE_THREAD_NATIVE_ID PyAPI_FUNC(unsigned long) PyThread_get_thread_native_id(void); #endif diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-06-05-09-24-17.bpo-37160.O3IAY3.rst b/Misc/NEWS.d/next/Core and Builtins/2019-06-05-09-24-17.bpo-37160.O3IAY3.rst new file mode 100644 index 000000000000..c2fc6804a126 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-06-05-09-24-17.bpo-37160.O3IAY3.rst @@ -0,0 +1 @@ +:func:`threading.get_native_id` now also supports NetBSD. diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h index 740b521b9446..9b4b23bdc7d7 100644 --- a/Python/thread_pthread.h +++ b/Python/thread_pthread.h @@ -18,6 +18,8 @@ # include /* pthread_getthreadid_np() */ #elif defined(__OpenBSD__) # include /* getthrid() */ +#elif defined(__NetBSD__) /* _lwp_self */ +# include #endif /* The POSIX spec requires that use of pthread_attr_setstacksize @@ -328,6 +330,9 @@ PyThread_get_thread_native_id(void) #elif defined(__OpenBSD__) pid_t native_id; native_id = getthrid(); +#elif defined(__NetBSD__) + lwpid_t native_id; + native_id = _lwp_self(); #endif return (unsigned long) native_id; } From webhook-mailer at python.org Wed Jun 12 13:16:54 2019 From: webhook-mailer at python.org (Steve Dower) Date: Wed, 12 Jun 2019 17:16:54 -0000 Subject: [Python-checkins] bpo-37201: fix test_distutils failures for Windows ARM64 (GH-13902) Message-ID: https://github.com/python/cpython/commit/daf62627518ad97ce66a48c49496aa0573cf0731 commit: daf62627518ad97ce66a48c49496aa0573cf0731 branch: master author: Paul Monson committer: Steve Dower date: 2019-06-12T10:16:49-07:00 summary: bpo-37201: fix test_distutils failures for Windows ARM64 (GH-13902) files: M Lib/distutils/_msvccompiler.py M Lib/distutils/tests/test_bdist_wininst.py M Lib/distutils/util.py M Lib/sysconfig.py M PC/pyconfig.h diff --git a/Lib/distutils/_msvccompiler.py b/Lib/distutils/_msvccompiler.py index c7ac3f049ebf..6e14f330d7f4 100644 --- a/Lib/distutils/_msvccompiler.py +++ b/Lib/distutils/_msvccompiler.py @@ -93,6 +93,7 @@ def _find_vc2017(): 'x86' : 'x86', 'x86_amd64' : 'x64', 'x86_arm' : 'arm', + 'x86_arm64' : 'arm64' } def _find_vcvarsall(plat_spec): @@ -190,6 +191,7 @@ def _find_exe(exe, paths=None): 'win32' : 'x86', 'win-amd64' : 'x86_amd64', 'win-arm32' : 'x86_arm', + 'win-arm64' : 'x86_arm64' } # A set containing the DLLs that are guaranteed to be available for diff --git a/Lib/distutils/tests/test_bdist_wininst.py b/Lib/distutils/tests/test_bdist_wininst.py index 4c19bbab219b..163f1cc97bf9 100644 --- a/Lib/distutils/tests/test_bdist_wininst.py +++ b/Lib/distutils/tests/test_bdist_wininst.py @@ -1,10 +1,14 @@ """Tests for distutils.command.bdist_wininst.""" +import sys +import platform import unittest from test.support import run_unittest from distutils.command.bdist_wininst import bdist_wininst from distutils.tests import support + at unittest.skipIf(sys.platform == 'win32' and platform.machine() == 'ARM64', + 'bdist_wininst is not supported in this install') @unittest.skipIf(getattr(bdist_wininst, '_unsupported', False), 'bdist_wininst is not supported in this install') class BuildWinInstTestCase(support.TempdirManager, diff --git a/Lib/distutils/util.py b/Lib/distutils/util.py index 50550e189341..17a94bc42832 100644 --- a/Lib/distutils/util.py +++ b/Lib/distutils/util.py @@ -40,6 +40,8 @@ def get_host_platform(): return 'win-amd64' if '(arm)' in sys.version.lower(): return 'win-arm32' + if '(arm64)' in sys.version.lower(): + return 'win-arm64' return sys.platform # Set for cross builds explicitly diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py index 8446c8deb242..e76e6927cb1f 100644 --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -628,6 +628,8 @@ def get_platform(): return 'win-amd64' if '(arm)' in sys.version.lower(): return 'win-arm32' + if '(arm64)' in sys.version.lower(): + return 'win-arm64' return sys.platform if os.name != "posix" or not hasattr(os, 'uname'): diff --git a/PC/pyconfig.h b/PC/pyconfig.h index 122591276b4a..9228923cbea8 100644 --- a/PC/pyconfig.h +++ b/PC/pyconfig.h @@ -122,13 +122,13 @@ WIN32 is still required for the locale module. #if defined(_M_X64) || defined(_M_AMD64) #if defined(__INTEL_COMPILER) #define COMPILER ("[ICC v." _Py_STRINGIZE(__INTEL_COMPILER) " 64 bit (amd64) with MSC v." _Py_STRINGIZE(_MSC_VER) " CRT]") -#elif defined(_M_ARM64) -#define COMPILER _Py_PASTE_VERSION("64 bit (ARM)") -#define PYD_PLATFORM_TAG "win_arm64" #else #define COMPILER _Py_PASTE_VERSION("64 bit (AMD64)") #endif /* __INTEL_COMPILER */ #define PYD_PLATFORM_TAG "win_amd64" +#elif defined(_M_ARM64) +#define COMPILER _Py_PASTE_VERSION("64 bit (ARM64)") +#define PYD_PLATFORM_TAG "win_arm64" #else #define COMPILER _Py_PASTE_VERSION("64 bit (Unknown)") #endif From webhook-mailer at python.org Wed Jun 12 13:44:51 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 12 Jun 2019 17:44:51 -0000 Subject: [Python-checkins] bpo-37201: fix test_distutils failures for Windows ARM64 (GH-13902) Message-ID: https://github.com/python/cpython/commit/bb3e8a68b2554b2bd94cf0cd9a0311f4561c1a25 commit: bb3e8a68b2554b2bd94cf0cd9a0311f4561c1a25 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-12T10:44:29-07:00 summary: bpo-37201: fix test_distutils failures for Windows ARM64 (GH-13902) (cherry picked from commit daf62627518ad97ce66a48c49496aa0573cf0731) Co-authored-by: Paul Monson files: M Lib/distutils/_msvccompiler.py M Lib/distutils/tests/test_bdist_wininst.py M Lib/distutils/util.py M Lib/sysconfig.py M PC/pyconfig.h diff --git a/Lib/distutils/_msvccompiler.py b/Lib/distutils/_msvccompiler.py index c7ac3f049ebf..6e14f330d7f4 100644 --- a/Lib/distutils/_msvccompiler.py +++ b/Lib/distutils/_msvccompiler.py @@ -93,6 +93,7 @@ def _find_vc2017(): 'x86' : 'x86', 'x86_amd64' : 'x64', 'x86_arm' : 'arm', + 'x86_arm64' : 'arm64' } def _find_vcvarsall(plat_spec): @@ -190,6 +191,7 @@ def _find_exe(exe, paths=None): 'win32' : 'x86', 'win-amd64' : 'x86_amd64', 'win-arm32' : 'x86_arm', + 'win-arm64' : 'x86_arm64' } # A set containing the DLLs that are guaranteed to be available for diff --git a/Lib/distutils/tests/test_bdist_wininst.py b/Lib/distutils/tests/test_bdist_wininst.py index 4c19bbab219b..163f1cc97bf9 100644 --- a/Lib/distutils/tests/test_bdist_wininst.py +++ b/Lib/distutils/tests/test_bdist_wininst.py @@ -1,10 +1,14 @@ """Tests for distutils.command.bdist_wininst.""" +import sys +import platform import unittest from test.support import run_unittest from distutils.command.bdist_wininst import bdist_wininst from distutils.tests import support + at unittest.skipIf(sys.platform == 'win32' and platform.machine() == 'ARM64', + 'bdist_wininst is not supported in this install') @unittest.skipIf(getattr(bdist_wininst, '_unsupported', False), 'bdist_wininst is not supported in this install') class BuildWinInstTestCase(support.TempdirManager, diff --git a/Lib/distutils/util.py b/Lib/distutils/util.py index 50550e189341..17a94bc42832 100644 --- a/Lib/distutils/util.py +++ b/Lib/distutils/util.py @@ -40,6 +40,8 @@ def get_host_platform(): return 'win-amd64' if '(arm)' in sys.version.lower(): return 'win-arm32' + if '(arm64)' in sys.version.lower(): + return 'win-arm64' return sys.platform # Set for cross builds explicitly diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py index 8446c8deb242..e76e6927cb1f 100644 --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -628,6 +628,8 @@ def get_platform(): return 'win-amd64' if '(arm)' in sys.version.lower(): return 'win-arm32' + if '(arm64)' in sys.version.lower(): + return 'win-arm64' return sys.platform if os.name != "posix" or not hasattr(os, 'uname'): diff --git a/PC/pyconfig.h b/PC/pyconfig.h index a74ee98a753d..3d7425a5a2c1 100644 --- a/PC/pyconfig.h +++ b/PC/pyconfig.h @@ -122,13 +122,13 @@ WIN32 is still required for the locale module. #if defined(_M_X64) || defined(_M_AMD64) #if defined(__INTEL_COMPILER) #define COMPILER ("[ICC v." _Py_STRINGIZE(__INTEL_COMPILER) " 64 bit (amd64) with MSC v." _Py_STRINGIZE(_MSC_VER) " CRT]") -#elif defined(_M_ARM64) -#define COMPILER _Py_PASTE_VERSION("64 bit (ARM)") -#define PYD_PLATFORM_TAG "win_arm64" #else #define COMPILER _Py_PASTE_VERSION("64 bit (AMD64)") #endif /* __INTEL_COMPILER */ #define PYD_PLATFORM_TAG "win_amd64" +#elif defined(_M_ARM64) +#define COMPILER _Py_PASTE_VERSION("64 bit (ARM64)") +#define PYD_PLATFORM_TAG "win_arm64" #else #define COMPILER _Py_PASTE_VERSION("64 bit (Unknown)") #endif From webhook-mailer at python.org Wed Jun 12 14:09:07 2019 From: webhook-mailer at python.org (Steve Dower) Date: Wed, 12 Jun 2019 18:09:07 -0000 Subject: [Python-checkins] bpo-37236: pragma optimize off for _Py_c_quot on Windows arm64 (GH-13983) Message-ID: https://github.com/python/cpython/commit/ff6bb0aa95259413f359d42410526ff0b4dccfb7 commit: ff6bb0aa95259413f359d42410526ff0b4dccfb7 branch: master author: Paul Monson committer: Steve Dower date: 2019-06-12T11:08:40-07:00 summary: bpo-37236: pragma optimize off for _Py_c_quot on Windows arm64 (GH-13983) files: M Objects/complexobject.c diff --git a/Objects/complexobject.c b/Objects/complexobject.c index f78c0fdf78de..a49da4018411 100644 --- a/Objects/complexobject.c +++ b/Objects/complexobject.c @@ -55,6 +55,10 @@ _Py_c_prod(Py_complex a, Py_complex b) return r; } +/* Avoid bad optimization on Windows ARM64 until the compiler is fixed */ +#ifdef _M_ARM64 +#pragma optimize("", off) +#endif Py_complex _Py_c_quot(Py_complex a, Py_complex b) { @@ -112,6 +116,9 @@ _Py_c_quot(Py_complex a, Py_complex b) } return r; } +#ifdef _M_ARM64 +#pragma optimize("", on) +#endif Py_complex _Py_c_pow(Py_complex a, Py_complex b) From webhook-mailer at python.org Wed Jun 12 14:27:21 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 12 Jun 2019 18:27:21 -0000 Subject: [Python-checkins] bpo-37236: pragma optimize off for _Py_c_quot on Windows arm64 (GH-13983) Message-ID: https://github.com/python/cpython/commit/f72886a066ba7d3a3aa077cfc3cad2ca0b2cdbf6 commit: f72886a066ba7d3a3aa077cfc3cad2ca0b2cdbf6 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-12T11:27:15-07:00 summary: bpo-37236: pragma optimize off for _Py_c_quot on Windows arm64 (GH-13983) (cherry picked from commit ff6bb0aa95259413f359d42410526ff0b4dccfb7) Co-authored-by: Paul Monson files: M Objects/complexobject.c diff --git a/Objects/complexobject.c b/Objects/complexobject.c index f78c0fdf78de..a49da4018411 100644 --- a/Objects/complexobject.c +++ b/Objects/complexobject.c @@ -55,6 +55,10 @@ _Py_c_prod(Py_complex a, Py_complex b) return r; } +/* Avoid bad optimization on Windows ARM64 until the compiler is fixed */ +#ifdef _M_ARM64 +#pragma optimize("", off) +#endif Py_complex _Py_c_quot(Py_complex a, Py_complex b) { @@ -112,6 +116,9 @@ _Py_c_quot(Py_complex a, Py_complex b) } return r; } +#ifdef _M_ARM64 +#pragma optimize("", on) +#endif Py_complex _Py_c_pow(Py_complex a, Py_complex b) From webhook-mailer at python.org Wed Jun 12 14:50:31 2019 From: webhook-mailer at python.org (Andrew Svetlov) Date: Wed, 12 Jun 2019 18:50:31 -0000 Subject: [Python-checkins] Make asyncio stream sendfile fail on error (was hang) (GH-14025) Message-ID: https://github.com/python/cpython/commit/0d1942774a70d561dbaaa980742dd0927e8aa51a commit: 0d1942774a70d561dbaaa980742dd0927e8aa51a branch: master author: Andrew Svetlov committer: GitHub date: 2019-06-12T21:50:23+03:00 summary: Make asyncio stream sendfile fail on error (was hang) (GH-14025) files: M Lib/test/test_asyncio/test_streams.py diff --git a/Lib/test/test_asyncio/test_streams.py b/Lib/test/test_asyncio/test_streams.py index 74e385524dd5..a1c62ecee662 100644 --- a/Lib/test/test_asyncio/test_streams.py +++ b/Lib/test/test_asyncio/test_streams.py @@ -1656,22 +1656,25 @@ def test_sendfile(self): async def serve_callback(stream): data = await stream.readline() - self.assertEqual(data, b'begin\n') + await stream.write(b'ack-' + data) data = await stream.readline() - self.assertEqual(data, b'data\n') + await stream.write(b'ack-' + data) data = await stream.readline() - self.assertEqual(data, b'end\n') - await stream.write(b'done\n') + await stream.write(b'ack-' + data) await stream.close() async def do_connect(host, port): stream = await asyncio.connect(host, port) await stream.write(b'begin\n') + data = await stream.readline() + self.assertEqual(b'ack-begin\n', data) with open(support.TESTFN, 'rb') as fp: await stream.sendfile(fp) + data = await stream.readline() + self.assertEqual(b'ack-data\n', data) await stream.write(b'end\n') data = await stream.readline() - self.assertEqual(data, b'done\n') + self.assertEqual(data, b'ack-end\n') await stream.close() async def test(): From webhook-mailer at python.org Wed Jun 12 15:10:52 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 12 Jun 2019 19:10:52 -0000 Subject: [Python-checkins] Make asyncio stream sendfile fail on error (was hang) (GH-14025) Message-ID: https://github.com/python/cpython/commit/3955dfff600dc8568e71ca19a48c72555043081f commit: 3955dfff600dc8568e71ca19a48c72555043081f branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-12T12:10:44-07:00 summary: Make asyncio stream sendfile fail on error (was hang) (GH-14025) (cherry picked from commit 0d1942774a70d561dbaaa980742dd0927e8aa51a) Co-authored-by: Andrew Svetlov files: M Lib/test/test_asyncio/test_streams.py diff --git a/Lib/test/test_asyncio/test_streams.py b/Lib/test/test_asyncio/test_streams.py index 74e385524dd5..a1c62ecee662 100644 --- a/Lib/test/test_asyncio/test_streams.py +++ b/Lib/test/test_asyncio/test_streams.py @@ -1656,22 +1656,25 @@ def test_sendfile(self): async def serve_callback(stream): data = await stream.readline() - self.assertEqual(data, b'begin\n') + await stream.write(b'ack-' + data) data = await stream.readline() - self.assertEqual(data, b'data\n') + await stream.write(b'ack-' + data) data = await stream.readline() - self.assertEqual(data, b'end\n') - await stream.write(b'done\n') + await stream.write(b'ack-' + data) await stream.close() async def do_connect(host, port): stream = await asyncio.connect(host, port) await stream.write(b'begin\n') + data = await stream.readline() + self.assertEqual(b'ack-begin\n', data) with open(support.TESTFN, 'rb') as fp: await stream.sendfile(fp) + data = await stream.readline() + self.assertEqual(b'ack-data\n', data) await stream.write(b'end\n') data = await stream.readline() - self.assertEqual(data, b'done\n') + self.assertEqual(data, b'ack-end\n') await stream.close() async def test(): From webhook-mailer at python.org Wed Jun 12 17:57:17 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 12 Jun 2019 21:57:17 -0000 Subject: [Python-checkins] bpo-37223, test_io: silence last 'Exception ignored in:' (GH-14029) Message-ID: https://github.com/python/cpython/commit/913fa1c8245d1cde6edb4254f4fb965cc91786ef commit: 913fa1c8245d1cde6edb4254f4fb965cc91786ef branch: master author: Victor Stinner committer: GitHub date: 2019-06-12T23:57:11+02:00 summary: bpo-37223, test_io: silence last 'Exception ignored in:' (GH-14029) Use catch_unraisable_exception() to ignore 'Exception ignored in:' error when the internal BufferedWriter of the BufferedRWPair is destroyed. The C implementation doesn't give access to the internal BufferedWriter, so just ignore the warning instead. files: M Lib/test/test_io.py diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 102679b1d342..55686d743983 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -2070,6 +2070,11 @@ def writer_close(): # Silence destructor error writer.close = lambda: None + writer = None + + with support.catch_unraisable_exception(): + pair = None + support.gc_collect() def test_reader_writer_close_error_on_close(self): def reader_close(): From webhook-mailer at python.org Wed Jun 12 18:23:55 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 12 Jun 2019 22:23:55 -0000 Subject: [Python-checkins] bpo-37223: test_io: silence destructor errors (GH-14031) Message-ID: https://github.com/python/cpython/commit/c15a682603a47f5aef5025f6a2e3babb699273d6 commit: c15a682603a47f5aef5025f6a2e3babb699273d6 branch: 3.8 author: Victor Stinner committer: GitHub date: 2019-06-13T00:23:49+02:00 summary: bpo-37223: test_io: silence destructor errors (GH-14031) * bpo-18748: Fix _pyio.IOBase destructor (closed case) (GH-13952) _pyio.IOBase destructor now does nothing if getting the closed attribute fails to better mimick _io.IOBase finalizer. (cherry picked from commit 4f6f7c5a611905fb6b81671547f268c226bc646a) * bpo-37223: test_io: silence destructor errors (GH-13954) Implement also MockNonBlockWriterIO.seek() method. (cherry picked from commit b589cef9c4dada2fb84ce0fae5040ecf16d9d5ef) * bpo-37223, test_io: silence last 'Exception ignored in:' (GH-14029) Use catch_unraisable_exception() to ignore 'Exception ignored in:' error when the internal BufferedWriter of the BufferedRWPair is destroyed. The C implementation doesn't give access to the internal BufferedWriter, so just ignore the warning instead. (cherry picked from commit 913fa1c8245d1cde6edb4254f4fb965cc91786ef) files: A Misc/NEWS.d/next/Library/2019-06-11-01-54-19.bpo-18748.ADqCkq.rst M Lib/_pyio.py M Lib/test/test_io.py diff --git a/Lib/_pyio.py b/Lib/_pyio.py index 43c24342ad61..0b6493bc8dc9 100644 --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -405,6 +405,16 @@ def close(self): def __del__(self): """Destructor. Calls close().""" + try: + closed = self.closed + except Exception: + # If getting closed fails, then the object is probably + # in an unusable state, so ignore. + return + + if closed: + return + if _IOBASE_EMITS_UNRAISABLE: self.close() else: diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 3a1f5ba5b666..55686d743983 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -277,6 +277,10 @@ def readable(self): def seekable(self): return True + def seek(self, pos, whence=0): + # naive implementation, enough for tests + return 0 + def writable(self): return True @@ -1486,6 +1490,9 @@ def test_misbehaved_io(self): self.assertRaises(OSError, bufio.seek, 0) self.assertRaises(OSError, bufio.tell) + # Silence destructor error + bufio.close = lambda: None + def test_no_extraneous_read(self): # Issue #9550; when the raw IO object has satisfied the read request, # we should not issue any additional reads, otherwise it may block @@ -1834,6 +1841,9 @@ def test_misbehaved_io(self): self.assertRaises(OSError, bufio.tell) self.assertRaises(OSError, bufio.write, b"abcdef") + # Silence destructor error + bufio.close = lambda: None + def test_max_buffer_size_removal(self): with self.assertRaises(TypeError): self.tp(self.MockRawIO(), 8, 12) @@ -2060,6 +2070,11 @@ def writer_close(): # Silence destructor error writer.close = lambda: None + writer = None + + with support.catch_unraisable_exception(): + pair = None + support.gc_collect() def test_reader_writer_close_error_on_close(self): def reader_close(): diff --git a/Misc/NEWS.d/next/Library/2019-06-11-01-54-19.bpo-18748.ADqCkq.rst b/Misc/NEWS.d/next/Library/2019-06-11-01-54-19.bpo-18748.ADqCkq.rst new file mode 100644 index 000000000000..295ddebb2a40 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-11-01-54-19.bpo-18748.ADqCkq.rst @@ -0,0 +1,2 @@ +:class:`_pyio.IOBase` destructor now does nothing if getting the ``closed`` +attribute fails to better mimick :class:`_io.IOBase` finalizer. From webhook-mailer at python.org Wed Jun 12 19:09:08 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 12 Jun 2019 23:09:08 -0000 Subject: [Python-checkins] bpo-37069: regrtest uses sys.unraisablehook (GH-13759) Message-ID: https://github.com/python/cpython/commit/95f61c8b1619e736bd5e29a0da0183234634b6e8 commit: 95f61c8b1619e736bd5e29a0da0183234634b6e8 branch: master author: Victor Stinner committer: GitHub date: 2019-06-13T01:09:04+02:00 summary: bpo-37069: regrtest uses sys.unraisablehook (GH-13759) regrtest now uses sys.unraisablehook() to mark a test as "environment altered" (ENV_CHANGED) if it emits an "unraisable exception". Moreover, regrtest logs a warning in this case. Use "python3 -m test --fail-env-changed" to catch unraisable exceptions in tests. files: A Misc/NEWS.d/next/Tests/2019-06-13-00-46-25.bpo-37069.wdktFo.rst M Lib/test/libregrtest/setup.py M Lib/test/libregrtest/utils.py M Lib/test/test_regrtest.py diff --git a/Lib/test/libregrtest/setup.py b/Lib/test/libregrtest/setup.py index fb5ac350cd08..36676bfa617b 100644 --- a/Lib/test/libregrtest/setup.py +++ b/Lib/test/libregrtest/setup.py @@ -10,6 +10,8 @@ except ImportError: gc = None +from test.libregrtest.utils import setup_unraisable_hook + def setup_tests(ns): try: @@ -93,6 +95,8 @@ def _test_audit_hook(name, args): pass sys.addaudithook(_test_audit_hook) + setup_unraisable_hook() + def suppress_msvcrt_asserts(verbose): try: diff --git a/Lib/test/libregrtest/utils.py b/Lib/test/libregrtest/utils.py index fb9971a64f66..2691a2c30ce8 100644 --- a/Lib/test/libregrtest/utils.py +++ b/Lib/test/libregrtest/utils.py @@ -2,6 +2,7 @@ import os.path import sys import textwrap +from test import support def format_duration(seconds): @@ -59,3 +60,19 @@ def printlist(x, width=70, indent=4, file=None): def print_warning(msg): print(f"Warning -- {msg}", file=sys.stderr, flush=True) + + +orig_unraisablehook = None + + +def regrtest_unraisable_hook(unraisable): + global orig_unraisablehook + support.environment_altered = True + print_warning("Unraisable exception") + orig_unraisablehook(unraisable) + + +def setup_unraisable_hook(): + global orig_unraisablehook + orig_unraisablehook = sys.unraisablehook + sys.unraisablehook = regrtest_unraisable_hook diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index b616e8974b9d..904b326d0e20 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -499,7 +499,7 @@ def run_command(self, args, input=None, exitcode=0, **kw): if not input: input = '' if 'stderr' not in kw: - kw['stderr'] = subprocess.PIPE + kw['stderr'] = subprocess.STDOUT proc = subprocess.run(args, universal_newlines=True, input=input, @@ -1124,6 +1124,34 @@ def test_garbage(self): env_changed=[testname], fail_env_changed=True) + def test_unraisable_exc(self): + # --fail-env-changed must catch unraisable exception + code = textwrap.dedent(r""" + import unittest + import weakref + + class MyObject: + pass + + def weakref_callback(obj): + raise Exception("weakref callback bug") + + class Tests(unittest.TestCase): + def test_unraisable_exc(self): + obj = MyObject() + ref = weakref.ref(obj, weakref_callback) + # call weakref_callback() which logs + # an unraisable exception + obj = None + """) + testname = self.create_test(code=code) + + output = self.run_tests("--fail-env-changed", "-v", testname, exitcode=3) + self.check_executed_tests(output, [testname], + env_changed=[testname], + fail_env_changed=True) + self.assertIn("Warning -- Unraisable exception", output) + class TestUtils(unittest.TestCase): def test_format_duration(self): diff --git a/Misc/NEWS.d/next/Tests/2019-06-13-00-46-25.bpo-37069.wdktFo.rst b/Misc/NEWS.d/next/Tests/2019-06-13-00-46-25.bpo-37069.wdktFo.rst new file mode 100644 index 000000000000..f9f6474ac8cf --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-06-13-00-46-25.bpo-37069.wdktFo.rst @@ -0,0 +1,7 @@ +regrtest now uses :func:`sys.unraisablehook` to mark a test as "environment +altered" (ENV_CHANGED) if it emits an "unraisable exception". Moreover, +regrtest logs a warning in this case. + +Use ``python3 -m test --fail-env-changed`` to catch unraisable exceptions in +tests. + From webhook-mailer at python.org Wed Jun 12 19:13:31 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Wed, 12 Jun 2019 23:13:31 -0000 Subject: [Python-checkins] =?utf-8?q?bpo-36779=3A_time=2Etzname_returns_e?= =?utf-8?q?mpty_string_on_Windows_if_default_cod=E2=80=A6_=28GH-13073=29?= Message-ID: https://github.com/python/cpython/commit/b4c7defe58695a6670a8fdeaef67a638bbb47e42 commit: b4c7defe58695a6670a8fdeaef67a638bbb47e42 branch: master author: Paul Monson committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-06-12T16:13:27-07:00 summary: bpo-36779: time.tzname returns empty string on Windows if default cod? (GH-13073) Calling setlocale(LC_CTYPE, "") on a system where GetACP() returns CP_UTF8 results in empty strings in _tzname[]. This causes time.tzname to be an empty string. I have reported the bug to the UCRT team and will follow up, but it will take some time get a fix into production. In the meantime one possible workaround is to temporarily change the locale by calling setlocale(LC_CTYPE, "C") before calling _tzset and restore the current locale after if the GetACP() == CP_UTF8 or CP_UTF7 @zooba https://bugs.python.org/issue36779 files: A Misc/NEWS.d/next/Windows/2019-06-11-15-41-34.bpo-36779.0TMw6f.rst M Modules/timemodule.c diff --git a/Misc/NEWS.d/next/Windows/2019-06-11-15-41-34.bpo-36779.0TMw6f.rst b/Misc/NEWS.d/next/Windows/2019-06-11-15-41-34.bpo-36779.0TMw6f.rst new file mode 100644 index 000000000000..618cfcae7b89 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2019-06-11-15-41-34.bpo-36779.0TMw6f.rst @@ -0,0 +1,2 @@ +Ensure ``time.tzname`` is correct on Windows when the active code page is +set to CP_UTF7 or CP_UTF8. diff --git a/Modules/timemodule.c b/Modules/timemodule.c index f991f31ee15e..bdc93a2b7ec1 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -1581,6 +1581,19 @@ init_timezone(PyObject *m) PyModule_AddIntConstant(m, "altzone", _Py_timezone-3600); #endif PyModule_AddIntConstant(m, "daylight", _Py_daylight); +#ifdef MS_WINDOWS + TIME_ZONE_INFORMATION tzinfo = {0}; + GetTimeZoneInformation(&tzinfo); + otz0 = PyUnicode_FromWideChar(tzinfo.StandardName, -1); + if (otz0 == NULL) { + return -1; + } + otz1 = PyUnicode_FromWideChar(tzinfo.DaylightName, -1); + if (otz1 == NULL) { + Py_DECREF(otz0); + return -1; + } +#else otz0 = PyUnicode_DecodeLocale(_Py_tzname[0], "surrogateescape"); if (otz0 == NULL) { return -1; @@ -1590,6 +1603,7 @@ init_timezone(PyObject *m) Py_DECREF(otz0); return -1; } +#endif // MS_WINDOWS PyObject *tzname_obj = Py_BuildValue("(NN)", otz0, otz1); if (tzname_obj == NULL) { return -1; From webhook-mailer at python.org Wed Jun 12 19:30:20 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Wed, 12 Jun 2019 23:30:20 -0000 Subject: [Python-checkins] bpo-36402: Fix threading._shutdown() race condition (GH-13948) Message-ID: https://github.com/python/cpython/commit/468e5fec8a2f534f1685d59da3ca4fad425c38dd commit: 468e5fec8a2f534f1685d59da3ca4fad425c38dd branch: master author: Victor Stinner committer: GitHub date: 2019-06-13T01:30:17+02:00 summary: bpo-36402: Fix threading._shutdown() race condition (GH-13948) Fix a race condition at Python shutdown when waiting for threads. Wait until the Python thread state of all non-daemon threads get deleted (join all non-daemon threads), rather than just wait until Python threads complete. * Add threading._shutdown_locks: set of Thread._tstate_lock locks of non-daemon threads used by _shutdown() to wait until all Python thread states get deleted. See Thread._set_tstate_lock(). * Add also threading._shutdown_locks_lock to protect access to threading._shutdown_locks. * Add test_finalization_shutdown() test. files: A Misc/NEWS.d/next/Library/2019-06-11-00-35-02.bpo-36402.b0IJVp.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 6ac4ea9623de..ad90010b8a38 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -583,6 +583,41 @@ def __del__(self): self.assertEqual(data.splitlines(), ["GC: True True True"] * 2) + def test_finalization_shutdown(self): + # bpo-36402: Py_Finalize() calls threading._shutdown() which must wait + # until Python thread states of all non-daemon threads get deleted. + # + # Test similar to SubinterpThreadingTests.test_threads_join_2(), but + # test the finalization of the main interpreter. + code = """if 1: + import os + import threading + import time + import random + + def random_sleep(): + seconds = random.random() * 0.010 + time.sleep(seconds) + + class Sleeper: + def __del__(self): + random_sleep() + + tls = threading.local() + + def f(): + # Sleep a bit so that the thread is still running when + # Py_Finalize() is called. + random_sleep() + tls.x = Sleeper() + random_sleep() + + threading.Thread(target=f).start() + random_sleep() + """ + rc, out, err = assert_python_ok("-c", code) + self.assertEqual(err, b"") + def test_tstate_lock(self): # Test an implementation detail of Thread objects. started = _thread.allocate_lock() @@ -878,15 +913,22 @@ def test_threads_join(self): self.addCleanup(os.close, w) code = r"""if 1: import os + import random import threading import time + def random_sleep(): + seconds = random.random() * 0.010 + time.sleep(seconds) + def f(): # Sleep a bit so that the thread is still running when # Py_EndInterpreter is called. - time.sleep(0.05) + random_sleep() os.write(%d, b"x") + threading.Thread(target=f).start() + random_sleep() """ % (w,) ret = test.support.run_in_subinterp(code) self.assertEqual(ret, 0) @@ -903,22 +945,29 @@ def test_threads_join_2(self): self.addCleanup(os.close, w) code = r"""if 1: import os + import random import threading import time + def random_sleep(): + seconds = random.random() * 0.010 + time.sleep(seconds) + class Sleeper: def __del__(self): - time.sleep(0.05) + random_sleep() tls = threading.local() def f(): # Sleep a bit so that the thread is still running when # Py_EndInterpreter is called. - time.sleep(0.05) + random_sleep() tls.x = Sleeper() os.write(%d, b"x") + threading.Thread(target=f).start() + random_sleep() """ % (w,) ret = test.support.run_in_subinterp(code) self.assertEqual(ret, 0) diff --git a/Lib/threading.py b/Lib/threading.py index 3d197eed6a72..67926403770e 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -739,6 +739,11 @@ def _newname(template="Thread-%d"): _active = {} # maps thread id to Thread object _limbo = {} _dangling = WeakSet() +# Set of Thread._tstate_lock locks of non-daemon threads used by _shutdown() +# to wait until all Python thread states get deleted: +# see Thread._set_tstate_lock(). +_shutdown_locks_lock = _allocate_lock() +_shutdown_locks = set() # Main class for threads @@ -903,6 +908,10 @@ def _set_tstate_lock(self): self._tstate_lock = _set_sentinel() self._tstate_lock.acquire() + if not self.daemon: + with _shutdown_locks_lock: + _shutdown_locks.add(self._tstate_lock) + def _bootstrap_inner(self): try: self._set_ident() @@ -954,6 +963,9 @@ def _stop(self): assert not lock.locked() self._is_stopped = True self._tstate_lock = None + if not self.daemon: + with _shutdown_locks_lock: + _shutdown_locks.discard(self._tstate_lock) def _delete(self): "Remove current thread from the dict of currently running threads." @@ -1342,6 +1354,9 @@ def enumerate(): _main_thread = _MainThread() def _shutdown(): + """ + Wait until the Python thread state of all non-daemon threads get deleted. + """ # Obscure: other threads may be waiting to join _main_thread. That's # dubious, but some code does it. We can't wait for C code to release # the main thread's tstate_lock - that won't happen until the interpreter @@ -1350,6 +1365,8 @@ def _shutdown(): if _main_thread._is_stopped: # _shutdown() was already called return + + # Main thread tlock = _main_thread._tstate_lock # The main thread isn't finished yet, so its thread state lock can't have # been released. @@ -1357,16 +1374,24 @@ def _shutdown(): assert tlock.locked() tlock.release() _main_thread._stop() - t = _pickSomeNonDaemonThread() - while t: - t.join() - t = _pickSomeNonDaemonThread() -def _pickSomeNonDaemonThread(): - for t in enumerate(): - if not t.daemon and t.is_alive(): - return t - return None + # Join all non-deamon threads + while True: + with _shutdown_locks_lock: + locks = list(_shutdown_locks) + _shutdown_locks.clear() + + if not locks: + break + + for lock in locks: + # mimick Thread.join() + lock.acquire() + lock.release() + + # new threads can be spawned while we were waiting for the other + # threads to complete + def main_thread(): """Return the main thread object. @@ -1392,12 +1417,18 @@ def _after_fork(): # Reset _active_limbo_lock, in case we forked while the lock was held # by another (non-forked) thread. http://bugs.python.org/issue874900 global _active_limbo_lock, _main_thread + global _shutdown_locks_lock, _shutdown_locks _active_limbo_lock = _allocate_lock() # fork() only copied the current thread; clear references to others. new_active = {} current = current_thread() _main_thread = current + + # reset _shutdown() locks: threads re-register their _tstate_lock below + _shutdown_locks_lock = _allocate_lock() + _shutdown_locks = set() + with _active_limbo_lock: # Dangling thread instances must still have their locks reset, # because someone may join() them. diff --git a/Misc/NEWS.d/next/Library/2019-06-11-00-35-02.bpo-36402.b0IJVp.rst b/Misc/NEWS.d/next/Library/2019-06-11-00-35-02.bpo-36402.b0IJVp.rst new file mode 100644 index 000000000000..3bc537e40ff6 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-11-00-35-02.bpo-36402.b0IJVp.rst @@ -0,0 +1,4 @@ +Fix a race condition at Python shutdown when waiting for threads. Wait until +the Python thread state of all non-daemon threads get deleted (join all +non-daemon threads), rather than just wait until non-daemon Python threads +complete. From webhook-mailer at python.org Wed Jun 12 20:01:34 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 13 Jun 2019 00:01:34 -0000 Subject: [Python-checkins] bpo-37253: Document PyCompilerFlags.cf_feature_version (GH-14019) Message-ID: https://github.com/python/cpython/commit/2c9b498759f4fc74da82a0a96d059d666fa73f16 commit: 2c9b498759f4fc74da82a0a96d059d666fa73f16 branch: master author: Victor Stinner committer: GitHub date: 2019-06-13T02:01:29+02:00 summary: bpo-37253: Document PyCompilerFlags.cf_feature_version (GH-14019) * Update PyCompilerFlags structure documentation. * Document the new cf_feature_version field in the Changes in the C API section of the What's New in Python 3.8 doc. files: M Doc/c-api/veryhigh.rst M Doc/whatsnew/3.8.rst diff --git a/Doc/c-api/veryhigh.rst b/Doc/c-api/veryhigh.rst index 3fe0ae47aac3..835afcb4f217 100644 --- a/Doc/c-api/veryhigh.rst +++ b/Doc/c-api/veryhigh.rst @@ -388,11 +388,22 @@ the same library that the Python runtime is using. Whenever ``PyCompilerFlags *flags`` is *NULL*, :attr:`cf_flags` is treated as equal to ``0``, and any modification due to ``from __future__ import`` is - discarded. :: + discarded. - struct PyCompilerFlags { - int cf_flags; - } + .. c:member:: int cf_flags + + Compiler flags. + + .. c:member:: int cf_feature_version; + + *cf_feature_version* is the minor Python version. It should be + initialized to ``PY_MINOR_VERSION``. + + The field is ignored by default, it is used if and only if + ``PyCF_ONLY_AST`` flag is set in *cf_flags*. + + .. versionchanged:: 3.8 + Added *cf_feature_version* field. .. c:var:: int CO_FUTURE_DIVISION diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 264586434b9b..3e607130743d 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -1312,6 +1312,11 @@ Changes in the Python API Changes in the C API -------------------- +* The :c:type:`PyCompilerFlags` structure gets a new *cf_feature_version* + field. It should be initialized to ``PY_MINOR_VERSION``. The field is ignored + by default, it is used if and only if ``PyCF_ONLY_AST`` flag is set in + *cf_flags*. + * The :c:func:`PyEval_ReInitThreads` function has been removed from the C API. It should not be called explicitly: use :c:func:`PyOS_AfterFork_Child` instead. From webhook-mailer at python.org Wed Jun 12 20:16:45 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 13 Jun 2019 00:16:45 -0000 Subject: [Python-checkins] bpo-37253: Add _PyCompilerFlags_INIT macro (GH-14018) Message-ID: https://github.com/python/cpython/commit/37d66d7d4bc7dbac9809d69966a774ebb32563be commit: 37d66d7d4bc7dbac9809d69966a774ebb32563be branch: master author: Victor Stinner committer: GitHub date: 2019-06-13T02:16:41+02:00 summary: bpo-37253: Add _PyCompilerFlags_INIT macro (GH-14018) Add a new _PyCompilerFlags_INIT macro to initialize PyCompilerFlags variables, rather than initializing cf_flags and cf_feature_version explicitly in each variable. files: M Include/compile.h M Modules/main.c M Modules/parsermodule.c M Modules/symtablemodule.c M Python/ast.c M Python/bltinmodule.c M Python/compile.c M Python/pythonrun.c diff --git a/Include/compile.h b/Include/compile.h index a833caa06b9d..1cda955c1425 100644 --- a/Include/compile.h +++ b/Include/compile.h @@ -30,6 +30,9 @@ typedef struct { int cf_flags; /* bitmask of CO_xxx flags relevant to future */ int cf_feature_version; /* minor Python version (PyCF_ONLY_AST) */ } PyCompilerFlags; + +#define _PyCompilerFlags_INIT \ + (PyCompilerFlags){.cf_flags = 0, .cf_feature_version = PY_MINOR_VERSION} #endif /* Future feature support */ diff --git a/Modules/main.c b/Modules/main.c index 6b9406f78666..853afedd7b90 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -524,7 +524,7 @@ pymain_run_python(int *exitcode) } } - PyCompilerFlags cf = {.cf_flags = 0, .cf_feature_version = PY_MINOR_VERSION}; + PyCompilerFlags cf = _PyCompilerFlags_INIT; pymain_header(config); pymain_import_readline(config); diff --git a/Modules/parsermodule.c b/Modules/parsermodule.c index 36f921419153..079d00f32aa6 100644 --- a/Modules/parsermodule.c +++ b/Modules/parsermodule.c @@ -336,8 +336,7 @@ parser_newstobject(node *st, int type) if (o != 0) { o->st_node = st; o->st_type = type; - o->st_flags.cf_flags = 0; - o->st_flags.cf_feature_version = PY_MINOR_VERSION; + o->st_flags = _PyCompilerFlags_INIT; } else { PyNode_Free(st); diff --git a/Modules/symtablemodule.c b/Modules/symtablemodule.c index d66cb44f69bd..9180f185e1e8 100644 --- a/Modules/symtablemodule.c +++ b/Modules/symtablemodule.c @@ -30,11 +30,10 @@ _symtable_symtable_impl(PyObject *module, PyObject *source, struct symtable *st; PyObject *t; int start; - PyCompilerFlags cf; + PyCompilerFlags cf = _PyCompilerFlags_INIT; PyObject *source_copy = NULL; cf.cf_flags = PyCF_SOURCE_IS_UTF8; - cf.cf_feature_version = PY_MINOR_VERSION; const char *str = _Py_SourceAsString(source, "symtable", "string or bytes", &cf, &source_copy); if (str == NULL) { diff --git a/Python/ast.c b/Python/ast.c index df9242977e3f..2a5941572148 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -4845,7 +4845,6 @@ fstring_compile_expr(const char *expr_start, const char *expr_end, struct compiling *c, const node *n) { - PyCompilerFlags cf; node *mod_n; mod_ty mod; char *str; @@ -4887,8 +4886,8 @@ fstring_compile_expr(const char *expr_start, const char *expr_end, str[len+1] = ')'; str[len+2] = 0; + PyCompilerFlags cf = _PyCompilerFlags_INIT; cf.cf_flags = PyCF_ONLY_AST; - cf.cf_feature_version = PY_MINOR_VERSION; mod_n = PyParser_SimpleParseStringFlagsFilename(str, "", Py_eval_input, 0); if (!mod_n) { diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index abf807a408f7..c3e30593475d 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -723,12 +723,11 @@ builtin_compile_impl(PyObject *module, PyObject *source, PyObject *filename, const char *str; int compile_mode = -1; int is_ast; - PyCompilerFlags cf; int start[] = {Py_file_input, Py_eval_input, Py_single_input, Py_func_type_input}; PyObject *result; + PyCompilerFlags cf = _PyCompilerFlags_INIT; cf.cf_flags = flags | PyCF_SOURCE_IS_UTF8; - cf.cf_feature_version = PY_MINOR_VERSION; if (feature_version >= 0 && (flags & PyCF_ONLY_AST)) { cf.cf_feature_version = feature_version; } @@ -889,7 +888,6 @@ builtin_eval_impl(PyObject *module, PyObject *source, PyObject *globals, { PyObject *result, *source_copy; const char *str; - PyCompilerFlags cf; if (locals != Py_None && !PyMapping_Check(locals)) { PyErr_SetString(PyExc_TypeError, "locals must be a mapping"); @@ -941,8 +939,8 @@ builtin_eval_impl(PyObject *module, PyObject *source, PyObject *globals, return PyEval_EvalCode(source, globals, locals); } + PyCompilerFlags cf = _PyCompilerFlags_INIT; cf.cf_flags = PyCF_SOURCE_IS_UTF8; - cf.cf_feature_version = PY_MINOR_VERSION; str = _Py_SourceAsString(source, "eval", "string, bytes or code", &cf, &source_copy); if (str == NULL) return NULL; @@ -1032,9 +1030,8 @@ builtin_exec_impl(PyObject *module, PyObject *source, PyObject *globals, else { PyObject *source_copy; const char *str; - PyCompilerFlags cf; + PyCompilerFlags cf = _PyCompilerFlags_INIT; cf.cf_flags = PyCF_SOURCE_IS_UTF8; - cf.cf_feature_version = PY_MINOR_VERSION; str = _Py_SourceAsString(source, "exec", "string, bytes or code", &cf, &source_copy); diff --git a/Python/compile.c b/Python/compile.c index 9e4a2094ac9b..4d3ecfe5d6fc 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -309,7 +309,7 @@ PyAST_CompileObject(mod_ty mod, PyObject *filename, PyCompilerFlags *flags, { struct compiler c; PyCodeObject *co = NULL; - PyCompilerFlags local_flags; + PyCompilerFlags local_flags = _PyCompilerFlags_INIT; int merged; PyConfig *config = &_PyInterpreterState_GET_UNSAFE()->config; @@ -332,8 +332,6 @@ PyAST_CompileObject(mod_ty mod, PyObject *filename, PyCompilerFlags *flags, if (c.c_future == NULL) goto finally; if (!flags) { - local_flags.cf_flags = 0; - local_flags.cf_feature_version = PY_MINOR_VERSION; flags = &local_flags; } merged = c.c_future->ff_features | flags->cf_flags; diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 784c15bb4b22..8f3ee19279d9 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -91,7 +91,7 @@ PyRun_InteractiveLoopFlags(FILE *fp, const char *filename_str, PyCompilerFlags * { PyObject *filename, *v; int ret, err; - PyCompilerFlags local_flags; + PyCompilerFlags local_flags = _PyCompilerFlags_INIT; int nomem_count = 0; #ifdef Py_REF_DEBUG int show_ref_count = _PyInterpreterState_Get()->config.show_ref_count; @@ -105,8 +105,6 @@ PyRun_InteractiveLoopFlags(FILE *fp, const char *filename_str, PyCompilerFlags * if (flags == NULL) { flags = &local_flags; - local_flags.cf_flags = 0; - local_flags.cf_feature_version = PY_MINOR_VERSION; } v = _PySys_GetObjectId(&PyId_ps1); if (v == NULL) { @@ -1283,10 +1281,7 @@ _Py_SourceAsString(PyObject *cmd, const char *funcname, const char *what, PyComp struct symtable * Py_SymtableStringObject(const char *str, PyObject *filename, int start) { - PyCompilerFlags flags; - - flags.cf_flags = 0; - flags.cf_feature_version = PY_MINOR_VERSION; + PyCompilerFlags flags = _PyCompilerFlags_INIT; return _Py_SymtableStringObjectFlags(str, filename, start, &flags); } @@ -1331,7 +1326,7 @@ PyParser_ASTFromStringObject(const char *s, PyObject *filename, int start, PyCompilerFlags *flags, PyArena *arena) { mod_ty mod; - PyCompilerFlags localflags; + PyCompilerFlags localflags = _PyCompilerFlags_INIT; perrdetail err; int iflags = PARSER_FLAGS(flags); if (flags && flags->cf_feature_version < 7) @@ -1341,8 +1336,6 @@ PyParser_ASTFromStringObject(const char *s, PyObject *filename, int start, &_PyParser_Grammar, start, &err, &iflags); if (flags == NULL) { - localflags.cf_flags = 0; - localflags.cf_feature_version = PY_MINOR_VERSION; flags = &localflags; } if (n) { @@ -1379,7 +1372,7 @@ PyParser_ASTFromFileObject(FILE *fp, PyObject *filename, const char* enc, PyArena *arena) { mod_ty mod; - PyCompilerFlags localflags; + PyCompilerFlags localflags = _PyCompilerFlags_INIT; perrdetail err; int iflags = PARSER_FLAGS(flags); @@ -1387,8 +1380,6 @@ PyParser_ASTFromFileObject(FILE *fp, PyObject *filename, const char* enc, &_PyParser_Grammar, start, ps1, ps2, &err, &iflags); if (flags == NULL) { - localflags.cf_flags = 0; - localflags.cf_feature_version = PY_MINOR_VERSION; flags = &localflags; } if (n) { From webhook-mailer at python.org Wed Jun 12 20:17:17 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 13 Jun 2019 00:17:17 -0000 Subject: [Python-checkins] bpo-37253: Fix typo in PyCompilerFlags doc (GH-14036) Message-ID: https://github.com/python/cpython/commit/a04ea4f92ccbe20ffdbb5fa9b6bb93ee8da50f5d commit: a04ea4f92ccbe20ffdbb5fa9b6bb93ee8da50f5d branch: master author: Victor Stinner committer: GitHub date: 2019-06-13T02:17:14+02:00 summary: bpo-37253: Fix typo in PyCompilerFlags doc (GH-14036) Remove ";" to fix Sphinx formatting. files: M Doc/c-api/veryhigh.rst diff --git a/Doc/c-api/veryhigh.rst b/Doc/c-api/veryhigh.rst index 835afcb4f217..e6704ddeca09 100644 --- a/Doc/c-api/veryhigh.rst +++ b/Doc/c-api/veryhigh.rst @@ -394,7 +394,7 @@ the same library that the Python runtime is using. Compiler flags. - .. c:member:: int cf_feature_version; + .. c:member:: int cf_feature_version *cf_feature_version* is the minor Python version. It should be initialized to ``PY_MINOR_VERSION``. From webhook-mailer at python.org Wed Jun 12 20:36:06 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 13 Jun 2019 00:36:06 -0000 Subject: [Python-checkins] bpo-37253: Add _PyCompilerFlags_INIT macro (GH-14018) Message-ID: https://github.com/python/cpython/commit/92e836c7dcaf74f7b8617250414224d24d1eb1f2 commit: 92e836c7dcaf74f7b8617250414224d24d1eb1f2 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-12T17:36:03-07:00 summary: bpo-37253: Add _PyCompilerFlags_INIT macro (GH-14018) Add a new _PyCompilerFlags_INIT macro to initialize PyCompilerFlags variables, rather than initializing cf_flags and cf_feature_version explicitly in each variable. (cherry picked from commit 37d66d7d4bc7dbac9809d69966a774ebb32563be) Co-authored-by: Victor Stinner files: M Include/compile.h M Modules/main.c M Modules/parsermodule.c M Modules/symtablemodule.c M Python/ast.c M Python/bltinmodule.c M Python/compile.c M Python/pythonrun.c diff --git a/Include/compile.h b/Include/compile.h index a833caa06b9d..1cda955c1425 100644 --- a/Include/compile.h +++ b/Include/compile.h @@ -30,6 +30,9 @@ typedef struct { int cf_flags; /* bitmask of CO_xxx flags relevant to future */ int cf_feature_version; /* minor Python version (PyCF_ONLY_AST) */ } PyCompilerFlags; + +#define _PyCompilerFlags_INIT \ + (PyCompilerFlags){.cf_flags = 0, .cf_feature_version = PY_MINOR_VERSION} #endif /* Future feature support */ diff --git a/Modules/main.c b/Modules/main.c index 6b9406f78666..853afedd7b90 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -524,7 +524,7 @@ pymain_run_python(int *exitcode) } } - PyCompilerFlags cf = {.cf_flags = 0, .cf_feature_version = PY_MINOR_VERSION}; + PyCompilerFlags cf = _PyCompilerFlags_INIT; pymain_header(config); pymain_import_readline(config); diff --git a/Modules/parsermodule.c b/Modules/parsermodule.c index 36f921419153..079d00f32aa6 100644 --- a/Modules/parsermodule.c +++ b/Modules/parsermodule.c @@ -336,8 +336,7 @@ parser_newstobject(node *st, int type) if (o != 0) { o->st_node = st; o->st_type = type; - o->st_flags.cf_flags = 0; - o->st_flags.cf_feature_version = PY_MINOR_VERSION; + o->st_flags = _PyCompilerFlags_INIT; } else { PyNode_Free(st); diff --git a/Modules/symtablemodule.c b/Modules/symtablemodule.c index d66cb44f69bd..9180f185e1e8 100644 --- a/Modules/symtablemodule.c +++ b/Modules/symtablemodule.c @@ -30,11 +30,10 @@ _symtable_symtable_impl(PyObject *module, PyObject *source, struct symtable *st; PyObject *t; int start; - PyCompilerFlags cf; + PyCompilerFlags cf = _PyCompilerFlags_INIT; PyObject *source_copy = NULL; cf.cf_flags = PyCF_SOURCE_IS_UTF8; - cf.cf_feature_version = PY_MINOR_VERSION; const char *str = _Py_SourceAsString(source, "symtable", "string or bytes", &cf, &source_copy); if (str == NULL) { diff --git a/Python/ast.c b/Python/ast.c index df9242977e3f..2a5941572148 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -4845,7 +4845,6 @@ fstring_compile_expr(const char *expr_start, const char *expr_end, struct compiling *c, const node *n) { - PyCompilerFlags cf; node *mod_n; mod_ty mod; char *str; @@ -4887,8 +4886,8 @@ fstring_compile_expr(const char *expr_start, const char *expr_end, str[len+1] = ')'; str[len+2] = 0; + PyCompilerFlags cf = _PyCompilerFlags_INIT; cf.cf_flags = PyCF_ONLY_AST; - cf.cf_feature_version = PY_MINOR_VERSION; mod_n = PyParser_SimpleParseStringFlagsFilename(str, "", Py_eval_input, 0); if (!mod_n) { diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index abf807a408f7..c3e30593475d 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -723,12 +723,11 @@ builtin_compile_impl(PyObject *module, PyObject *source, PyObject *filename, const char *str; int compile_mode = -1; int is_ast; - PyCompilerFlags cf; int start[] = {Py_file_input, Py_eval_input, Py_single_input, Py_func_type_input}; PyObject *result; + PyCompilerFlags cf = _PyCompilerFlags_INIT; cf.cf_flags = flags | PyCF_SOURCE_IS_UTF8; - cf.cf_feature_version = PY_MINOR_VERSION; if (feature_version >= 0 && (flags & PyCF_ONLY_AST)) { cf.cf_feature_version = feature_version; } @@ -889,7 +888,6 @@ builtin_eval_impl(PyObject *module, PyObject *source, PyObject *globals, { PyObject *result, *source_copy; const char *str; - PyCompilerFlags cf; if (locals != Py_None && !PyMapping_Check(locals)) { PyErr_SetString(PyExc_TypeError, "locals must be a mapping"); @@ -941,8 +939,8 @@ builtin_eval_impl(PyObject *module, PyObject *source, PyObject *globals, return PyEval_EvalCode(source, globals, locals); } + PyCompilerFlags cf = _PyCompilerFlags_INIT; cf.cf_flags = PyCF_SOURCE_IS_UTF8; - cf.cf_feature_version = PY_MINOR_VERSION; str = _Py_SourceAsString(source, "eval", "string, bytes or code", &cf, &source_copy); if (str == NULL) return NULL; @@ -1032,9 +1030,8 @@ builtin_exec_impl(PyObject *module, PyObject *source, PyObject *globals, else { PyObject *source_copy; const char *str; - PyCompilerFlags cf; + PyCompilerFlags cf = _PyCompilerFlags_INIT; cf.cf_flags = PyCF_SOURCE_IS_UTF8; - cf.cf_feature_version = PY_MINOR_VERSION; str = _Py_SourceAsString(source, "exec", "string, bytes or code", &cf, &source_copy); diff --git a/Python/compile.c b/Python/compile.c index 9e4a2094ac9b..4d3ecfe5d6fc 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -309,7 +309,7 @@ PyAST_CompileObject(mod_ty mod, PyObject *filename, PyCompilerFlags *flags, { struct compiler c; PyCodeObject *co = NULL; - PyCompilerFlags local_flags; + PyCompilerFlags local_flags = _PyCompilerFlags_INIT; int merged; PyConfig *config = &_PyInterpreterState_GET_UNSAFE()->config; @@ -332,8 +332,6 @@ PyAST_CompileObject(mod_ty mod, PyObject *filename, PyCompilerFlags *flags, if (c.c_future == NULL) goto finally; if (!flags) { - local_flags.cf_flags = 0; - local_flags.cf_feature_version = PY_MINOR_VERSION; flags = &local_flags; } merged = c.c_future->ff_features | flags->cf_flags; diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 784c15bb4b22..8f3ee19279d9 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -91,7 +91,7 @@ PyRun_InteractiveLoopFlags(FILE *fp, const char *filename_str, PyCompilerFlags * { PyObject *filename, *v; int ret, err; - PyCompilerFlags local_flags; + PyCompilerFlags local_flags = _PyCompilerFlags_INIT; int nomem_count = 0; #ifdef Py_REF_DEBUG int show_ref_count = _PyInterpreterState_Get()->config.show_ref_count; @@ -105,8 +105,6 @@ PyRun_InteractiveLoopFlags(FILE *fp, const char *filename_str, PyCompilerFlags * if (flags == NULL) { flags = &local_flags; - local_flags.cf_flags = 0; - local_flags.cf_feature_version = PY_MINOR_VERSION; } v = _PySys_GetObjectId(&PyId_ps1); if (v == NULL) { @@ -1283,10 +1281,7 @@ _Py_SourceAsString(PyObject *cmd, const char *funcname, const char *what, PyComp struct symtable * Py_SymtableStringObject(const char *str, PyObject *filename, int start) { - PyCompilerFlags flags; - - flags.cf_flags = 0; - flags.cf_feature_version = PY_MINOR_VERSION; + PyCompilerFlags flags = _PyCompilerFlags_INIT; return _Py_SymtableStringObjectFlags(str, filename, start, &flags); } @@ -1331,7 +1326,7 @@ PyParser_ASTFromStringObject(const char *s, PyObject *filename, int start, PyCompilerFlags *flags, PyArena *arena) { mod_ty mod; - PyCompilerFlags localflags; + PyCompilerFlags localflags = _PyCompilerFlags_INIT; perrdetail err; int iflags = PARSER_FLAGS(flags); if (flags && flags->cf_feature_version < 7) @@ -1341,8 +1336,6 @@ PyParser_ASTFromStringObject(const char *s, PyObject *filename, int start, &_PyParser_Grammar, start, &err, &iflags); if (flags == NULL) { - localflags.cf_flags = 0; - localflags.cf_feature_version = PY_MINOR_VERSION; flags = &localflags; } if (n) { @@ -1379,7 +1372,7 @@ PyParser_ASTFromFileObject(FILE *fp, PyObject *filename, const char* enc, PyArena *arena) { mod_ty mod; - PyCompilerFlags localflags; + PyCompilerFlags localflags = _PyCompilerFlags_INIT; perrdetail err; int iflags = PARSER_FLAGS(flags); @@ -1387,8 +1380,6 @@ PyParser_ASTFromFileObject(FILE *fp, PyObject *filename, const char* enc, &_PyParser_Grammar, start, ps1, ps2, &err, &iflags); if (flags == NULL) { - localflags.cf_flags = 0; - localflags.cf_feature_version = PY_MINOR_VERSION; flags = &localflags; } if (n) { From webhook-mailer at python.org Wed Jun 12 20:40:45 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 13 Jun 2019 00:40:45 -0000 Subject: [Python-checkins] [3.8] bpo-37253: Document PyCompilerFlags.cf_feature_version (GH-14019) (GH-14038) Message-ID: https://github.com/python/cpython/commit/f9445a391e6a91103fbe88bff4d3adc07f526c73 commit: f9445a391e6a91103fbe88bff4d3adc07f526c73 branch: 3.8 author: Victor Stinner committer: GitHub date: 2019-06-13T02:40:41+02:00 summary: [3.8] bpo-37253: Document PyCompilerFlags.cf_feature_version (GH-14019) (GH-14038) * Update PyCompilerFlags structure documentation. * Document the new cf_feature_version field in the Changes in the C API section of the What's New in Python 3.8 doc. (cherry picked from commit 2c9b498759f4fc74da82a0a96d059d666fa73f16) files: M Doc/c-api/veryhigh.rst M Doc/whatsnew/3.8.rst diff --git a/Doc/c-api/veryhigh.rst b/Doc/c-api/veryhigh.rst index 3fe0ae47aac3..e6704ddeca09 100644 --- a/Doc/c-api/veryhigh.rst +++ b/Doc/c-api/veryhigh.rst @@ -388,11 +388,22 @@ the same library that the Python runtime is using. Whenever ``PyCompilerFlags *flags`` is *NULL*, :attr:`cf_flags` is treated as equal to ``0``, and any modification due to ``from __future__ import`` is - discarded. :: + discarded. - struct PyCompilerFlags { - int cf_flags; - } + .. c:member:: int cf_flags + + Compiler flags. + + .. c:member:: int cf_feature_version + + *cf_feature_version* is the minor Python version. It should be + initialized to ``PY_MINOR_VERSION``. + + The field is ignored by default, it is used if and only if + ``PyCF_ONLY_AST`` flag is set in *cf_flags*. + + .. versionchanged:: 3.8 + Added *cf_feature_version* field. .. c:var:: int CO_FUTURE_DIVISION diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 7e5d2f1f2d02..9989a0917434 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -1293,6 +1293,11 @@ Changes in the Python API Changes in the C API -------------------- +* The :c:type:`PyCompilerFlags` structure gets a new *cf_feature_version* + field. It should be initialized to ``PY_MINOR_VERSION``. The field is ignored + by default, it is used if and only if ``PyCF_ONLY_AST`` flag is set in + *cf_flags*. + * The :c:func:`PyEval_ReInitThreads` function has been removed from the C API. It should not be called explicitly: use :c:func:`PyOS_AfterFork_Child` instead. From webhook-mailer at python.org Wed Jun 12 23:31:48 2019 From: webhook-mailer at python.org (Ned Deily) Date: Thu, 13 Jun 2019 03:31:48 -0000 Subject: [Python-checkins] Add 3.9 whatsnew file (GH-14040) Message-ID: https://github.com/python/cpython/commit/3a2883c313be3aff34c61a42e586f8507ba5945f commit: 3a2883c313be3aff34c61a42e586f8507ba5945f branch: master author: Ned Deily committer: GitHub date: 2019-06-12T23:31:45-04:00 summary: Add 3.9 whatsnew file (GH-14040) files: A Doc/whatsnew/3.9.rst M Doc/whatsnew/index.rst diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst new file mode 100644 index 000000000000..999519f0ce07 --- /dev/null +++ b/Doc/whatsnew/3.9.rst @@ -0,0 +1,115 @@ +**************************** + What's New In Python 3.9 +**************************** + +:Release: |release| +:Date: |today| + +.. Rules for maintenance: + + * Anyone can add text to this document. Do not spend very much time + on the wording of your changes, because your text will probably + get rewritten to some degree. + + * The maintainer will go through Misc/NEWS periodically and add + changes; it's therefore more important to add your changes to + Misc/NEWS than to this file. + + * This is not a complete list of every single change; completeness + is the purpose of Misc/NEWS. Some changes I consider too small + or esoteric to include. If such a change is added to the text, + I'll just remove it. (This is another reason you shouldn't spend + too much time on writing your addition.) + + * If you want to draw your new text to the attention of the + maintainer, add 'XXX' to the beginning of the paragraph or + section. + + * It's OK to just add a fragmentary note about a change. For + example: "XXX Describe the transmogrify() function added to the + socket module." The maintainer will research the change and + write the necessary text. + + * You can comment out your additions if you like, but it's not + necessary (especially when a final release is some months away). + + * Credit the author of a patch or bugfix. Just the name is + sufficient; the e-mail address isn't necessary. + + * It's helpful to add the bug/patch number as a comment: + + XXX Describe the transmogrify() function added to the socket + module. + (Contributed by P.Y. Developer in :issue:`12345`.) + + This saves the maintainer the effort of going through the Mercurial log + when researching a change. + +This article explains the new features in Python 3.9, compared to 3.8. + +For full details, see the :source:`Misc/NEWS` file. + +.. note:: + + Prerelease users should be aware that this document is currently in draft + form. It will be updated substantially as Python 3.9 moves towards release, + so it's worth checking back even after reading earlier versions. + + +Summary -- Release highlights +============================= + +.. This section singles out the most important changes in Python 3.9. + Brevity is key. + + +.. PEP-sized items next. + + + +New Features +============ + + + +Other Language Changes +====================== + + + +New Modules +=========== + +* None yet. + + +Improved Modules +================ + + +Optimizations +============= + + +Build and C API Changes +======================= + + + +Deprecated +========== + + + +Removed +======= + + + +Porting to Python 3.9 +===================== + +This section lists previously described changes and other bugfixes +that may require changes to your code. + + diff --git a/Doc/whatsnew/index.rst b/Doc/whatsnew/index.rst index b1160c039821..954e38bc6f1e 100644 --- a/Doc/whatsnew/index.rst +++ b/Doc/whatsnew/index.rst @@ -11,6 +11,7 @@ anyone wishing to stay up-to-date after a new release. .. toctree:: :maxdepth: 2 + 3.9.rst 3.8.rst 3.7.rst 3.6.rst From webhook-mailer at python.org Wed Jun 12 23:41:19 2019 From: webhook-mailer at python.org (Tim Peters) Date: Thu, 13 Jun 2019 03:41:19 -0000 Subject: [Python-checkins] bpo-37257: obmalloc: stop simple arena thrashing (#14039) Message-ID: https://github.com/python/cpython/commit/d1c85a27ea9fe70163cad3443d5e534d94f08284 commit: d1c85a27ea9fe70163cad3443d5e534d94f08284 branch: master author: Tim Peters committer: GitHub date: 2019-06-12T22:41:03-05:00 summary: bpo-37257: obmalloc: stop simple arena thrashing (#14039) GH-14039: allow (no more than) one wholly empty arena on the usable_arenas list. This prevents thrashing in some easily-provoked simple cases that could end up creating and destroying an arena on each loop iteration in client code. Intuitively, if the only arena on the list becomes empty, it makes scant sense to give it back to the system unless we know we'll never need another free pool again before another arena frees a pool. If the latter obtains, then - yes - this will "waste" an arena. files: A Misc/NEWS.d/next/Core and Builtins/2019-06-13-02-27-12.bpo-37257.IMxDvT.rst M Objects/obmalloc.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-06-13-02-27-12.bpo-37257.IMxDvT.rst b/Misc/NEWS.d/next/Core and Builtins/2019-06-13-02-27-12.bpo-37257.IMxDvT.rst new file mode 100644 index 000000000000..ac8d90fd2998 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-06-13-02-27-12.bpo-37257.IMxDvT.rst @@ -0,0 +1 @@ +Python's small object allocator (``obmalloc.c``) now allows (no more than) one empty arena to remain available for immediate reuse, without returning it to the OS. This prevents thrashing in simple loops where an arena could be created and destroyed anew on each iteration. \ No newline at end of file diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c index fc7bef619946..622da3ad08fc 100644 --- a/Objects/obmalloc.c +++ b/Objects/obmalloc.c @@ -1758,7 +1758,12 @@ pymalloc_free(void *ctx, void *p) /* All the rest is arena management. We just freed * a pool, and there are 4 cases for arena mgmt: * 1. If all the pools are free, return the arena to - * the system free(). + * the system free(). Except if this is the last + * arena in the list, keep it to avoid thrashing: + * keeping one wholly free arena in the list avoids + * pathological cases where a simple loop would + * otherwise provoke needing to allocate and free an + * arena on every iteration. See bpo-37257. * 2. If this is the only free pool in the arena, * add the arena back to the `usable_arenas` list. * 3. If the "next" arena has a smaller count of free @@ -1767,7 +1772,7 @@ pymalloc_free(void *ctx, void *p) * nfreepools. * 4. Else there's nothing more to do. */ - if (nf == ao->ntotalpools) { + if (nf == ao->ntotalpools && ao->nextarena != NULL) { /* Case 1. First unlink ao from usable_arenas. */ assert(ao->prevarena == NULL || From webhook-mailer at python.org Thu Jun 13 00:35:26 2019 From: webhook-mailer at python.org (Ned Deily) Date: Thu, 13 Jun 2019 04:35:26 -0000 Subject: [Python-checkins] [3.6] Doc fix: duplicate object description of email.message (GH-13742) (GH-14041) Message-ID: https://github.com/python/cpython/commit/1af68a65194a26d959161df33fc25ade7f812009 commit: 1af68a65194a26d959161df33fc25ade7f812009 branch: 3.6 author: Ned Deily committer: GitHub date: 2019-06-13T00:35:19-04:00 summary: [3.6] Doc fix: duplicate object description of email.message (GH-13742) (GH-14041) files: M Doc/library/email.compat32-message.rst diff --git a/Doc/library/email.compat32-message.rst b/Doc/library/email.compat32-message.rst index ed380151769a..8d1c2f5daffb 100644 --- a/Doc/library/email.compat32-message.rst +++ b/Doc/library/email.compat32-message.rst @@ -6,6 +6,7 @@ .. module:: email.message :synopsis: The base class representing email messages in a fashion backward compatible with python3.2 + :noindex: The :class:`Message` class is very similar to the From webhook-mailer at python.org Thu Jun 13 01:04:20 2019 From: webhook-mailer at python.org (Ned Deily) Date: Thu, 13 Jun 2019 05:04:20 -0000 Subject: [Python-checkins] bpo-37216: update version to 3.9 in mac using document (GH-13966) Message-ID: https://github.com/python/cpython/commit/905e19a9bf9afd6439ea44fc6a4f3c8631750d6d commit: 905e19a9bf9afd6439ea44fc6a4f3c8631750d6d branch: master author: Makdon committer: Ned Deily date: 2019-06-13T01:04:13-04:00 summary: bpo-37216: update version to 3.9 in mac using document (GH-13966) files: M Doc/using/mac.rst diff --git a/Doc/using/mac.rst b/Doc/using/mac.rst index bc022fa58c04..baf737ddaa91 100644 --- a/Doc/using/mac.rst +++ b/Doc/using/mac.rst @@ -25,7 +25,7 @@ there. What you get after installing is a number of things: -* A :file:`MacPython 3.6` folder in your :file:`Applications` folder. In here +* A :file:`Python 3.9` folder in your :file:`Applications` folder. In here you find IDLE, the development environment that is a standard part of official Python distributions; PythonLauncher, which handles double-clicking Python scripts from the Finder; and the "Build Applet" tool, which allows you to @@ -93,7 +93,7 @@ aware of: programs that talk to the Aqua window manager (in other words, anything that has a GUI) need to be run in a special way. Use :program:`pythonw` instead of :program:`python` to start such scripts. -With Python 3.6, you can use either :program:`python` or :program:`pythonw`. +With Python 3.9, you can use either :program:`python` or :program:`pythonw`. Configuration From webhook-mailer at python.org Thu Jun 13 03:01:36 2019 From: webhook-mailer at python.org (Ned Deily) Date: Thu, 13 Jun 2019 07:01:36 -0000 Subject: [Python-checkins] bpo-35070: test_getgrouplist may fail on macOS if too many groups (GH-13071) Message-ID: https://github.com/python/cpython/commit/8725c83ed5ca8959195ad8326db99d564a921749 commit: 8725c83ed5ca8959195ad8326db99d564a921749 branch: master author: Jeffrey Kintscher <49998481+websurfer5 at users.noreply.github.com> committer: Ned Deily date: 2019-06-13T03:01:29-04:00 summary: bpo-35070: test_getgrouplist may fail on macOS if too many groups (GH-13071) files: A Misc/NEWS.d/next/Library/2019-05-09-18-50-55.bpo-35070.4vaqNL.rst M Modules/posixmodule.c diff --git a/Misc/NEWS.d/next/Library/2019-05-09-18-50-55.bpo-35070.4vaqNL.rst b/Misc/NEWS.d/next/Library/2019-05-09-18-50-55.bpo-35070.4vaqNL.rst new file mode 100644 index 000000000000..e823f1d469cc --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-09-18-50-55.bpo-35070.4vaqNL.rst @@ -0,0 +1,2 @@ +posix.getgrouplist() now works correctly when the user belongs to +NGROUPS_MAX supplemental groups. Patch by Jeffrey Kintscher. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 8f6cffffcdfb..7a471801db39 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -6722,6 +6722,13 @@ os_getpid_impl(PyObject *module) } #endif /* HAVE_GETPID */ +#ifdef NGROUPS_MAX +#define MAX_GROUPS NGROUPS_MAX +#else + /* defined to be 16 on Solaris7, so this should be a small number */ +#define MAX_GROUPS 64 +#endif + #ifdef HAVE_GETGROUPLIST /* AC 3.5: funny apple logic below */ @@ -6734,13 +6741,6 @@ Returns a list of groups to which a user belongs.\n\n\ static PyObject * posix_getgrouplist(PyObject *self, PyObject *args) { -#ifdef NGROUPS_MAX -#define MAX_GROUPS NGROUPS_MAX -#else - /* defined to be 16 on Solaris7, so this should be a small number */ -#define MAX_GROUPS 64 -#endif - const char *user; int i, ngroups; PyObject *list; @@ -6749,7 +6749,16 @@ posix_getgrouplist(PyObject *self, PyObject *args) #else gid_t *groups, basegid; #endif - ngroups = MAX_GROUPS; + + /* + * NGROUPS_MAX is defined by POSIX.1 as the maximum + * number of supplimental groups a users can belong to. + * We have to increment it by one because + * getgrouplist() returns both the supplemental groups + * and the primary group, i.e. all of the groups the + * user belongs to. + */ + ngroups = 1 + MAX_GROUPS; #ifdef __APPLE__ if (!PyArg_ParseTuple(args, "si:getgrouplist", &user, &basegid)) @@ -6818,13 +6827,6 @@ os_getgroups_impl(PyObject *module) /*[clinic end generated code: output=42b0c17758561b56 input=d3f109412e6a155c]*/ { PyObject *result = NULL; - -#ifdef NGROUPS_MAX -#define MAX_GROUPS NGROUPS_MAX -#else - /* defined to be 16 on Solaris7, so this should be a small number */ -#define MAX_GROUPS 64 -#endif gid_t grouplist[MAX_GROUPS]; /* On MacOSX getgroups(2) can return more than MAX_GROUPS results From webhook-mailer at python.org Thu Jun 13 03:18:30 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 13 Jun 2019 07:18:30 -0000 Subject: [Python-checkins] bpo-35070: test_getgrouplist may fail on macOS if too many groups (GH-13071) Message-ID: https://github.com/python/cpython/commit/b4c8ef7c67712c6639ee896bf7cb8ca1c204946d commit: b4c8ef7c67712c6639ee896bf7cb8ca1c204946d branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-13T00:18:26-07:00 summary: bpo-35070: test_getgrouplist may fail on macOS if too many groups (GH-13071) (cherry picked from commit 8725c83ed5ca8959195ad8326db99d564a921749) Co-authored-by: Jeffrey Kintscher <49998481+websurfer5 at users.noreply.github.com> files: A Misc/NEWS.d/next/Library/2019-05-09-18-50-55.bpo-35070.4vaqNL.rst M Modules/posixmodule.c diff --git a/Misc/NEWS.d/next/Library/2019-05-09-18-50-55.bpo-35070.4vaqNL.rst b/Misc/NEWS.d/next/Library/2019-05-09-18-50-55.bpo-35070.4vaqNL.rst new file mode 100644 index 000000000000..e823f1d469cc --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-09-18-50-55.bpo-35070.4vaqNL.rst @@ -0,0 +1,2 @@ +posix.getgrouplist() now works correctly when the user belongs to +NGROUPS_MAX supplemental groups. Patch by Jeffrey Kintscher. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index e7a1f987def9..b758e766a4d0 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -6120,6 +6120,13 @@ os_getpid_impl(PyObject *module) } #endif /* HAVE_GETPID */ +#ifdef NGROUPS_MAX +#define MAX_GROUPS NGROUPS_MAX +#else + /* defined to be 16 on Solaris7, so this should be a small number */ +#define MAX_GROUPS 64 +#endif + #ifdef HAVE_GETGROUPLIST /* AC 3.5: funny apple logic below */ @@ -6132,13 +6139,6 @@ Returns a list of groups to which a user belongs.\n\n\ static PyObject * posix_getgrouplist(PyObject *self, PyObject *args) { -#ifdef NGROUPS_MAX -#define MAX_GROUPS NGROUPS_MAX -#else - /* defined to be 16 on Solaris7, so this should be a small number */ -#define MAX_GROUPS 64 -#endif - const char *user; int i, ngroups; PyObject *list; @@ -6147,7 +6147,16 @@ posix_getgrouplist(PyObject *self, PyObject *args) #else gid_t *groups, basegid; #endif - ngroups = MAX_GROUPS; + + /* + * NGROUPS_MAX is defined by POSIX.1 as the maximum + * number of supplimental groups a users can belong to. + * We have to increment it by one because + * getgrouplist() returns both the supplemental groups + * and the primary group, i.e. all of the groups the + * user belongs to. + */ + ngroups = 1 + MAX_GROUPS; #ifdef __APPLE__ if (!PyArg_ParseTuple(args, "si:getgrouplist", &user, &basegid)) @@ -6216,13 +6225,6 @@ os_getgroups_impl(PyObject *module) /*[clinic end generated code: output=42b0c17758561b56 input=d3f109412e6a155c]*/ { PyObject *result = NULL; - -#ifdef NGROUPS_MAX -#define MAX_GROUPS NGROUPS_MAX -#else - /* defined to be 16 on Solaris7, so this should be a small number */ -#define MAX_GROUPS 64 -#endif gid_t grouplist[MAX_GROUPS]; /* On MacOSX getgroups(2) can return more than MAX_GROUPS results From webhook-mailer at python.org Thu Jun 13 03:18:49 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 13 Jun 2019 07:18:49 -0000 Subject: [Python-checkins] bpo-37253: Remove PyAST_obj2mod_ex() function (GH-14020) Message-ID: https://github.com/python/cpython/commit/022ac0a497b668d8b15e34e582a6396ead1a35e1 commit: 022ac0a497b668d8b15e34e582a6396ead1a35e1 branch: master author: Victor Stinner committer: GitHub date: 2019-06-13T09:18:45+02:00 summary: bpo-37253: Remove PyAST_obj2mod_ex() function (GH-14020) PyAST_obj2mod_ex() is similar to PyAST_obj2mod() with an additional 'feature_version' parameter which is unused. files: M Include/Python-ast.h M Parser/asdl_c.py M Python/Python-ast.c diff --git a/Include/Python-ast.h b/Include/Python-ast.h index 490d3b0846ab..62626503403b 100644 --- a/Include/Python-ast.h +++ b/Include/Python-ast.h @@ -707,7 +707,6 @@ type_ignore_ty _Py_TypeIgnore(int lineno, string tag, PyArena *arena); PyObject* PyAST_mod2obj(mod_ty t); mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode); -mod_ty PyAST_obj2mod_ex(PyObject* ast, PyArena* arena, int mode, int feature_version); int PyAST_Check(PyObject* obj); #ifdef __cplusplus diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py index 582c6ca57b65..f4fa271b6595 100644 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -1190,11 +1190,6 @@ class PartingShots(StaticVisitor): /* mode is 0 for "exec", 1 for "eval" and 2 for "single" input */ mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode) -{ - return PyAST_obj2mod_ex(ast, arena, mode, PY_MINOR_VERSION); -} - -mod_ty PyAST_obj2mod_ex(PyObject* ast, PyArena* arena, int mode, int feature_version) { mod_ty res; PyObject *req_type[3]; @@ -1280,7 +1275,6 @@ def main(srcfile, dump_module=False): f.write("\n") f.write("PyObject* PyAST_mod2obj(mod_ty t);\n") f.write("mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode);\n") - f.write("mod_ty PyAST_obj2mod_ex(PyObject* ast, PyArena* arena, int mode, int feature_version);\n") f.write("int PyAST_Check(PyObject* obj);\n") f.write('\n') f.write('#ifdef __cplusplus\n') diff --git a/Python/Python-ast.c b/Python/Python-ast.c index dc2b1304f1f2..0774c58e2d23 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -8990,11 +8990,6 @@ PyObject* PyAST_mod2obj(mod_ty t) /* mode is 0 for "exec", 1 for "eval" and 2 for "single" input */ mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode) -{ - return PyAST_obj2mod_ex(ast, arena, mode, PY_MINOR_VERSION); -} - -mod_ty PyAST_obj2mod_ex(PyObject* ast, PyArena* arena, int mode, int feature_version) { mod_ty res; PyObject *req_type[3]; From webhook-mailer at python.org Thu Jun 13 03:27:28 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 13 Jun 2019 07:27:28 -0000 Subject: [Python-checkins] bpo-35070: test_getgrouplist may fail on macOS if too many groups (GH-13071) Message-ID: https://github.com/python/cpython/commit/c80183e6ca8c0ce834fc6444a71c7f31a3eb05b7 commit: c80183e6ca8c0ce834fc6444a71c7f31a3eb05b7 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-13T00:27:23-07:00 summary: bpo-35070: test_getgrouplist may fail on macOS if too many groups (GH-13071) (cherry picked from commit 8725c83ed5ca8959195ad8326db99d564a921749) Co-authored-by: Jeffrey Kintscher <49998481+websurfer5 at users.noreply.github.com> files: A Misc/NEWS.d/next/Library/2019-05-09-18-50-55.bpo-35070.4vaqNL.rst M Modules/posixmodule.c diff --git a/Misc/NEWS.d/next/Library/2019-05-09-18-50-55.bpo-35070.4vaqNL.rst b/Misc/NEWS.d/next/Library/2019-05-09-18-50-55.bpo-35070.4vaqNL.rst new file mode 100644 index 000000000000..e823f1d469cc --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-09-18-50-55.bpo-35070.4vaqNL.rst @@ -0,0 +1,2 @@ +posix.getgrouplist() now works correctly when the user belongs to +NGROUPS_MAX supplemental groups. Patch by Jeffrey Kintscher. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 8f6cffffcdfb..7a471801db39 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -6722,6 +6722,13 @@ os_getpid_impl(PyObject *module) } #endif /* HAVE_GETPID */ +#ifdef NGROUPS_MAX +#define MAX_GROUPS NGROUPS_MAX +#else + /* defined to be 16 on Solaris7, so this should be a small number */ +#define MAX_GROUPS 64 +#endif + #ifdef HAVE_GETGROUPLIST /* AC 3.5: funny apple logic below */ @@ -6734,13 +6741,6 @@ Returns a list of groups to which a user belongs.\n\n\ static PyObject * posix_getgrouplist(PyObject *self, PyObject *args) { -#ifdef NGROUPS_MAX -#define MAX_GROUPS NGROUPS_MAX -#else - /* defined to be 16 on Solaris7, so this should be a small number */ -#define MAX_GROUPS 64 -#endif - const char *user; int i, ngroups; PyObject *list; @@ -6749,7 +6749,16 @@ posix_getgrouplist(PyObject *self, PyObject *args) #else gid_t *groups, basegid; #endif - ngroups = MAX_GROUPS; + + /* + * NGROUPS_MAX is defined by POSIX.1 as the maximum + * number of supplimental groups a users can belong to. + * We have to increment it by one because + * getgrouplist() returns both the supplemental groups + * and the primary group, i.e. all of the groups the + * user belongs to. + */ + ngroups = 1 + MAX_GROUPS; #ifdef __APPLE__ if (!PyArg_ParseTuple(args, "si:getgrouplist", &user, &basegid)) @@ -6818,13 +6827,6 @@ os_getgroups_impl(PyObject *module) /*[clinic end generated code: output=42b0c17758561b56 input=d3f109412e6a155c]*/ { PyObject *result = NULL; - -#ifdef NGROUPS_MAX -#define MAX_GROUPS NGROUPS_MAX -#else - /* defined to be 16 on Solaris7, so this should be a small number */ -#define MAX_GROUPS 64 -#endif gid_t grouplist[MAX_GROUPS]; /* On MacOSX getgroups(2) can return more than MAX_GROUPS results From webhook-mailer at python.org Thu Jun 13 03:46:16 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 13 Jun 2019 07:46:16 -0000 Subject: [Python-checkins] bpo-37253: Remove PyAST_obj2mod_ex() function (GH-14020) Message-ID: https://github.com/python/cpython/commit/032bf30643fff49b5595b53f9c1ce5b2cd2df504 commit: 032bf30643fff49b5595b53f9c1ce5b2cd2df504 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-13T00:46:01-07:00 summary: bpo-37253: Remove PyAST_obj2mod_ex() function (GH-14020) PyAST_obj2mod_ex() is similar to PyAST_obj2mod() with an additional 'feature_version' parameter which is unused. (cherry picked from commit 022ac0a497b668d8b15e34e582a6396ead1a35e1) Co-authored-by: Victor Stinner files: M Include/Python-ast.h M Parser/asdl_c.py M Python/Python-ast.c diff --git a/Include/Python-ast.h b/Include/Python-ast.h index 490d3b0846ab..62626503403b 100644 --- a/Include/Python-ast.h +++ b/Include/Python-ast.h @@ -707,7 +707,6 @@ type_ignore_ty _Py_TypeIgnore(int lineno, string tag, PyArena *arena); PyObject* PyAST_mod2obj(mod_ty t); mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode); -mod_ty PyAST_obj2mod_ex(PyObject* ast, PyArena* arena, int mode, int feature_version); int PyAST_Check(PyObject* obj); #ifdef __cplusplus diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py index 582c6ca57b65..f4fa271b6595 100644 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -1190,11 +1190,6 @@ class PartingShots(StaticVisitor): /* mode is 0 for "exec", 1 for "eval" and 2 for "single" input */ mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode) -{ - return PyAST_obj2mod_ex(ast, arena, mode, PY_MINOR_VERSION); -} - -mod_ty PyAST_obj2mod_ex(PyObject* ast, PyArena* arena, int mode, int feature_version) { mod_ty res; PyObject *req_type[3]; @@ -1280,7 +1275,6 @@ def main(srcfile, dump_module=False): f.write("\n") f.write("PyObject* PyAST_mod2obj(mod_ty t);\n") f.write("mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode);\n") - f.write("mod_ty PyAST_obj2mod_ex(PyObject* ast, PyArena* arena, int mode, int feature_version);\n") f.write("int PyAST_Check(PyObject* obj);\n") f.write('\n') f.write('#ifdef __cplusplus\n') diff --git a/Python/Python-ast.c b/Python/Python-ast.c index dc2b1304f1f2..0774c58e2d23 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -8990,11 +8990,6 @@ PyObject* PyAST_mod2obj(mod_ty t) /* mode is 0 for "exec", 1 for "eval" and 2 for "single" input */ mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode) -{ - return PyAST_obj2mod_ex(ast, arena, mode, PY_MINOR_VERSION); -} - -mod_ty PyAST_obj2mod_ex(PyObject* ast, PyArena* arena, int mode, int feature_version) { mod_ty res; PyObject *req_type[3]; From webhook-mailer at python.org Thu Jun 13 05:26:51 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Thu, 13 Jun 2019 09:26:51 -0000 Subject: [Python-checkins] bpo-37231: optimize calls of special methods (GH-13973) Message-ID: https://github.com/python/cpython/commit/b4b814b3988abf69f07f8492d82e855c51b2a75d commit: b4b814b3988abf69f07f8492d82e855c51b2a75d branch: master author: Jeroen Demeyer committer: Inada Naoki date: 2019-06-13T18:26:44+09:00 summary: bpo-37231: optimize calls of special methods (GH-13973) files: A Misc/NEWS.d/next/Core and Builtins/2019-06-12-14-39-16.bpo-37231.LF41Es.rst M Objects/typeobject.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-06-12-14-39-16.bpo-37231.LF41Es.rst b/Misc/NEWS.d/next/Core and Builtins/2019-06-12-14-39-16.bpo-37231.LF41Es.rst new file mode 100644 index 000000000000..2e277194f3c2 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-06-12-14-39-16.bpo-37231.LF41Es.rst @@ -0,0 +1,2 @@ +The dispatching of type slots to special methods (for example calling +``__mul__`` when doing ``x * y``) has been made faster. diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 006df8d1f090..ba128a90778c 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -1440,16 +1440,19 @@ lookup_method(PyObject *self, _Py_Identifier *attrid, int *unbound) return res; } -static PyObject* -call_unbound(int unbound, PyObject *func, PyObject *self, - PyObject **args, Py_ssize_t nargs) + +static inline PyObject* +vectorcall_unbound(int unbound, PyObject *func, + PyObject *const *args, Py_ssize_t nargs) { - if (unbound) { - return _PyObject_FastCall_Prepend(func, self, args, nargs); - } - else { - return _PyObject_FastCall(func, args, nargs); + size_t nargsf = nargs; + if (!unbound) { + /* Skip self argument, freeing up args[0] to use for + * PY_VECTORCALL_ARGUMENTS_OFFSET */ + args++; + nargsf = nargsf - 1 + PY_VECTORCALL_ARGUMENTS_OFFSET; } + return _PyObject_Vectorcall(func, args, nargsf, NULL); } static PyObject* @@ -1464,41 +1467,43 @@ call_unbound_noarg(int unbound, PyObject *func, PyObject *self) } } -/* A variation of PyObject_CallMethod* that uses lookup_maybe_method() - instead of PyObject_GetAttrString(). */ +/* A variation of PyObject_CallMethod* that uses lookup_method() + instead of PyObject_GetAttrString(). + + args is an argument vector of length nargs. The first element in this + vector is the special object "self" which is used for the method lookup */ static PyObject * -call_method(PyObject *obj, _Py_Identifier *name, - PyObject **args, Py_ssize_t nargs) +vectorcall_method(_Py_Identifier *name, + PyObject *const *args, Py_ssize_t nargs) { + assert(nargs >= 1); int unbound; - PyObject *func, *retval; - - func = lookup_method(obj, name, &unbound); + PyObject *self = args[0]; + PyObject *func = lookup_method(self, name, &unbound); if (func == NULL) { return NULL; } - retval = call_unbound(unbound, func, obj, args, nargs); + PyObject *retval = vectorcall_unbound(unbound, func, args, nargs); Py_DECREF(func); return retval; } -/* Clone of call_method() that returns NotImplemented when the lookup fails. */ - +/* Clone of vectorcall_method() that returns NotImplemented + * when the lookup fails. */ static PyObject * -call_maybe(PyObject *obj, _Py_Identifier *name, - PyObject **args, Py_ssize_t nargs) +vectorcall_maybe(_Py_Identifier *name, + PyObject *const *args, Py_ssize_t nargs) { + assert(nargs >= 1); int unbound; - PyObject *func, *retval; - - func = lookup_maybe_method(obj, name, &unbound); + PyObject *self = args[0]; + PyObject *func = lookup_maybe_method(self, name, &unbound); if (func == NULL) { if (!PyErr_Occurred()) Py_RETURN_NOTIMPLEMENTED; return NULL; } - - retval = call_unbound(unbound, func, obj, args, nargs); + PyObject *retval = vectorcall_unbound(unbound, func, args, nargs); Py_DECREF(func); return retval; } @@ -6084,17 +6089,18 @@ add_tp_new_wrapper(PyTypeObject *type) static PyObject * \ FUNCNAME(PyObject *self) \ { \ + PyObject* stack[1] = {self}; \ _Py_static_string(id, OPSTR); \ - return call_method(self, &id, NULL, 0); \ + return vectorcall_method(&id, stack, 1); \ } #define SLOT1(FUNCNAME, OPSTR, ARG1TYPE) \ static PyObject * \ FUNCNAME(PyObject *self, ARG1TYPE arg1) \ { \ - PyObject* stack[1] = {arg1}; \ + PyObject* stack[2] = {self, arg1}; \ _Py_static_string(id, OPSTR); \ - return call_method(self, &id, stack, 1); \ + return vectorcall_method(&id, stack, 2); \ } /* Boolean helper for SLOT1BINFULL(). @@ -6136,7 +6142,7 @@ method_is_overloaded(PyObject *left, PyObject *right, struct _Py_Identifier *nam static PyObject * \ FUNCNAME(PyObject *self, PyObject *other) \ { \ - PyObject* stack[1]; \ + PyObject* stack[2]; \ _Py_static_string(op_id, OPSTR); \ _Py_static_string(rop_id, ROPSTR); \ int do_other = Py_TYPE(self) != Py_TYPE(other) && \ @@ -6148,23 +6154,26 @@ FUNCNAME(PyObject *self, PyObject *other) \ if (do_other && \ PyType_IsSubtype(Py_TYPE(other), Py_TYPE(self)) && \ method_is_overloaded(self, other, &rop_id)) { \ - stack[0] = self; \ - r = call_maybe(other, &rop_id, stack, 1); \ + stack[0] = other; \ + stack[1] = self; \ + r = vectorcall_maybe(&rop_id, stack, 2); \ if (r != Py_NotImplemented) \ return r; \ Py_DECREF(r); \ do_other = 0; \ } \ - stack[0] = other; \ - r = call_maybe(self, &op_id, stack, 1); \ + stack[0] = self; \ + stack[1] = other; \ + r = vectorcall_maybe(&op_id, stack, 2); \ if (r != Py_NotImplemented || \ Py_TYPE(other) == Py_TYPE(self)) \ return r; \ Py_DECREF(r); \ } \ if (do_other) { \ - stack[0] = self; \ - return call_maybe(other, &rop_id, stack, 1); \ + stack[0] = other; \ + stack[1] = self; \ + return vectorcall_maybe(&rop_id, stack, 2); \ } \ Py_RETURN_NOTIMPLEMENTED; \ } @@ -6175,7 +6184,8 @@ FUNCNAME(PyObject *self, PyObject *other) \ static Py_ssize_t slot_sq_length(PyObject *self) { - PyObject *res = call_method(self, &PyId___len__, NULL, 0); + PyObject* stack[1] = {self}; + PyObject *res = vectorcall_method(&PyId___len__, stack, 1); Py_ssize_t len; if (res == NULL) @@ -6202,14 +6212,12 @@ slot_sq_length(PyObject *self) static PyObject * slot_sq_item(PyObject *self, Py_ssize_t i) { - PyObject *retval; - PyObject *args[1]; PyObject *ival = PyLong_FromSsize_t(i); if (ival == NULL) { return NULL; } - args[0] = ival; - retval = call_method(self, &PyId___getitem__, args, 1); + PyObject *stack[2] = {self, ival}; + PyObject *retval = vectorcall_method(&PyId___getitem__, stack, 2); Py_DECREF(ival); return retval; } @@ -6217,7 +6225,7 @@ slot_sq_item(PyObject *self, Py_ssize_t i) static int slot_sq_ass_item(PyObject *self, Py_ssize_t index, PyObject *value) { - PyObject *stack[2]; + PyObject *stack[3]; PyObject *res; PyObject *index_obj; @@ -6226,13 +6234,14 @@ slot_sq_ass_item(PyObject *self, Py_ssize_t index, PyObject *value) return -1; } - stack[0] = index_obj; + stack[0] = self; + stack[1] = index_obj; if (value == NULL) { - res = call_method(self, &PyId___delitem__, stack, 1); + res = vectorcall_method(&PyId___delitem__, stack, 2); } else { - stack[1] = value; - res = call_method(self, &PyId___setitem__, stack, 2); + stack[2] = value; + res = vectorcall_method(&PyId___setitem__, stack, 3); } Py_DECREF(index_obj); @@ -6259,8 +6268,8 @@ slot_sq_contains(PyObject *self, PyObject *value) return -1; } if (func != NULL) { - PyObject *args[1] = {value}; - res = call_unbound(unbound, func, self, args, 1); + PyObject *args[2] = {self, value}; + res = vectorcall_unbound(unbound, func, args, 2); Py_DECREF(func); if (res != NULL) { result = PyObject_IsTrue(res); @@ -6282,16 +6291,17 @@ SLOT1(slot_mp_subscript, "__getitem__", PyObject *) static int slot_mp_ass_subscript(PyObject *self, PyObject *key, PyObject *value) { - PyObject *stack[2]; + PyObject *stack[3]; PyObject *res; - stack[0] = key; + stack[0] = self; + stack[1] = key; if (value == NULL) { - res = call_method(self, &PyId___delitem__, stack, 1); + res = vectorcall_method(&PyId___delitem__, stack, 2); } else { - stack[1] = value; - res = call_method(self, &PyId___setitem__, stack, 2); + stack[2] = value; + res = vectorcall_method(&PyId___setitem__, stack, 3); } if (res == NULL) @@ -6324,8 +6334,8 @@ slot_nb_power(PyObject *self, PyObject *other, PyObject *modulus) slot_nb_power, so check before calling self.__pow__. */ if (Py_TYPE(self)->tp_as_number != NULL && Py_TYPE(self)->tp_as_number->nb_power == slot_nb_power) { - PyObject* stack[2] = {other, modulus}; - return call_method(self, &PyId___pow__, stack, 2); + PyObject* stack[3] = {self, other, modulus}; + return vectorcall_method(&PyId___pow__, stack, 3); } Py_RETURN_NOTIMPLEMENTED; } @@ -6392,7 +6402,8 @@ static PyObject * slot_nb_index(PyObject *self) { _Py_IDENTIFIER(__index__); - return call_method(self, &PyId___index__, NULL, 0); + PyObject *stack[1] = {self}; + return vectorcall_method(&PyId___index__, stack, 1); } @@ -6414,9 +6425,9 @@ SLOT1(slot_nb_inplace_remainder, "__imod__", PyObject *) static PyObject * slot_nb_inplace_power(PyObject *self, PyObject * arg1, PyObject *arg2) { - PyObject *stack[1] = {arg1}; + PyObject *stack[2] = {self, arg1}; _Py_IDENTIFIER(__ipow__); - return call_method(self, &PyId___ipow__, stack, 1); + return vectorcall_method(&PyId___ipow__, stack, 2); } SLOT1(slot_nb_inplace_lshift, "__ilshift__", PyObject *) SLOT1(slot_nb_inplace_rshift, "__irshift__", PyObject *) @@ -6533,8 +6544,8 @@ slot_tp_call(PyObject *self, PyObject *args, PyObject *kwds) static PyObject * slot_tp_getattro(PyObject *self, PyObject *name) { - PyObject *stack[1] = {name}; - return call_method(self, &PyId___getattribute__, stack, 1); + PyObject *stack[2] = {self, name}; + return vectorcall_method(&PyId___getattribute__, stack, 2); } static PyObject * @@ -6601,18 +6612,19 @@ slot_tp_getattr_hook(PyObject *self, PyObject *name) static int slot_tp_setattro(PyObject *self, PyObject *name, PyObject *value) { - PyObject *stack[2]; + PyObject *stack[3]; PyObject *res; _Py_IDENTIFIER(__delattr__); _Py_IDENTIFIER(__setattr__); - stack[0] = name; + stack[0] = self; + stack[1] = name; if (value == NULL) { - res = call_method(self, &PyId___delattr__, stack, 1); + res = vectorcall_method(&PyId___delattr__, stack, 2); } else { - stack[1] = value; - res = call_method(self, &PyId___setattr__, stack, 2); + stack[2] = value; + res = vectorcall_method(&PyId___setattr__, stack, 3); } if (res == NULL) return -1; @@ -6641,8 +6653,8 @@ slot_tp_richcompare(PyObject *self, PyObject *other, int op) Py_RETURN_NOTIMPLEMENTED; } - PyObject *args[1] = {other}; - res = call_unbound(unbound, func, self, args, 1); + PyObject *stack[2] = {self, other}; + res = vectorcall_unbound(unbound, func, stack, 2); Py_DECREF(func); return res; } @@ -6685,7 +6697,8 @@ static PyObject * slot_tp_iternext(PyObject *self) { _Py_IDENTIFIER(__next__); - return call_method(self, &PyId___next__, NULL, 0); + PyObject *stack[1] = {self}; + return vectorcall_method(&PyId___next__, stack, 1); } static PyObject * @@ -6713,18 +6726,19 @@ slot_tp_descr_get(PyObject *self, PyObject *obj, PyObject *type) static int slot_tp_descr_set(PyObject *self, PyObject *target, PyObject *value) { - PyObject* stack[2]; + PyObject* stack[3]; PyObject *res; _Py_IDENTIFIER(__delete__); _Py_IDENTIFIER(__set__); - stack[0] = target; + stack[0] = self; + stack[1] = target; if (value == NULL) { - res = call_method(self, &PyId___delete__, stack, 1); + res = vectorcall_method(&PyId___delete__, stack, 2); } else { - stack[1] = value; - res = call_method(self, &PyId___set__, stack, 2); + stack[2] = value; + res = vectorcall_method(&PyId___set__, stack, 3); } if (res == NULL) return -1; From webhook-mailer at python.org Thu Jun 13 06:06:30 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 13 Jun 2019 10:06:30 -0000 Subject: [Python-checkins] tbpo-36402: Fix threading.Thread._stop() (GH-14047) Message-ID: https://github.com/python/cpython/commit/6f75c873752a16a7ad8f35855b1e29f59d048e84 commit: 6f75c873752a16a7ad8f35855b1e29f59d048e84 branch: master author: Victor Stinner committer: GitHub date: 2019-06-13T12:06:24+02:00 summary: tbpo-36402: Fix threading.Thread._stop() (GH-14047) Remove the _tstate_lock from _shutdown_locks, don't remove None. files: 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 ad90010b8a38..0a0a62bdf9bf 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -738,6 +738,30 @@ def callback(): finally: sys.settrace(old_trace) + @cpython_only + def test_shutdown_locks(self): + for daemon in (False, True): + with self.subTest(daemon=daemon): + event = threading.Event() + thread = threading.Thread(target=event.wait, daemon=daemon) + + # Thread.start() must add lock to _shutdown_locks, + # but only for non-daemon thread + thread.start() + tstate_lock = thread._tstate_lock + if not daemon: + self.assertIn(tstate_lock, threading._shutdown_locks) + else: + self.assertNotIn(tstate_lock, threading._shutdown_locks) + + # unblock the thread and join it + event.set() + thread.join() + + # Thread._stop() must remove tstate_lock from _shutdown_locks. + # Daemon threads must never add it to _shutdown_locks. + self.assertNotIn(tstate_lock, threading._shutdown_locks) + class ThreadJoinOnShutdown(BaseTestCase): diff --git a/Lib/threading.py b/Lib/threading.py index 67926403770e..7c6d404bcd10 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -965,7 +965,7 @@ def _stop(self): self._tstate_lock = None if not self.daemon: with _shutdown_locks_lock: - _shutdown_locks.discard(self._tstate_lock) + _shutdown_locks.discard(lock) def _delete(self): "Remove current thread from the dict of currently running threads." From webhook-mailer at python.org Thu Jun 13 07:44:30 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 13 Jun 2019 11:44:30 -0000 Subject: [Python-checkins] [3.8] bpo-36402: Fix threading._shutdown() race condition (GH-13948) (GH-14050) Message-ID: https://github.com/python/cpython/commit/e40a97a721d46307dfdc2b0322028ccded6eb571 commit: e40a97a721d46307dfdc2b0322028ccded6eb571 branch: 3.8 author: Victor Stinner committer: GitHub date: 2019-06-13T13:44:23+02:00 summary: [3.8] bpo-36402: Fix threading._shutdown() race condition (GH-13948) (GH-14050) * bpo-36402: Fix threading._shutdown() race condition (GH-13948) Fix a race condition at Python shutdown when waiting for threads. Wait until the Python thread state of all non-daemon threads get deleted (join all non-daemon threads), rather than just wait until Python threads complete. * Add threading._shutdown_locks: set of Thread._tstate_lock locks of non-daemon threads used by _shutdown() to wait until all Python thread states get deleted. See Thread._set_tstate_lock(). * Add also threading._shutdown_locks_lock to protect access to threading._shutdown_locks. * Add test_finalization_shutdown() test. (cherry picked from commit 468e5fec8a2f534f1685d59da3ca4fad425c38dd) * bpo-36402: Fix threading.Thread._stop() (GH-14047) Remove the _tstate_lock from _shutdown_locks, don't remove None. (cherry picked from commit 6f75c873752a16a7ad8f35855b1e29f59d048e84) files: A Misc/NEWS.d/next/Library/2019-06-11-00-35-02.bpo-36402.b0IJVp.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 6ac4ea9623de..0a0a62bdf9bf 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -583,6 +583,41 @@ def __del__(self): self.assertEqual(data.splitlines(), ["GC: True True True"] * 2) + def test_finalization_shutdown(self): + # bpo-36402: Py_Finalize() calls threading._shutdown() which must wait + # until Python thread states of all non-daemon threads get deleted. + # + # Test similar to SubinterpThreadingTests.test_threads_join_2(), but + # test the finalization of the main interpreter. + code = """if 1: + import os + import threading + import time + import random + + def random_sleep(): + seconds = random.random() * 0.010 + time.sleep(seconds) + + class Sleeper: + def __del__(self): + random_sleep() + + tls = threading.local() + + def f(): + # Sleep a bit so that the thread is still running when + # Py_Finalize() is called. + random_sleep() + tls.x = Sleeper() + random_sleep() + + threading.Thread(target=f).start() + random_sleep() + """ + rc, out, err = assert_python_ok("-c", code) + self.assertEqual(err, b"") + def test_tstate_lock(self): # Test an implementation detail of Thread objects. started = _thread.allocate_lock() @@ -703,6 +738,30 @@ def callback(): finally: sys.settrace(old_trace) + @cpython_only + def test_shutdown_locks(self): + for daemon in (False, True): + with self.subTest(daemon=daemon): + event = threading.Event() + thread = threading.Thread(target=event.wait, daemon=daemon) + + # Thread.start() must add lock to _shutdown_locks, + # but only for non-daemon thread + thread.start() + tstate_lock = thread._tstate_lock + if not daemon: + self.assertIn(tstate_lock, threading._shutdown_locks) + else: + self.assertNotIn(tstate_lock, threading._shutdown_locks) + + # unblock the thread and join it + event.set() + thread.join() + + # Thread._stop() must remove tstate_lock from _shutdown_locks. + # Daemon threads must never add it to _shutdown_locks. + self.assertNotIn(tstate_lock, threading._shutdown_locks) + class ThreadJoinOnShutdown(BaseTestCase): @@ -878,15 +937,22 @@ def test_threads_join(self): self.addCleanup(os.close, w) code = r"""if 1: import os + import random import threading import time + def random_sleep(): + seconds = random.random() * 0.010 + time.sleep(seconds) + def f(): # Sleep a bit so that the thread is still running when # Py_EndInterpreter is called. - time.sleep(0.05) + random_sleep() os.write(%d, b"x") + threading.Thread(target=f).start() + random_sleep() """ % (w,) ret = test.support.run_in_subinterp(code) self.assertEqual(ret, 0) @@ -903,22 +969,29 @@ def test_threads_join_2(self): self.addCleanup(os.close, w) code = r"""if 1: import os + import random import threading import time + def random_sleep(): + seconds = random.random() * 0.010 + time.sleep(seconds) + class Sleeper: def __del__(self): - time.sleep(0.05) + random_sleep() tls = threading.local() def f(): # Sleep a bit so that the thread is still running when # Py_EndInterpreter is called. - time.sleep(0.05) + random_sleep() tls.x = Sleeper() os.write(%d, b"x") + threading.Thread(target=f).start() + random_sleep() """ % (w,) ret = test.support.run_in_subinterp(code) self.assertEqual(ret, 0) diff --git a/Lib/threading.py b/Lib/threading.py index 3d197eed6a72..7c6d404bcd10 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -739,6 +739,11 @@ def _newname(template="Thread-%d"): _active = {} # maps thread id to Thread object _limbo = {} _dangling = WeakSet() +# Set of Thread._tstate_lock locks of non-daemon threads used by _shutdown() +# to wait until all Python thread states get deleted: +# see Thread._set_tstate_lock(). +_shutdown_locks_lock = _allocate_lock() +_shutdown_locks = set() # Main class for threads @@ -903,6 +908,10 @@ def _set_tstate_lock(self): self._tstate_lock = _set_sentinel() self._tstate_lock.acquire() + if not self.daemon: + with _shutdown_locks_lock: + _shutdown_locks.add(self._tstate_lock) + def _bootstrap_inner(self): try: self._set_ident() @@ -954,6 +963,9 @@ def _stop(self): assert not lock.locked() self._is_stopped = True self._tstate_lock = None + if not self.daemon: + with _shutdown_locks_lock: + _shutdown_locks.discard(lock) def _delete(self): "Remove current thread from the dict of currently running threads." @@ -1342,6 +1354,9 @@ def enumerate(): _main_thread = _MainThread() def _shutdown(): + """ + Wait until the Python thread state of all non-daemon threads get deleted. + """ # Obscure: other threads may be waiting to join _main_thread. That's # dubious, but some code does it. We can't wait for C code to release # the main thread's tstate_lock - that won't happen until the interpreter @@ -1350,6 +1365,8 @@ def _shutdown(): if _main_thread._is_stopped: # _shutdown() was already called return + + # Main thread tlock = _main_thread._tstate_lock # The main thread isn't finished yet, so its thread state lock can't have # been released. @@ -1357,16 +1374,24 @@ def _shutdown(): assert tlock.locked() tlock.release() _main_thread._stop() - t = _pickSomeNonDaemonThread() - while t: - t.join() - t = _pickSomeNonDaemonThread() -def _pickSomeNonDaemonThread(): - for t in enumerate(): - if not t.daemon and t.is_alive(): - return t - return None + # Join all non-deamon threads + while True: + with _shutdown_locks_lock: + locks = list(_shutdown_locks) + _shutdown_locks.clear() + + if not locks: + break + + for lock in locks: + # mimick Thread.join() + lock.acquire() + lock.release() + + # new threads can be spawned while we were waiting for the other + # threads to complete + def main_thread(): """Return the main thread object. @@ -1392,12 +1417,18 @@ def _after_fork(): # Reset _active_limbo_lock, in case we forked while the lock was held # by another (non-forked) thread. http://bugs.python.org/issue874900 global _active_limbo_lock, _main_thread + global _shutdown_locks_lock, _shutdown_locks _active_limbo_lock = _allocate_lock() # fork() only copied the current thread; clear references to others. new_active = {} current = current_thread() _main_thread = current + + # reset _shutdown() locks: threads re-register their _tstate_lock below + _shutdown_locks_lock = _allocate_lock() + _shutdown_locks = set() + with _active_limbo_lock: # Dangling thread instances must still have their locks reset, # because someone may join() them. diff --git a/Misc/NEWS.d/next/Library/2019-06-11-00-35-02.bpo-36402.b0IJVp.rst b/Misc/NEWS.d/next/Library/2019-06-11-00-35-02.bpo-36402.b0IJVp.rst new file mode 100644 index 000000000000..3bc537e40ff6 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-11-00-35-02.bpo-36402.b0IJVp.rst @@ -0,0 +1,4 @@ +Fix a race condition at Python shutdown when waiting for threads. Wait until +the Python thread state of all non-daemon threads get deleted (join all +non-daemon threads), rather than just wait until non-daemon Python threads +complete. From webhook-mailer at python.org Thu Jun 13 07:59:03 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 13 Jun 2019 11:59:03 -0000 Subject: [Python-checkins] bpo-37210: Fix pure Python pickle when _pickle is unavailable (GH-14016) Message-ID: https://github.com/python/cpython/commit/63ab4ba07b492448844940c347787ba30735b7f2 commit: 63ab4ba07b492448844940c347787ba30735b7f2 branch: master author: Victor Stinner committer: GitHub date: 2019-06-13T13:58:51+02:00 summary: bpo-37210: Fix pure Python pickle when _pickle is unavailable (GH-14016) Allow pure Python implementation of pickle to work even when the C _pickle module is unavailable. Fix test_pickle when _pickle is missing: declare PyPicklerHookTests outside "if has_c_implementation:" block. files: A Misc/NEWS.d/next/Library/2019-06-12-16-10-50.bpo-37210.r4yMg6.rst M Lib/pickle.py M Lib/test/test_pickle.py diff --git a/Lib/pickle.py b/Lib/pickle.py index a67ac7dd8b68..71aa57d500ec 100644 --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -36,10 +36,16 @@ import codecs import _compat_pickle -from _pickle import PickleBuffer - __all__ = ["PickleError", "PicklingError", "UnpicklingError", "Pickler", - "Unpickler", "dump", "dumps", "load", "loads", "PickleBuffer"] + "Unpickler", "dump", "dumps", "load", "loads"] + +try: + from _pickle import PickleBuffer + __all__.append("PickleBuffer") + _HAVE_PICKLE_BUFFER = True +except ImportError: + _HAVE_PICKLE_BUFFER = False + # Shortcut for use in isinstance testing bytes_types = (bytes, bytearray) @@ -812,31 +818,32 @@ def save_bytearray(self, obj): self.write(BYTEARRAY8 + pack("= 5") - with obj.raw() as m: - if not m.contiguous: - raise PicklingError("PickleBuffer can not be pickled when " - "pointing to a non-contiguous buffer") - in_band = True - if self._buffer_callback is not None: - in_band = bool(self._buffer_callback(obj)) - if in_band: - # Write data in-band - # XXX The C implementation avoids a copy here - if m.readonly: - self.save_bytes(m.tobytes()) + if _HAVE_PICKLE_BUFFER: + def save_picklebuffer(self, obj): + if self.proto < 5: + raise PicklingError("PickleBuffer can only pickled with " + "protocol >= 5") + with obj.raw() as m: + if not m.contiguous: + raise PicklingError("PickleBuffer can not be pickled when " + "pointing to a non-contiguous buffer") + in_band = True + if self._buffer_callback is not None: + in_band = bool(self._buffer_callback(obj)) + if in_band: + # Write data in-band + # XXX The C implementation avoids a copy here + if m.readonly: + self.save_bytes(m.tobytes()) + else: + self.save_bytearray(m.tobytes()) else: - self.save_bytearray(m.tobytes()) - else: - # Write data out-of-band - self.write(NEXT_BUFFER) - if m.readonly: - self.write(READONLY_BUFFER) + # Write data out-of-band + self.write(NEXT_BUFFER) + if m.readonly: + self.write(READONLY_BUFFER) - dispatch[PickleBuffer] = save_picklebuffer + dispatch[PickleBuffer] = save_picklebuffer def save_str(self, obj): if self.bin: diff --git a/Lib/test/test_pickle.py b/Lib/test/test_pickle.py index 5f7a879b935d..2307b133dbd0 100644 --- a/Lib/test/test_pickle.py +++ b/Lib/test/test_pickle.py @@ -203,6 +203,13 @@ def get_dispatch_table(self): return collections.ChainMap({}, pickle.dispatch_table) +class PyPicklerHookTests(AbstractHookTests): + class CustomPyPicklerClass(pickle._Pickler, + AbstractCustomPicklerClass): + pass + pickler_class = CustomPyPicklerClass + + if has_c_implementation: class CPickleTests(AbstractPickleModuleTests): from _pickle import dump, dumps, load, loads, Pickler, Unpickler @@ -255,12 +262,6 @@ class CChainDispatchTableTests(AbstractDispatchTableTests): def get_dispatch_table(self): return collections.ChainMap({}, pickle.dispatch_table) - class PyPicklerHookTests(AbstractHookTests): - class CustomPyPicklerClass(pickle._Pickler, - AbstractCustomPicklerClass): - pass - pickler_class = CustomPyPicklerClass - class CPicklerHookTests(AbstractHookTests): class CustomCPicklerClass(_pickle.Pickler, AbstractCustomPicklerClass): pass diff --git a/Misc/NEWS.d/next/Library/2019-06-12-16-10-50.bpo-37210.r4yMg6.rst b/Misc/NEWS.d/next/Library/2019-06-12-16-10-50.bpo-37210.r4yMg6.rst new file mode 100644 index 000000000000..58fc66b59059 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-12-16-10-50.bpo-37210.r4yMg6.rst @@ -0,0 +1 @@ +Allow pure Python implementation of :mod:`pickle` to work even when the C :mod:`_pickle` module is unavailable. From webhook-mailer at python.org Thu Jun 13 08:22:25 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 13 Jun 2019 12:22:25 -0000 Subject: [Python-checkins] bpo-36402: Fix threading._shutdown() race condition (GH-13948) (GH-14050) (GH-14054) Message-ID: https://github.com/python/cpython/commit/6eb2878e42152e9c45d7ee5e6f889532d753e67c commit: 6eb2878e42152e9c45d7ee5e6f889532d753e67c branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Victor Stinner date: 2019-06-13T14:22:20+02:00 summary: bpo-36402: Fix threading._shutdown() race condition (GH-13948) (GH-14050) (GH-14054) * bpo-36402: Fix threading._shutdown() race condition (GH-13948) Fix a race condition at Python shutdown when waiting for threads. Wait until the Python thread state of all non-daemon threads get deleted (join all non-daemon threads), rather than just wait until Python threads complete. * Add threading._shutdown_locks: set of Thread._tstate_lock locks of non-daemon threads used by _shutdown() to wait until all Python thread states get deleted. See Thread._set_tstate_lock(). * Add also threading._shutdown_locks_lock to protect access to threading._shutdown_locks. * Add test_finalization_shutdown() test. (cherry picked from commit 468e5fec8a2f534f1685d59da3ca4fad425c38dd) * bpo-36402: Fix threading.Thread._stop() (GH-14047) Remove the _tstate_lock from _shutdown_locks, don't remove None. (cherry picked from commit 6f75c873752a16a7ad8f35855b1e29f59d048e84) (cherry picked from commit e40a97a721d46307dfdc2b0322028ccded6eb571) Co-authored-by: Victor Stinner files: A Misc/NEWS.d/next/Library/2019-06-11-00-35-02.bpo-36402.b0IJVp.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 aa810bda1c2a..36d9fbb162e2 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -578,6 +578,41 @@ def __del__(self): self.assertEqual(data.splitlines(), ["GC: True True True"] * 2) + def test_finalization_shutdown(self): + # bpo-36402: Py_Finalize() calls threading._shutdown() which must wait + # until Python thread states of all non-daemon threads get deleted. + # + # Test similar to SubinterpThreadingTests.test_threads_join_2(), but + # test the finalization of the main interpreter. + code = """if 1: + import os + import threading + import time + import random + + def random_sleep(): + seconds = random.random() * 0.010 + time.sleep(seconds) + + class Sleeper: + def __del__(self): + random_sleep() + + tls = threading.local() + + def f(): + # Sleep a bit so that the thread is still running when + # Py_Finalize() is called. + random_sleep() + tls.x = Sleeper() + random_sleep() + + threading.Thread(target=f).start() + random_sleep() + """ + rc, out, err = assert_python_ok("-c", code) + self.assertEqual(err, b"") + def test_tstate_lock(self): # Test an implementation detail of Thread objects. started = _thread.allocate_lock() @@ -698,6 +733,30 @@ def callback(): finally: sys.settrace(old_trace) + @cpython_only + def test_shutdown_locks(self): + for daemon in (False, True): + with self.subTest(daemon=daemon): + event = threading.Event() + thread = threading.Thread(target=event.wait, daemon=daemon) + + # Thread.start() must add lock to _shutdown_locks, + # but only for non-daemon thread + thread.start() + tstate_lock = thread._tstate_lock + if not daemon: + self.assertIn(tstate_lock, threading._shutdown_locks) + else: + self.assertNotIn(tstate_lock, threading._shutdown_locks) + + # unblock the thread and join it + event.set() + thread.join() + + # Thread._stop() must remove tstate_lock from _shutdown_locks. + # Daemon threads must never add it to _shutdown_locks. + self.assertNotIn(tstate_lock, threading._shutdown_locks) + class ThreadJoinOnShutdown(BaseTestCase): @@ -875,15 +934,22 @@ def test_threads_join(self): self.addCleanup(os.close, w) code = r"""if 1: import os + import random import threading import time + def random_sleep(): + seconds = random.random() * 0.010 + time.sleep(seconds) + def f(): # Sleep a bit so that the thread is still running when # Py_EndInterpreter is called. - time.sleep(0.05) + random_sleep() os.write(%d, b"x") + threading.Thread(target=f).start() + random_sleep() """ % (w,) ret = test.support.run_in_subinterp(code) self.assertEqual(ret, 0) @@ -900,22 +966,29 @@ def test_threads_join_2(self): self.addCleanup(os.close, w) code = r"""if 1: import os + import random import threading import time + def random_sleep(): + seconds = random.random() * 0.010 + time.sleep(seconds) + class Sleeper: def __del__(self): - time.sleep(0.05) + random_sleep() tls = threading.local() def f(): # Sleep a bit so that the thread is still running when # Py_EndInterpreter is called. - time.sleep(0.05) + random_sleep() tls.x = Sleeper() os.write(%d, b"x") + threading.Thread(target=f).start() + random_sleep() """ % (w,) ret = test.support.run_in_subinterp(code) self.assertEqual(ret, 0) diff --git a/Lib/threading.py b/Lib/threading.py index 318b3301126a..0fb3bdd55cd7 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -733,6 +733,11 @@ def _newname(template="Thread-%d"): _active = {} # maps thread id to Thread object _limbo = {} _dangling = WeakSet() +# Set of Thread._tstate_lock locks of non-daemon threads used by _shutdown() +# to wait until all Python thread states get deleted: +# see Thread._set_tstate_lock(). +_shutdown_locks_lock = _allocate_lock() +_shutdown_locks = set() # Main class for threads @@ -899,6 +904,10 @@ def _set_tstate_lock(self): self._tstate_lock = _set_sentinel() self._tstate_lock.acquire() + if not self.daemon: + with _shutdown_locks_lock: + _shutdown_locks.add(self._tstate_lock) + def _bootstrap_inner(self): try: self._set_ident() @@ -987,6 +996,9 @@ def _stop(self): assert not lock.locked() self._is_stopped = True self._tstate_lock = None + if not self.daemon: + with _shutdown_locks_lock: + _shutdown_locks.discard(lock) def _delete(self): "Remove current thread from the dict of currently running threads." @@ -1261,6 +1273,9 @@ def enumerate(): _main_thread = _MainThread() def _shutdown(): + """ + Wait until the Python thread state of all non-daemon threads get deleted. + """ # Obscure: other threads may be waiting to join _main_thread. That's # dubious, but some code does it. We can't wait for C code to release # the main thread's tstate_lock - that won't happen until the interpreter @@ -1269,6 +1284,8 @@ def _shutdown(): if _main_thread._is_stopped: # _shutdown() was already called return + + # Main thread tlock = _main_thread._tstate_lock # The main thread isn't finished yet, so its thread state lock can't have # been released. @@ -1276,16 +1293,24 @@ def _shutdown(): assert tlock.locked() tlock.release() _main_thread._stop() - t = _pickSomeNonDaemonThread() - while t: - t.join() - t = _pickSomeNonDaemonThread() -def _pickSomeNonDaemonThread(): - for t in enumerate(): - if not t.daemon and t.is_alive(): - return t - return None + # Join all non-deamon threads + while True: + with _shutdown_locks_lock: + locks = list(_shutdown_locks) + _shutdown_locks.clear() + + if not locks: + break + + for lock in locks: + # mimick Thread.join() + lock.acquire() + lock.release() + + # new threads can be spawned while we were waiting for the other + # threads to complete + def main_thread(): """Return the main thread object. @@ -1311,12 +1336,18 @@ def _after_fork(): # Reset _active_limbo_lock, in case we forked while the lock was held # by another (non-forked) thread. http://bugs.python.org/issue874900 global _active_limbo_lock, _main_thread + global _shutdown_locks_lock, _shutdown_locks _active_limbo_lock = _allocate_lock() # fork() only copied the current thread; clear references to others. new_active = {} current = current_thread() _main_thread = current + + # reset _shutdown() locks: threads re-register their _tstate_lock below + _shutdown_locks_lock = _allocate_lock() + _shutdown_locks = set() + with _active_limbo_lock: # Dangling thread instances must still have their locks reset, # because someone may join() them. diff --git a/Misc/NEWS.d/next/Library/2019-06-11-00-35-02.bpo-36402.b0IJVp.rst b/Misc/NEWS.d/next/Library/2019-06-11-00-35-02.bpo-36402.b0IJVp.rst new file mode 100644 index 000000000000..3bc537e40ff6 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-11-00-35-02.bpo-36402.b0IJVp.rst @@ -0,0 +1,4 @@ +Fix a race condition at Python shutdown when waiting for threads. Wait until +the Python thread state of all non-daemon threads get deleted (join all +non-daemon threads), rather than just wait until non-daemon Python threads +complete. From webhook-mailer at python.org Thu Jun 13 08:28:22 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 13 Jun 2019 12:28:22 -0000 Subject: [Python-checkins] bpo-37210: Fix pure Python pickle when _pickle is unavailable (GH-14016) Message-ID: https://github.com/python/cpython/commit/cbda40db7b604b377acfd3f04e19407ca33748a7 commit: cbda40db7b604b377acfd3f04e19407ca33748a7 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-13T05:28:11-07:00 summary: bpo-37210: Fix pure Python pickle when _pickle is unavailable (GH-14016) Allow pure Python implementation of pickle to work even when the C _pickle module is unavailable. Fix test_pickle when _pickle is missing: declare PyPicklerHookTests outside "if has_c_implementation:" block. (cherry picked from commit 63ab4ba07b492448844940c347787ba30735b7f2) Co-authored-by: Victor Stinner files: A Misc/NEWS.d/next/Library/2019-06-12-16-10-50.bpo-37210.r4yMg6.rst M Lib/pickle.py M Lib/test/test_pickle.py diff --git a/Lib/pickle.py b/Lib/pickle.py index a67ac7dd8b68..71aa57d500ec 100644 --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -36,10 +36,16 @@ import codecs import _compat_pickle -from _pickle import PickleBuffer - __all__ = ["PickleError", "PicklingError", "UnpicklingError", "Pickler", - "Unpickler", "dump", "dumps", "load", "loads", "PickleBuffer"] + "Unpickler", "dump", "dumps", "load", "loads"] + +try: + from _pickle import PickleBuffer + __all__.append("PickleBuffer") + _HAVE_PICKLE_BUFFER = True +except ImportError: + _HAVE_PICKLE_BUFFER = False + # Shortcut for use in isinstance testing bytes_types = (bytes, bytearray) @@ -812,31 +818,32 @@ def save_bytearray(self, obj): self.write(BYTEARRAY8 + pack("= 5") - with obj.raw() as m: - if not m.contiguous: - raise PicklingError("PickleBuffer can not be pickled when " - "pointing to a non-contiguous buffer") - in_band = True - if self._buffer_callback is not None: - in_band = bool(self._buffer_callback(obj)) - if in_band: - # Write data in-band - # XXX The C implementation avoids a copy here - if m.readonly: - self.save_bytes(m.tobytes()) + if _HAVE_PICKLE_BUFFER: + def save_picklebuffer(self, obj): + if self.proto < 5: + raise PicklingError("PickleBuffer can only pickled with " + "protocol >= 5") + with obj.raw() as m: + if not m.contiguous: + raise PicklingError("PickleBuffer can not be pickled when " + "pointing to a non-contiguous buffer") + in_band = True + if self._buffer_callback is not None: + in_band = bool(self._buffer_callback(obj)) + if in_band: + # Write data in-band + # XXX The C implementation avoids a copy here + if m.readonly: + self.save_bytes(m.tobytes()) + else: + self.save_bytearray(m.tobytes()) else: - self.save_bytearray(m.tobytes()) - else: - # Write data out-of-band - self.write(NEXT_BUFFER) - if m.readonly: - self.write(READONLY_BUFFER) + # Write data out-of-band + self.write(NEXT_BUFFER) + if m.readonly: + self.write(READONLY_BUFFER) - dispatch[PickleBuffer] = save_picklebuffer + dispatch[PickleBuffer] = save_picklebuffer def save_str(self, obj): if self.bin: diff --git a/Lib/test/test_pickle.py b/Lib/test/test_pickle.py index 5f7a879b935d..2307b133dbd0 100644 --- a/Lib/test/test_pickle.py +++ b/Lib/test/test_pickle.py @@ -203,6 +203,13 @@ def get_dispatch_table(self): return collections.ChainMap({}, pickle.dispatch_table) +class PyPicklerHookTests(AbstractHookTests): + class CustomPyPicklerClass(pickle._Pickler, + AbstractCustomPicklerClass): + pass + pickler_class = CustomPyPicklerClass + + if has_c_implementation: class CPickleTests(AbstractPickleModuleTests): from _pickle import dump, dumps, load, loads, Pickler, Unpickler @@ -255,12 +262,6 @@ class CChainDispatchTableTests(AbstractDispatchTableTests): def get_dispatch_table(self): return collections.ChainMap({}, pickle.dispatch_table) - class PyPicklerHookTests(AbstractHookTests): - class CustomPyPicklerClass(pickle._Pickler, - AbstractCustomPicklerClass): - pass - pickler_class = CustomPyPicklerClass - class CPicklerHookTests(AbstractHookTests): class CustomCPicklerClass(_pickle.Pickler, AbstractCustomPicklerClass): pass diff --git a/Misc/NEWS.d/next/Library/2019-06-12-16-10-50.bpo-37210.r4yMg6.rst b/Misc/NEWS.d/next/Library/2019-06-12-16-10-50.bpo-37210.r4yMg6.rst new file mode 100644 index 000000000000..58fc66b59059 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-12-16-10-50.bpo-37210.r4yMg6.rst @@ -0,0 +1 @@ +Allow pure Python implementation of :mod:`pickle` to work even when the C :mod:`_pickle` module is unavailable. From webhook-mailer at python.org Thu Jun 13 08:45:03 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 13 Jun 2019 12:45:03 -0000 Subject: [Python-checkins] bpo-37261: Fix support.catch_unraisable_exception() (GH-14052) Message-ID: https://github.com/python/cpython/commit/6d22cc8e90ccb1e1965b1a4bc79456e2cc1e5a3e commit: 6d22cc8e90ccb1e1965b1a4bc79456e2cc1e5a3e branch: master author: Victor Stinner committer: GitHub date: 2019-06-13T14:44:54+02:00 summary: bpo-37261: Fix support.catch_unraisable_exception() (GH-14052) The __exit__() method of test.support.catch_unraisable_exception context manager now ignores unraisable exception raised when clearing self.unraisable attribute. files: A Misc/NEWS.d/next/Tests/2019-06-13-12-19-56.bpo-37261.NuKFVo.rst M Doc/library/test.rst M Lib/test/support/__init__.py diff --git a/Doc/library/test.rst b/Doc/library/test.rst index b7a2595708d0..0a98c882465d 100644 --- a/Doc/library/test.rst +++ b/Doc/library/test.rst @@ -1086,6 +1086,18 @@ The :mod:`test.support` module defines the following functions: Context manager catching unraisable exception using :func:`sys.unraisablehook`. + If the *object* attribute of the unraisable hook is set and the object is + being finalized, the object is resurrected because the context manager + stores a strong reference to it (``cm.unraisable.object``). + + Storing the exception value (``cm.unraisable.exc_value``) creates a + reference cycle. The reference cycle is broken explicitly when the context + manager exits. + + Exiting the context manager clears the stored unraisable exception. It can + trigger a new unraisable exception (ex: the resurrected object is finalized + again and raises the same exception): it is silently ignored in this case. + Usage:: with support.catch_unraisable_exception() as cm: diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index d6ed2215f383..174e0456dc71 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -3040,6 +3040,18 @@ class catch_unraisable_exception: """ Context manager catching unraisable exception using sys.unraisablehook. + If the *object* attribute of the unraisable hook is set and the object is + being finalized, the object is resurrected because the context manager + stores a strong reference to it (cm.unraisable.object). + + Storing the exception value (cm.unraisable.exc_value) creates a reference + cycle. The reference cycle is broken explicitly when the context manager + exits. + + Exiting the context manager clears the stored unraisable exception. It can + trigger a new unraisable exception (ex: the resurrected object is finalized + again and raises the same exception): it is silently ignored in this case. + Usage: with support.catch_unraisable_exception() as cm: @@ -3058,6 +3070,8 @@ def __init__(self): self._old_hook = None def _hook(self, unraisable): + # Storing unraisable.object can resurrect an object which is being + # finalized. Storing unraisable.exc_value creates a reference cycle. self.unraisable = unraisable def __enter__(self): @@ -3066,6 +3080,10 @@ def __enter__(self): return self def __exit__(self, *exc_info): - # Clear the unraisable exception to explicitly break a reference cycle - del self.unraisable + # Clear the unraisable exception to explicitly break a reference cycle. + # It can call _hook() again: ignore the new unraisable exception in + # this case. + self.unraisable = None + sys.unraisablehook = self._old_hook + del self.unraisable diff --git a/Misc/NEWS.d/next/Tests/2019-06-13-12-19-56.bpo-37261.NuKFVo.rst b/Misc/NEWS.d/next/Tests/2019-06-13-12-19-56.bpo-37261.NuKFVo.rst new file mode 100644 index 000000000000..27ce78a70f2b --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-06-13-12-19-56.bpo-37261.NuKFVo.rst @@ -0,0 +1,3 @@ +Fix :func:`test.support.catch_unraisable_exception`: its __exit__() method +now ignores unraisable exception raised when clearing its ``unraisable`` +attribute. From webhook-mailer at python.org Thu Jun 13 09:22:58 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 13 Jun 2019 13:22:58 -0000 Subject: [Python-checkins] =?utf-8?q?bpo-36779=3A_time=2Etzname_returns_e?= =?utf-8?q?mpty_string_on_Windows_if_default_cod=E2=80=A6_=28GH-13073=29_?= =?utf-8?q?=28GH-14032=29?= Message-ID: https://github.com/python/cpython/commit/0a9baec16c17d261377fb8a31a57d8c397e25af6 commit: 0a9baec16c17d261377fb8a31a57d8c397e25af6 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Victor Stinner date: 2019-06-13T15:22:51+02:00 summary: bpo-36779: time.tzname returns empty string on Windows if default cod? (GH-13073) (GH-14032) Calling setlocale(LC_CTYPE, "") on a system where GetACP() returns CP_UTF8 results in empty strings in _tzname[]. This causes time.tzname to be an empty string. I have reported the bug to the UCRT team and will follow up, but it will take some time get a fix into production. In the meantime one possible workaround is to temporarily change the locale by calling setlocale(LC_CTYPE, "C") before calling _tzset and restore the current locale after if the GetACP() == CP_UTF8 or CP_UTF7 @zooba https://bugs.python.org/issue36779 (cherry picked from commit b4c7defe58695a6670a8fdeaef67a638bbb47e42) Co-authored-by: Paul Monson files: A Misc/NEWS.d/next/Windows/2019-06-11-15-41-34.bpo-36779.0TMw6f.rst M Modules/timemodule.c diff --git a/Misc/NEWS.d/next/Windows/2019-06-11-15-41-34.bpo-36779.0TMw6f.rst b/Misc/NEWS.d/next/Windows/2019-06-11-15-41-34.bpo-36779.0TMw6f.rst new file mode 100644 index 000000000000..618cfcae7b89 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2019-06-11-15-41-34.bpo-36779.0TMw6f.rst @@ -0,0 +1,2 @@ +Ensure ``time.tzname`` is correct on Windows when the active code page is +set to CP_UTF7 or CP_UTF8. diff --git a/Modules/timemodule.c b/Modules/timemodule.c index f991f31ee15e..bdc93a2b7ec1 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -1581,6 +1581,19 @@ init_timezone(PyObject *m) PyModule_AddIntConstant(m, "altzone", _Py_timezone-3600); #endif PyModule_AddIntConstant(m, "daylight", _Py_daylight); +#ifdef MS_WINDOWS + TIME_ZONE_INFORMATION tzinfo = {0}; + GetTimeZoneInformation(&tzinfo); + otz0 = PyUnicode_FromWideChar(tzinfo.StandardName, -1); + if (otz0 == NULL) { + return -1; + } + otz1 = PyUnicode_FromWideChar(tzinfo.DaylightName, -1); + if (otz1 == NULL) { + Py_DECREF(otz0); + return -1; + } +#else otz0 = PyUnicode_DecodeLocale(_Py_tzname[0], "surrogateescape"); if (otz0 == NULL) { return -1; @@ -1590,6 +1603,7 @@ init_timezone(PyObject *m) Py_DECREF(otz0); return -1; } +#endif // MS_WINDOWS PyObject *tzname_obj = Py_BuildValue("(NN)", otz0, otz1); if (tzname_obj == NULL) { return -1; From webhook-mailer at python.org Thu Jun 13 09:26:05 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 13 Jun 2019 13:26:05 -0000 Subject: [Python-checkins] bpo-37261: Fix support.catch_unraisable_exception() (GH-14052) Message-ID: https://github.com/python/cpython/commit/b4f5b212535e75503fc33513676837089037bb48 commit: b4f5b212535e75503fc33513676837089037bb48 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-13T06:25:59-07:00 summary: bpo-37261: Fix support.catch_unraisable_exception() (GH-14052) The __exit__() method of test.support.catch_unraisable_exception context manager now ignores unraisable exception raised when clearing self.unraisable attribute. (cherry picked from commit 6d22cc8e90ccb1e1965b1a4bc79456e2cc1e5a3e) Co-authored-by: Victor Stinner files: A Misc/NEWS.d/next/Tests/2019-06-13-12-19-56.bpo-37261.NuKFVo.rst M Doc/library/test.rst M Lib/test/support/__init__.py diff --git a/Doc/library/test.rst b/Doc/library/test.rst index b7a2595708d0..0a98c882465d 100644 --- a/Doc/library/test.rst +++ b/Doc/library/test.rst @@ -1086,6 +1086,18 @@ The :mod:`test.support` module defines the following functions: Context manager catching unraisable exception using :func:`sys.unraisablehook`. + If the *object* attribute of the unraisable hook is set and the object is + being finalized, the object is resurrected because the context manager + stores a strong reference to it (``cm.unraisable.object``). + + Storing the exception value (``cm.unraisable.exc_value``) creates a + reference cycle. The reference cycle is broken explicitly when the context + manager exits. + + Exiting the context manager clears the stored unraisable exception. It can + trigger a new unraisable exception (ex: the resurrected object is finalized + again and raises the same exception): it is silently ignored in this case. + Usage:: with support.catch_unraisable_exception() as cm: diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index d6ed2215f383..174e0456dc71 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -3040,6 +3040,18 @@ class catch_unraisable_exception: """ Context manager catching unraisable exception using sys.unraisablehook. + If the *object* attribute of the unraisable hook is set and the object is + being finalized, the object is resurrected because the context manager + stores a strong reference to it (cm.unraisable.object). + + Storing the exception value (cm.unraisable.exc_value) creates a reference + cycle. The reference cycle is broken explicitly when the context manager + exits. + + Exiting the context manager clears the stored unraisable exception. It can + trigger a new unraisable exception (ex: the resurrected object is finalized + again and raises the same exception): it is silently ignored in this case. + Usage: with support.catch_unraisable_exception() as cm: @@ -3058,6 +3070,8 @@ def __init__(self): self._old_hook = None def _hook(self, unraisable): + # Storing unraisable.object can resurrect an object which is being + # finalized. Storing unraisable.exc_value creates a reference cycle. self.unraisable = unraisable def __enter__(self): @@ -3066,6 +3080,10 @@ def __enter__(self): return self def __exit__(self, *exc_info): - # Clear the unraisable exception to explicitly break a reference cycle - del self.unraisable + # Clear the unraisable exception to explicitly break a reference cycle. + # It can call _hook() again: ignore the new unraisable exception in + # this case. + self.unraisable = None + sys.unraisablehook = self._old_hook + del self.unraisable diff --git a/Misc/NEWS.d/next/Tests/2019-06-13-12-19-56.bpo-37261.NuKFVo.rst b/Misc/NEWS.d/next/Tests/2019-06-13-12-19-56.bpo-37261.NuKFVo.rst new file mode 100644 index 000000000000..27ce78a70f2b --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-06-13-12-19-56.bpo-37261.NuKFVo.rst @@ -0,0 +1,3 @@ +Fix :func:`test.support.catch_unraisable_exception`: its __exit__() method +now ignores unraisable exception raised when clearing its ``unraisable`` +attribute. From webhook-mailer at python.org Thu Jun 13 09:42:56 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 13 Jun 2019 13:42:56 -0000 Subject: [Python-checkins] =?utf-8?q?bpo-36779=3A_time=2Etzname_returns_e?= =?utf-8?q?mpty_string_on_Windows_if_default_cod=E2=80=A6_=28GH-13073=29?= Message-ID: https://github.com/python/cpython/commit/6a433f5ae63de72a85d20b05ff826c6f72d529b7 commit: 6a433f5ae63de72a85d20b05ff826c6f72d529b7 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-13T06:42:46-07:00 summary: bpo-36779: time.tzname returns empty string on Windows if default cod? (GH-13073) Calling setlocale(LC_CTYPE, "") on a system where GetACP() returns CP_UTF8 results in empty strings in _tzname[]. This causes time.tzname to be an empty string. I have reported the bug to the UCRT team and will follow up, but it will take some time get a fix into production. In the meantime one possible workaround is to temporarily change the locale by calling setlocale(LC_CTYPE, "C") before calling _tzset and restore the current locale after if the GetACP() == CP_UTF8 or CP_UTF7 @zooba https://bugs.python.org/issue36779 (cherry picked from commit b4c7defe58695a6670a8fdeaef67a638bbb47e42) Co-authored-by: Paul Monson files: A Misc/NEWS.d/next/Windows/2019-06-11-15-41-34.bpo-36779.0TMw6f.rst M Modules/timemodule.c diff --git a/Misc/NEWS.d/next/Windows/2019-06-11-15-41-34.bpo-36779.0TMw6f.rst b/Misc/NEWS.d/next/Windows/2019-06-11-15-41-34.bpo-36779.0TMw6f.rst new file mode 100644 index 000000000000..618cfcae7b89 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2019-06-11-15-41-34.bpo-36779.0TMw6f.rst @@ -0,0 +1,2 @@ +Ensure ``time.tzname`` is correct on Windows when the active code page is +set to CP_UTF7 or CP_UTF8. diff --git a/Modules/timemodule.c b/Modules/timemodule.c index ae7de5b2c766..4c8e2cb2344b 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -1571,6 +1571,19 @@ init_timezone(PyObject *m) PyModule_AddIntConstant(m, "altzone", _Py_timezone-3600); #endif PyModule_AddIntConstant(m, "daylight", _Py_daylight); +#ifdef MS_WINDOWS + TIME_ZONE_INFORMATION tzinfo = {0}; + GetTimeZoneInformation(&tzinfo); + otz0 = PyUnicode_FromWideChar(tzinfo.StandardName, -1); + if (otz0 == NULL) { + return -1; + } + otz1 = PyUnicode_FromWideChar(tzinfo.DaylightName, -1); + if (otz1 == NULL) { + Py_DECREF(otz0); + return -1; + } +#else otz0 = PyUnicode_DecodeLocale(_Py_tzname[0], "surrogateescape"); if (otz0 == NULL) { return -1; @@ -1580,6 +1593,7 @@ init_timezone(PyObject *m) Py_DECREF(otz0); return -1; } +#endif // MS_WINDOWS PyObject *tzname_obj = Py_BuildValue("(NN)", otz0, otz1); if (tzname_obj == NULL) { return -1; From webhook-mailer at python.org Thu Jun 13 10:00:19 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 13 Jun 2019 14:00:19 -0000 Subject: [Python-checkins] bpo-6689: os.path.commonpath raises ValueError for different drives isn't documented (GH-14045) Message-ID: https://github.com/python/cpython/commit/95492032c48fef20b9c7076a23fe7e46927a4688 commit: 95492032c48fef20b9c7076a23fe7e46927a4688 branch: master author: Makdon committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-06-13T06:59:49-07:00 summary: bpo-6689: os.path.commonpath raises ValueError for different drives isn't documented (GH-14045) It would raise ValueError("Paths don't have the same drive") if the paths on different drivers, which is not documented. os.path.commonpath raises ValueError when the *paths* are in different drivers, but it is not documented. Update the document according @Windsooon 's suggestion. It actually raise ValueError according line 355 of [test of path](https://github.com/python/cpython/blob/master/Lib/test/test_ntpath.py) https://bugs.python.org/issue6689 files: M Doc/library/os.path.rst diff --git a/Doc/library/os.path.rst b/Doc/library/os.path.rst index 8e7ee8bfe784..a673b81278ea 100644 --- a/Doc/library/os.path.rst +++ b/Doc/library/os.path.rst @@ -87,9 +87,10 @@ the :mod:`glob` module.) .. function:: commonpath(paths) Return the longest common sub-path of each pathname in the sequence - *paths*. Raise :exc:`ValueError` if *paths* contains both absolute and relative - pathnames, or if *paths* is empty. Unlike :func:`commonprefix`, this - returns a valid path. + *paths*. Raise :exc:`ValueError` if *paths* contain both absolute + and relative pathnames, the *paths* are on the different drives or + if *paths* is empty. Unlike :func:`commonprefix`, this returns a + valid path. .. availability:: Unix, Windows. From webhook-mailer at python.org Thu Jun 13 10:13:16 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 13 Jun 2019 14:13:16 -0000 Subject: [Python-checkins] bpo-6689: os.path.commonpath raises ValueError for different drives isn't documented (GH-14045) Message-ID: https://github.com/python/cpython/commit/ec3839a215a68cf35ff1f90cb6823f67a5abdce3 commit: ec3839a215a68cf35ff1f90cb6823f67a5abdce3 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-13T07:12:49-07:00 summary: bpo-6689: os.path.commonpath raises ValueError for different drives isn't documented (GH-14045) It would raise ValueError("Paths don't have the same drive") if the paths on different drivers, which is not documented. os.path.commonpath raises ValueError when the *paths* are in different drivers, but it is not documented. Update the document according @Windsooon 's suggestion. It actually raise ValueError according line 355 of [test of path](https://github.com/python/cpython/blob/master/Lib/test/test_ntpath.py) https://bugs.python.org/issue6689 (cherry picked from commit 95492032c48fef20b9c7076a23fe7e46927a4688) Co-authored-by: Makdon files: M Doc/library/os.path.rst diff --git a/Doc/library/os.path.rst b/Doc/library/os.path.rst index 8e7ee8bfe784..a673b81278ea 100644 --- a/Doc/library/os.path.rst +++ b/Doc/library/os.path.rst @@ -87,9 +87,10 @@ the :mod:`glob` module.) .. function:: commonpath(paths) Return the longest common sub-path of each pathname in the sequence - *paths*. Raise :exc:`ValueError` if *paths* contains both absolute and relative - pathnames, or if *paths* is empty. Unlike :func:`commonprefix`, this - returns a valid path. + *paths*. Raise :exc:`ValueError` if *paths* contain both absolute + and relative pathnames, the *paths* are on the different drives or + if *paths* is empty. Unlike :func:`commonprefix`, this returns a + valid path. .. availability:: Unix, Windows. From webhook-mailer at python.org Thu Jun 13 14:16:28 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Thu, 13 Jun 2019 18:16:28 -0000 Subject: [Python-checkins] bpo-37213: Handle negative line deltas correctly in the peephole optimizer (GH-13969) Message-ID: https://github.com/python/cpython/commit/3498c642f4e83f3d8e2214654c0fa8e0d51cebe5 commit: 3498c642f4e83f3d8e2214654c0fa8e0d51cebe5 branch: master author: Pablo Galindo committer: GitHub date: 2019-06-13T19:16:22+01:00 summary: bpo-37213: Handle negative line deltas correctly in the peephole optimizer (GH-13969) The peephole optimizer was not optimizing correctly bytecode after negative deltas were introduced. This is due to the fact that some special values (255) were being searched for in both instruction pointer delta and line number deltas. files: A Misc/NEWS.d/next/Core and Builtins/2019-06-11-11-15-19.bpo-37213.UPii5K.rst M Lib/test/test_peepholer.py M Python/importlib.h M Python/importlib_external.h M Python/importlib_zipimport.h M Python/peephole.c diff --git a/Lib/test/test_peepholer.py b/Lib/test/test_peepholer.py index 794d104d5919..860ceeb003e7 100644 --- a/Lib/test/test_peepholer.py +++ b/Lib/test/test_peepholer.py @@ -1,5 +1,7 @@ import dis import unittest +import types +import textwrap from test.bytecode_helper import BytecodeTestCase @@ -18,6 +20,27 @@ def count_instr_recursively(f, opname): class TestTranforms(BytecodeTestCase): + def check_jump_targets(self, code): + instructions = list(dis.get_instructions(code)) + targets = {instr.offset: instr for instr in instructions} + for instr in instructions: + if 'JUMP_' not in instr.opname: + continue + tgt = targets[instr.argval] + # jump to unconditional jump + if tgt.opname in ('JUMP_ABSOLUTE', 'JUMP_FORWARD'): + self.fail(f'{instr.opname} at {instr.offset} ' + f'jumps to {tgt.opname} at {tgt.offset}') + # unconditional jump to RETURN_VALUE + if (instr.opname in ('JUMP_ABSOLUTE', 'JUMP_FORWARD') and + tgt.opname == 'RETURN_VALUE'): + self.fail(f'{instr.opname} at {instr.offset} ' + f'jumps to {tgt.opname} at {tgt.offset}') + # JUMP_IF_*_OR_POP jump to conditional jump + if '_OR_POP' in instr.opname and 'JUMP_IF_' in tgt.opname: + self.fail(f'{instr.opname} at {instr.offset} ' + f'jumps to {tgt.opname} at {tgt.offset}') + def test_unot(self): # UNARY_NOT POP_JUMP_IF_FALSE --> POP_JUMP_IF_TRUE' def unot(x): @@ -259,13 +282,69 @@ def f(x): def test_elim_jump_to_return(self): # JUMP_FORWARD to RETURN --> RETURN def f(cond, true_value, false_value): - return true_value if cond else false_value + # Intentionally use two-line expression to test issue37213. + return (true_value if cond + else false_value) + self.check_jump_targets(f) self.assertNotInBytecode(f, 'JUMP_FORWARD') self.assertNotInBytecode(f, 'JUMP_ABSOLUTE') returns = [instr for instr in dis.get_instructions(f) if instr.opname == 'RETURN_VALUE'] self.assertEqual(len(returns), 2) + def test_elim_jump_to_uncond_jump(self): + # POP_JUMP_IF_FALSE to JUMP_FORWARD --> POP_JUMP_IF_FALSE to non-jump + def f(): + if a: + # Intentionally use two-line expression to test issue37213. + if (c + or d): + foo() + else: + baz() + self.check_jump_targets(f) + + def test_elim_jump_to_uncond_jump2(self): + # POP_JUMP_IF_FALSE to JUMP_ABSOLUTE --> POP_JUMP_IF_FALSE to non-jump + def f(): + while a: + # Intentionally use two-line expression to test issue37213. + if (c + or d): + a = foo() + self.check_jump_targets(f) + + def test_elim_jump_to_uncond_jump3(self): + # Intentionally use two-line expressions to test issue37213. + # JUMP_IF_FALSE_OR_POP to JUMP_IF_FALSE_OR_POP --> JUMP_IF_FALSE_OR_POP to non-jump + def f(a, b, c): + return ((a and b) + and c) + self.check_jump_targets(f) + self.assertEqual(count_instr_recursively(f, 'JUMP_IF_FALSE_OR_POP'), 2) + # JUMP_IF_TRUE_OR_POP to JUMP_IF_TRUE_OR_POP --> JUMP_IF_TRUE_OR_POP to non-jump + def f(a, b, c): + return ((a or b) + or c) + self.check_jump_targets(f) + self.assertEqual(count_instr_recursively(f, 'JUMP_IF_TRUE_OR_POP'), 2) + # JUMP_IF_FALSE_OR_POP to JUMP_IF_TRUE_OR_POP --> POP_JUMP_IF_FALSE to non-jump + def f(a, b, c): + return ((a and b) + or c) + self.check_jump_targets(f) + self.assertNotInBytecode(f, 'JUMP_IF_FALSE_OR_POP') + self.assertInBytecode(f, 'JUMP_IF_TRUE_OR_POP') + self.assertInBytecode(f, 'POP_JUMP_IF_FALSE') + # JUMP_IF_TRUE_OR_POP to JUMP_IF_FALSE_OR_POP --> POP_JUMP_IF_TRUE to non-jump + def f(a, b, c): + return ((a or b) + and c) + self.check_jump_targets(f) + self.assertNotInBytecode(f, 'JUMP_IF_TRUE_OR_POP') + self.assertInBytecode(f, 'JUMP_IF_FALSE_OR_POP') + self.assertInBytecode(f, 'POP_JUMP_IF_TRUE') + def test_elim_jump_after_return1(self): # Eliminate dead code: jumps immediately after returns can't be reached def f(cond1, cond2): diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-06-11-11-15-19.bpo-37213.UPii5K.rst b/Misc/NEWS.d/next/Core and Builtins/2019-06-11-11-15-19.bpo-37213.UPii5K.rst new file mode 100644 index 000000000000..b949883da9c2 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-06-11-11-15-19.bpo-37213.UPii5K.rst @@ -0,0 +1,2 @@ +Handle correctly negative line offsets in the peephole optimizer. Patch by +Pablo Galindo. diff --git a/Python/importlib.h b/Python/importlib.h index 5bd1d179e2f0..a285a31e2065 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -670,1121 +670,1120 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 1,18,1,10,1,8,1,4,255,6,2,122,19,77,111,100, 117,108,101,83,112,101,99,46,95,95,114,101,112,114,95,95, 99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,8,0,0,0,67,0,0,0,115,114,0,0,0,124,0, - 106,0,125,2,122,76,124,0,106,1,124,1,106,1,107,2, + 0,8,0,0,0,67,0,0,0,115,106,0,0,0,124,0, + 106,0,125,2,122,72,124,0,106,1,124,1,106,1,107,2, 111,76,124,0,106,2,124,1,106,2,107,2,111,76,124,0, 106,3,124,1,106,3,107,2,111,76,124,2,124,1,106,0, 107,2,111,76,124,0,106,4,124,1,106,4,107,2,111,76, - 124,0,106,5,124,1,106,5,107,2,87,0,83,0,87,0, - 110,26,4,0,116,6,107,10,114,108,1,0,1,0,1,0, - 89,0,100,1,83,0,89,0,110,2,88,0,100,0,83,0, - 114,116,0,0,0,41,7,114,117,0,0,0,114,17,0,0, - 0,114,109,0,0,0,114,113,0,0,0,218,6,99,97,99, - 104,101,100,218,12,104,97,115,95,108,111,99,97,116,105,111, - 110,114,106,0,0,0,41,3,114,30,0,0,0,90,5,111, - 116,104,101,114,90,4,115,109,115,108,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,218,6,95,95,101,113,95, - 95,108,1,0,0,115,30,0,0,0,0,1,6,1,2,1, - 12,1,10,255,2,2,10,254,2,3,8,253,2,4,10,252, - 2,5,10,251,8,6,14,1,122,17,77,111,100,117,108,101, - 83,112,101,99,46,95,95,101,113,95,95,99,1,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0, - 67,0,0,0,115,58,0,0,0,124,0,106,0,100,0,107, - 8,114,52,124,0,106,1,100,0,107,9,114,52,124,0,106, - 2,114,52,116,3,100,0,107,8,114,38,116,4,130,1,116, - 3,160,5,124,0,106,1,161,1,124,0,95,0,124,0,106, - 0,83,0,114,13,0,0,0,41,6,114,119,0,0,0,114, - 113,0,0,0,114,118,0,0,0,218,19,95,98,111,111,116, - 115,116,114,97,112,95,101,120,116,101,114,110,97,108,218,19, - 78,111,116,73,109,112,108,101,109,101,110,116,101,100,69,114, - 114,111,114,90,11,95,103,101,116,95,99,97,99,104,101,100, - 114,47,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,114,123,0,0,0,120,1,0,0,115,12,0, - 0,0,0,2,10,1,16,1,8,1,4,1,14,1,122,17, - 77,111,100,117,108,101,83,112,101,99,46,99,97,99,104,101, - 100,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,2,0,0,0,67,0,0,0,115,10,0,0,0,124, - 1,124,0,95,0,100,0,83,0,114,13,0,0,0,41,1, - 114,119,0,0,0,41,2,114,30,0,0,0,114,123,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,123,0,0,0,129,1,0,0,115,2,0,0,0,0,2, - 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,3,0,0,0,67,0,0,0,115,36,0,0,0,124,0, - 106,0,100,1,107,8,114,26,124,0,106,1,160,2,100,2, - 161,1,100,3,25,0,83,0,124,0,106,1,83,0,100,1, - 83,0,41,4,122,32,84,104,101,32,110,97,109,101,32,111, - 102,32,116,104,101,32,109,111,100,117,108,101,39,115,32,112, - 97,114,101,110,116,46,78,218,1,46,114,22,0,0,0,41, - 3,114,117,0,0,0,114,17,0,0,0,218,10,114,112,97, - 114,116,105,116,105,111,110,114,47,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,218,6,112,97,114, - 101,110,116,133,1,0,0,115,6,0,0,0,0,3,10,1, - 16,2,122,17,77,111,100,117,108,101,83,112,101,99,46,112, - 97,114,101,110,116,99,1,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,1,0,0,0,67,0,0,0,115,6, - 0,0,0,124,0,106,0,83,0,114,13,0,0,0,41,1, - 114,118,0,0,0,114,47,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,124,0,0,0,141,1, - 0,0,115,2,0,0,0,0,2,122,23,77,111,100,117,108, - 101,83,112,101,99,46,104,97,115,95,108,111,99,97,116,105, - 111,110,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,2,0,0,0,67,0,0,0,115,14,0,0,0, - 116,0,124,1,131,1,124,0,95,1,100,0,83,0,114,13, - 0,0,0,41,2,218,4,98,111,111,108,114,118,0,0,0, - 41,2,114,30,0,0,0,218,5,118,97,108,117,101,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,124,0, - 0,0,145,1,0,0,115,2,0,0,0,0,2,41,12,114, - 1,0,0,0,114,0,0,0,0,114,2,0,0,0,114,3, - 0,0,0,114,31,0,0,0,114,48,0,0,0,114,125,0, - 0,0,218,8,112,114,111,112,101,114,116,121,114,123,0,0, - 0,218,6,115,101,116,116,101,114,114,130,0,0,0,114,124, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,112,0,0,0,49,1,0,0, - 115,32,0,0,0,8,1,4,36,4,1,2,255,12,12,8, - 10,8,12,2,1,10,8,4,1,10,3,2,1,10,7,2, - 1,10,3,4,1,114,112,0,0,0,169,2,114,113,0,0, - 0,114,115,0,0,0,99,2,0,0,0,0,0,0,0,2, - 0,0,0,6,0,0,0,8,0,0,0,67,0,0,0,115, - 154,0,0,0,116,0,124,1,100,1,131,2,114,74,116,1, - 100,2,107,8,114,22,116,2,130,1,116,1,106,3,125,4, - 124,3,100,2,107,8,114,48,124,4,124,0,124,1,100,3, - 141,2,83,0,124,3,114,56,103,0,110,2,100,2,125,5, - 124,4,124,0,124,1,124,5,100,4,141,3,83,0,124,3, - 100,2,107,8,114,138,116,0,124,1,100,5,131,2,114,134, - 122,14,124,1,160,4,124,0,161,1,125,3,87,0,110,24, - 4,0,116,5,107,10,114,130,1,0,1,0,1,0,100,2, - 125,3,89,0,110,2,88,0,110,4,100,6,125,3,116,6, - 124,0,124,1,124,2,124,3,100,7,141,4,83,0,41,8, - 122,53,82,101,116,117,114,110,32,97,32,109,111,100,117,108, - 101,32,115,112,101,99,32,98,97,115,101,100,32,111,110,32, - 118,97,114,105,111,117,115,32,108,111,97,100,101,114,32,109, - 101,116,104,111,100,115,46,90,12,103,101,116,95,102,105,108, - 101,110,97,109,101,78,41,1,114,109,0,0,0,41,2,114, - 109,0,0,0,114,117,0,0,0,114,115,0,0,0,70,114, - 135,0,0,0,41,7,114,4,0,0,0,114,126,0,0,0, - 114,127,0,0,0,218,23,115,112,101,99,95,102,114,111,109, - 95,102,105,108,101,95,108,111,99,97,116,105,111,110,114,115, - 0,0,0,114,79,0,0,0,114,112,0,0,0,41,6,114, - 17,0,0,0,114,109,0,0,0,114,113,0,0,0,114,115, - 0,0,0,114,136,0,0,0,90,6,115,101,97,114,99,104, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 91,0,0,0,150,1,0,0,115,36,0,0,0,0,2,10, - 1,8,1,4,1,6,2,8,1,12,1,12,1,6,1,2, - 255,6,3,8,1,10,1,2,1,14,1,14,1,12,3,4, - 2,114,91,0,0,0,99,3,0,0,0,0,0,0,0,0, - 0,0,0,8,0,0,0,8,0,0,0,67,0,0,0,115, - 56,1,0,0,122,10,124,0,106,0,125,3,87,0,110,20, - 4,0,116,1,107,10,114,30,1,0,1,0,1,0,89,0, - 110,14,88,0,124,3,100,0,107,9,114,44,124,3,83,0, - 124,0,106,2,125,4,124,1,100,0,107,8,114,90,122,10, - 124,0,106,3,125,1,87,0,110,20,4,0,116,1,107,10, - 114,88,1,0,1,0,1,0,89,0,110,2,88,0,122,10, - 124,0,106,4,125,5,87,0,110,24,4,0,116,1,107,10, - 114,124,1,0,1,0,1,0,100,0,125,5,89,0,110,2, - 88,0,124,2,100,0,107,8,114,184,124,5,100,0,107,8, - 114,180,122,10,124,1,106,5,125,2,87,0,113,184,4,0, - 116,1,107,10,114,176,1,0,1,0,1,0,100,0,125,2, - 89,0,113,184,88,0,110,4,124,5,125,2,122,10,124,0, - 106,6,125,6,87,0,110,24,4,0,116,1,107,10,114,218, - 1,0,1,0,1,0,100,0,125,6,89,0,110,2,88,0, - 122,14,116,7,124,0,106,8,131,1,125,7,87,0,110,26, - 4,0,116,1,107,10,144,1,114,4,1,0,1,0,1,0, - 100,0,125,7,89,0,110,2,88,0,116,9,124,4,124,1, - 124,2,100,1,141,3,125,3,124,5,100,0,107,8,144,1, - 114,34,100,2,110,2,100,3,124,3,95,10,124,6,124,3, - 95,11,124,7,124,3,95,12,124,3,83,0,41,4,78,169, - 1,114,113,0,0,0,70,84,41,13,114,105,0,0,0,114, - 106,0,0,0,114,1,0,0,0,114,98,0,0,0,114,108, - 0,0,0,218,7,95,79,82,73,71,73,78,218,10,95,95, - 99,97,99,104,101,100,95,95,218,4,108,105,115,116,218,8, - 95,95,112,97,116,104,95,95,114,112,0,0,0,114,118,0, - 0,0,114,123,0,0,0,114,117,0,0,0,41,8,114,96, - 0,0,0,114,109,0,0,0,114,113,0,0,0,114,95,0, - 0,0,114,17,0,0,0,90,8,108,111,99,97,116,105,111, - 110,114,123,0,0,0,114,117,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,218,17,95,115,112,101, - 99,95,102,114,111,109,95,109,111,100,117,108,101,176,1,0, - 0,115,72,0,0,0,0,2,2,1,10,1,14,1,6,2, - 8,1,4,2,6,1,8,1,2,1,10,1,14,2,6,1, - 2,1,10,1,14,1,10,1,8,1,8,1,2,1,10,1, - 14,1,12,2,4,1,2,1,10,1,14,1,10,1,2,1, - 14,1,16,1,10,2,14,1,20,1,6,1,6,1,114,142, - 0,0,0,70,169,1,218,8,111,118,101,114,114,105,100,101, - 99,2,0,0,0,0,0,0,0,1,0,0,0,5,0,0, - 0,8,0,0,0,67,0,0,0,115,226,1,0,0,124,2, - 115,20,116,0,124,1,100,1,100,0,131,3,100,0,107,8, - 114,54,122,12,124,0,106,1,124,1,95,2,87,0,110,20, - 4,0,116,3,107,10,114,52,1,0,1,0,1,0,89,0, - 110,2,88,0,124,2,115,74,116,0,124,1,100,2,100,0, - 131,3,100,0,107,8,114,178,124,0,106,4,125,3,124,3, - 100,0,107,8,114,146,124,0,106,5,100,0,107,9,114,146, - 116,6,100,0,107,8,114,110,116,7,130,1,116,6,106,8, - 125,4,124,4,160,9,124,4,161,1,125,3,124,0,106,5, - 124,3,95,10,124,3,124,0,95,4,100,0,124,1,95,11, - 122,10,124,3,124,1,95,12,87,0,110,20,4,0,116,3, - 107,10,114,176,1,0,1,0,1,0,89,0,110,2,88,0, - 124,2,115,198,116,0,124,1,100,3,100,0,131,3,100,0, - 107,8,114,232,122,12,124,0,106,13,124,1,95,14,87,0, - 110,20,4,0,116,3,107,10,114,230,1,0,1,0,1,0, - 89,0,110,2,88,0,122,10,124,0,124,1,95,15,87,0, - 110,22,4,0,116,3,107,10,144,1,114,8,1,0,1,0, - 1,0,89,0,110,2,88,0,124,2,144,1,115,34,116,0, - 124,1,100,4,100,0,131,3,100,0,107,8,144,1,114,82, - 124,0,106,5,100,0,107,9,144,1,114,82,122,12,124,0, - 106,5,124,1,95,16,87,0,110,22,4,0,116,3,107,10, - 144,1,114,80,1,0,1,0,1,0,89,0,110,2,88,0, - 124,0,106,17,144,1,114,222,124,2,144,1,115,114,116,0, - 124,1,100,5,100,0,131,3,100,0,107,8,144,1,114,150, - 122,12,124,0,106,18,124,1,95,11,87,0,110,22,4,0, - 116,3,107,10,144,1,114,148,1,0,1,0,1,0,89,0, - 110,2,88,0,124,2,144,1,115,174,116,0,124,1,100,6, - 100,0,131,3,100,0,107,8,144,1,114,222,124,0,106,19, - 100,0,107,9,144,1,114,222,122,12,124,0,106,19,124,1, - 95,20,87,0,110,22,4,0,116,3,107,10,144,1,114,220, - 1,0,1,0,1,0,89,0,110,2,88,0,124,1,83,0, - 41,7,78,114,1,0,0,0,114,98,0,0,0,218,11,95, - 95,112,97,99,107,97,103,101,95,95,114,141,0,0,0,114, - 108,0,0,0,114,139,0,0,0,41,21,114,6,0,0,0, - 114,17,0,0,0,114,1,0,0,0,114,106,0,0,0,114, - 109,0,0,0,114,117,0,0,0,114,126,0,0,0,114,127, - 0,0,0,218,16,95,78,97,109,101,115,112,97,99,101,76, - 111,97,100,101,114,218,7,95,95,110,101,119,95,95,90,5, - 95,112,97,116,104,114,108,0,0,0,114,98,0,0,0,114, - 130,0,0,0,114,145,0,0,0,114,105,0,0,0,114,141, - 0,0,0,114,124,0,0,0,114,113,0,0,0,114,123,0, - 0,0,114,139,0,0,0,41,5,114,95,0,0,0,114,96, - 0,0,0,114,144,0,0,0,114,109,0,0,0,114,146,0, + 124,0,106,5,124,1,106,5,107,2,87,0,83,0,4,0, + 116,6,107,10,114,100,1,0,1,0,1,0,89,0,100,1, + 83,0,88,0,100,0,83,0,114,116,0,0,0,41,7,114, + 117,0,0,0,114,17,0,0,0,114,109,0,0,0,114,113, + 0,0,0,218,6,99,97,99,104,101,100,218,12,104,97,115, + 95,108,111,99,97,116,105,111,110,114,106,0,0,0,41,3, + 114,30,0,0,0,90,5,111,116,104,101,114,90,4,115,109, + 115,108,114,10,0,0,0,114,10,0,0,0,114,11,0,0, + 0,218,6,95,95,101,113,95,95,108,1,0,0,115,30,0, + 0,0,0,1,6,1,2,1,12,1,10,255,2,2,10,254, + 2,3,8,253,2,4,10,252,2,5,10,251,4,6,14,1, + 122,17,77,111,100,117,108,101,83,112,101,99,46,95,95,101, + 113,95,95,99,1,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,0,3,0,0,0,67,0,0,0,115,58,0,0, + 0,124,0,106,0,100,0,107,8,114,52,124,0,106,1,100, + 0,107,9,114,52,124,0,106,2,114,52,116,3,100,0,107, + 8,114,38,116,4,130,1,116,3,160,5,124,0,106,1,161, + 1,124,0,95,0,124,0,106,0,83,0,114,13,0,0,0, + 41,6,114,119,0,0,0,114,113,0,0,0,114,118,0,0, + 0,218,19,95,98,111,111,116,115,116,114,97,112,95,101,120, + 116,101,114,110,97,108,218,19,78,111,116,73,109,112,108,101, + 109,101,110,116,101,100,69,114,114,111,114,90,11,95,103,101, + 116,95,99,97,99,104,101,100,114,47,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,114,123,0,0, + 0,120,1,0,0,115,12,0,0,0,0,2,10,1,16,1, + 8,1,4,1,14,1,122,17,77,111,100,117,108,101,83,112, + 101,99,46,99,97,99,104,101,100,99,2,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,2,0,0,0,67,0, + 0,0,115,10,0,0,0,124,1,124,0,95,0,100,0,83, + 0,114,13,0,0,0,41,1,114,119,0,0,0,41,2,114, + 30,0,0,0,114,123,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,123,0,0,0,129,1,0, + 0,115,2,0,0,0,0,2,99,1,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, + 0,115,36,0,0,0,124,0,106,0,100,1,107,8,114,26, + 124,0,106,1,160,2,100,2,161,1,100,3,25,0,83,0, + 124,0,106,1,83,0,100,1,83,0,41,4,122,32,84,104, + 101,32,110,97,109,101,32,111,102,32,116,104,101,32,109,111, + 100,117,108,101,39,115,32,112,97,114,101,110,116,46,78,218, + 1,46,114,22,0,0,0,41,3,114,117,0,0,0,114,17, + 0,0,0,218,10,114,112,97,114,116,105,116,105,111,110,114, + 47,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,218,6,112,97,114,101,110,116,133,1,0,0,115, + 6,0,0,0,0,3,10,1,16,2,122,17,77,111,100,117, + 108,101,83,112,101,99,46,112,97,114,101,110,116,99,1,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0, + 0,0,67,0,0,0,115,6,0,0,0,124,0,106,0,83, + 0,114,13,0,0,0,41,1,114,118,0,0,0,114,47,0, 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,218,18,95,105,110,105,116,95,109,111,100,117,108,101,95, - 97,116,116,114,115,221,1,0,0,115,96,0,0,0,0,4, - 20,1,2,1,12,1,14,1,6,2,20,1,6,1,8,2, - 10,1,8,1,4,1,6,2,10,1,8,1,6,11,6,1, - 2,1,10,1,14,1,6,2,20,1,2,1,12,1,14,1, - 6,2,2,1,10,1,16,1,6,2,24,1,12,1,2,1, - 12,1,16,1,6,2,8,1,24,1,2,1,12,1,16,1, - 6,2,24,1,12,1,2,1,12,1,16,1,6,1,114,148, - 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,3,0,0,0,67,0,0,0,115,82,0,0, - 0,100,1,125,1,116,0,124,0,106,1,100,2,131,2,114, - 30,124,0,106,1,160,2,124,0,161,1,125,1,110,20,116, - 0,124,0,106,1,100,3,131,2,114,50,116,3,100,4,131, - 1,130,1,124,1,100,1,107,8,114,68,116,4,124,0,106, - 5,131,1,125,1,116,6,124,0,124,1,131,2,1,0,124, - 1,83,0,41,5,122,43,67,114,101,97,116,101,32,97,32, - 109,111,100,117,108,101,32,98,97,115,101,100,32,111,110,32, - 116,104,101,32,112,114,111,118,105,100,101,100,32,115,112,101, - 99,46,78,218,13,99,114,101,97,116,101,95,109,111,100,117, - 108,101,218,11,101,120,101,99,95,109,111,100,117,108,101,122, - 66,108,111,97,100,101,114,115,32,116,104,97,116,32,100,101, - 102,105,110,101,32,101,120,101,99,95,109,111,100,117,108,101, - 40,41,32,109,117,115,116,32,97,108,115,111,32,100,101,102, - 105,110,101,32,99,114,101,97,116,101,95,109,111,100,117,108, - 101,40,41,41,7,114,4,0,0,0,114,109,0,0,0,114, - 149,0,0,0,114,79,0,0,0,114,18,0,0,0,114,17, - 0,0,0,114,148,0,0,0,169,2,114,95,0,0,0,114, - 96,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,218,16,109,111,100,117,108,101,95,102,114,111,109, - 95,115,112,101,99,37,2,0,0,115,18,0,0,0,0,3, - 4,1,12,3,14,1,12,1,8,2,8,1,10,1,10,1, - 114,152,0,0,0,99,1,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,4,0,0,0,67,0,0,0,115,106, - 0,0,0,124,0,106,0,100,1,107,8,114,14,100,2,110, - 4,124,0,106,0,125,1,124,0,106,1,100,1,107,8,114, - 66,124,0,106,2,100,1,107,8,114,50,100,3,160,3,124, - 1,161,1,83,0,100,4,160,3,124,1,124,0,106,2,161, - 2,83,0,110,36,124,0,106,4,114,86,100,5,160,3,124, - 1,124,0,106,1,161,2,83,0,100,6,160,3,124,0,106, - 0,124,0,106,1,161,2,83,0,100,1,83,0,41,7,122, - 38,82,101,116,117,114,110,32,116,104,101,32,114,101,112,114, - 32,116,111,32,117,115,101,32,102,111,114,32,116,104,101,32, - 109,111,100,117,108,101,46,78,114,100,0,0,0,114,101,0, - 0,0,114,102,0,0,0,114,103,0,0,0,250,18,60,109, - 111,100,117,108,101,32,123,33,114,125,32,40,123,125,41,62, - 41,5,114,17,0,0,0,114,113,0,0,0,114,109,0,0, - 0,114,45,0,0,0,114,124,0,0,0,41,2,114,95,0, - 0,0,114,17,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,107,0,0,0,54,2,0,0,115, - 16,0,0,0,0,3,20,1,10,1,10,1,10,2,16,2, - 6,1,14,2,114,107,0,0,0,99,2,0,0,0,0,0, - 0,0,0,0,0,0,4,0,0,0,10,0,0,0,67,0, - 0,0,115,204,0,0,0,124,0,106,0,125,2,116,1,124, - 2,131,1,143,180,1,0,116,2,106,3,160,4,124,2,161, - 1,124,1,107,9,114,54,100,1,160,5,124,2,161,1,125, - 3,116,6,124,3,124,2,100,2,141,2,130,1,122,106,124, - 0,106,7,100,3,107,8,114,106,124,0,106,8,100,3,107, - 8,114,90,116,6,100,4,124,0,106,0,100,2,141,2,130, - 1,116,9,124,0,124,1,100,5,100,6,141,3,1,0,110, - 52,116,9,124,0,124,1,100,5,100,6,141,3,1,0,116, - 10,124,0,106,7,100,7,131,2,115,146,124,0,106,7,160, - 11,124,2,161,1,1,0,110,12,124,0,106,7,160,12,124, - 1,161,1,1,0,87,0,53,0,116,2,106,3,160,13,124, - 0,106,0,161,1,125,1,124,1,116,2,106,3,124,0,106, - 0,60,0,88,0,87,0,53,0,81,0,82,0,88,0,124, - 1,83,0,41,8,122,70,69,120,101,99,117,116,101,32,116, - 104,101,32,115,112,101,99,39,115,32,115,112,101,99,105,102, - 105,101,100,32,109,111,100,117,108,101,32,105,110,32,97,110, - 32,101,120,105,115,116,105,110,103,32,109,111,100,117,108,101, - 39,115,32,110,97,109,101,115,112,97,99,101,46,122,30,109, - 111,100,117,108,101,32,123,33,114,125,32,110,111,116,32,105, - 110,32,115,121,115,46,109,111,100,117,108,101,115,114,16,0, - 0,0,78,250,14,109,105,115,115,105,110,103,32,108,111,97, - 100,101,114,84,114,143,0,0,0,114,150,0,0,0,41,14, - 114,17,0,0,0,114,50,0,0,0,114,15,0,0,0,114, - 92,0,0,0,114,34,0,0,0,114,45,0,0,0,114,79, - 0,0,0,114,109,0,0,0,114,117,0,0,0,114,148,0, - 0,0,114,4,0,0,0,218,11,108,111,97,100,95,109,111, - 100,117,108,101,114,150,0,0,0,218,3,112,111,112,41,4, - 114,95,0,0,0,114,96,0,0,0,114,17,0,0,0,218, - 3,109,115,103,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,93,0,0,0,71,2,0,0,115,34,0,0, - 0,0,2,6,1,10,1,16,1,10,1,12,1,2,1,10, - 1,10,1,14,2,16,2,14,1,12,4,14,2,16,4,14, - 1,24,1,114,93,0,0,0,99,1,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,8,0,0,0,67,0,0, - 0,115,26,1,0,0,122,18,124,0,106,0,160,1,124,0, - 106,2,161,1,1,0,87,0,110,52,1,0,1,0,1,0, - 124,0,106,2,116,3,106,4,107,6,114,64,116,3,106,4, - 160,5,124,0,106,2,161,1,125,1,124,1,116,3,106,4, - 124,0,106,2,60,0,130,0,89,0,110,2,88,0,116,3, - 106,4,160,5,124,0,106,2,161,1,125,1,124,1,116,3, - 106,4,124,0,106,2,60,0,116,6,124,1,100,1,100,0, - 131,3,100,0,107,8,114,148,122,12,124,0,106,0,124,1, - 95,7,87,0,110,20,4,0,116,8,107,10,114,146,1,0, - 1,0,1,0,89,0,110,2,88,0,116,6,124,1,100,2, - 100,0,131,3,100,0,107,8,114,226,122,40,124,1,106,9, - 124,1,95,10,116,11,124,1,100,3,131,2,115,202,124,0, - 106,2,160,12,100,4,161,1,100,5,25,0,124,1,95,10, - 87,0,110,20,4,0,116,8,107,10,114,224,1,0,1,0, - 1,0,89,0,110,2,88,0,116,6,124,1,100,6,100,0, - 131,3,100,0,107,8,144,1,114,22,122,10,124,0,124,1, - 95,13,87,0,110,22,4,0,116,8,107,10,144,1,114,20, - 1,0,1,0,1,0,89,0,110,2,88,0,124,1,83,0, - 41,7,78,114,98,0,0,0,114,145,0,0,0,114,141,0, - 0,0,114,128,0,0,0,114,22,0,0,0,114,105,0,0, - 0,41,14,114,109,0,0,0,114,155,0,0,0,114,17,0, - 0,0,114,15,0,0,0,114,92,0,0,0,114,156,0,0, - 0,114,6,0,0,0,114,98,0,0,0,114,106,0,0,0, - 114,1,0,0,0,114,145,0,0,0,114,4,0,0,0,114, - 129,0,0,0,114,105,0,0,0,114,151,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,218,25,95, - 108,111,97,100,95,98,97,99,107,119,97,114,100,95,99,111, - 109,112,97,116,105,98,108,101,101,2,0,0,115,54,0,0, - 0,0,4,2,1,18,1,6,1,12,1,14,1,12,1,8, - 3,14,1,12,1,16,1,2,1,12,1,14,1,6,1,16, - 1,2,4,8,1,10,1,22,1,14,1,6,1,18,1,2, - 1,10,1,16,1,6,1,114,158,0,0,0,99,1,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,11,0,0, - 0,67,0,0,0,115,220,0,0,0,124,0,106,0,100,0, - 107,9,114,30,116,1,124,0,106,0,100,1,131,2,115,30, - 116,2,124,0,131,1,83,0,116,3,124,0,131,1,125,1, - 100,2,124,0,95,4,122,162,124,1,116,5,106,6,124,0, - 106,7,60,0,122,52,124,0,106,0,100,0,107,8,114,96, - 124,0,106,8,100,0,107,8,114,108,116,9,100,3,124,0, - 106,7,100,4,141,2,130,1,110,12,124,0,106,0,160,10, - 124,1,161,1,1,0,87,0,110,50,1,0,1,0,1,0, - 122,14,116,5,106,6,124,0,106,7,61,0,87,0,110,20, - 4,0,116,11,107,10,114,152,1,0,1,0,1,0,89,0, - 110,2,88,0,130,0,89,0,110,2,88,0,116,5,106,6, - 160,12,124,0,106,7,161,1,125,1,124,1,116,5,106,6, - 124,0,106,7,60,0,116,13,100,5,124,0,106,7,124,0, - 106,0,131,3,1,0,87,0,53,0,100,6,124,0,95,4, - 88,0,124,1,83,0,41,7,78,114,150,0,0,0,84,114, - 154,0,0,0,114,16,0,0,0,122,18,105,109,112,111,114, - 116,32,123,33,114,125,32,35,32,123,33,114,125,70,41,14, - 114,109,0,0,0,114,4,0,0,0,114,158,0,0,0,114, - 152,0,0,0,90,13,95,105,110,105,116,105,97,108,105,122, - 105,110,103,114,15,0,0,0,114,92,0,0,0,114,17,0, - 0,0,114,117,0,0,0,114,79,0,0,0,114,150,0,0, - 0,114,63,0,0,0,114,156,0,0,0,114,76,0,0,0, - 114,151,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,218,14,95,108,111,97,100,95,117,110,108,111, - 99,107,101,100,138,2,0,0,115,46,0,0,0,0,2,10, - 2,12,1,8,2,8,5,6,1,2,1,12,1,2,1,10, - 1,10,1,16,3,16,1,6,1,2,1,14,1,14,1,6, - 1,8,5,14,1,12,1,20,2,8,2,114,159,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,10,0,0,0,67,0,0,0,115,42,0,0,0,116,0, - 124,0,106,1,131,1,143,22,1,0,116,2,124,0,131,1, - 87,0,2,0,53,0,81,0,82,0,163,0,83,0,81,0, - 82,0,88,0,100,1,83,0,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,50, - 0,0,0,114,17,0,0,0,114,159,0,0,0,41,1,114, - 95,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,94,0,0,0,180,2,0,0,115,4,0,0, - 0,0,9,12,1,114,94,0,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,64, - 0,0,0,115,136,0,0,0,101,0,90,1,100,0,90,2, - 100,1,90,3,101,4,100,2,100,3,132,0,131,1,90,5, - 101,6,100,19,100,5,100,6,132,1,131,1,90,7,101,6, - 100,20,100,7,100,8,132,1,131,1,90,8,101,6,100,9, - 100,10,132,0,131,1,90,9,101,6,100,11,100,12,132,0, - 131,1,90,10,101,6,101,11,100,13,100,14,132,0,131,1, - 131,1,90,12,101,6,101,11,100,15,100,16,132,0,131,1, - 131,1,90,13,101,6,101,11,100,17,100,18,132,0,131,1, - 131,1,90,14,101,6,101,15,131,1,90,16,100,4,83,0, - 41,21,218,15,66,117,105,108,116,105,110,73,109,112,111,114, - 116,101,114,122,144,77,101,116,97,32,112,97,116,104,32,105, - 109,112,111,114,116,32,102,111,114,32,98,117,105,108,116,45, - 105,110,32,109,111,100,117,108,101,115,46,10,10,32,32,32, - 32,65,108,108,32,109,101,116,104,111,100,115,32,97,114,101, - 32,101,105,116,104,101,114,32,99,108,97,115,115,32,111,114, - 32,115,116,97,116,105,99,32,109,101,116,104,111,100,115,32, - 116,111,32,97,118,111,105,100,32,116,104,101,32,110,101,101, - 100,32,116,111,10,32,32,32,32,105,110,115,116,97,110,116, - 105,97,116,101,32,116,104,101,32,99,108,97,115,115,46,10, - 10,32,32,32,32,99,1,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,3,0,0,0,67,0,0,0,115,12, - 0,0,0,100,1,160,0,124,0,106,1,161,1,83,0,41, - 2,250,115,82,101,116,117,114,110,32,114,101,112,114,32,102, - 111,114,32,116,104,101,32,109,111,100,117,108,101,46,10,10, - 32,32,32,32,32,32,32,32,84,104,101,32,109,101,116,104, - 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, - 46,32,32,84,104,101,32,105,109,112,111,114,116,32,109,97, - 99,104,105,110,101,114,121,32,100,111,101,115,32,116,104,101, - 32,106,111,98,32,105,116,115,101,108,102,46,10,10,32,32, - 32,32,32,32,32,32,122,24,60,109,111,100,117,108,101,32, - 123,33,114,125,32,40,98,117,105,108,116,45,105,110,41,62, - 41,2,114,45,0,0,0,114,1,0,0,0,41,1,114,96, + 0,114,124,0,0,0,141,1,0,0,115,2,0,0,0,0, + 2,122,23,77,111,100,117,108,101,83,112,101,99,46,104,97, + 115,95,108,111,99,97,116,105,111,110,99,2,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,67, + 0,0,0,115,14,0,0,0,116,0,124,1,131,1,124,0, + 95,1,100,0,83,0,114,13,0,0,0,41,2,218,4,98, + 111,111,108,114,118,0,0,0,41,2,114,30,0,0,0,218, + 5,118,97,108,117,101,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,124,0,0,0,145,1,0,0,115,2, + 0,0,0,0,2,41,12,114,1,0,0,0,114,0,0,0, + 0,114,2,0,0,0,114,3,0,0,0,114,31,0,0,0, + 114,48,0,0,0,114,125,0,0,0,218,8,112,114,111,112, + 101,114,116,121,114,123,0,0,0,218,6,115,101,116,116,101, + 114,114,130,0,0,0,114,124,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, + 112,0,0,0,49,1,0,0,115,32,0,0,0,8,1,4, + 36,4,1,2,255,12,12,8,10,8,12,2,1,10,8,4, + 1,10,3,2,1,10,7,2,1,10,3,4,1,114,112,0, + 0,0,169,2,114,113,0,0,0,114,115,0,0,0,99,2, + 0,0,0,0,0,0,0,2,0,0,0,6,0,0,0,8, + 0,0,0,67,0,0,0,115,154,0,0,0,116,0,124,1, + 100,1,131,2,114,74,116,1,100,2,107,8,114,22,116,2, + 130,1,116,1,106,3,125,4,124,3,100,2,107,8,114,48, + 124,4,124,0,124,1,100,3,141,2,83,0,124,3,114,56, + 103,0,110,2,100,2,125,5,124,4,124,0,124,1,124,5, + 100,4,141,3,83,0,124,3,100,2,107,8,114,138,116,0, + 124,1,100,5,131,2,114,134,122,14,124,1,160,4,124,0, + 161,1,125,3,87,0,113,138,4,0,116,5,107,10,114,130, + 1,0,1,0,1,0,100,2,125,3,89,0,113,138,88,0, + 110,4,100,6,125,3,116,6,124,0,124,1,124,2,124,3, + 100,7,141,4,83,0,41,8,122,53,82,101,116,117,114,110, + 32,97,32,109,111,100,117,108,101,32,115,112,101,99,32,98, + 97,115,101,100,32,111,110,32,118,97,114,105,111,117,115,32, + 108,111,97,100,101,114,32,109,101,116,104,111,100,115,46,90, + 12,103,101,116,95,102,105,108,101,110,97,109,101,78,41,1, + 114,109,0,0,0,41,2,114,109,0,0,0,114,117,0,0, + 0,114,115,0,0,0,70,114,135,0,0,0,41,7,114,4, + 0,0,0,114,126,0,0,0,114,127,0,0,0,218,23,115, + 112,101,99,95,102,114,111,109,95,102,105,108,101,95,108,111, + 99,97,116,105,111,110,114,115,0,0,0,114,79,0,0,0, + 114,112,0,0,0,41,6,114,17,0,0,0,114,109,0,0, + 0,114,113,0,0,0,114,115,0,0,0,114,136,0,0,0, + 90,6,115,101,97,114,99,104,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,91,0,0,0,150,1,0,0, + 115,36,0,0,0,0,2,10,1,8,1,4,1,6,2,8, + 1,12,1,12,1,6,1,2,255,6,3,8,1,10,1,2, + 1,14,1,14,1,12,3,4,2,114,91,0,0,0,99,3, + 0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,8, + 0,0,0,67,0,0,0,115,56,1,0,0,122,10,124,0, + 106,0,125,3,87,0,110,20,4,0,116,1,107,10,114,30, + 1,0,1,0,1,0,89,0,110,14,88,0,124,3,100,0, + 107,9,114,44,124,3,83,0,124,0,106,2,125,4,124,1, + 100,0,107,8,114,90,122,10,124,0,106,3,125,1,87,0, + 110,20,4,0,116,1,107,10,114,88,1,0,1,0,1,0, + 89,0,110,2,88,0,122,10,124,0,106,4,125,5,87,0, + 110,24,4,0,116,1,107,10,114,124,1,0,1,0,1,0, + 100,0,125,5,89,0,110,2,88,0,124,2,100,0,107,8, + 114,184,124,5,100,0,107,8,114,180,122,10,124,1,106,5, + 125,2,87,0,113,184,4,0,116,1,107,10,114,176,1,0, + 1,0,1,0,100,0,125,2,89,0,113,184,88,0,110,4, + 124,5,125,2,122,10,124,0,106,6,125,6,87,0,110,24, + 4,0,116,1,107,10,114,218,1,0,1,0,1,0,100,0, + 125,6,89,0,110,2,88,0,122,14,116,7,124,0,106,8, + 131,1,125,7,87,0,110,26,4,0,116,1,107,10,144,1, + 114,4,1,0,1,0,1,0,100,0,125,7,89,0,110,2, + 88,0,116,9,124,4,124,1,124,2,100,1,141,3,125,3, + 124,5,100,0,107,8,144,1,114,34,100,2,110,2,100,3, + 124,3,95,10,124,6,124,3,95,11,124,7,124,3,95,12, + 124,3,83,0,41,4,78,169,1,114,113,0,0,0,70,84, + 41,13,114,105,0,0,0,114,106,0,0,0,114,1,0,0, + 0,114,98,0,0,0,114,108,0,0,0,218,7,95,79,82, + 73,71,73,78,218,10,95,95,99,97,99,104,101,100,95,95, + 218,4,108,105,115,116,218,8,95,95,112,97,116,104,95,95, + 114,112,0,0,0,114,118,0,0,0,114,123,0,0,0,114, + 117,0,0,0,41,8,114,96,0,0,0,114,109,0,0,0, + 114,113,0,0,0,114,95,0,0,0,114,17,0,0,0,90, + 8,108,111,99,97,116,105,111,110,114,123,0,0,0,114,117, 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,114,99,0,0,0,204,2,0,0,115,2,0,0,0, - 0,7,122,27,66,117,105,108,116,105,110,73,109,112,111,114, - 116,101,114,46,109,111,100,117,108,101,95,114,101,112,114,78, - 99,4,0,0,0,0,0,0,0,0,0,0,0,4,0,0, - 0,5,0,0,0,67,0,0,0,115,44,0,0,0,124,2, - 100,0,107,9,114,12,100,0,83,0,116,0,160,1,124,1, - 161,1,114,36,116,2,124,1,124,0,100,1,100,2,141,3, - 83,0,100,0,83,0,100,0,83,0,41,3,78,122,8,98, - 117,105,108,116,45,105,110,114,137,0,0,0,41,3,114,57, - 0,0,0,90,10,105,115,95,98,117,105,108,116,105,110,114, - 91,0,0,0,169,4,218,3,99,108,115,114,81,0,0,0, - 218,4,112,97,116,104,218,6,116,97,114,103,101,116,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,218,9,102, - 105,110,100,95,115,112,101,99,213,2,0,0,115,10,0,0, - 0,0,2,8,1,4,1,10,1,14,2,122,25,66,117,105, - 108,116,105,110,73,109,112,111,114,116,101,114,46,102,105,110, - 100,95,115,112,101,99,99,3,0,0,0,0,0,0,0,0, - 0,0,0,4,0,0,0,4,0,0,0,67,0,0,0,115, - 30,0,0,0,124,0,160,0,124,1,124,2,161,2,125,3, - 124,3,100,1,107,9,114,26,124,3,106,1,83,0,100,1, - 83,0,41,2,122,175,70,105,110,100,32,116,104,101,32,98, - 117,105,108,116,45,105,110,32,109,111,100,117,108,101,46,10, - 10,32,32,32,32,32,32,32,32,73,102,32,39,112,97,116, - 104,39,32,105,115,32,101,118,101,114,32,115,112,101,99,105, - 102,105,101,100,32,116,104,101,110,32,116,104,101,32,115,101, - 97,114,99,104,32,105,115,32,99,111,110,115,105,100,101,114, - 101,100,32,97,32,102,97,105,108,117,114,101,46,10,10,32, - 32,32,32,32,32,32,32,84,104,105,115,32,109,101,116,104, - 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, - 46,32,32,85,115,101,32,102,105,110,100,95,115,112,101,99, - 40,41,32,105,110,115,116,101,97,100,46,10,10,32,32,32, - 32,32,32,32,32,78,41,2,114,166,0,0,0,114,109,0, - 0,0,41,4,114,163,0,0,0,114,81,0,0,0,114,164, - 0,0,0,114,95,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,11,102,105,110,100,95,109,111, - 100,117,108,101,222,2,0,0,115,4,0,0,0,0,9,12, - 1,122,27,66,117,105,108,116,105,110,73,109,112,111,114,116, - 101,114,46,102,105,110,100,95,109,111,100,117,108,101,99,2, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,4, - 0,0,0,67,0,0,0,115,46,0,0,0,124,1,106,0, - 116,1,106,2,107,7,114,34,116,3,100,1,160,4,124,1, - 106,0,161,1,124,1,106,0,100,2,141,2,130,1,116,5, - 116,6,106,7,124,1,131,2,83,0,41,3,122,24,67,114, - 101,97,116,101,32,97,32,98,117,105,108,116,45,105,110,32, - 109,111,100,117,108,101,114,77,0,0,0,114,16,0,0,0, - 41,8,114,17,0,0,0,114,15,0,0,0,114,78,0,0, - 0,114,79,0,0,0,114,45,0,0,0,114,67,0,0,0, - 114,57,0,0,0,90,14,99,114,101,97,116,101,95,98,117, - 105,108,116,105,110,41,2,114,30,0,0,0,114,95,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,149,0,0,0,234,2,0,0,115,10,0,0,0,0,3, - 12,1,12,1,4,255,6,2,122,29,66,117,105,108,116,105, - 110,73,109,112,111,114,116,101,114,46,99,114,101,97,116,101, + 0,0,218,17,95,115,112,101,99,95,102,114,111,109,95,109, + 111,100,117,108,101,176,1,0,0,115,72,0,0,0,0,2, + 2,1,10,1,14,1,6,2,8,1,4,2,6,1,8,1, + 2,1,10,1,14,2,6,1,2,1,10,1,14,1,10,1, + 8,1,8,1,2,1,10,1,14,1,12,2,4,1,2,1, + 10,1,14,1,10,1,2,1,14,1,16,1,10,2,14,1, + 20,1,6,1,6,1,114,142,0,0,0,70,169,1,218,8, + 111,118,101,114,114,105,100,101,99,2,0,0,0,0,0,0, + 0,1,0,0,0,5,0,0,0,8,0,0,0,67,0,0, + 0,115,226,1,0,0,124,2,115,20,116,0,124,1,100,1, + 100,0,131,3,100,0,107,8,114,54,122,12,124,0,106,1, + 124,1,95,2,87,0,110,20,4,0,116,3,107,10,114,52, + 1,0,1,0,1,0,89,0,110,2,88,0,124,2,115,74, + 116,0,124,1,100,2,100,0,131,3,100,0,107,8,114,178, + 124,0,106,4,125,3,124,3,100,0,107,8,114,146,124,0, + 106,5,100,0,107,9,114,146,116,6,100,0,107,8,114,110, + 116,7,130,1,116,6,106,8,125,4,124,4,160,9,124,4, + 161,1,125,3,124,0,106,5,124,3,95,10,124,3,124,0, + 95,4,100,0,124,1,95,11,122,10,124,3,124,1,95,12, + 87,0,110,20,4,0,116,3,107,10,114,176,1,0,1,0, + 1,0,89,0,110,2,88,0,124,2,115,198,116,0,124,1, + 100,3,100,0,131,3,100,0,107,8,114,232,122,12,124,0, + 106,13,124,1,95,14,87,0,110,20,4,0,116,3,107,10, + 114,230,1,0,1,0,1,0,89,0,110,2,88,0,122,10, + 124,0,124,1,95,15,87,0,110,22,4,0,116,3,107,10, + 144,1,114,8,1,0,1,0,1,0,89,0,110,2,88,0, + 124,2,144,1,115,34,116,0,124,1,100,4,100,0,131,3, + 100,0,107,8,144,1,114,82,124,0,106,5,100,0,107,9, + 144,1,114,82,122,12,124,0,106,5,124,1,95,16,87,0, + 110,22,4,0,116,3,107,10,144,1,114,80,1,0,1,0, + 1,0,89,0,110,2,88,0,124,0,106,17,144,1,114,222, + 124,2,144,1,115,114,116,0,124,1,100,5,100,0,131,3, + 100,0,107,8,144,1,114,150,122,12,124,0,106,18,124,1, + 95,11,87,0,110,22,4,0,116,3,107,10,144,1,114,148, + 1,0,1,0,1,0,89,0,110,2,88,0,124,2,144,1, + 115,174,116,0,124,1,100,6,100,0,131,3,100,0,107,8, + 144,1,114,222,124,0,106,19,100,0,107,9,144,1,114,222, + 122,12,124,0,106,19,124,1,95,20,87,0,110,22,4,0, + 116,3,107,10,144,1,114,220,1,0,1,0,1,0,89,0, + 110,2,88,0,124,1,83,0,41,7,78,114,1,0,0,0, + 114,98,0,0,0,218,11,95,95,112,97,99,107,97,103,101, + 95,95,114,141,0,0,0,114,108,0,0,0,114,139,0,0, + 0,41,21,114,6,0,0,0,114,17,0,0,0,114,1,0, + 0,0,114,106,0,0,0,114,109,0,0,0,114,117,0,0, + 0,114,126,0,0,0,114,127,0,0,0,218,16,95,78,97, + 109,101,115,112,97,99,101,76,111,97,100,101,114,218,7,95, + 95,110,101,119,95,95,90,5,95,112,97,116,104,114,108,0, + 0,0,114,98,0,0,0,114,130,0,0,0,114,145,0,0, + 0,114,105,0,0,0,114,141,0,0,0,114,124,0,0,0, + 114,113,0,0,0,114,123,0,0,0,114,139,0,0,0,41, + 5,114,95,0,0,0,114,96,0,0,0,114,144,0,0,0, + 114,109,0,0,0,114,146,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,218,18,95,105,110,105,116, + 95,109,111,100,117,108,101,95,97,116,116,114,115,221,1,0, + 0,115,96,0,0,0,0,4,20,1,2,1,12,1,14,1, + 6,2,20,1,6,1,8,2,10,1,8,1,4,1,6,2, + 10,1,8,1,6,11,6,1,2,1,10,1,14,1,6,2, + 20,1,2,1,12,1,14,1,6,2,2,1,10,1,16,1, + 6,2,24,1,12,1,2,1,12,1,16,1,6,2,8,1, + 24,1,2,1,12,1,16,1,6,2,24,1,12,1,2,1, + 12,1,16,1,6,1,114,148,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, + 67,0,0,0,115,82,0,0,0,100,1,125,1,116,0,124, + 0,106,1,100,2,131,2,114,30,124,0,106,1,160,2,124, + 0,161,1,125,1,110,20,116,0,124,0,106,1,100,3,131, + 2,114,50,116,3,100,4,131,1,130,1,124,1,100,1,107, + 8,114,68,116,4,124,0,106,5,131,1,125,1,116,6,124, + 0,124,1,131,2,1,0,124,1,83,0,41,5,122,43,67, + 114,101,97,116,101,32,97,32,109,111,100,117,108,101,32,98, + 97,115,101,100,32,111,110,32,116,104,101,32,112,114,111,118, + 105,100,101,100,32,115,112,101,99,46,78,218,13,99,114,101, + 97,116,101,95,109,111,100,117,108,101,218,11,101,120,101,99, + 95,109,111,100,117,108,101,122,66,108,111,97,100,101,114,115, + 32,116,104,97,116,32,100,101,102,105,110,101,32,101,120,101, + 99,95,109,111,100,117,108,101,40,41,32,109,117,115,116,32, + 97,108,115,111,32,100,101,102,105,110,101,32,99,114,101,97, + 116,101,95,109,111,100,117,108,101,40,41,41,7,114,4,0, + 0,0,114,109,0,0,0,114,149,0,0,0,114,79,0,0, + 0,114,18,0,0,0,114,17,0,0,0,114,148,0,0,0, + 169,2,114,95,0,0,0,114,96,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,218,16,109,111,100, + 117,108,101,95,102,114,111,109,95,115,112,101,99,37,2,0, + 0,115,18,0,0,0,0,3,4,1,12,3,14,1,12,1, + 8,2,8,1,10,1,10,1,114,152,0,0,0,99,1,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,4,0, + 0,0,67,0,0,0,115,106,0,0,0,124,0,106,0,100, + 1,107,8,114,14,100,2,110,4,124,0,106,0,125,1,124, + 0,106,1,100,1,107,8,114,66,124,0,106,2,100,1,107, + 8,114,50,100,3,160,3,124,1,161,1,83,0,100,4,160, + 3,124,1,124,0,106,2,161,2,83,0,110,36,124,0,106, + 4,114,86,100,5,160,3,124,1,124,0,106,1,161,2,83, + 0,100,6,160,3,124,0,106,0,124,0,106,1,161,2,83, + 0,100,1,83,0,41,7,122,38,82,101,116,117,114,110,32, + 116,104,101,32,114,101,112,114,32,116,111,32,117,115,101,32, + 102,111,114,32,116,104,101,32,109,111,100,117,108,101,46,78, + 114,100,0,0,0,114,101,0,0,0,114,102,0,0,0,114, + 103,0,0,0,250,18,60,109,111,100,117,108,101,32,123,33, + 114,125,32,40,123,125,41,62,41,5,114,17,0,0,0,114, + 113,0,0,0,114,109,0,0,0,114,45,0,0,0,114,124, + 0,0,0,41,2,114,95,0,0,0,114,17,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,107, + 0,0,0,54,2,0,0,115,16,0,0,0,0,3,20,1, + 10,1,10,1,10,2,16,2,6,1,14,2,114,107,0,0, + 0,99,2,0,0,0,0,0,0,0,0,0,0,0,4,0, + 0,0,10,0,0,0,67,0,0,0,115,204,0,0,0,124, + 0,106,0,125,2,116,1,124,2,131,1,143,180,1,0,116, + 2,106,3,160,4,124,2,161,1,124,1,107,9,114,54,100, + 1,160,5,124,2,161,1,125,3,116,6,124,3,124,2,100, + 2,141,2,130,1,122,106,124,0,106,7,100,3,107,8,114, + 106,124,0,106,8,100,3,107,8,114,90,116,6,100,4,124, + 0,106,0,100,2,141,2,130,1,116,9,124,0,124,1,100, + 5,100,6,141,3,1,0,110,52,116,9,124,0,124,1,100, + 5,100,6,141,3,1,0,116,10,124,0,106,7,100,7,131, + 2,115,146,124,0,106,7,160,11,124,2,161,1,1,0,110, + 12,124,0,106,7,160,12,124,1,161,1,1,0,87,0,53, + 0,116,2,106,3,160,13,124,0,106,0,161,1,125,1,124, + 1,116,2,106,3,124,0,106,0,60,0,88,0,87,0,53, + 0,81,0,82,0,88,0,124,1,83,0,41,8,122,70,69, + 120,101,99,117,116,101,32,116,104,101,32,115,112,101,99,39, + 115,32,115,112,101,99,105,102,105,101,100,32,109,111,100,117, + 108,101,32,105,110,32,97,110,32,101,120,105,115,116,105,110, + 103,32,109,111,100,117,108,101,39,115,32,110,97,109,101,115, + 112,97,99,101,46,122,30,109,111,100,117,108,101,32,123,33, + 114,125,32,110,111,116,32,105,110,32,115,121,115,46,109,111, + 100,117,108,101,115,114,16,0,0,0,78,250,14,109,105,115, + 115,105,110,103,32,108,111,97,100,101,114,84,114,143,0,0, + 0,114,150,0,0,0,41,14,114,17,0,0,0,114,50,0, + 0,0,114,15,0,0,0,114,92,0,0,0,114,34,0,0, + 0,114,45,0,0,0,114,79,0,0,0,114,109,0,0,0, + 114,117,0,0,0,114,148,0,0,0,114,4,0,0,0,218, + 11,108,111,97,100,95,109,111,100,117,108,101,114,150,0,0, + 0,218,3,112,111,112,41,4,114,95,0,0,0,114,96,0, + 0,0,114,17,0,0,0,218,3,109,115,103,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,93,0,0,0, + 71,2,0,0,115,34,0,0,0,0,2,6,1,10,1,16, + 1,10,1,12,1,2,1,10,1,10,1,14,2,16,2,14, + 1,12,4,14,2,16,4,14,1,24,1,114,93,0,0,0, + 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,8,0,0,0,67,0,0,0,115,26,1,0,0,122,18, + 124,0,106,0,160,1,124,0,106,2,161,1,1,0,87,0, + 110,52,1,0,1,0,1,0,124,0,106,2,116,3,106,4, + 107,6,114,64,116,3,106,4,160,5,124,0,106,2,161,1, + 125,1,124,1,116,3,106,4,124,0,106,2,60,0,130,0, + 89,0,110,2,88,0,116,3,106,4,160,5,124,0,106,2, + 161,1,125,1,124,1,116,3,106,4,124,0,106,2,60,0, + 116,6,124,1,100,1,100,0,131,3,100,0,107,8,114,148, + 122,12,124,0,106,0,124,1,95,7,87,0,110,20,4,0, + 116,8,107,10,114,146,1,0,1,0,1,0,89,0,110,2, + 88,0,116,6,124,1,100,2,100,0,131,3,100,0,107,8, + 114,226,122,40,124,1,106,9,124,1,95,10,116,11,124,1, + 100,3,131,2,115,202,124,0,106,2,160,12,100,4,161,1, + 100,5,25,0,124,1,95,10,87,0,110,20,4,0,116,8, + 107,10,114,224,1,0,1,0,1,0,89,0,110,2,88,0, + 116,6,124,1,100,6,100,0,131,3,100,0,107,8,144,1, + 114,22,122,10,124,0,124,1,95,13,87,0,110,22,4,0, + 116,8,107,10,144,1,114,20,1,0,1,0,1,0,89,0, + 110,2,88,0,124,1,83,0,41,7,78,114,98,0,0,0, + 114,145,0,0,0,114,141,0,0,0,114,128,0,0,0,114, + 22,0,0,0,114,105,0,0,0,41,14,114,109,0,0,0, + 114,155,0,0,0,114,17,0,0,0,114,15,0,0,0,114, + 92,0,0,0,114,156,0,0,0,114,6,0,0,0,114,98, + 0,0,0,114,106,0,0,0,114,1,0,0,0,114,145,0, + 0,0,114,4,0,0,0,114,129,0,0,0,114,105,0,0, + 0,114,151,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,218,25,95,108,111,97,100,95,98,97,99, + 107,119,97,114,100,95,99,111,109,112,97,116,105,98,108,101, + 101,2,0,0,115,54,0,0,0,0,4,2,1,18,1,6, + 1,12,1,14,1,12,1,8,3,14,1,12,1,16,1,2, + 1,12,1,14,1,6,1,16,1,2,4,8,1,10,1,22, + 1,14,1,6,1,18,1,2,1,10,1,16,1,6,1,114, + 158,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,11,0,0,0,67,0,0,0,115,220,0, + 0,0,124,0,106,0,100,0,107,9,114,30,116,1,124,0, + 106,0,100,1,131,2,115,30,116,2,124,0,131,1,83,0, + 116,3,124,0,131,1,125,1,100,2,124,0,95,4,122,162, + 124,1,116,5,106,6,124,0,106,7,60,0,122,52,124,0, + 106,0,100,0,107,8,114,96,124,0,106,8,100,0,107,8, + 114,108,116,9,100,3,124,0,106,7,100,4,141,2,130,1, + 110,12,124,0,106,0,160,10,124,1,161,1,1,0,87,0, + 110,50,1,0,1,0,1,0,122,14,116,5,106,6,124,0, + 106,7,61,0,87,0,110,20,4,0,116,11,107,10,114,152, + 1,0,1,0,1,0,89,0,110,2,88,0,130,0,89,0, + 110,2,88,0,116,5,106,6,160,12,124,0,106,7,161,1, + 125,1,124,1,116,5,106,6,124,0,106,7,60,0,116,13, + 100,5,124,0,106,7,124,0,106,0,131,3,1,0,87,0, + 53,0,100,6,124,0,95,4,88,0,124,1,83,0,41,7, + 78,114,150,0,0,0,84,114,154,0,0,0,114,16,0,0, + 0,122,18,105,109,112,111,114,116,32,123,33,114,125,32,35, + 32,123,33,114,125,70,41,14,114,109,0,0,0,114,4,0, + 0,0,114,158,0,0,0,114,152,0,0,0,90,13,95,105, + 110,105,116,105,97,108,105,122,105,110,103,114,15,0,0,0, + 114,92,0,0,0,114,17,0,0,0,114,117,0,0,0,114, + 79,0,0,0,114,150,0,0,0,114,63,0,0,0,114,156, + 0,0,0,114,76,0,0,0,114,151,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,218,14,95,108, + 111,97,100,95,117,110,108,111,99,107,101,100,138,2,0,0, + 115,46,0,0,0,0,2,10,2,12,1,8,2,8,5,6, + 1,2,1,12,1,2,1,10,1,10,1,16,3,16,1,6, + 1,2,1,14,1,14,1,6,1,8,5,14,1,12,1,20, + 2,8,2,114,159,0,0,0,99,1,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,10,0,0,0,67,0,0, + 0,115,42,0,0,0,116,0,124,0,106,1,131,1,143,22, + 1,0,116,2,124,0,131,1,87,0,2,0,53,0,81,0, + 82,0,163,0,83,0,81,0,82,0,88,0,100,1,83,0, + 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,50,0,0,0,114,17,0,0,0, + 114,159,0,0,0,41,1,114,95,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,94,0,0,0, + 180,2,0,0,115,4,0,0,0,0,9,12,1,114,94,0, + 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,4,0,0,0,64,0,0,0,115,136,0,0,0, + 101,0,90,1,100,0,90,2,100,1,90,3,101,4,100,2, + 100,3,132,0,131,1,90,5,101,6,100,19,100,5,100,6, + 132,1,131,1,90,7,101,6,100,20,100,7,100,8,132,1, + 131,1,90,8,101,6,100,9,100,10,132,0,131,1,90,9, + 101,6,100,11,100,12,132,0,131,1,90,10,101,6,101,11, + 100,13,100,14,132,0,131,1,131,1,90,12,101,6,101,11, + 100,15,100,16,132,0,131,1,131,1,90,13,101,6,101,11, + 100,17,100,18,132,0,131,1,131,1,90,14,101,6,101,15, + 131,1,90,16,100,4,83,0,41,21,218,15,66,117,105,108, + 116,105,110,73,109,112,111,114,116,101,114,122,144,77,101,116, + 97,32,112,97,116,104,32,105,109,112,111,114,116,32,102,111, + 114,32,98,117,105,108,116,45,105,110,32,109,111,100,117,108, + 101,115,46,10,10,32,32,32,32,65,108,108,32,109,101,116, + 104,111,100,115,32,97,114,101,32,101,105,116,104,101,114,32, + 99,108,97,115,115,32,111,114,32,115,116,97,116,105,99,32, + 109,101,116,104,111,100,115,32,116,111,32,97,118,111,105,100, + 32,116,104,101,32,110,101,101,100,32,116,111,10,32,32,32, + 32,105,110,115,116,97,110,116,105,97,116,101,32,116,104,101, + 32,99,108,97,115,115,46,10,10,32,32,32,32,99,1,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0, + 0,0,67,0,0,0,115,12,0,0,0,100,1,160,0,124, + 0,106,1,161,1,83,0,41,2,250,115,82,101,116,117,114, + 110,32,114,101,112,114,32,102,111,114,32,116,104,101,32,109, + 111,100,117,108,101,46,10,10,32,32,32,32,32,32,32,32, + 84,104,101,32,109,101,116,104,111,100,32,105,115,32,100,101, + 112,114,101,99,97,116,101,100,46,32,32,84,104,101,32,105, + 109,112,111,114,116,32,109,97,99,104,105,110,101,114,121,32, + 100,111,101,115,32,116,104,101,32,106,111,98,32,105,116,115, + 101,108,102,46,10,10,32,32,32,32,32,32,32,32,122,24, + 60,109,111,100,117,108,101,32,123,33,114,125,32,40,98,117, + 105,108,116,45,105,110,41,62,41,2,114,45,0,0,0,114, + 1,0,0,0,41,1,114,96,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,99,0,0,0,204, + 2,0,0,115,2,0,0,0,0,7,122,27,66,117,105,108, + 116,105,110,73,109,112,111,114,116,101,114,46,109,111,100,117, + 108,101,95,114,101,112,114,78,99,4,0,0,0,0,0,0, + 0,0,0,0,0,4,0,0,0,5,0,0,0,67,0,0, + 0,115,44,0,0,0,124,2,100,0,107,9,114,12,100,0, + 83,0,116,0,160,1,124,1,161,1,114,36,116,2,124,1, + 124,0,100,1,100,2,141,3,83,0,100,0,83,0,100,0, + 83,0,41,3,78,122,8,98,117,105,108,116,45,105,110,114, + 137,0,0,0,41,3,114,57,0,0,0,90,10,105,115,95, + 98,117,105,108,116,105,110,114,91,0,0,0,169,4,218,3, + 99,108,115,114,81,0,0,0,218,4,112,97,116,104,218,6, + 116,97,114,103,101,116,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,218,9,102,105,110,100,95,115,112,101,99, + 213,2,0,0,115,10,0,0,0,0,2,8,1,4,1,10, + 1,14,2,122,25,66,117,105,108,116,105,110,73,109,112,111, + 114,116,101,114,46,102,105,110,100,95,115,112,101,99,99,3, + 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4, + 0,0,0,67,0,0,0,115,30,0,0,0,124,0,160,0, + 124,1,124,2,161,2,125,3,124,3,100,1,107,9,114,26, + 124,3,106,1,83,0,100,1,83,0,41,2,122,175,70,105, + 110,100,32,116,104,101,32,98,117,105,108,116,45,105,110,32, + 109,111,100,117,108,101,46,10,10,32,32,32,32,32,32,32, + 32,73,102,32,39,112,97,116,104,39,32,105,115,32,101,118, + 101,114,32,115,112,101,99,105,102,105,101,100,32,116,104,101, + 110,32,116,104,101,32,115,101,97,114,99,104,32,105,115,32, + 99,111,110,115,105,100,101,114,101,100,32,97,32,102,97,105, + 108,117,114,101,46,10,10,32,32,32,32,32,32,32,32,84, + 104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,101, + 112,114,101,99,97,116,101,100,46,32,32,85,115,101,32,102, + 105,110,100,95,115,112,101,99,40,41,32,105,110,115,116,101, + 97,100,46,10,10,32,32,32,32,32,32,32,32,78,41,2, + 114,166,0,0,0,114,109,0,0,0,41,4,114,163,0,0, + 0,114,81,0,0,0,114,164,0,0,0,114,95,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, + 11,102,105,110,100,95,109,111,100,117,108,101,222,2,0,0, + 115,4,0,0,0,0,9,12,1,122,27,66,117,105,108,116, + 105,110,73,109,112,111,114,116,101,114,46,102,105,110,100,95, + 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,4,0,0,0,67,0,0,0,115, + 46,0,0,0,124,1,106,0,116,1,106,2,107,7,114,34, + 116,3,100,1,160,4,124,1,106,0,161,1,124,1,106,0, + 100,2,141,2,130,1,116,5,116,6,106,7,124,1,131,2, + 83,0,41,3,122,24,67,114,101,97,116,101,32,97,32,98, + 117,105,108,116,45,105,110,32,109,111,100,117,108,101,114,77, + 0,0,0,114,16,0,0,0,41,8,114,17,0,0,0,114, + 15,0,0,0,114,78,0,0,0,114,79,0,0,0,114,45, + 0,0,0,114,67,0,0,0,114,57,0,0,0,90,14,99, + 114,101,97,116,101,95,98,117,105,108,116,105,110,41,2,114, + 30,0,0,0,114,95,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,149,0,0,0,234,2,0, + 0,115,10,0,0,0,0,3,12,1,12,1,4,255,6,2, + 122,29,66,117,105,108,116,105,110,73,109,112,111,114,116,101, + 114,46,99,114,101,97,116,101,95,109,111,100,117,108,101,99, + 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 3,0,0,0,67,0,0,0,115,16,0,0,0,116,0,116, + 1,106,2,124,1,131,2,1,0,100,1,83,0,41,2,122, + 22,69,120,101,99,32,97,32,98,117,105,108,116,45,105,110, + 32,109,111,100,117,108,101,78,41,3,114,67,0,0,0,114, + 57,0,0,0,90,12,101,120,101,99,95,98,117,105,108,116, + 105,110,41,2,114,30,0,0,0,114,96,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,114,150,0, + 0,0,242,2,0,0,115,2,0,0,0,0,3,122,27,66, + 117,105,108,116,105,110,73,109,112,111,114,116,101,114,46,101, + 120,101,99,95,109,111,100,117,108,101,99,2,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, + 0,0,0,115,4,0,0,0,100,1,83,0,41,2,122,57, + 82,101,116,117,114,110,32,78,111,110,101,32,97,115,32,98, + 117,105,108,116,45,105,110,32,109,111,100,117,108,101,115,32, + 100,111,32,110,111,116,32,104,97,118,101,32,99,111,100,101, + 32,111,98,106,101,99,116,115,46,78,114,10,0,0,0,169, + 2,114,163,0,0,0,114,81,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,218,8,103,101,116,95, + 99,111,100,101,247,2,0,0,115,2,0,0,0,0,4,122, + 24,66,117,105,108,116,105,110,73,109,112,111,114,116,101,114, + 46,103,101,116,95,99,111,100,101,99,2,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,1,0,0,0,67,0, + 0,0,115,4,0,0,0,100,1,83,0,41,2,122,56,82, + 101,116,117,114,110,32,78,111,110,101,32,97,115,32,98,117, + 105,108,116,45,105,110,32,109,111,100,117,108,101,115,32,100, + 111,32,110,111,116,32,104,97,118,101,32,115,111,117,114,99, + 101,32,99,111,100,101,46,78,114,10,0,0,0,114,168,0, + 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, + 0,218,10,103,101,116,95,115,111,117,114,99,101,253,2,0, + 0,115,2,0,0,0,0,4,122,26,66,117,105,108,116,105, + 110,73,109,112,111,114,116,101,114,46,103,101,116,95,115,111, + 117,114,99,101,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, + 0,0,100,1,83,0,41,2,122,52,82,101,116,117,114,110, + 32,70,97,108,115,101,32,97,115,32,98,117,105,108,116,45, + 105,110,32,109,111,100,117,108,101,115,32,97,114,101,32,110, + 101,118,101,114,32,112,97,99,107,97,103,101,115,46,70,114, + 10,0,0,0,114,168,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,115,0,0,0,3,3,0, + 0,115,2,0,0,0,0,4,122,26,66,117,105,108,116,105, + 110,73,109,112,111,114,116,101,114,46,105,115,95,112,97,99, + 107,97,103,101,41,2,78,78,41,1,78,41,17,114,1,0, + 0,0,114,0,0,0,0,114,2,0,0,0,114,3,0,0, + 0,218,12,115,116,97,116,105,99,109,101,116,104,111,100,114, + 99,0,0,0,218,11,99,108,97,115,115,109,101,116,104,111, + 100,114,166,0,0,0,114,167,0,0,0,114,149,0,0,0, + 114,150,0,0,0,114,86,0,0,0,114,169,0,0,0,114, + 170,0,0,0,114,115,0,0,0,114,97,0,0,0,114,155, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,160,0,0,0,195,2,0,0, + 115,42,0,0,0,8,2,4,7,2,1,10,8,2,1,12, + 8,2,1,12,11,2,1,10,7,2,1,10,4,2,1,2, + 1,12,4,2,1,2,1,12,4,2,1,2,1,12,4,114, + 160,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,4,0,0,0,64,0,0,0,115,144,0, + 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2, + 90,4,101,5,100,3,100,4,132,0,131,1,90,6,101,7, + 100,22,100,6,100,7,132,1,131,1,90,8,101,7,100,23, + 100,8,100,9,132,1,131,1,90,9,101,7,100,10,100,11, + 132,0,131,1,90,10,101,5,100,12,100,13,132,0,131,1, + 90,11,101,7,100,14,100,15,132,0,131,1,90,12,101,7, + 101,13,100,16,100,17,132,0,131,1,131,1,90,14,101,7, + 101,13,100,18,100,19,132,0,131,1,131,1,90,15,101,7, + 101,13,100,20,100,21,132,0,131,1,131,1,90,16,100,5, + 83,0,41,24,218,14,70,114,111,122,101,110,73,109,112,111, + 114,116,101,114,122,142,77,101,116,97,32,112,97,116,104,32, + 105,109,112,111,114,116,32,102,111,114,32,102,114,111,122,101, + 110,32,109,111,100,117,108,101,115,46,10,10,32,32,32,32, + 65,108,108,32,109,101,116,104,111,100,115,32,97,114,101,32, + 101,105,116,104,101,114,32,99,108,97,115,115,32,111,114,32, + 115,116,97,116,105,99,32,109,101,116,104,111,100,115,32,116, + 111,32,97,118,111,105,100,32,116,104,101,32,110,101,101,100, + 32,116,111,10,32,32,32,32,105,110,115,116,97,110,116,105, + 97,116,101,32,116,104,101,32,99,108,97,115,115,46,10,10, + 32,32,32,32,90,6,102,114,111,122,101,110,99,1,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0, + 0,67,0,0,0,115,16,0,0,0,100,1,160,0,124,0, + 106,1,116,2,106,3,161,2,83,0,41,2,114,161,0,0, + 0,114,153,0,0,0,41,4,114,45,0,0,0,114,1,0, + 0,0,114,173,0,0,0,114,138,0,0,0,41,1,218,1, + 109,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 114,99,0,0,0,23,3,0,0,115,2,0,0,0,0,7, + 122,26,70,114,111,122,101,110,73,109,112,111,114,116,101,114, + 46,109,111,100,117,108,101,95,114,101,112,114,78,99,4,0, + 0,0,0,0,0,0,0,0,0,0,4,0,0,0,5,0, + 0,0,67,0,0,0,115,34,0,0,0,116,0,160,1,124, + 1,161,1,114,26,116,2,124,1,124,0,124,0,106,3,100, + 1,141,3,83,0,100,0,83,0,100,0,83,0,41,2,78, + 114,137,0,0,0,41,4,114,57,0,0,0,114,88,0,0, + 0,114,91,0,0,0,114,138,0,0,0,114,162,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, + 166,0,0,0,32,3,0,0,115,6,0,0,0,0,2,10, + 1,16,2,122,24,70,114,111,122,101,110,73,109,112,111,114, + 116,101,114,46,102,105,110,100,95,115,112,101,99,99,3,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0, + 0,0,67,0,0,0,115,18,0,0,0,116,0,160,1,124, + 1,161,1,114,14,124,0,83,0,100,1,83,0,41,2,122, + 93,70,105,110,100,32,97,32,102,114,111,122,101,110,32,109, + 111,100,117,108,101,46,10,10,32,32,32,32,32,32,32,32, + 84,104,105,115,32,109,101,116,104,111,100,32,105,115,32,100, + 101,112,114,101,99,97,116,101,100,46,32,32,85,115,101,32, + 102,105,110,100,95,115,112,101,99,40,41,32,105,110,115,116, + 101,97,100,46,10,10,32,32,32,32,32,32,32,32,78,41, + 2,114,57,0,0,0,114,88,0,0,0,41,3,114,163,0, + 0,0,114,81,0,0,0,114,164,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,167,0,0,0, + 39,3,0,0,115,2,0,0,0,0,7,122,26,70,114,111, + 122,101,110,73,109,112,111,114,116,101,114,46,102,105,110,100, + 95,109,111,100,117,108,101,99,2,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,0, + 115,4,0,0,0,100,1,83,0,41,2,122,42,85,115,101, + 32,100,101,102,97,117,108,116,32,115,101,109,97,110,116,105, + 99,115,32,102,111,114,32,109,111,100,117,108,101,32,99,114, + 101,97,116,105,111,110,46,78,114,10,0,0,0,41,2,114, + 163,0,0,0,114,95,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,149,0,0,0,48,3,0, + 0,115,2,0,0,0,0,2,122,28,70,114,111,122,101,110, + 73,109,112,111,114,116,101,114,46,99,114,101,97,116,101,95, + 109,111,100,117,108,101,99,1,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,4,0,0,0,67,0,0,0,115, + 64,0,0,0,124,0,106,0,106,1,125,1,116,2,160,3, + 124,1,161,1,115,36,116,4,100,1,160,5,124,1,161,1, + 124,1,100,2,141,2,130,1,116,6,116,2,106,7,124,1, + 131,2,125,2,116,8,124,2,124,0,106,9,131,2,1,0, + 100,0,83,0,114,87,0,0,0,41,10,114,105,0,0,0, + 114,17,0,0,0,114,57,0,0,0,114,88,0,0,0,114, + 79,0,0,0,114,45,0,0,0,114,67,0,0,0,218,17, + 103,101,116,95,102,114,111,122,101,110,95,111,98,106,101,99, + 116,218,4,101,120,101,99,114,7,0,0,0,41,3,114,96, + 0,0,0,114,17,0,0,0,218,4,99,111,100,101,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,114,150,0, + 0,0,52,3,0,0,115,14,0,0,0,0,2,8,1,10, + 1,10,1,2,255,6,2,12,1,122,26,70,114,111,122,101, + 110,73,109,112,111,114,116,101,114,46,101,120,101,99,95,109, + 111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,10, + 0,0,0,116,0,124,0,124,1,131,2,83,0,41,1,122, + 95,76,111,97,100,32,97,32,102,114,111,122,101,110,32,109, + 111,100,117,108,101,46,10,10,32,32,32,32,32,32,32,32, + 84,104,105,115,32,109,101,116,104,111,100,32,105,115,32,100, + 101,112,114,101,99,97,116,101,100,46,32,32,85,115,101,32, + 101,120,101,99,95,109,111,100,117,108,101,40,41,32,105,110, + 115,116,101,97,100,46,10,10,32,32,32,32,32,32,32,32, + 41,1,114,97,0,0,0,114,168,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,155,0,0,0, + 61,3,0,0,115,2,0,0,0,0,7,122,26,70,114,111, + 122,101,110,73,109,112,111,114,116,101,114,46,108,111,97,100, 95,109,111,100,117,108,101,99,2,0,0,0,0,0,0,0, 0,0,0,0,2,0,0,0,3,0,0,0,67,0,0,0, - 115,16,0,0,0,116,0,116,1,106,2,124,1,131,2,1, - 0,100,1,83,0,41,2,122,22,69,120,101,99,32,97,32, - 98,117,105,108,116,45,105,110,32,109,111,100,117,108,101,78, - 41,3,114,67,0,0,0,114,57,0,0,0,90,12,101,120, - 101,99,95,98,117,105,108,116,105,110,41,2,114,30,0,0, - 0,114,96,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,150,0,0,0,242,2,0,0,115,2, - 0,0,0,0,3,122,27,66,117,105,108,116,105,110,73,109, - 112,111,114,116,101,114,46,101,120,101,99,95,109,111,100,117, - 108,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0, - 100,1,83,0,41,2,122,57,82,101,116,117,114,110,32,78, - 111,110,101,32,97,115,32,98,117,105,108,116,45,105,110,32, - 109,111,100,117,108,101,115,32,100,111,32,110,111,116,32,104, - 97,118,101,32,99,111,100,101,32,111,98,106,101,99,116,115, - 46,78,114,10,0,0,0,169,2,114,163,0,0,0,114,81, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,8,103,101,116,95,99,111,100,101,247,2,0,0, - 115,2,0,0,0,0,4,122,24,66,117,105,108,116,105,110, - 73,109,112,111,114,116,101,114,46,103,101,116,95,99,111,100, - 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, - 1,83,0,41,2,122,56,82,101,116,117,114,110,32,78,111, - 110,101,32,97,115,32,98,117,105,108,116,45,105,110,32,109, - 111,100,117,108,101,115,32,100,111,32,110,111,116,32,104,97, - 118,101,32,115,111,117,114,99,101,32,99,111,100,101,46,78, - 114,10,0,0,0,114,168,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,218,10,103,101,116,95,115, - 111,117,114,99,101,253,2,0,0,115,2,0,0,0,0,4, - 122,26,66,117,105,108,116,105,110,73,109,112,111,114,116,101, - 114,46,103,101,116,95,115,111,117,114,99,101,99,2,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0, - 0,67,0,0,0,115,4,0,0,0,100,1,83,0,41,2, - 122,52,82,101,116,117,114,110,32,70,97,108,115,101,32,97, - 115,32,98,117,105,108,116,45,105,110,32,109,111,100,117,108, - 101,115,32,97,114,101,32,110,101,118,101,114,32,112,97,99, - 107,97,103,101,115,46,70,114,10,0,0,0,114,168,0,0, + 115,10,0,0,0,116,0,160,1,124,1,161,1,83,0,41, + 1,122,45,82,101,116,117,114,110,32,116,104,101,32,99,111, + 100,101,32,111,98,106,101,99,116,32,102,111,114,32,116,104, + 101,32,102,114,111,122,101,110,32,109,111,100,117,108,101,46, + 41,2,114,57,0,0,0,114,175,0,0,0,114,168,0,0, 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,115,0,0,0,3,3,0,0,115,2,0,0,0,0,4, - 122,26,66,117,105,108,116,105,110,73,109,112,111,114,116,101, - 114,46,105,115,95,112,97,99,107,97,103,101,41,2,78,78, - 41,1,78,41,17,114,1,0,0,0,114,0,0,0,0,114, - 2,0,0,0,114,3,0,0,0,218,12,115,116,97,116,105, - 99,109,101,116,104,111,100,114,99,0,0,0,218,11,99,108, - 97,115,115,109,101,116,104,111,100,114,166,0,0,0,114,167, - 0,0,0,114,149,0,0,0,114,150,0,0,0,114,86,0, - 0,0,114,169,0,0,0,114,170,0,0,0,114,115,0,0, - 0,114,97,0,0,0,114,155,0,0,0,114,10,0,0,0, + 114,169,0,0,0,70,3,0,0,115,2,0,0,0,0,4, + 122,23,70,114,111,122,101,110,73,109,112,111,114,116,101,114, + 46,103,101,116,95,99,111,100,101,99,2,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,1,0,0,0,67,0, + 0,0,115,4,0,0,0,100,1,83,0,41,2,122,54,82, + 101,116,117,114,110,32,78,111,110,101,32,97,115,32,102,114, + 111,122,101,110,32,109,111,100,117,108,101,115,32,100,111,32, + 110,111,116,32,104,97,118,101,32,115,111,117,114,99,101,32, + 99,111,100,101,46,78,114,10,0,0,0,114,168,0,0,0, 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 160,0,0,0,195,2,0,0,115,42,0,0,0,8,2,4, - 7,2,1,10,8,2,1,12,8,2,1,12,11,2,1,10, - 7,2,1,10,4,2,1,2,1,12,4,2,1,2,1,12, - 4,2,1,2,1,12,4,114,160,0,0,0,99,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0, - 0,64,0,0,0,115,144,0,0,0,101,0,90,1,100,0, - 90,2,100,1,90,3,100,2,90,4,101,5,100,3,100,4, - 132,0,131,1,90,6,101,7,100,22,100,6,100,7,132,1, - 131,1,90,8,101,7,100,23,100,8,100,9,132,1,131,1, - 90,9,101,7,100,10,100,11,132,0,131,1,90,10,101,5, - 100,12,100,13,132,0,131,1,90,11,101,7,100,14,100,15, - 132,0,131,1,90,12,101,7,101,13,100,16,100,17,132,0, - 131,1,131,1,90,14,101,7,101,13,100,18,100,19,132,0, - 131,1,131,1,90,15,101,7,101,13,100,20,100,21,132,0, - 131,1,131,1,90,16,100,5,83,0,41,24,218,14,70,114, - 111,122,101,110,73,109,112,111,114,116,101,114,122,142,77,101, - 116,97,32,112,97,116,104,32,105,109,112,111,114,116,32,102, - 111,114,32,102,114,111,122,101,110,32,109,111,100,117,108,101, - 115,46,10,10,32,32,32,32,65,108,108,32,109,101,116,104, - 111,100,115,32,97,114,101,32,101,105,116,104,101,114,32,99, - 108,97,115,115,32,111,114,32,115,116,97,116,105,99,32,109, - 101,116,104,111,100,115,32,116,111,32,97,118,111,105,100,32, - 116,104,101,32,110,101,101,100,32,116,111,10,32,32,32,32, - 105,110,115,116,97,110,116,105,97,116,101,32,116,104,101,32, - 99,108,97,115,115,46,10,10,32,32,32,32,90,6,102,114, - 111,122,101,110,99,1,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,4,0,0,0,67,0,0,0,115,16,0, - 0,0,100,1,160,0,124,0,106,1,116,2,106,3,161,2, - 83,0,41,2,114,161,0,0,0,114,153,0,0,0,41,4, - 114,45,0,0,0,114,1,0,0,0,114,173,0,0,0,114, - 138,0,0,0,41,1,218,1,109,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,99,0,0,0,23,3,0, - 0,115,2,0,0,0,0,7,122,26,70,114,111,122,101,110, - 73,109,112,111,114,116,101,114,46,109,111,100,117,108,101,95, - 114,101,112,114,78,99,4,0,0,0,0,0,0,0,0,0, - 0,0,4,0,0,0,5,0,0,0,67,0,0,0,115,34, - 0,0,0,116,0,160,1,124,1,161,1,114,26,116,2,124, - 1,124,0,124,0,106,3,100,1,141,3,83,0,100,0,83, - 0,100,0,83,0,41,2,78,114,137,0,0,0,41,4,114, - 57,0,0,0,114,88,0,0,0,114,91,0,0,0,114,138, - 0,0,0,114,162,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,166,0,0,0,32,3,0,0, - 115,6,0,0,0,0,2,10,1,16,2,122,24,70,114,111, - 122,101,110,73,109,112,111,114,116,101,114,46,102,105,110,100, - 95,115,112,101,99,99,3,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,3,0,0,0,67,0,0,0,115,18, - 0,0,0,116,0,160,1,124,1,161,1,114,14,124,0,83, - 0,100,1,83,0,41,2,122,93,70,105,110,100,32,97,32, - 102,114,111,122,101,110,32,109,111,100,117,108,101,46,10,10, - 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, - 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, - 100,46,32,32,85,115,101,32,102,105,110,100,95,115,112,101, - 99,40,41,32,105,110,115,116,101,97,100,46,10,10,32,32, - 32,32,32,32,32,32,78,41,2,114,57,0,0,0,114,88, - 0,0,0,41,3,114,163,0,0,0,114,81,0,0,0,114, - 164,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,167,0,0,0,39,3,0,0,115,2,0,0, - 0,0,7,122,26,70,114,111,122,101,110,73,109,112,111,114, - 116,101,114,46,102,105,110,100,95,109,111,100,117,108,101,99, - 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 1,0,0,0,67,0,0,0,115,4,0,0,0,100,1,83, - 0,41,2,122,42,85,115,101,32,100,101,102,97,117,108,116, - 32,115,101,109,97,110,116,105,99,115,32,102,111,114,32,109, - 111,100,117,108,101,32,99,114,101,97,116,105,111,110,46,78, - 114,10,0,0,0,41,2,114,163,0,0,0,114,95,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,149,0,0,0,48,3,0,0,115,2,0,0,0,0,2, - 122,28,70,114,111,122,101,110,73,109,112,111,114,116,101,114, - 46,99,114,101,97,116,101,95,109,111,100,117,108,101,99,1, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,4, - 0,0,0,67,0,0,0,115,64,0,0,0,124,0,106,0, - 106,1,125,1,116,2,160,3,124,1,161,1,115,36,116,4, - 100,1,160,5,124,1,161,1,124,1,100,2,141,2,130,1, - 116,6,116,2,106,7,124,1,131,2,125,2,116,8,124,2, - 124,0,106,9,131,2,1,0,100,0,83,0,114,87,0,0, - 0,41,10,114,105,0,0,0,114,17,0,0,0,114,57,0, - 0,0,114,88,0,0,0,114,79,0,0,0,114,45,0,0, - 0,114,67,0,0,0,218,17,103,101,116,95,102,114,111,122, - 101,110,95,111,98,106,101,99,116,218,4,101,120,101,99,114, - 7,0,0,0,41,3,114,96,0,0,0,114,17,0,0,0, - 218,4,99,111,100,101,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,150,0,0,0,52,3,0,0,115,14, - 0,0,0,0,2,8,1,10,1,10,1,2,255,6,2,12, - 1,122,26,70,114,111,122,101,110,73,109,112,111,114,116,101, - 114,46,101,120,101,99,95,109,111,100,117,108,101,99,2,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0, - 0,0,67,0,0,0,115,10,0,0,0,116,0,124,0,124, - 1,131,2,83,0,41,1,122,95,76,111,97,100,32,97,32, - 102,114,111,122,101,110,32,109,111,100,117,108,101,46,10,10, - 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, - 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, - 100,46,32,32,85,115,101,32,101,120,101,99,95,109,111,100, - 117,108,101,40,41,32,105,110,115,116,101,97,100,46,10,10, - 32,32,32,32,32,32,32,32,41,1,114,97,0,0,0,114, - 168,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,155,0,0,0,61,3,0,0,115,2,0,0, - 0,0,7,122,26,70,114,111,122,101,110,73,109,112,111,114, - 116,101,114,46,108,111,97,100,95,109,111,100,117,108,101,99, - 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 3,0,0,0,67,0,0,0,115,10,0,0,0,116,0,160, - 1,124,1,161,1,83,0,41,1,122,45,82,101,116,117,114, - 110,32,116,104,101,32,99,111,100,101,32,111,98,106,101,99, - 116,32,102,111,114,32,116,104,101,32,102,114,111,122,101,110, - 32,109,111,100,117,108,101,46,41,2,114,57,0,0,0,114, - 175,0,0,0,114,168,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,169,0,0,0,70,3,0, - 0,115,2,0,0,0,0,4,122,23,70,114,111,122,101,110, - 73,109,112,111,114,116,101,114,46,103,101,116,95,99,111,100, - 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, - 1,83,0,41,2,122,54,82,101,116,117,114,110,32,78,111, - 110,101,32,97,115,32,102,114,111,122,101,110,32,109,111,100, - 117,108,101,115,32,100,111,32,110,111,116,32,104,97,118,101, - 32,115,111,117,114,99,101,32,99,111,100,101,46,78,114,10, - 0,0,0,114,168,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,170,0,0,0,76,3,0,0, - 115,2,0,0,0,0,4,122,25,70,114,111,122,101,110,73, - 109,112,111,114,116,101,114,46,103,101,116,95,115,111,117,114, - 99,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,3,0,0,0,67,0,0,0,115,10,0,0,0, - 116,0,160,1,124,1,161,1,83,0,41,1,122,46,82,101, - 116,117,114,110,32,84,114,117,101,32,105,102,32,116,104,101, - 32,102,114,111,122,101,110,32,109,111,100,117,108,101,32,105, - 115,32,97,32,112,97,99,107,97,103,101,46,41,2,114,57, - 0,0,0,90,17,105,115,95,102,114,111,122,101,110,95,112, - 97,99,107,97,103,101,114,168,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,115,0,0,0,82, - 3,0,0,115,2,0,0,0,0,4,122,25,70,114,111,122, - 101,110,73,109,112,111,114,116,101,114,46,105,115,95,112,97, - 99,107,97,103,101,41,2,78,78,41,1,78,41,17,114,1, - 0,0,0,114,0,0,0,0,114,2,0,0,0,114,3,0, - 0,0,114,138,0,0,0,114,171,0,0,0,114,99,0,0, - 0,114,172,0,0,0,114,166,0,0,0,114,167,0,0,0, - 114,149,0,0,0,114,150,0,0,0,114,155,0,0,0,114, - 90,0,0,0,114,169,0,0,0,114,170,0,0,0,114,115, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,173,0,0,0,12,3,0,0, - 115,46,0,0,0,8,2,4,7,4,2,2,1,10,8,2, - 1,12,6,2,1,12,8,2,1,10,3,2,1,10,8,2, - 1,10,8,2,1,2,1,12,4,2,1,2,1,12,4,2, - 1,2,1,114,173,0,0,0,99,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,64,0,0, - 0,115,32,0,0,0,101,0,90,1,100,0,90,2,100,1, - 90,3,100,2,100,3,132,0,90,4,100,4,100,5,132,0, - 90,5,100,6,83,0,41,7,218,18,95,73,109,112,111,114, - 116,76,111,99,107,67,111,110,116,101,120,116,122,36,67,111, - 110,116,101,120,116,32,109,97,110,97,103,101,114,32,102,111, - 114,32,116,104,101,32,105,109,112,111,114,116,32,108,111,99, - 107,46,99,1,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,2,0,0,0,67,0,0,0,115,12,0,0,0, - 116,0,160,1,161,0,1,0,100,1,83,0,41,2,122,24, - 65,99,113,117,105,114,101,32,116,104,101,32,105,109,112,111, - 114,116,32,108,111,99,107,46,78,41,2,114,57,0,0,0, - 114,58,0,0,0,114,47,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,54,0,0,0,95,3, - 0,0,115,2,0,0,0,0,2,122,28,95,73,109,112,111, - 114,116,76,111,99,107,67,111,110,116,101,120,116,46,95,95, - 101,110,116,101,114,95,95,99,4,0,0,0,0,0,0,0, - 0,0,0,0,4,0,0,0,2,0,0,0,67,0,0,0, - 115,12,0,0,0,116,0,160,1,161,0,1,0,100,1,83, - 0,41,2,122,60,82,101,108,101,97,115,101,32,116,104,101, - 32,105,109,112,111,114,116,32,108,111,99,107,32,114,101,103, - 97,114,100,108,101,115,115,32,111,102,32,97,110,121,32,114, - 97,105,115,101,100,32,101,120,99,101,112,116,105,111,110,115, - 46,78,41,2,114,57,0,0,0,114,60,0,0,0,41,4, - 114,30,0,0,0,218,8,101,120,99,95,116,121,112,101,218, - 9,101,120,99,95,118,97,108,117,101,218,13,101,120,99,95, - 116,114,97,99,101,98,97,99,107,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,56,0,0,0,99,3,0, - 0,115,2,0,0,0,0,2,122,27,95,73,109,112,111,114, - 116,76,111,99,107,67,111,110,116,101,120,116,46,95,95,101, - 120,105,116,95,95,78,41,6,114,1,0,0,0,114,0,0, - 0,0,114,2,0,0,0,114,3,0,0,0,114,54,0,0, - 0,114,56,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,178,0,0,0,91, - 3,0,0,115,6,0,0,0,8,2,4,2,8,4,114,178, - 0,0,0,99,3,0,0,0,0,0,0,0,0,0,0,0, - 5,0,0,0,5,0,0,0,67,0,0,0,115,64,0,0, - 0,124,1,160,0,100,1,124,2,100,2,24,0,161,2,125, - 3,116,1,124,3,131,1,124,2,107,0,114,36,116,2,100, - 3,131,1,130,1,124,3,100,4,25,0,125,4,124,0,114, - 60,100,5,160,3,124,4,124,0,161,2,83,0,124,4,83, - 0,41,6,122,50,82,101,115,111,108,118,101,32,97,32,114, - 101,108,97,116,105,118,101,32,109,111,100,117,108,101,32,110, - 97,109,101,32,116,111,32,97,110,32,97,98,115,111,108,117, - 116,101,32,111,110,101,46,114,128,0,0,0,114,37,0,0, - 0,122,50,97,116,116,101,109,112,116,101,100,32,114,101,108, - 97,116,105,118,101,32,105,109,112,111,114,116,32,98,101,121, - 111,110,100,32,116,111,112,45,108,101,118,101,108,32,112,97, - 99,107,97,103,101,114,22,0,0,0,250,5,123,125,46,123, - 125,41,4,218,6,114,115,112,108,105,116,218,3,108,101,110, - 218,10,86,97,108,117,101,69,114,114,111,114,114,45,0,0, - 0,41,5,114,17,0,0,0,218,7,112,97,99,107,97,103, - 101,218,5,108,101,118,101,108,90,4,98,105,116,115,90,4, - 98,97,115,101,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,218,13,95,114,101,115,111,108,118,101,95,110,97, - 109,101,104,3,0,0,115,10,0,0,0,0,2,16,1,12, - 1,8,1,8,1,114,188,0,0,0,99,3,0,0,0,0, - 0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,67, - 0,0,0,115,34,0,0,0,124,0,160,0,124,1,124,2, - 161,2,125,3,124,3,100,0,107,8,114,24,100,0,83,0, - 116,1,124,1,124,3,131,2,83,0,114,13,0,0,0,41, - 2,114,167,0,0,0,114,91,0,0,0,41,4,218,6,102, - 105,110,100,101,114,114,17,0,0,0,114,164,0,0,0,114, - 109,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,218,17,95,102,105,110,100,95,115,112,101,99,95, - 108,101,103,97,99,121,113,3,0,0,115,8,0,0,0,0, - 3,12,1,8,1,4,1,114,190,0,0,0,99,3,0,0, - 0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,0, - 0,67,0,0,0,115,12,1,0,0,116,0,106,1,125,3, - 124,3,100,1,107,8,114,22,116,2,100,2,131,1,130,1, - 124,3,115,38,116,3,160,4,100,3,116,5,161,2,1,0, - 124,0,116,0,106,6,107,6,125,4,124,3,68,0,93,210, - 125,5,116,7,131,0,143,84,1,0,122,10,124,5,106,8, - 125,6,87,0,110,54,4,0,116,9,107,10,114,128,1,0, - 1,0,1,0,116,10,124,5,124,0,124,1,131,3,125,7, - 124,7,100,1,107,8,114,124,89,0,87,0,53,0,81,0, - 82,0,163,0,113,52,89,0,110,14,88,0,124,6,124,0, - 124,1,124,2,131,3,125,7,87,0,53,0,81,0,82,0, - 88,0,124,7,100,1,107,9,114,52,124,4,144,0,115,254, - 124,0,116,0,106,6,107,6,144,0,114,254,116,0,106,6, - 124,0,25,0,125,8,122,10,124,8,106,11,125,9,87,0, - 110,28,4,0,116,9,107,10,114,226,1,0,1,0,1,0, - 124,7,6,0,89,0,2,0,1,0,83,0,88,0,124,9, - 100,1,107,8,114,244,124,7,2,0,1,0,83,0,124,9, - 2,0,1,0,83,0,113,52,124,7,2,0,1,0,83,0, - 113,52,100,1,83,0,41,4,122,21,70,105,110,100,32,97, - 32,109,111,100,117,108,101,39,115,32,115,112,101,99,46,78, - 122,53,115,121,115,46,109,101,116,97,95,112,97,116,104,32, - 105,115,32,78,111,110,101,44,32,80,121,116,104,111,110,32, - 105,115,32,108,105,107,101,108,121,32,115,104,117,116,116,105, - 110,103,32,100,111,119,110,122,22,115,121,115,46,109,101,116, - 97,95,112,97,116,104,32,105,115,32,101,109,112,116,121,41, - 12,114,15,0,0,0,218,9,109,101,116,97,95,112,97,116, - 104,114,79,0,0,0,218,9,95,119,97,114,110,105,110,103, - 115,218,4,119,97,114,110,218,13,73,109,112,111,114,116,87, - 97,114,110,105,110,103,114,92,0,0,0,114,178,0,0,0, - 114,166,0,0,0,114,106,0,0,0,114,190,0,0,0,114, - 105,0,0,0,41,10,114,17,0,0,0,114,164,0,0,0, - 114,165,0,0,0,114,191,0,0,0,90,9,105,115,95,114, - 101,108,111,97,100,114,189,0,0,0,114,166,0,0,0,114, - 95,0,0,0,114,96,0,0,0,114,105,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,218,10,95, - 102,105,110,100,95,115,112,101,99,122,3,0,0,115,54,0, - 0,0,0,2,6,1,8,2,8,3,4,1,12,5,10,1, - 8,1,8,1,2,1,10,1,14,1,12,1,8,1,20,2, - 22,1,8,2,18,1,10,1,2,1,10,1,14,4,14,2, - 8,1,8,2,10,2,10,2,114,195,0,0,0,99,3,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,5,0, - 0,0,67,0,0,0,115,108,0,0,0,116,0,124,0,116, - 1,131,2,115,28,116,2,100,1,160,3,116,4,124,0,131, - 1,161,1,131,1,130,1,124,2,100,2,107,0,114,44,116, - 5,100,3,131,1,130,1,124,2,100,2,107,4,114,84,116, - 0,124,1,116,1,131,2,115,72,116,2,100,4,131,1,130, - 1,110,12,124,1,115,84,116,6,100,5,131,1,130,1,124, - 0,115,104,124,2,100,2,107,2,114,104,116,5,100,6,131, - 1,130,1,100,7,83,0,41,8,122,28,86,101,114,105,102, - 121,32,97,114,103,117,109,101,110,116,115,32,97,114,101,32, - 34,115,97,110,101,34,46,122,31,109,111,100,117,108,101,32, - 110,97,109,101,32,109,117,115,116,32,98,101,32,115,116,114, - 44,32,110,111,116,32,123,125,114,22,0,0,0,122,18,108, - 101,118,101,108,32,109,117,115,116,32,98,101,32,62,61,32, - 48,122,31,95,95,112,97,99,107,97,103,101,95,95,32,110, - 111,116,32,115,101,116,32,116,111,32,97,32,115,116,114,105, - 110,103,122,54,97,116,116,101,109,112,116,101,100,32,114,101, - 108,97,116,105,118,101,32,105,109,112,111,114,116,32,119,105, - 116,104,32,110,111,32,107,110,111,119,110,32,112,97,114,101, - 110,116,32,112,97,99,107,97,103,101,122,17,69,109,112,116, - 121,32,109,111,100,117,108,101,32,110,97,109,101,78,41,7, - 218,10,105,115,105,110,115,116,97,110,99,101,218,3,115,116, - 114,218,9,84,121,112,101,69,114,114,111,114,114,45,0,0, - 0,114,14,0,0,0,114,185,0,0,0,114,79,0,0,0, - 169,3,114,17,0,0,0,114,186,0,0,0,114,187,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 218,13,95,115,97,110,105,116,121,95,99,104,101,99,107,169, - 3,0,0,115,22,0,0,0,0,2,10,1,18,1,8,1, - 8,1,8,1,10,1,10,1,4,1,8,2,12,1,114,200, - 0,0,0,122,16,78,111,32,109,111,100,117,108,101,32,110, - 97,109,101,100,32,122,4,123,33,114,125,99,2,0,0,0, - 0,0,0,0,0,0,0,0,8,0,0,0,8,0,0,0, - 67,0,0,0,115,220,0,0,0,100,0,125,2,124,0,160, - 0,100,1,161,1,100,2,25,0,125,3,124,3,114,134,124, - 3,116,1,106,2,107,7,114,42,116,3,124,1,124,3,131, - 2,1,0,124,0,116,1,106,2,107,6,114,62,116,1,106, - 2,124,0,25,0,83,0,116,1,106,2,124,3,25,0,125, - 4,122,10,124,4,106,4,125,2,87,0,110,50,4,0,116, - 5,107,10,114,132,1,0,1,0,1,0,116,6,100,3,23, - 0,160,7,124,0,124,3,161,2,125,5,116,8,124,5,124, - 0,100,4,141,2,100,0,130,2,89,0,110,2,88,0,116, - 9,124,0,124,2,131,2,125,6,124,6,100,0,107,8,114, - 172,116,8,116,6,160,7,124,0,161,1,124,0,100,4,141, - 2,130,1,110,8,116,10,124,6,131,1,125,7,124,3,114, - 216,116,1,106,2,124,3,25,0,125,4,116,11,124,4,124, - 0,160,0,100,1,161,1,100,5,25,0,124,7,131,3,1, - 0,124,7,83,0,41,6,78,114,128,0,0,0,114,22,0, - 0,0,122,23,59,32,123,33,114,125,32,105,115,32,110,111, - 116,32,97,32,112,97,99,107,97,103,101,114,16,0,0,0, - 233,2,0,0,0,41,12,114,129,0,0,0,114,15,0,0, - 0,114,92,0,0,0,114,67,0,0,0,114,141,0,0,0, - 114,106,0,0,0,218,8,95,69,82,82,95,77,83,71,114, - 45,0,0,0,218,19,77,111,100,117,108,101,78,111,116,70, - 111,117,110,100,69,114,114,111,114,114,195,0,0,0,114,159, - 0,0,0,114,5,0,0,0,41,8,114,17,0,0,0,218, - 7,105,109,112,111,114,116,95,114,164,0,0,0,114,130,0, - 0,0,90,13,112,97,114,101,110,116,95,109,111,100,117,108, - 101,114,157,0,0,0,114,95,0,0,0,114,96,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, - 23,95,102,105,110,100,95,97,110,100,95,108,111,97,100,95, - 117,110,108,111,99,107,101,100,188,3,0,0,115,42,0,0, - 0,0,1,4,1,14,1,4,1,10,1,10,2,10,1,10, - 1,10,1,2,1,10,1,14,1,16,1,20,1,10,1,8, - 1,20,2,8,1,4,2,10,1,22,1,114,205,0,0,0, - 99,2,0,0,0,0,0,0,0,0,0,0,0,4,0,0, - 0,10,0,0,0,67,0,0,0,115,106,0,0,0,116,0, - 124,0,131,1,143,50,1,0,116,1,106,2,160,3,124,0, - 116,4,161,2,125,2,124,2,116,4,107,8,114,54,116,5, - 124,0,124,1,131,2,87,0,2,0,53,0,81,0,82,0, - 163,0,83,0,87,0,53,0,81,0,82,0,88,0,124,2, - 100,1,107,8,114,94,100,2,160,6,124,0,161,1,125,3, - 116,7,124,3,124,0,100,3,141,2,130,1,116,8,124,0, - 131,1,1,0,124,2,83,0,41,4,122,25,70,105,110,100, - 32,97,110,100,32,108,111,97,100,32,116,104,101,32,109,111, - 100,117,108,101,46,78,122,40,105,109,112,111,114,116,32,111, - 102,32,123,125,32,104,97,108,116,101,100,59,32,78,111,110, - 101,32,105,110,32,115,121,115,46,109,111,100,117,108,101,115, - 114,16,0,0,0,41,9,114,50,0,0,0,114,15,0,0, - 0,114,92,0,0,0,114,34,0,0,0,218,14,95,78,69, - 69,68,83,95,76,79,65,68,73,78,71,114,205,0,0,0, - 114,45,0,0,0,114,203,0,0,0,114,65,0,0,0,41, - 4,114,17,0,0,0,114,204,0,0,0,114,96,0,0,0, - 114,75,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,218,14,95,102,105,110,100,95,97,110,100,95, - 108,111,97,100,218,3,0,0,115,22,0,0,0,0,2,10, - 1,14,1,8,1,32,2,8,1,4,1,2,255,4,2,12, - 2,8,1,114,207,0,0,0,114,22,0,0,0,99,3,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,4,0, - 0,0,67,0,0,0,115,42,0,0,0,116,0,124,0,124, - 1,124,2,131,3,1,0,124,2,100,1,107,4,114,32,116, - 1,124,0,124,1,124,2,131,3,125,0,116,2,124,0,116, - 3,131,2,83,0,41,2,97,50,1,0,0,73,109,112,111, - 114,116,32,97,110,100,32,114,101,116,117,114,110,32,116,104, - 101,32,109,111,100,117,108,101,32,98,97,115,101,100,32,111, - 110,32,105,116,115,32,110,97,109,101,44,32,116,104,101,32, - 112,97,99,107,97,103,101,32,116,104,101,32,99,97,108,108, - 32,105,115,10,32,32,32,32,98,101,105,110,103,32,109,97, - 100,101,32,102,114,111,109,44,32,97,110,100,32,116,104,101, - 32,108,101,118,101,108,32,97,100,106,117,115,116,109,101,110, - 116,46,10,10,32,32,32,32,84,104,105,115,32,102,117,110, - 99,116,105,111,110,32,114,101,112,114,101,115,101,110,116,115, - 32,116,104,101,32,103,114,101,97,116,101,115,116,32,99,111, - 109,109,111,110,32,100,101,110,111,109,105,110,97,116,111,114, - 32,111,102,32,102,117,110,99,116,105,111,110,97,108,105,116, - 121,10,32,32,32,32,98,101,116,119,101,101,110,32,105,109, - 112,111,114,116,95,109,111,100,117,108,101,32,97,110,100,32, - 95,95,105,109,112,111,114,116,95,95,46,32,84,104,105,115, - 32,105,110,99,108,117,100,101,115,32,115,101,116,116,105,110, - 103,32,95,95,112,97,99,107,97,103,101,95,95,32,105,102, - 10,32,32,32,32,116,104,101,32,108,111,97,100,101,114,32, - 100,105,100,32,110,111,116,46,10,10,32,32,32,32,114,22, - 0,0,0,41,4,114,200,0,0,0,114,188,0,0,0,114, - 207,0,0,0,218,11,95,103,99,100,95,105,109,112,111,114, - 116,114,199,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,208,0,0,0,234,3,0,0,115,8, - 0,0,0,0,9,12,1,8,1,12,1,114,208,0,0,0, - 169,1,218,9,114,101,99,117,114,115,105,118,101,99,3,0, - 0,0,0,0,0,0,1,0,0,0,8,0,0,0,11,0, - 0,0,67,0,0,0,115,226,0,0,0,124,1,68,0,93, - 216,125,4,116,0,124,4,116,1,131,2,115,66,124,3,114, - 34,124,0,106,2,100,1,23,0,125,5,110,4,100,2,125, - 5,116,3,100,3,124,5,155,0,100,4,116,4,124,4,131, - 1,106,2,155,0,157,4,131,1,130,1,110,154,124,4,100, - 5,107,2,114,108,124,3,115,106,116,5,124,0,100,6,131, - 2,114,106,116,6,124,0,124,0,106,7,124,2,100,7,100, - 8,141,4,1,0,110,112,116,5,124,0,124,4,131,2,115, - 220,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,110,72,4, - 0,116,10,107,10,114,218,1,0,125,7,1,0,122,42,124, - 7,106,11,124,6,107,2,114,200,116,12,106,13,160,14,124, - 6,116,15,161,2,100,10,107,9,114,200,87,0,89,0,162, - 8,113,4,130,0,87,0,53,0,100,10,125,7,126,7,88, - 0,89,0,110,2,88,0,113,4,124,0,83,0,41,11,122, - 238,70,105,103,117,114,101,32,111,117,116,32,119,104,97,116, - 32,95,95,105,109,112,111,114,116,95,95,32,115,104,111,117, - 108,100,32,114,101,116,117,114,110,46,10,10,32,32,32,32, - 84,104,101,32,105,109,112,111,114,116,95,32,112,97,114,97, - 109,101,116,101,114,32,105,115,32,97,32,99,97,108,108,97, - 98,108,101,32,119,104,105,99,104,32,116,97,107,101,115,32, - 116,104,101,32,110,97,109,101,32,111,102,32,109,111,100,117, - 108,101,32,116,111,10,32,32,32,32,105,109,112,111,114,116, - 46,32,73,116,32,105,115,32,114,101,113,117,105,114,101,100, - 32,116,111,32,100,101,99,111,117,112,108,101,32,116,104,101, - 32,102,117,110,99,116,105,111,110,32,102,114,111,109,32,97, - 115,115,117,109,105,110,103,32,105,109,112,111,114,116,108,105, - 98,39,115,10,32,32,32,32,105,109,112,111,114,116,32,105, - 109,112,108,101,109,101,110,116,97,116,105,111,110,32,105,115, - 32,100,101,115,105,114,101,100,46,10,10,32,32,32,32,122, - 8,46,95,95,97,108,108,95,95,122,13,96,96,102,114,111, - 109,32,108,105,115,116,39,39,122,8,73,116,101,109,32,105, - 110,32,122,18,32,109,117,115,116,32,98,101,32,115,116,114, - 44,32,110,111,116,32,250,1,42,218,7,95,95,97,108,108, - 95,95,84,114,209,0,0,0,114,182,0,0,0,78,41,16, - 114,196,0,0,0,114,197,0,0,0,114,1,0,0,0,114, - 198,0,0,0,114,14,0,0,0,114,4,0,0,0,218,16, - 95,104,97,110,100,108,101,95,102,114,111,109,108,105,115,116, - 114,212,0,0,0,114,45,0,0,0,114,67,0,0,0,114, - 203,0,0,0,114,17,0,0,0,114,15,0,0,0,114,92, - 0,0,0,114,34,0,0,0,114,206,0,0,0,41,8,114, - 96,0,0,0,218,8,102,114,111,109,108,105,115,116,114,204, - 0,0,0,114,210,0,0,0,218,1,120,90,5,119,104,101, - 114,101,90,9,102,114,111,109,95,110,97,109,101,90,3,101, - 120,99,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,213,0,0,0,249,3,0,0,115,44,0,0,0,0, - 10,8,1,10,1,4,1,12,2,4,1,28,2,8,1,14, - 1,10,1,2,255,8,2,10,1,14,1,2,1,14,1,16, - 4,10,1,16,255,2,2,8,1,22,1,114,213,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,6,0,0,0,67,0,0,0,115,146,0,0,0,124,0, - 160,0,100,1,161,1,125,1,124,0,160,0,100,2,161,1, - 125,2,124,1,100,3,107,9,114,82,124,2,100,3,107,9, - 114,78,124,1,124,2,106,1,107,3,114,78,116,2,106,3, - 100,4,124,1,155,2,100,5,124,2,106,1,155,2,100,6, - 157,5,116,4,100,7,100,8,141,3,1,0,124,1,83,0, - 124,2,100,3,107,9,114,96,124,2,106,1,83,0,116,2, - 106,3,100,9,116,4,100,7,100,8,141,3,1,0,124,0, - 100,10,25,0,125,1,100,11,124,0,107,7,114,142,124,1, - 160,5,100,12,161,1,100,13,25,0,125,1,124,1,83,0, - 41,14,122,167,67,97,108,99,117,108,97,116,101,32,119,104, - 97,116,32,95,95,112,97,99,107,97,103,101,95,95,32,115, - 104,111,117,108,100,32,98,101,46,10,10,32,32,32,32,95, - 95,112,97,99,107,97,103,101,95,95,32,105,115,32,110,111, - 116,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32, - 98,101,32,100,101,102,105,110,101,100,32,111,114,32,99,111, - 117,108,100,32,98,101,32,115,101,116,32,116,111,32,78,111, - 110,101,10,32,32,32,32,116,111,32,114,101,112,114,101,115, - 101,110,116,32,116,104,97,116,32,105,116,115,32,112,114,111, - 112,101,114,32,118,97,108,117,101,32,105,115,32,117,110,107, - 110,111,119,110,46,10,10,32,32,32,32,114,145,0,0,0, - 114,105,0,0,0,78,122,32,95,95,112,97,99,107,97,103, - 101,95,95,32,33,61,32,95,95,115,112,101,99,95,95,46, - 112,97,114,101,110,116,32,40,122,4,32,33,61,32,250,1, - 41,233,3,0,0,0,41,1,90,10,115,116,97,99,107,108, - 101,118,101,108,122,89,99,97,110,39,116,32,114,101,115,111, - 108,118,101,32,112,97,99,107,97,103,101,32,102,114,111,109, - 32,95,95,115,112,101,99,95,95,32,111,114,32,95,95,112, - 97,99,107,97,103,101,95,95,44,32,102,97,108,108,105,110, - 103,32,98,97,99,107,32,111,110,32,95,95,110,97,109,101, - 95,95,32,97,110,100,32,95,95,112,97,116,104,95,95,114, - 1,0,0,0,114,141,0,0,0,114,128,0,0,0,114,22, - 0,0,0,41,6,114,34,0,0,0,114,130,0,0,0,114, - 192,0,0,0,114,193,0,0,0,114,194,0,0,0,114,129, - 0,0,0,41,3,218,7,103,108,111,98,97,108,115,114,186, - 0,0,0,114,95,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,17,95,99,97,108,99,95,95, - 95,112,97,99,107,97,103,101,95,95,30,4,0,0,115,38, - 0,0,0,0,7,10,1,10,1,8,1,18,1,22,2,2, - 0,2,254,6,3,4,1,8,1,6,2,6,2,2,0,2, - 254,6,3,8,1,8,1,14,1,114,219,0,0,0,114,10, - 0,0,0,99,5,0,0,0,0,0,0,0,0,0,0,0, - 9,0,0,0,5,0,0,0,67,0,0,0,115,180,0,0, - 0,124,4,100,1,107,2,114,18,116,0,124,0,131,1,125, - 5,110,36,124,1,100,2,107,9,114,30,124,1,110,2,105, - 0,125,6,116,1,124,6,131,1,125,7,116,0,124,0,124, - 7,124,4,131,3,125,5,124,3,115,150,124,4,100,1,107, - 2,114,84,116,0,124,0,160,2,100,3,161,1,100,1,25, - 0,131,1,83,0,124,0,115,92,124,5,83,0,116,3,124, - 0,131,1,116,3,124,0,160,2,100,3,161,1,100,1,25, - 0,131,1,24,0,125,8,116,4,106,5,124,5,106,6,100, - 2,116,3,124,5,106,6,131,1,124,8,24,0,133,2,25, - 0,25,0,83,0,110,26,116,7,124,5,100,4,131,2,114, - 172,116,8,124,5,124,3,116,0,131,3,83,0,124,5,83, - 0,100,2,83,0,41,5,97,215,1,0,0,73,109,112,111, - 114,116,32,97,32,109,111,100,117,108,101,46,10,10,32,32, - 32,32,84,104,101,32,39,103,108,111,98,97,108,115,39,32, - 97,114,103,117,109,101,110,116,32,105,115,32,117,115,101,100, - 32,116,111,32,105,110,102,101,114,32,119,104,101,114,101,32, - 116,104,101,32,105,109,112,111,114,116,32,105,115,32,111,99, - 99,117,114,114,105,110,103,32,102,114,111,109,10,32,32,32, - 32,116,111,32,104,97,110,100,108,101,32,114,101,108,97,116, - 105,118,101,32,105,109,112,111,114,116,115,46,32,84,104,101, - 32,39,108,111,99,97,108,115,39,32,97,114,103,117,109,101, - 110,116,32,105,115,32,105,103,110,111,114,101,100,46,32,84, - 104,101,10,32,32,32,32,39,102,114,111,109,108,105,115,116, - 39,32,97,114,103,117,109,101,110,116,32,115,112,101,99,105, - 102,105,101,115,32,119,104,97,116,32,115,104,111,117,108,100, - 32,101,120,105,115,116,32,97,115,32,97,116,116,114,105,98, - 117,116,101,115,32,111,110,32,116,104,101,32,109,111,100,117, - 108,101,10,32,32,32,32,98,101,105,110,103,32,105,109,112, - 111,114,116,101,100,32,40,101,46,103,46,32,96,96,102,114, - 111,109,32,109,111,100,117,108,101,32,105,109,112,111,114,116, - 32,60,102,114,111,109,108,105,115,116,62,96,96,41,46,32, - 32,84,104,101,32,39,108,101,118,101,108,39,10,32,32,32, - 32,97,114,103,117,109,101,110,116,32,114,101,112,114,101,115, - 101,110,116,115,32,116,104,101,32,112,97,99,107,97,103,101, - 32,108,111,99,97,116,105,111,110,32,116,111,32,105,109,112, - 111,114,116,32,102,114,111,109,32,105,110,32,97,32,114,101, - 108,97,116,105,118,101,10,32,32,32,32,105,109,112,111,114, - 116,32,40,101,46,103,46,32,96,96,102,114,111,109,32,46, - 46,112,107,103,32,105,109,112,111,114,116,32,109,111,100,96, - 96,32,119,111,117,108,100,32,104,97,118,101,32,97,32,39, - 108,101,118,101,108,39,32,111,102,32,50,41,46,10,10,32, - 32,32,32,114,22,0,0,0,78,114,128,0,0,0,114,141, - 0,0,0,41,9,114,208,0,0,0,114,219,0,0,0,218, - 9,112,97,114,116,105,116,105,111,110,114,184,0,0,0,114, - 15,0,0,0,114,92,0,0,0,114,1,0,0,0,114,4, - 0,0,0,114,213,0,0,0,41,9,114,17,0,0,0,114, - 218,0,0,0,218,6,108,111,99,97,108,115,114,214,0,0, - 0,114,187,0,0,0,114,96,0,0,0,90,8,103,108,111, - 98,97,108,115,95,114,186,0,0,0,90,7,99,117,116,95, - 111,102,102,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,10,95,95,105,109,112,111,114,116,95,95,57,4, - 0,0,115,30,0,0,0,0,11,8,1,10,2,16,1,8, - 1,12,1,4,3,8,1,18,1,4,1,4,4,26,3,32, - 1,10,1,12,2,114,222,0,0,0,99,1,0,0,0,0, + 170,0,0,0,76,3,0,0,115,2,0,0,0,0,4,122, + 25,70,114,111,122,101,110,73,109,112,111,114,116,101,114,46, + 103,101,116,95,115,111,117,114,99,101,99,2,0,0,0,0, 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,67, - 0,0,0,115,38,0,0,0,116,0,160,1,124,0,161,1, - 125,1,124,1,100,0,107,8,114,30,116,2,100,1,124,0, - 23,0,131,1,130,1,116,3,124,1,131,1,83,0,41,2, - 78,122,25,110,111,32,98,117,105,108,116,45,105,110,32,109, - 111,100,117,108,101,32,110,97,109,101,100,32,41,4,114,160, - 0,0,0,114,166,0,0,0,114,79,0,0,0,114,159,0, - 0,0,41,2,114,17,0,0,0,114,95,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,218,18,95, - 98,117,105,108,116,105,110,95,102,114,111,109,95,110,97,109, - 101,94,4,0,0,115,8,0,0,0,0,1,10,1,8,1, - 12,1,114,223,0,0,0,99,2,0,0,0,0,0,0,0, - 0,0,0,0,10,0,0,0,5,0,0,0,67,0,0,0, - 115,166,0,0,0,124,1,97,0,124,0,97,1,116,2,116, - 1,131,1,125,2,116,1,106,3,160,4,161,0,68,0,93, - 72,92,2,125,3,125,4,116,5,124,4,124,2,131,2,114, - 26,124,3,116,1,106,6,107,6,114,60,116,7,125,5,110, - 18,116,0,160,8,124,3,161,1,114,26,116,9,125,5,110, - 2,113,26,116,10,124,4,124,5,131,2,125,6,116,11,124, - 6,124,4,131,2,1,0,113,26,116,1,106,3,116,12,25, - 0,125,7,100,1,68,0,93,46,125,8,124,8,116,1,106, - 3,107,7,114,138,116,13,124,8,131,1,125,9,110,10,116, - 1,106,3,124,8,25,0,125,9,116,14,124,7,124,8,124, - 9,131,3,1,0,113,114,100,2,83,0,41,3,122,250,83, - 101,116,117,112,32,105,109,112,111,114,116,108,105,98,32,98, - 121,32,105,109,112,111,114,116,105,110,103,32,110,101,101,100, - 101,100,32,98,117,105,108,116,45,105,110,32,109,111,100,117, - 108,101,115,32,97,110,100,32,105,110,106,101,99,116,105,110, - 103,32,116,104,101,109,10,32,32,32,32,105,110,116,111,32, - 116,104,101,32,103,108,111,98,97,108,32,110,97,109,101,115, - 112,97,99,101,46,10,10,32,32,32,32,65,115,32,115,121, - 115,32,105,115,32,110,101,101,100,101,100,32,102,111,114,32, - 115,121,115,46,109,111,100,117,108,101,115,32,97,99,99,101, - 115,115,32,97,110,100,32,95,105,109,112,32,105,115,32,110, - 101,101,100,101,100,32,116,111,32,108,111,97,100,32,98,117, - 105,108,116,45,105,110,10,32,32,32,32,109,111,100,117,108, - 101,115,44,32,116,104,111,115,101,32,116,119,111,32,109,111, - 100,117,108,101,115,32,109,117,115,116,32,98,101,32,101,120, - 112,108,105,99,105,116,108,121,32,112,97,115,115,101,100,32, - 105,110,46,10,10,32,32,32,32,41,3,114,23,0,0,0, - 114,192,0,0,0,114,64,0,0,0,78,41,15,114,57,0, - 0,0,114,15,0,0,0,114,14,0,0,0,114,92,0,0, - 0,218,5,105,116,101,109,115,114,196,0,0,0,114,78,0, - 0,0,114,160,0,0,0,114,88,0,0,0,114,173,0,0, - 0,114,142,0,0,0,114,148,0,0,0,114,1,0,0,0, - 114,223,0,0,0,114,5,0,0,0,41,10,218,10,115,121, - 115,95,109,111,100,117,108,101,218,11,95,105,109,112,95,109, - 111,100,117,108,101,90,11,109,111,100,117,108,101,95,116,121, - 112,101,114,17,0,0,0,114,96,0,0,0,114,109,0,0, - 0,114,95,0,0,0,90,11,115,101,108,102,95,109,111,100, - 117,108,101,90,12,98,117,105,108,116,105,110,95,110,97,109, - 101,90,14,98,117,105,108,116,105,110,95,109,111,100,117,108, - 101,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 218,6,95,115,101,116,117,112,101,4,0,0,115,36,0,0, - 0,0,9,4,1,4,3,8,1,18,1,10,1,10,1,6, - 1,10,1,6,2,2,1,10,1,12,3,10,1,8,1,10, - 1,10,2,10,1,114,227,0,0,0,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,67, - 0,0,0,115,38,0,0,0,116,0,124,0,124,1,131,2, - 1,0,116,1,106,2,160,3,116,4,161,1,1,0,116,1, - 106,2,160,3,116,5,161,1,1,0,100,1,83,0,41,2, - 122,48,73,110,115,116,97,108,108,32,105,109,112,111,114,116, - 101,114,115,32,102,111,114,32,98,117,105,108,116,105,110,32, - 97,110,100,32,102,114,111,122,101,110,32,109,111,100,117,108, - 101,115,78,41,6,114,227,0,0,0,114,15,0,0,0,114, - 191,0,0,0,114,120,0,0,0,114,160,0,0,0,114,173, - 0,0,0,41,2,114,225,0,0,0,114,226,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,8, - 95,105,110,115,116,97,108,108,136,4,0,0,115,6,0,0, - 0,0,2,10,2,12,1,114,228,0,0,0,99,0,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0, - 0,67,0,0,0,115,32,0,0,0,100,1,100,2,108,0, - 125,0,124,0,97,1,124,0,160,2,116,3,106,4,116,5, - 25,0,161,1,1,0,100,2,83,0,41,3,122,57,73,110, - 115,116,97,108,108,32,105,109,112,111,114,116,101,114,115,32, - 116,104,97,116,32,114,101,113,117,105,114,101,32,101,120,116, - 101,114,110,97,108,32,102,105,108,101,115,121,115,116,101,109, - 32,97,99,99,101,115,115,114,22,0,0,0,78,41,6,218, - 26,95,102,114,111,122,101,110,95,105,109,112,111,114,116,108, - 105,98,95,101,120,116,101,114,110,97,108,114,126,0,0,0, - 114,228,0,0,0,114,15,0,0,0,114,92,0,0,0,114, - 1,0,0,0,41,1,114,229,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,218,27,95,105,110,115, - 116,97,108,108,95,101,120,116,101,114,110,97,108,95,105,109, - 112,111,114,116,101,114,115,144,4,0,0,115,6,0,0,0, - 0,3,8,1,4,1,114,230,0,0,0,41,2,78,78,41, - 1,78,41,2,78,114,22,0,0,0,41,4,78,78,114,10, - 0,0,0,114,22,0,0,0,41,50,114,3,0,0,0,114, - 126,0,0,0,114,12,0,0,0,114,18,0,0,0,114,59, - 0,0,0,114,33,0,0,0,114,42,0,0,0,114,19,0, - 0,0,114,20,0,0,0,114,49,0,0,0,114,50,0,0, - 0,114,53,0,0,0,114,65,0,0,0,114,67,0,0,0, - 114,76,0,0,0,114,86,0,0,0,114,90,0,0,0,114, - 97,0,0,0,114,111,0,0,0,114,112,0,0,0,114,91, - 0,0,0,114,142,0,0,0,114,148,0,0,0,114,152,0, - 0,0,114,107,0,0,0,114,93,0,0,0,114,158,0,0, - 0,114,159,0,0,0,114,94,0,0,0,114,160,0,0,0, - 114,173,0,0,0,114,178,0,0,0,114,188,0,0,0,114, - 190,0,0,0,114,195,0,0,0,114,200,0,0,0,90,15, - 95,69,82,82,95,77,83,71,95,80,82,69,70,73,88,114, - 202,0,0,0,114,205,0,0,0,218,6,111,98,106,101,99, - 116,114,206,0,0,0,114,207,0,0,0,114,208,0,0,0, - 114,213,0,0,0,114,219,0,0,0,114,222,0,0,0,114, - 223,0,0,0,114,227,0,0,0,114,228,0,0,0,114,230, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,8,60,109,111,100,117,108,101, - 62,1,0,0,0,115,94,0,0,0,4,24,4,2,8,8, - 8,8,4,2,4,3,16,4,14,68,14,21,14,16,8,37, - 8,17,8,11,14,8,8,11,8,12,8,16,8,36,14,101, - 16,26,10,45,14,72,8,17,8,17,8,30,8,37,8,42, - 8,15,14,73,14,79,14,13,8,9,8,9,10,47,8,16, - 4,1,8,2,8,27,6,3,8,16,10,15,14,37,8,27, - 10,37,8,7,8,35,8,8, + 0,0,0,115,10,0,0,0,116,0,160,1,124,1,161,1, + 83,0,41,1,122,46,82,101,116,117,114,110,32,84,114,117, + 101,32,105,102,32,116,104,101,32,102,114,111,122,101,110,32, + 109,111,100,117,108,101,32,105,115,32,97,32,112,97,99,107, + 97,103,101,46,41,2,114,57,0,0,0,90,17,105,115,95, + 102,114,111,122,101,110,95,112,97,99,107,97,103,101,114,168, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,114,115,0,0,0,82,3,0,0,115,2,0,0,0, + 0,4,122,25,70,114,111,122,101,110,73,109,112,111,114,116, + 101,114,46,105,115,95,112,97,99,107,97,103,101,41,2,78, + 78,41,1,78,41,17,114,1,0,0,0,114,0,0,0,0, + 114,2,0,0,0,114,3,0,0,0,114,138,0,0,0,114, + 171,0,0,0,114,99,0,0,0,114,172,0,0,0,114,166, + 0,0,0,114,167,0,0,0,114,149,0,0,0,114,150,0, + 0,0,114,155,0,0,0,114,90,0,0,0,114,169,0,0, + 0,114,170,0,0,0,114,115,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, + 173,0,0,0,12,3,0,0,115,46,0,0,0,8,2,4, + 7,4,2,2,1,10,8,2,1,12,6,2,1,12,8,2, + 1,10,3,2,1,10,8,2,1,10,8,2,1,2,1,12, + 4,2,1,2,1,12,4,2,1,2,1,114,173,0,0,0, + 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,64,0,0,0,115,32,0,0,0,101,0, + 90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,0, + 90,4,100,4,100,5,132,0,90,5,100,6,83,0,41,7, + 218,18,95,73,109,112,111,114,116,76,111,99,107,67,111,110, + 116,101,120,116,122,36,67,111,110,116,101,120,116,32,109,97, + 110,97,103,101,114,32,102,111,114,32,116,104,101,32,105,109, + 112,111,114,116,32,108,111,99,107,46,99,1,0,0,0,0, + 0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,67, + 0,0,0,115,12,0,0,0,116,0,160,1,161,0,1,0, + 100,1,83,0,41,2,122,24,65,99,113,117,105,114,101,32, + 116,104,101,32,105,109,112,111,114,116,32,108,111,99,107,46, + 78,41,2,114,57,0,0,0,114,58,0,0,0,114,47,0, + 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, + 0,114,54,0,0,0,95,3,0,0,115,2,0,0,0,0, + 2,122,28,95,73,109,112,111,114,116,76,111,99,107,67,111, + 110,116,101,120,116,46,95,95,101,110,116,101,114,95,95,99, + 4,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, + 2,0,0,0,67,0,0,0,115,12,0,0,0,116,0,160, + 1,161,0,1,0,100,1,83,0,41,2,122,60,82,101,108, + 101,97,115,101,32,116,104,101,32,105,109,112,111,114,116,32, + 108,111,99,107,32,114,101,103,97,114,100,108,101,115,115,32, + 111,102,32,97,110,121,32,114,97,105,115,101,100,32,101,120, + 99,101,112,116,105,111,110,115,46,78,41,2,114,57,0,0, + 0,114,60,0,0,0,41,4,114,30,0,0,0,218,8,101, + 120,99,95,116,121,112,101,218,9,101,120,99,95,118,97,108, + 117,101,218,13,101,120,99,95,116,114,97,99,101,98,97,99, + 107,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 114,56,0,0,0,99,3,0,0,115,2,0,0,0,0,2, + 122,27,95,73,109,112,111,114,116,76,111,99,107,67,111,110, + 116,101,120,116,46,95,95,101,120,105,116,95,95,78,41,6, + 114,1,0,0,0,114,0,0,0,0,114,2,0,0,0,114, + 3,0,0,0,114,54,0,0,0,114,56,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,114,178,0,0,0,91,3,0,0,115,6,0,0,0, + 8,2,4,2,8,4,114,178,0,0,0,99,3,0,0,0, + 0,0,0,0,0,0,0,0,5,0,0,0,5,0,0,0, + 67,0,0,0,115,64,0,0,0,124,1,160,0,100,1,124, + 2,100,2,24,0,161,2,125,3,116,1,124,3,131,1,124, + 2,107,0,114,36,116,2,100,3,131,1,130,1,124,3,100, + 4,25,0,125,4,124,0,114,60,100,5,160,3,124,4,124, + 0,161,2,83,0,124,4,83,0,41,6,122,50,82,101,115, + 111,108,118,101,32,97,32,114,101,108,97,116,105,118,101,32, + 109,111,100,117,108,101,32,110,97,109,101,32,116,111,32,97, + 110,32,97,98,115,111,108,117,116,101,32,111,110,101,46,114, + 128,0,0,0,114,37,0,0,0,122,50,97,116,116,101,109, + 112,116,101,100,32,114,101,108,97,116,105,118,101,32,105,109, + 112,111,114,116,32,98,101,121,111,110,100,32,116,111,112,45, + 108,101,118,101,108,32,112,97,99,107,97,103,101,114,22,0, + 0,0,250,5,123,125,46,123,125,41,4,218,6,114,115,112, + 108,105,116,218,3,108,101,110,218,10,86,97,108,117,101,69, + 114,114,111,114,114,45,0,0,0,41,5,114,17,0,0,0, + 218,7,112,97,99,107,97,103,101,218,5,108,101,118,101,108, + 90,4,98,105,116,115,90,4,98,97,115,101,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,218,13,95,114,101, + 115,111,108,118,101,95,110,97,109,101,104,3,0,0,115,10, + 0,0,0,0,2,16,1,12,1,8,1,8,1,114,188,0, + 0,0,99,3,0,0,0,0,0,0,0,0,0,0,0,4, + 0,0,0,4,0,0,0,67,0,0,0,115,34,0,0,0, + 124,0,160,0,124,1,124,2,161,2,125,3,124,3,100,0, + 107,8,114,24,100,0,83,0,116,1,124,1,124,3,131,2, + 83,0,114,13,0,0,0,41,2,114,167,0,0,0,114,91, + 0,0,0,41,4,218,6,102,105,110,100,101,114,114,17,0, + 0,0,114,164,0,0,0,114,109,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,218,17,95,102,105, + 110,100,95,115,112,101,99,95,108,101,103,97,99,121,113,3, + 0,0,115,8,0,0,0,0,3,12,1,8,1,4,1,114, + 190,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0, + 0,10,0,0,0,10,0,0,0,67,0,0,0,115,12,1, + 0,0,116,0,106,1,125,3,124,3,100,1,107,8,114,22, + 116,2,100,2,131,1,130,1,124,3,115,38,116,3,160,4, + 100,3,116,5,161,2,1,0,124,0,116,0,106,6,107,6, + 125,4,124,3,68,0,93,210,125,5,116,7,131,0,143,84, + 1,0,122,10,124,5,106,8,125,6,87,0,110,54,4,0, + 116,9,107,10,114,128,1,0,1,0,1,0,116,10,124,5, + 124,0,124,1,131,3,125,7,124,7,100,1,107,8,114,124, + 89,0,87,0,53,0,81,0,82,0,163,0,113,52,89,0, + 110,14,88,0,124,6,124,0,124,1,124,2,131,3,125,7, + 87,0,53,0,81,0,82,0,88,0,124,7,100,1,107,9, + 114,52,124,4,144,0,115,254,124,0,116,0,106,6,107,6, + 144,0,114,254,116,0,106,6,124,0,25,0,125,8,122,10, + 124,8,106,11,125,9,87,0,110,28,4,0,116,9,107,10, + 114,226,1,0,1,0,1,0,124,7,6,0,89,0,2,0, + 1,0,83,0,88,0,124,9,100,1,107,8,114,244,124,7, + 2,0,1,0,83,0,124,9,2,0,1,0,83,0,113,52, + 124,7,2,0,1,0,83,0,113,52,100,1,83,0,41,4, + 122,21,70,105,110,100,32,97,32,109,111,100,117,108,101,39, + 115,32,115,112,101,99,46,78,122,53,115,121,115,46,109,101, + 116,97,95,112,97,116,104,32,105,115,32,78,111,110,101,44, + 32,80,121,116,104,111,110,32,105,115,32,108,105,107,101,108, + 121,32,115,104,117,116,116,105,110,103,32,100,111,119,110,122, + 22,115,121,115,46,109,101,116,97,95,112,97,116,104,32,105, + 115,32,101,109,112,116,121,41,12,114,15,0,0,0,218,9, + 109,101,116,97,95,112,97,116,104,114,79,0,0,0,218,9, + 95,119,97,114,110,105,110,103,115,218,4,119,97,114,110,218, + 13,73,109,112,111,114,116,87,97,114,110,105,110,103,114,92, + 0,0,0,114,178,0,0,0,114,166,0,0,0,114,106,0, + 0,0,114,190,0,0,0,114,105,0,0,0,41,10,114,17, + 0,0,0,114,164,0,0,0,114,165,0,0,0,114,191,0, + 0,0,90,9,105,115,95,114,101,108,111,97,100,114,189,0, + 0,0,114,166,0,0,0,114,95,0,0,0,114,96,0,0, + 0,114,105,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,218,10,95,102,105,110,100,95,115,112,101, + 99,122,3,0,0,115,54,0,0,0,0,2,6,1,8,2, + 8,3,4,1,12,5,10,1,8,1,8,1,2,1,10,1, + 14,1,12,1,8,1,20,2,22,1,8,2,18,1,10,1, + 2,1,10,1,14,4,14,2,8,1,8,2,10,2,10,2, + 114,195,0,0,0,99,3,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,5,0,0,0,67,0,0,0,115,108, + 0,0,0,116,0,124,0,116,1,131,2,115,28,116,2,100, + 1,160,3,116,4,124,0,131,1,161,1,131,1,130,1,124, + 2,100,2,107,0,114,44,116,5,100,3,131,1,130,1,124, + 2,100,2,107,4,114,84,116,0,124,1,116,1,131,2,115, + 72,116,2,100,4,131,1,130,1,110,12,124,1,115,84,116, + 6,100,5,131,1,130,1,124,0,115,104,124,2,100,2,107, + 2,114,104,116,5,100,6,131,1,130,1,100,7,83,0,41, + 8,122,28,86,101,114,105,102,121,32,97,114,103,117,109,101, + 110,116,115,32,97,114,101,32,34,115,97,110,101,34,46,122, + 31,109,111,100,117,108,101,32,110,97,109,101,32,109,117,115, + 116,32,98,101,32,115,116,114,44,32,110,111,116,32,123,125, + 114,22,0,0,0,122,18,108,101,118,101,108,32,109,117,115, + 116,32,98,101,32,62,61,32,48,122,31,95,95,112,97,99, + 107,97,103,101,95,95,32,110,111,116,32,115,101,116,32,116, + 111,32,97,32,115,116,114,105,110,103,122,54,97,116,116,101, + 109,112,116,101,100,32,114,101,108,97,116,105,118,101,32,105, + 109,112,111,114,116,32,119,105,116,104,32,110,111,32,107,110, + 111,119,110,32,112,97,114,101,110,116,32,112,97,99,107,97, + 103,101,122,17,69,109,112,116,121,32,109,111,100,117,108,101, + 32,110,97,109,101,78,41,7,218,10,105,115,105,110,115,116, + 97,110,99,101,218,3,115,116,114,218,9,84,121,112,101,69, + 114,114,111,114,114,45,0,0,0,114,14,0,0,0,114,185, + 0,0,0,114,79,0,0,0,169,3,114,17,0,0,0,114, + 186,0,0,0,114,187,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,218,13,95,115,97,110,105,116, + 121,95,99,104,101,99,107,169,3,0,0,115,22,0,0,0, + 0,2,10,1,18,1,8,1,8,1,8,1,10,1,10,1, + 4,1,8,2,12,1,114,200,0,0,0,122,16,78,111,32, + 109,111,100,117,108,101,32,110,97,109,101,100,32,122,4,123, + 33,114,125,99,2,0,0,0,0,0,0,0,0,0,0,0, + 8,0,0,0,8,0,0,0,67,0,0,0,115,220,0,0, + 0,100,0,125,2,124,0,160,0,100,1,161,1,100,2,25, + 0,125,3,124,3,114,134,124,3,116,1,106,2,107,7,114, + 42,116,3,124,1,124,3,131,2,1,0,124,0,116,1,106, + 2,107,6,114,62,116,1,106,2,124,0,25,0,83,0,116, + 1,106,2,124,3,25,0,125,4,122,10,124,4,106,4,125, + 2,87,0,110,50,4,0,116,5,107,10,114,132,1,0,1, + 0,1,0,116,6,100,3,23,0,160,7,124,0,124,3,161, + 2,125,5,116,8,124,5,124,0,100,4,141,2,100,0,130, + 2,89,0,110,2,88,0,116,9,124,0,124,2,131,2,125, + 6,124,6,100,0,107,8,114,172,116,8,116,6,160,7,124, + 0,161,1,124,0,100,4,141,2,130,1,110,8,116,10,124, + 6,131,1,125,7,124,3,114,216,116,1,106,2,124,3,25, + 0,125,4,116,11,124,4,124,0,160,0,100,1,161,1,100, + 5,25,0,124,7,131,3,1,0,124,7,83,0,41,6,78, + 114,128,0,0,0,114,22,0,0,0,122,23,59,32,123,33, + 114,125,32,105,115,32,110,111,116,32,97,32,112,97,99,107, + 97,103,101,114,16,0,0,0,233,2,0,0,0,41,12,114, + 129,0,0,0,114,15,0,0,0,114,92,0,0,0,114,67, + 0,0,0,114,141,0,0,0,114,106,0,0,0,218,8,95, + 69,82,82,95,77,83,71,114,45,0,0,0,218,19,77,111, + 100,117,108,101,78,111,116,70,111,117,110,100,69,114,114,111, + 114,114,195,0,0,0,114,159,0,0,0,114,5,0,0,0, + 41,8,114,17,0,0,0,218,7,105,109,112,111,114,116,95, + 114,164,0,0,0,114,130,0,0,0,90,13,112,97,114,101, + 110,116,95,109,111,100,117,108,101,114,157,0,0,0,114,95, + 0,0,0,114,96,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,218,23,95,102,105,110,100,95,97, + 110,100,95,108,111,97,100,95,117,110,108,111,99,107,101,100, + 188,3,0,0,115,42,0,0,0,0,1,4,1,14,1,4, + 1,10,1,10,2,10,1,10,1,10,1,2,1,10,1,14, + 1,16,1,20,1,10,1,8,1,20,2,8,1,4,2,10, + 1,22,1,114,205,0,0,0,99,2,0,0,0,0,0,0, + 0,0,0,0,0,4,0,0,0,10,0,0,0,67,0,0, + 0,115,106,0,0,0,116,0,124,0,131,1,143,50,1,0, + 116,1,106,2,160,3,124,0,116,4,161,2,125,2,124,2, + 116,4,107,8,114,54,116,5,124,0,124,1,131,2,87,0, + 2,0,53,0,81,0,82,0,163,0,83,0,87,0,53,0, + 81,0,82,0,88,0,124,2,100,1,107,8,114,94,100,2, + 160,6,124,0,161,1,125,3,116,7,124,3,124,0,100,3, + 141,2,130,1,116,8,124,0,131,1,1,0,124,2,83,0, + 41,4,122,25,70,105,110,100,32,97,110,100,32,108,111,97, + 100,32,116,104,101,32,109,111,100,117,108,101,46,78,122,40, + 105,109,112,111,114,116,32,111,102,32,123,125,32,104,97,108, + 116,101,100,59,32,78,111,110,101,32,105,110,32,115,121,115, + 46,109,111,100,117,108,101,115,114,16,0,0,0,41,9,114, + 50,0,0,0,114,15,0,0,0,114,92,0,0,0,114,34, + 0,0,0,218,14,95,78,69,69,68,83,95,76,79,65,68, + 73,78,71,114,205,0,0,0,114,45,0,0,0,114,203,0, + 0,0,114,65,0,0,0,41,4,114,17,0,0,0,114,204, + 0,0,0,114,96,0,0,0,114,75,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,218,14,95,102, + 105,110,100,95,97,110,100,95,108,111,97,100,218,3,0,0, + 115,22,0,0,0,0,2,10,1,14,1,8,1,32,2,8, + 1,4,1,2,255,4,2,12,2,8,1,114,207,0,0,0, + 114,22,0,0,0,99,3,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,4,0,0,0,67,0,0,0,115,42, + 0,0,0,116,0,124,0,124,1,124,2,131,3,1,0,124, + 2,100,1,107,4,114,32,116,1,124,0,124,1,124,2,131, + 3,125,0,116,2,124,0,116,3,131,2,83,0,41,2,97, + 50,1,0,0,73,109,112,111,114,116,32,97,110,100,32,114, + 101,116,117,114,110,32,116,104,101,32,109,111,100,117,108,101, + 32,98,97,115,101,100,32,111,110,32,105,116,115,32,110,97, + 109,101,44,32,116,104,101,32,112,97,99,107,97,103,101,32, + 116,104,101,32,99,97,108,108,32,105,115,10,32,32,32,32, + 98,101,105,110,103,32,109,97,100,101,32,102,114,111,109,44, + 32,97,110,100,32,116,104,101,32,108,101,118,101,108,32,97, + 100,106,117,115,116,109,101,110,116,46,10,10,32,32,32,32, + 84,104,105,115,32,102,117,110,99,116,105,111,110,32,114,101, + 112,114,101,115,101,110,116,115,32,116,104,101,32,103,114,101, + 97,116,101,115,116,32,99,111,109,109,111,110,32,100,101,110, + 111,109,105,110,97,116,111,114,32,111,102,32,102,117,110,99, + 116,105,111,110,97,108,105,116,121,10,32,32,32,32,98,101, + 116,119,101,101,110,32,105,109,112,111,114,116,95,109,111,100, + 117,108,101,32,97,110,100,32,95,95,105,109,112,111,114,116, + 95,95,46,32,84,104,105,115,32,105,110,99,108,117,100,101, + 115,32,115,101,116,116,105,110,103,32,95,95,112,97,99,107, + 97,103,101,95,95,32,105,102,10,32,32,32,32,116,104,101, + 32,108,111,97,100,101,114,32,100,105,100,32,110,111,116,46, + 10,10,32,32,32,32,114,22,0,0,0,41,4,114,200,0, + 0,0,114,188,0,0,0,114,207,0,0,0,218,11,95,103, + 99,100,95,105,109,112,111,114,116,114,199,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,114,208,0, + 0,0,234,3,0,0,115,8,0,0,0,0,9,12,1,8, + 1,12,1,114,208,0,0,0,169,1,218,9,114,101,99,117, + 114,115,105,118,101,99,3,0,0,0,0,0,0,0,1,0, + 0,0,8,0,0,0,11,0,0,0,67,0,0,0,115,226, + 0,0,0,124,1,68,0,93,216,125,4,116,0,124,4,116, + 1,131,2,115,66,124,3,114,34,124,0,106,2,100,1,23, + 0,125,5,110,4,100,2,125,5,116,3,100,3,124,5,155, + 0,100,4,116,4,124,4,131,1,106,2,155,0,157,4,131, + 1,130,1,113,4,124,4,100,5,107,2,114,108,124,3,115, + 220,116,5,124,0,100,6,131,2,114,220,116,6,124,0,124, + 0,106,7,124,2,100,7,100,8,141,4,1,0,113,4,116, + 5,124,0,124,4,131,2,115,4,100,9,160,8,124,0,106, + 2,124,4,161,2,125,6,122,14,116,9,124,2,124,6,131, + 2,1,0,87,0,113,4,4,0,116,10,107,10,114,218,1, + 0,125,7,1,0,122,42,124,7,106,11,124,6,107,2,114, + 200,116,12,106,13,160,14,124,6,116,15,161,2,100,10,107, + 9,114,200,87,0,89,0,162,8,113,4,130,0,87,0,53, + 0,100,10,125,7,126,7,88,0,89,0,113,4,88,0,113, + 4,124,0,83,0,41,11,122,238,70,105,103,117,114,101,32, + 111,117,116,32,119,104,97,116,32,95,95,105,109,112,111,114, + 116,95,95,32,115,104,111,117,108,100,32,114,101,116,117,114, + 110,46,10,10,32,32,32,32,84,104,101,32,105,109,112,111, + 114,116,95,32,112,97,114,97,109,101,116,101,114,32,105,115, + 32,97,32,99,97,108,108,97,98,108,101,32,119,104,105,99, + 104,32,116,97,107,101,115,32,116,104,101,32,110,97,109,101, + 32,111,102,32,109,111,100,117,108,101,32,116,111,10,32,32, + 32,32,105,109,112,111,114,116,46,32,73,116,32,105,115,32, + 114,101,113,117,105,114,101,100,32,116,111,32,100,101,99,111, + 117,112,108,101,32,116,104,101,32,102,117,110,99,116,105,111, + 110,32,102,114,111,109,32,97,115,115,117,109,105,110,103,32, + 105,109,112,111,114,116,108,105,98,39,115,10,32,32,32,32, + 105,109,112,111,114,116,32,105,109,112,108,101,109,101,110,116, + 97,116,105,111,110,32,105,115,32,100,101,115,105,114,101,100, + 46,10,10,32,32,32,32,122,8,46,95,95,97,108,108,95, + 95,122,13,96,96,102,114,111,109,32,108,105,115,116,39,39, + 122,8,73,116,101,109,32,105,110,32,122,18,32,109,117,115, + 116,32,98,101,32,115,116,114,44,32,110,111,116,32,250,1, + 42,218,7,95,95,97,108,108,95,95,84,114,209,0,0,0, + 114,182,0,0,0,78,41,16,114,196,0,0,0,114,197,0, + 0,0,114,1,0,0,0,114,198,0,0,0,114,14,0,0, + 0,114,4,0,0,0,218,16,95,104,97,110,100,108,101,95, + 102,114,111,109,108,105,115,116,114,212,0,0,0,114,45,0, + 0,0,114,67,0,0,0,114,203,0,0,0,114,17,0,0, + 0,114,15,0,0,0,114,92,0,0,0,114,34,0,0,0, + 114,206,0,0,0,41,8,114,96,0,0,0,218,8,102,114, + 111,109,108,105,115,116,114,204,0,0,0,114,210,0,0,0, + 218,1,120,90,5,119,104,101,114,101,90,9,102,114,111,109, + 95,110,97,109,101,90,3,101,120,99,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,213,0,0,0,249,3, + 0,0,115,44,0,0,0,0,10,8,1,10,1,4,1,12, + 2,4,1,28,2,8,1,14,1,10,1,2,255,8,2,10, + 1,14,1,2,1,14,1,16,4,10,1,16,255,2,2,8, + 1,22,1,114,213,0,0,0,99,1,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,6,0,0,0,67,0,0, + 0,115,146,0,0,0,124,0,160,0,100,1,161,1,125,1, + 124,0,160,0,100,2,161,1,125,2,124,1,100,3,107,9, + 114,82,124,2,100,3,107,9,114,78,124,1,124,2,106,1, + 107,3,114,78,116,2,106,3,100,4,124,1,155,2,100,5, + 124,2,106,1,155,2,100,6,157,5,116,4,100,7,100,8, + 141,3,1,0,124,1,83,0,124,2,100,3,107,9,114,96, + 124,2,106,1,83,0,116,2,106,3,100,9,116,4,100,7, + 100,8,141,3,1,0,124,0,100,10,25,0,125,1,100,11, + 124,0,107,7,114,142,124,1,160,5,100,12,161,1,100,13, + 25,0,125,1,124,1,83,0,41,14,122,167,67,97,108,99, + 117,108,97,116,101,32,119,104,97,116,32,95,95,112,97,99, + 107,97,103,101,95,95,32,115,104,111,117,108,100,32,98,101, + 46,10,10,32,32,32,32,95,95,112,97,99,107,97,103,101, + 95,95,32,105,115,32,110,111,116,32,103,117,97,114,97,110, + 116,101,101,100,32,116,111,32,98,101,32,100,101,102,105,110, + 101,100,32,111,114,32,99,111,117,108,100,32,98,101,32,115, + 101,116,32,116,111,32,78,111,110,101,10,32,32,32,32,116, + 111,32,114,101,112,114,101,115,101,110,116,32,116,104,97,116, + 32,105,116,115,32,112,114,111,112,101,114,32,118,97,108,117, + 101,32,105,115,32,117,110,107,110,111,119,110,46,10,10,32, + 32,32,32,114,145,0,0,0,114,105,0,0,0,78,122,32, + 95,95,112,97,99,107,97,103,101,95,95,32,33,61,32,95, + 95,115,112,101,99,95,95,46,112,97,114,101,110,116,32,40, + 122,4,32,33,61,32,250,1,41,233,3,0,0,0,41,1, + 90,10,115,116,97,99,107,108,101,118,101,108,122,89,99,97, + 110,39,116,32,114,101,115,111,108,118,101,32,112,97,99,107, + 97,103,101,32,102,114,111,109,32,95,95,115,112,101,99,95, + 95,32,111,114,32,95,95,112,97,99,107,97,103,101,95,95, + 44,32,102,97,108,108,105,110,103,32,98,97,99,107,32,111, + 110,32,95,95,110,97,109,101,95,95,32,97,110,100,32,95, + 95,112,97,116,104,95,95,114,1,0,0,0,114,141,0,0, + 0,114,128,0,0,0,114,22,0,0,0,41,6,114,34,0, + 0,0,114,130,0,0,0,114,192,0,0,0,114,193,0,0, + 0,114,194,0,0,0,114,129,0,0,0,41,3,218,7,103, + 108,111,98,97,108,115,114,186,0,0,0,114,95,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, + 17,95,99,97,108,99,95,95,95,112,97,99,107,97,103,101, + 95,95,30,4,0,0,115,38,0,0,0,0,7,10,1,10, + 1,8,1,18,1,22,2,2,0,2,254,6,3,4,1,8, + 1,6,2,6,2,2,0,2,254,6,3,8,1,8,1,14, + 1,114,219,0,0,0,114,10,0,0,0,99,5,0,0,0, + 0,0,0,0,0,0,0,0,9,0,0,0,5,0,0,0, + 67,0,0,0,115,180,0,0,0,124,4,100,1,107,2,114, + 18,116,0,124,0,131,1,125,5,110,36,124,1,100,2,107, + 9,114,30,124,1,110,2,105,0,125,6,116,1,124,6,131, + 1,125,7,116,0,124,0,124,7,124,4,131,3,125,5,124, + 3,115,150,124,4,100,1,107,2,114,84,116,0,124,0,160, + 2,100,3,161,1,100,1,25,0,131,1,83,0,124,0,115, + 92,124,5,83,0,116,3,124,0,131,1,116,3,124,0,160, + 2,100,3,161,1,100,1,25,0,131,1,24,0,125,8,116, + 4,106,5,124,5,106,6,100,2,116,3,124,5,106,6,131, + 1,124,8,24,0,133,2,25,0,25,0,83,0,110,26,116, + 7,124,5,100,4,131,2,114,172,116,8,124,5,124,3,116, + 0,131,3,83,0,124,5,83,0,100,2,83,0,41,5,97, + 215,1,0,0,73,109,112,111,114,116,32,97,32,109,111,100, + 117,108,101,46,10,10,32,32,32,32,84,104,101,32,39,103, + 108,111,98,97,108,115,39,32,97,114,103,117,109,101,110,116, + 32,105,115,32,117,115,101,100,32,116,111,32,105,110,102,101, + 114,32,119,104,101,114,101,32,116,104,101,32,105,109,112,111, + 114,116,32,105,115,32,111,99,99,117,114,114,105,110,103,32, + 102,114,111,109,10,32,32,32,32,116,111,32,104,97,110,100, + 108,101,32,114,101,108,97,116,105,118,101,32,105,109,112,111, + 114,116,115,46,32,84,104,101,32,39,108,111,99,97,108,115, + 39,32,97,114,103,117,109,101,110,116,32,105,115,32,105,103, + 110,111,114,101,100,46,32,84,104,101,10,32,32,32,32,39, + 102,114,111,109,108,105,115,116,39,32,97,114,103,117,109,101, + 110,116,32,115,112,101,99,105,102,105,101,115,32,119,104,97, + 116,32,115,104,111,117,108,100,32,101,120,105,115,116,32,97, + 115,32,97,116,116,114,105,98,117,116,101,115,32,111,110,32, + 116,104,101,32,109,111,100,117,108,101,10,32,32,32,32,98, + 101,105,110,103,32,105,109,112,111,114,116,101,100,32,40,101, + 46,103,46,32,96,96,102,114,111,109,32,109,111,100,117,108, + 101,32,105,109,112,111,114,116,32,60,102,114,111,109,108,105, + 115,116,62,96,96,41,46,32,32,84,104,101,32,39,108,101, + 118,101,108,39,10,32,32,32,32,97,114,103,117,109,101,110, + 116,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101, + 32,112,97,99,107,97,103,101,32,108,111,99,97,116,105,111, + 110,32,116,111,32,105,109,112,111,114,116,32,102,114,111,109, + 32,105,110,32,97,32,114,101,108,97,116,105,118,101,10,32, + 32,32,32,105,109,112,111,114,116,32,40,101,46,103,46,32, + 96,96,102,114,111,109,32,46,46,112,107,103,32,105,109,112, + 111,114,116,32,109,111,100,96,96,32,119,111,117,108,100,32, + 104,97,118,101,32,97,32,39,108,101,118,101,108,39,32,111, + 102,32,50,41,46,10,10,32,32,32,32,114,22,0,0,0, + 78,114,128,0,0,0,114,141,0,0,0,41,9,114,208,0, + 0,0,114,219,0,0,0,218,9,112,97,114,116,105,116,105, + 111,110,114,184,0,0,0,114,15,0,0,0,114,92,0,0, + 0,114,1,0,0,0,114,4,0,0,0,114,213,0,0,0, + 41,9,114,17,0,0,0,114,218,0,0,0,218,6,108,111, + 99,97,108,115,114,214,0,0,0,114,187,0,0,0,114,96, + 0,0,0,90,8,103,108,111,98,97,108,115,95,114,186,0, + 0,0,90,7,99,117,116,95,111,102,102,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,218,10,95,95,105,109, + 112,111,114,116,95,95,57,4,0,0,115,30,0,0,0,0, + 11,8,1,10,2,16,1,8,1,12,1,4,3,8,1,18, + 1,4,1,4,4,26,3,32,1,10,1,12,2,114,222,0, + 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,3,0,0,0,67,0,0,0,115,38,0,0,0, + 116,0,160,1,124,0,161,1,125,1,124,1,100,0,107,8, + 114,30,116,2,100,1,124,0,23,0,131,1,130,1,116,3, + 124,1,131,1,83,0,41,2,78,122,25,110,111,32,98,117, + 105,108,116,45,105,110,32,109,111,100,117,108,101,32,110,97, + 109,101,100,32,41,4,114,160,0,0,0,114,166,0,0,0, + 114,79,0,0,0,114,159,0,0,0,41,2,114,17,0,0, + 0,114,95,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,218,18,95,98,117,105,108,116,105,110,95, + 102,114,111,109,95,110,97,109,101,94,4,0,0,115,8,0, + 0,0,0,1,10,1,8,1,12,1,114,223,0,0,0,99, + 2,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0, + 5,0,0,0,67,0,0,0,115,166,0,0,0,124,1,97, + 0,124,0,97,1,116,2,116,1,131,1,125,2,116,1,106, + 3,160,4,161,0,68,0,93,72,92,2,125,3,125,4,116, + 5,124,4,124,2,131,2,114,26,124,3,116,1,106,6,107, + 6,114,60,116,7,125,5,110,18,116,0,160,8,124,3,161, + 1,114,26,116,9,125,5,110,2,113,26,116,10,124,4,124, + 5,131,2,125,6,116,11,124,6,124,4,131,2,1,0,113, + 26,116,1,106,3,116,12,25,0,125,7,100,1,68,0,93, + 46,125,8,124,8,116,1,106,3,107,7,114,138,116,13,124, + 8,131,1,125,9,110,10,116,1,106,3,124,8,25,0,125, + 9,116,14,124,7,124,8,124,9,131,3,1,0,113,114,100, + 2,83,0,41,3,122,250,83,101,116,117,112,32,105,109,112, + 111,114,116,108,105,98,32,98,121,32,105,109,112,111,114,116, + 105,110,103,32,110,101,101,100,101,100,32,98,117,105,108,116, + 45,105,110,32,109,111,100,117,108,101,115,32,97,110,100,32, + 105,110,106,101,99,116,105,110,103,32,116,104,101,109,10,32, + 32,32,32,105,110,116,111,32,116,104,101,32,103,108,111,98, + 97,108,32,110,97,109,101,115,112,97,99,101,46,10,10,32, + 32,32,32,65,115,32,115,121,115,32,105,115,32,110,101,101, + 100,101,100,32,102,111,114,32,115,121,115,46,109,111,100,117, + 108,101,115,32,97,99,99,101,115,115,32,97,110,100,32,95, + 105,109,112,32,105,115,32,110,101,101,100,101,100,32,116,111, + 32,108,111,97,100,32,98,117,105,108,116,45,105,110,10,32, + 32,32,32,109,111,100,117,108,101,115,44,32,116,104,111,115, + 101,32,116,119,111,32,109,111,100,117,108,101,115,32,109,117, + 115,116,32,98,101,32,101,120,112,108,105,99,105,116,108,121, + 32,112,97,115,115,101,100,32,105,110,46,10,10,32,32,32, + 32,41,3,114,23,0,0,0,114,192,0,0,0,114,64,0, + 0,0,78,41,15,114,57,0,0,0,114,15,0,0,0,114, + 14,0,0,0,114,92,0,0,0,218,5,105,116,101,109,115, + 114,196,0,0,0,114,78,0,0,0,114,160,0,0,0,114, + 88,0,0,0,114,173,0,0,0,114,142,0,0,0,114,148, + 0,0,0,114,1,0,0,0,114,223,0,0,0,114,5,0, + 0,0,41,10,218,10,115,121,115,95,109,111,100,117,108,101, + 218,11,95,105,109,112,95,109,111,100,117,108,101,90,11,109, + 111,100,117,108,101,95,116,121,112,101,114,17,0,0,0,114, + 96,0,0,0,114,109,0,0,0,114,95,0,0,0,90,11, + 115,101,108,102,95,109,111,100,117,108,101,90,12,98,117,105, + 108,116,105,110,95,110,97,109,101,90,14,98,117,105,108,116, + 105,110,95,109,111,100,117,108,101,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,218,6,95,115,101,116,117,112, + 101,4,0,0,115,36,0,0,0,0,9,4,1,4,3,8, + 1,18,1,10,1,10,1,6,1,10,1,6,2,2,1,10, + 1,12,3,10,1,8,1,10,1,10,2,10,1,114,227,0, + 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,3,0,0,0,67,0,0,0,115,38,0,0,0, + 116,0,124,0,124,1,131,2,1,0,116,1,106,2,160,3, + 116,4,161,1,1,0,116,1,106,2,160,3,116,5,161,1, + 1,0,100,1,83,0,41,2,122,48,73,110,115,116,97,108, + 108,32,105,109,112,111,114,116,101,114,115,32,102,111,114,32, + 98,117,105,108,116,105,110,32,97,110,100,32,102,114,111,122, + 101,110,32,109,111,100,117,108,101,115,78,41,6,114,227,0, + 0,0,114,15,0,0,0,114,191,0,0,0,114,120,0,0, + 0,114,160,0,0,0,114,173,0,0,0,41,2,114,225,0, + 0,0,114,226,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,8,95,105,110,115,116,97,108,108, + 136,4,0,0,115,6,0,0,0,0,2,10,2,12,1,114, + 228,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,4,0,0,0,67,0,0,0,115,32,0, + 0,0,100,1,100,2,108,0,125,0,124,0,97,1,124,0, + 160,2,116,3,106,4,116,5,25,0,161,1,1,0,100,2, + 83,0,41,3,122,57,73,110,115,116,97,108,108,32,105,109, + 112,111,114,116,101,114,115,32,116,104,97,116,32,114,101,113, + 117,105,114,101,32,101,120,116,101,114,110,97,108,32,102,105, + 108,101,115,121,115,116,101,109,32,97,99,99,101,115,115,114, + 22,0,0,0,78,41,6,218,26,95,102,114,111,122,101,110, + 95,105,109,112,111,114,116,108,105,98,95,101,120,116,101,114, + 110,97,108,114,126,0,0,0,114,228,0,0,0,114,15,0, + 0,0,114,92,0,0,0,114,1,0,0,0,41,1,114,229, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,218,27,95,105,110,115,116,97,108,108,95,101,120,116, + 101,114,110,97,108,95,105,109,112,111,114,116,101,114,115,144, + 4,0,0,115,6,0,0,0,0,3,8,1,4,1,114,230, + 0,0,0,41,2,78,78,41,1,78,41,2,78,114,22,0, + 0,0,41,4,78,78,114,10,0,0,0,114,22,0,0,0, + 41,50,114,3,0,0,0,114,126,0,0,0,114,12,0,0, + 0,114,18,0,0,0,114,59,0,0,0,114,33,0,0,0, + 114,42,0,0,0,114,19,0,0,0,114,20,0,0,0,114, + 49,0,0,0,114,50,0,0,0,114,53,0,0,0,114,65, + 0,0,0,114,67,0,0,0,114,76,0,0,0,114,86,0, + 0,0,114,90,0,0,0,114,97,0,0,0,114,111,0,0, + 0,114,112,0,0,0,114,91,0,0,0,114,142,0,0,0, + 114,148,0,0,0,114,152,0,0,0,114,107,0,0,0,114, + 93,0,0,0,114,158,0,0,0,114,159,0,0,0,114,94, + 0,0,0,114,160,0,0,0,114,173,0,0,0,114,178,0, + 0,0,114,188,0,0,0,114,190,0,0,0,114,195,0,0, + 0,114,200,0,0,0,90,15,95,69,82,82,95,77,83,71, + 95,80,82,69,70,73,88,114,202,0,0,0,114,205,0,0, + 0,218,6,111,98,106,101,99,116,114,206,0,0,0,114,207, + 0,0,0,114,208,0,0,0,114,213,0,0,0,114,219,0, + 0,0,114,222,0,0,0,114,223,0,0,0,114,227,0,0, + 0,114,228,0,0,0,114,230,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, + 8,60,109,111,100,117,108,101,62,1,0,0,0,115,94,0, + 0,0,4,24,4,2,8,8,8,8,4,2,4,3,16,4, + 14,68,14,21,14,16,8,37,8,17,8,11,14,8,8,11, + 8,12,8,16,8,36,14,101,16,26,10,45,14,72,8,17, + 8,17,8,30,8,37,8,42,8,15,14,73,14,79,14,13, + 8,9,8,9,10,47,8,16,4,1,8,2,8,27,6,3, + 8,16,10,15,14,37,8,27,10,37,8,7,8,35,8,8, }; diff --git a/Python/importlib_external.h b/Python/importlib_external.h index e724560d67a1..9b86fe6b72a9 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -1,1003 +1,1001 @@ /* Auto-generated by Programs/_freeze_importlib.c */ const unsigned char _Py_M__importlib_bootstrap_external[] = { 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,5,0,0,0,64,0,0,0,115,52,2,0,0,100,0, + 0,5,0,0,0,64,0,0,0,115,32,2,0,0,100,0, 90,0,100,1,90,1,100,2,90,2,101,2,101,1,23,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,132,0,90,8,100,13,100,14,132,0, 90,9,100,15,100,16,132,0,90,10,100,17,100,18,132,0, 90,11,100,19,100,20,132,0,90,12,100,21,100,22,132,0, - 90,13,100,23,100,24,132,0,90,14,100,25,102,1,100,26, - 100,27,132,1,90,15,101,16,101,15,106,17,131,1,90,18, - 100,28,160,19,100,29,100,30,161,2,100,31,23,0,90,20, - 101,21,160,22,101,20,100,30,161,2,90,23,100,32,90,24, - 100,33,90,25,100,34,103,1,90,26,100,35,103,1,90,27, - 101,27,4,0,90,28,90,29,100,36,102,1,100,36,100,37, - 156,1,100,38,100,39,132,3,90,30,100,40,100,41,132,0, - 90,31,100,42,100,43,132,0,90,32,100,44,100,45,132,0, - 90,33,100,46,100,47,132,0,90,34,100,48,100,49,132,0, - 90,35,100,50,100,51,132,0,90,36,100,52,100,53,132,0, - 90,37,100,54,100,55,132,0,90,38,100,56,100,57,132,0, - 90,39,100,36,100,36,100,36,102,3,100,58,100,59,132,1, - 90,40,100,60,100,60,102,2,100,61,100,62,132,1,90,41, - 100,63,102,1,100,64,100,65,132,1,90,42,100,66,100,67, - 132,0,90,43,101,44,131,0,90,45,100,36,102,1,100,36, - 101,45,100,68,156,2,100,69,100,70,132,3,90,46,71,0, - 100,71,100,72,132,0,100,72,131,2,90,47,71,0,100,73, - 100,74,132,0,100,74,131,2,90,48,71,0,100,75,100,76, - 132,0,100,76,101,48,131,3,90,49,71,0,100,77,100,78, - 132,0,100,78,131,2,90,50,71,0,100,79,100,80,132,0, - 100,80,101,50,101,49,131,4,90,51,71,0,100,81,100,82, - 132,0,100,82,101,50,101,48,131,4,90,52,103,0,90,53, - 71,0,100,83,100,84,132,0,100,84,101,50,101,48,131,4, - 90,54,71,0,100,85,100,86,132,0,100,86,131,2,90,55, - 71,0,100,87,100,88,132,0,100,88,131,2,90,56,71,0, - 100,89,100,90,132,0,100,90,131,2,90,57,71,0,100,91, - 100,92,132,0,100,92,131,2,90,58,100,36,102,1,100,93, - 100,94,132,1,90,59,100,95,100,96,132,0,90,60,100,97, - 100,98,132,0,90,61,100,99,100,100,132,0,90,62,100,36, - 83,0,41,101,97,94,1,0,0,67,111,114,101,32,105,109, - 112,108,101,109,101,110,116,97,116,105,111,110,32,111,102,32, - 112,97,116,104,45,98,97,115,101,100,32,105,109,112,111,114, - 116,46,10,10,84,104,105,115,32,109,111,100,117,108,101,32, - 105,115,32,78,79,84,32,109,101,97,110,116,32,116,111,32, - 98,101,32,100,105,114,101,99,116,108,121,32,105,109,112,111, - 114,116,101,100,33,32,73,116,32,104,97,115,32,98,101,101, - 110,32,100,101,115,105,103,110,101,100,32,115,117,99,104,10, - 116,104,97,116,32,105,116,32,99,97,110,32,98,101,32,98, - 111,111,116,115,116,114,97,112,112,101,100,32,105,110,116,111, - 32,80,121,116,104,111,110,32,97,115,32,116,104,101,32,105, - 109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,102, - 32,105,109,112,111,114,116,46,32,65,115,10,115,117,99,104, - 32,105,116,32,114,101,113,117,105,114,101,115,32,116,104,101, - 32,105,110,106,101,99,116,105,111,110,32,111,102,32,115,112, - 101,99,105,102,105,99,32,109,111,100,117,108,101,115,32,97, - 110,100,32,97,116,116,114,105,98,117,116,101,115,32,105,110, - 32,111,114,100,101,114,32,116,111,10,119,111,114,107,46,32, - 79,110,101,32,115,104,111,117,108,100,32,117,115,101,32,105, - 109,112,111,114,116,108,105,98,32,97,115,32,116,104,101,32, - 112,117,98,108,105,99,45,102,97,99,105,110,103,32,118,101, - 114,115,105,111,110,32,111,102,32,116,104,105,115,32,109,111, - 100,117,108,101,46,10,10,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,3,0,0,0,115,60,0,0,0,116,0, - 106,1,160,2,116,3,161,1,114,48,116,0,106,1,160,2, - 116,4,161,1,114,30,100,1,137,0,110,4,100,2,137,0, - 135,0,102,1,100,3,100,4,132,8,125,0,110,8,100,5, - 100,4,132,0,125,0,124,0,83,0,41,6,78,90,12,80, - 89,84,72,79,78,67,65,83,69,79,75,115,12,0,0,0, - 80,89,84,72,79,78,67,65,83,69,79,75,99,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,19,0,0,0,115,10,0,0,0,136,0,116,0,106,1, - 107,6,83,0,41,1,250,53,84,114,117,101,32,105,102,32, - 102,105,108,101,110,97,109,101,115,32,109,117,115,116,32,98, - 101,32,99,104,101,99,107,101,100,32,99,97,115,101,45,105, - 110,115,101,110,115,105,116,105,118,101,108,121,46,41,2,218, - 3,95,111,115,90,7,101,110,118,105,114,111,110,169,0,169, - 1,218,3,107,101,121,114,3,0,0,0,250,38,60,102,114, - 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95, - 98,111,111,116,115,116,114,97,112,95,101,120,116,101,114,110, - 97,108,62,218,11,95,114,101,108,97,120,95,99,97,115,101, - 36,0,0,0,115,2,0,0,0,0,2,122,37,95,109,97, - 107,101,95,114,101,108,97,120,95,99,97,115,101,46,60,108, - 111,99,97,108,115,62,46,95,114,101,108,97,120,95,99,97, - 115,101,99,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,83,0,0,0,115,4,0,0,0, - 100,1,83,0,41,2,114,1,0,0,0,70,114,3,0,0, - 0,114,3,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,7,0,0,0,40,0,0,0,115,2, - 0,0,0,0,2,41,5,218,3,115,121,115,218,8,112,108, - 97,116,102,111,114,109,218,10,115,116,97,114,116,115,119,105, - 116,104,218,27,95,67,65,83,69,95,73,78,83,69,78,83, - 73,84,73,86,69,95,80,76,65,84,70,79,82,77,83,218, - 35,95,67,65,83,69,95,73,78,83,69,78,83,73,84,73, - 86,69,95,80,76,65,84,70,79,82,77,83,95,83,84,82, - 95,75,69,89,41,1,114,7,0,0,0,114,3,0,0,0, - 114,4,0,0,0,114,6,0,0,0,218,16,95,109,97,107, - 101,95,114,101,108,97,120,95,99,97,115,101,29,0,0,0, - 115,14,0,0,0,0,1,12,1,12,1,6,2,4,2,14, - 4,8,3,114,13,0,0,0,99,1,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,4,0,0,0,67,0,0, - 0,115,20,0,0,0,116,0,124,0,131,1,100,1,64,0, - 160,1,100,2,100,3,161,2,83,0,41,4,122,42,67,111, - 110,118,101,114,116,32,97,32,51,50,45,98,105,116,32,105, - 110,116,101,103,101,114,32,116,111,32,108,105,116,116,108,101, - 45,101,110,100,105,97,110,46,236,3,0,0,0,255,127,255, - 127,3,0,233,4,0,0,0,218,6,108,105,116,116,108,101, - 41,2,218,3,105,110,116,218,8,116,111,95,98,121,116,101, - 115,41,1,218,1,120,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,12,95,112,97,99,107,95,117,105,110, - 116,51,50,46,0,0,0,115,2,0,0,0,0,2,114,20, - 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,4,0,0,0,67,0,0,0,115,28,0,0, - 0,116,0,124,0,131,1,100,1,107,2,115,16,116,1,130, - 1,116,2,160,3,124,0,100,2,161,2,83,0,41,3,122, - 47,67,111,110,118,101,114,116,32,52,32,98,121,116,101,115, - 32,105,110,32,108,105,116,116,108,101,45,101,110,100,105,97, - 110,32,116,111,32,97,110,32,105,110,116,101,103,101,114,46, - 114,15,0,0,0,114,16,0,0,0,169,4,218,3,108,101, - 110,218,14,65,115,115,101,114,116,105,111,110,69,114,114,111, - 114,114,17,0,0,0,218,10,102,114,111,109,95,98,121,116, - 101,115,169,1,218,4,100,97,116,97,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,14,95,117,110,112,97, - 99,107,95,117,105,110,116,51,50,51,0,0,0,115,4,0, - 0,0,0,2,16,1,114,27,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0, - 67,0,0,0,115,28,0,0,0,116,0,124,0,131,1,100, - 1,107,2,115,16,116,1,130,1,116,2,160,3,124,0,100, - 2,161,2,83,0,41,3,122,47,67,111,110,118,101,114,116, - 32,50,32,98,121,116,101,115,32,105,110,32,108,105,116,116, - 108,101,45,101,110,100,105,97,110,32,116,111,32,97,110,32, - 105,110,116,101,103,101,114,46,233,2,0,0,0,114,16,0, - 0,0,114,21,0,0,0,114,25,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,218,14,95,117,110, - 112,97,99,107,95,117,105,110,116,49,54,56,0,0,0,115, - 4,0,0,0,0,2,16,1,114,29,0,0,0,99,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0, - 0,0,71,0,0,0,115,20,0,0,0,116,0,160,1,100, - 1,100,2,132,0,124,0,68,0,131,1,161,1,83,0,41, - 3,122,31,82,101,112,108,97,99,101,109,101,110,116,32,102, - 111,114,32,111,115,46,112,97,116,104,46,106,111,105,110,40, - 41,46,99,1,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,5,0,0,0,83,0,0,0,115,26,0,0,0, - 103,0,124,0,93,18,125,1,124,1,114,22,124,1,160,0, - 116,1,161,1,145,2,113,4,83,0,114,3,0,0,0,41, - 2,218,6,114,115,116,114,105,112,218,15,112,97,116,104,95, - 115,101,112,97,114,97,116,111,114,115,41,2,218,2,46,48, - 218,4,112,97,114,116,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,10,60,108,105,115,116,99,111,109,112, - 62,64,0,0,0,115,6,0,0,0,6,1,2,0,4,255, - 122,30,95,112,97,116,104,95,106,111,105,110,46,60,108,111, - 99,97,108,115,62,46,60,108,105,115,116,99,111,109,112,62, - 41,2,218,8,112,97,116,104,95,115,101,112,218,4,106,111, - 105,110,41,1,218,10,112,97,116,104,95,112,97,114,116,115, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, - 10,95,112,97,116,104,95,106,111,105,110,62,0,0,0,115, - 6,0,0,0,0,2,10,1,2,255,114,38,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, - 5,0,0,0,67,0,0,0,115,96,0,0,0,116,0,116, - 1,131,1,100,1,107,2,114,36,124,0,160,2,116,3,161, - 1,92,3,125,1,125,2,125,3,124,1,124,3,102,2,83, - 0,116,4,124,0,131,1,68,0,93,42,125,4,124,4,116, - 1,107,6,114,44,124,0,106,5,124,4,100,1,100,2,141, - 2,92,2,125,1,125,3,124,1,124,3,102,2,2,0,1, - 0,83,0,113,44,100,3,124,0,102,2,83,0,41,4,122, - 32,82,101,112,108,97,99,101,109,101,110,116,32,102,111,114, - 32,111,115,46,112,97,116,104,46,115,112,108,105,116,40,41, - 46,233,1,0,0,0,41,1,90,8,109,97,120,115,112,108, - 105,116,218,0,41,6,114,22,0,0,0,114,31,0,0,0, - 218,10,114,112,97,114,116,105,116,105,111,110,114,35,0,0, - 0,218,8,114,101,118,101,114,115,101,100,218,6,114,115,112, - 108,105,116,41,5,218,4,112,97,116,104,90,5,102,114,111, - 110,116,218,1,95,218,4,116,97,105,108,114,19,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, - 11,95,112,97,116,104,95,115,112,108,105,116,68,0,0,0, - 115,16,0,0,0,0,2,12,1,16,1,8,1,12,1,8, - 1,18,1,14,1,114,47,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,67, - 0,0,0,115,10,0,0,0,116,0,160,1,124,0,161,1, - 83,0,41,1,122,126,83,116,97,116,32,116,104,101,32,112, - 97,116,104,46,10,10,32,32,32,32,77,97,100,101,32,97, - 32,115,101,112,97,114,97,116,101,32,102,117,110,99,116,105, - 111,110,32,116,111,32,109,97,107,101,32,105,116,32,101,97, - 115,105,101,114,32,116,111,32,111,118,101,114,114,105,100,101, - 32,105,110,32,101,120,112,101,114,105,109,101,110,116,115,10, - 32,32,32,32,40,101,46,103,46,32,99,97,99,104,101,32, - 115,116,97,116,32,114,101,115,117,108,116,115,41,46,10,10, - 32,32,32,32,41,2,114,2,0,0,0,90,4,115,116,97, - 116,169,1,114,44,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,218,10,95,112,97,116,104,95,115, - 116,97,116,80,0,0,0,115,2,0,0,0,0,7,114,49, - 0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,8,0,0,0,67,0,0,0,115,50,0,0, - 0,122,12,116,0,124,0,131,1,125,2,87,0,110,22,4, - 0,116,1,107,10,114,34,1,0,1,0,1,0,89,0,100, - 1,83,0,88,0,124,2,106,2,100,2,64,0,124,1,107, - 2,83,0,41,3,122,49,84,101,115,116,32,119,104,101,116, - 104,101,114,32,116,104,101,32,112,97,116,104,32,105,115,32, - 116,104,101,32,115,112,101,99,105,102,105,101,100,32,109,111, - 100,101,32,116,121,112,101,46,70,105,0,240,0,0,41,3, - 114,49,0,0,0,218,7,79,83,69,114,114,111,114,218,7, - 115,116,95,109,111,100,101,41,3,114,44,0,0,0,218,4, - 109,111,100,101,90,9,115,116,97,116,95,105,110,102,111,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,18, - 95,112,97,116,104,95,105,115,95,109,111,100,101,95,116,121, - 112,101,90,0,0,0,115,10,0,0,0,0,2,2,1,12, - 1,14,1,8,1,114,53,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,67, - 0,0,0,115,10,0,0,0,116,0,124,0,100,1,131,2, - 83,0,41,2,122,31,82,101,112,108,97,99,101,109,101,110, - 116,32,102,111,114,32,111,115,46,112,97,116,104,46,105,115, - 102,105,108,101,46,105,0,128,0,0,41,1,114,53,0,0, - 0,114,48,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,12,95,112,97,116,104,95,105,115,102, - 105,108,101,99,0,0,0,115,2,0,0,0,0,2,114,54, - 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,3,0,0,0,67,0,0,0,115,22,0,0, - 0,124,0,115,12,116,0,160,1,161,0,125,0,116,2,124, - 0,100,1,131,2,83,0,41,2,122,30,82,101,112,108,97, - 99,101,109,101,110,116,32,102,111,114,32,111,115,46,112,97, - 116,104,46,105,115,100,105,114,46,105,0,64,0,0,41,3, - 114,2,0,0,0,218,6,103,101,116,99,119,100,114,53,0, - 0,0,114,48,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,218,11,95,112,97,116,104,95,105,115, - 100,105,114,104,0,0,0,115,6,0,0,0,0,2,4,1, - 8,1,114,56,0,0,0,99,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,0, - 115,26,0,0,0,124,0,160,0,116,1,161,1,112,24,124, - 0,100,1,100,2,133,2,25,0,116,2,107,6,83,0,41, - 3,122,142,82,101,112,108,97,99,101,109,101,110,116,32,102, - 111,114,32,111,115,46,112,97,116,104,46,105,115,97,98,115, - 46,10,10,32,32,32,32,67,111,110,115,105,100,101,114,115, - 32,97,32,87,105,110,100,111,119,115,32,100,114,105,118,101, - 45,114,101,108,97,116,105,118,101,32,112,97,116,104,32,40, - 110,111,32,100,114,105,118,101,44,32,98,117,116,32,115,116, - 97,114,116,115,32,119,105,116,104,32,115,108,97,115,104,41, - 32,116,111,10,32,32,32,32,115,116,105,108,108,32,98,101, - 32,34,97,98,115,111,108,117,116,101,34,46,10,32,32,32, - 32,114,39,0,0,0,233,3,0,0,0,41,3,114,10,0, - 0,0,114,31,0,0,0,218,20,95,112,97,116,104,115,101, - 112,115,95,119,105,116,104,95,99,111,108,111,110,114,48,0, + 90,13,100,23,100,24,132,0,90,14,100,101,100,26,100,27, + 132,1,90,15,101,16,101,15,106,17,131,1,90,18,100,28, + 160,19,100,29,100,30,161,2,100,31,23,0,90,20,101,21, + 160,22,101,20,100,30,161,2,90,23,100,32,90,24,100,33, + 90,25,100,34,103,1,90,26,100,35,103,1,90,27,101,27, + 4,0,90,28,90,29,100,102,100,36,100,37,156,1,100,38, + 100,39,132,3,90,30,100,40,100,41,132,0,90,31,100,42, + 100,43,132,0,90,32,100,44,100,45,132,0,90,33,100,46, + 100,47,132,0,90,34,100,48,100,49,132,0,90,35,100,50, + 100,51,132,0,90,36,100,52,100,53,132,0,90,37,100,54, + 100,55,132,0,90,38,100,56,100,57,132,0,90,39,100,103, + 100,58,100,59,132,1,90,40,100,104,100,61,100,62,132,1, + 90,41,100,105,100,64,100,65,132,1,90,42,100,66,100,67, + 132,0,90,43,101,44,131,0,90,45,100,106,100,36,101,45, + 100,68,156,2,100,69,100,70,132,3,90,46,71,0,100,71, + 100,72,132,0,100,72,131,2,90,47,71,0,100,73,100,74, + 132,0,100,74,131,2,90,48,71,0,100,75,100,76,132,0, + 100,76,101,48,131,3,90,49,71,0,100,77,100,78,132,0, + 100,78,131,2,90,50,71,0,100,79,100,80,132,0,100,80, + 101,50,101,49,131,4,90,51,71,0,100,81,100,82,132,0, + 100,82,101,50,101,48,131,4,90,52,103,0,90,53,71,0, + 100,83,100,84,132,0,100,84,101,50,101,48,131,4,90,54, + 71,0,100,85,100,86,132,0,100,86,131,2,90,55,71,0, + 100,87,100,88,132,0,100,88,131,2,90,56,71,0,100,89, + 100,90,132,0,100,90,131,2,90,57,71,0,100,91,100,92, + 132,0,100,92,131,2,90,58,100,107,100,93,100,94,132,1, + 90,59,100,95,100,96,132,0,90,60,100,97,100,98,132,0, + 90,61,100,99,100,100,132,0,90,62,100,36,83,0,41,108, + 97,94,1,0,0,67,111,114,101,32,105,109,112,108,101,109, + 101,110,116,97,116,105,111,110,32,111,102,32,112,97,116,104, + 45,98,97,115,101,100,32,105,109,112,111,114,116,46,10,10, + 84,104,105,115,32,109,111,100,117,108,101,32,105,115,32,78, + 79,84,32,109,101,97,110,116,32,116,111,32,98,101,32,100, + 105,114,101,99,116,108,121,32,105,109,112,111,114,116,101,100, + 33,32,73,116,32,104,97,115,32,98,101,101,110,32,100,101, + 115,105,103,110,101,100,32,115,117,99,104,10,116,104,97,116, + 32,105,116,32,99,97,110,32,98,101,32,98,111,111,116,115, + 116,114,97,112,112,101,100,32,105,110,116,111,32,80,121,116, + 104,111,110,32,97,115,32,116,104,101,32,105,109,112,108,101, + 109,101,110,116,97,116,105,111,110,32,111,102,32,105,109,112, + 111,114,116,46,32,65,115,10,115,117,99,104,32,105,116,32, + 114,101,113,117,105,114,101,115,32,116,104,101,32,105,110,106, + 101,99,116,105,111,110,32,111,102,32,115,112,101,99,105,102, + 105,99,32,109,111,100,117,108,101,115,32,97,110,100,32,97, + 116,116,114,105,98,117,116,101,115,32,105,110,32,111,114,100, + 101,114,32,116,111,10,119,111,114,107,46,32,79,110,101,32, + 115,104,111,117,108,100,32,117,115,101,32,105,109,112,111,114, + 116,108,105,98,32,97,115,32,116,104,101,32,112,117,98,108, + 105,99,45,102,97,99,105,110,103,32,118,101,114,115,105,111, + 110,32,111,102,32,116,104,105,115,32,109,111,100,117,108,101, + 46,10,10,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,3,0,0,0,115,60,0,0,0,116,0,106,1,160,2, + 116,3,161,1,114,48,116,0,106,1,160,2,116,4,161,1, + 114,30,100,1,137,0,110,4,100,2,137,0,135,0,102,1, + 100,3,100,4,132,8,125,0,110,8,100,5,100,4,132,0, + 125,0,124,0,83,0,41,6,78,90,12,80,89,84,72,79, + 78,67,65,83,69,79,75,115,12,0,0,0,80,89,84,72, + 79,78,67,65,83,69,79,75,99,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,19,0,0, + 0,115,10,0,0,0,136,0,116,0,106,1,107,6,83,0, + 41,1,250,53,84,114,117,101,32,105,102,32,102,105,108,101, + 110,97,109,101,115,32,109,117,115,116,32,98,101,32,99,104, + 101,99,107,101,100,32,99,97,115,101,45,105,110,115,101,110, + 115,105,116,105,118,101,108,121,46,41,2,218,3,95,111,115, + 90,7,101,110,118,105,114,111,110,169,0,169,1,218,3,107, + 101,121,114,3,0,0,0,250,38,60,102,114,111,122,101,110, + 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, + 115,116,114,97,112,95,101,120,116,101,114,110,97,108,62,218, + 11,95,114,101,108,97,120,95,99,97,115,101,36,0,0,0, + 115,2,0,0,0,0,2,122,37,95,109,97,107,101,95,114, + 101,108,97,120,95,99,97,115,101,46,60,108,111,99,97,108, + 115,62,46,95,114,101,108,97,120,95,99,97,115,101,99,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,83,0,0,0,115,4,0,0,0,100,1,83,0, + 41,2,114,1,0,0,0,70,114,3,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,114,7,0,0,0,40,0,0,0,115,2,0,0,0,0, + 2,41,5,218,3,115,121,115,218,8,112,108,97,116,102,111, + 114,109,218,10,115,116,97,114,116,115,119,105,116,104,218,27, + 95,67,65,83,69,95,73,78,83,69,78,83,73,84,73,86, + 69,95,80,76,65,84,70,79,82,77,83,218,35,95,67,65, + 83,69,95,73,78,83,69,78,83,73,84,73,86,69,95,80, + 76,65,84,70,79,82,77,83,95,83,84,82,95,75,69,89, + 41,1,114,7,0,0,0,114,3,0,0,0,114,4,0,0, + 0,114,6,0,0,0,218,16,95,109,97,107,101,95,114,101, + 108,97,120,95,99,97,115,101,29,0,0,0,115,14,0,0, + 0,0,1,12,1,12,1,6,2,4,2,14,4,8,3,114, + 13,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,4,0,0,0,67,0,0,0,115,20,0, + 0,0,116,0,124,0,131,1,100,1,64,0,160,1,100,2, + 100,3,161,2,83,0,41,4,122,42,67,111,110,118,101,114, + 116,32,97,32,51,50,45,98,105,116,32,105,110,116,101,103, + 101,114,32,116,111,32,108,105,116,116,108,101,45,101,110,100, + 105,97,110,46,236,3,0,0,0,255,127,255,127,3,0,233, + 4,0,0,0,218,6,108,105,116,116,108,101,41,2,218,3, + 105,110,116,218,8,116,111,95,98,121,116,101,115,41,1,218, + 1,120,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,218,12,95,112,97,99,107,95,117,105,110,116,51,50,46, + 0,0,0,115,2,0,0,0,0,2,114,20,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, + 4,0,0,0,67,0,0,0,115,28,0,0,0,116,0,124, + 0,131,1,100,1,107,2,115,16,116,1,130,1,116,2,160, + 3,124,0,100,2,161,2,83,0,41,3,122,47,67,111,110, + 118,101,114,116,32,52,32,98,121,116,101,115,32,105,110,32, + 108,105,116,116,108,101,45,101,110,100,105,97,110,32,116,111, + 32,97,110,32,105,110,116,101,103,101,114,46,114,15,0,0, + 0,114,16,0,0,0,169,4,218,3,108,101,110,218,14,65, + 115,115,101,114,116,105,111,110,69,114,114,111,114,114,17,0, + 0,0,218,10,102,114,111,109,95,98,121,116,101,115,169,1, + 218,4,100,97,116,97,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,218,14,95,117,110,112,97,99,107,95,117, + 105,110,116,51,50,51,0,0,0,115,4,0,0,0,0,2, + 16,1,114,27,0,0,0,99,1,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,4,0,0,0,67,0,0,0, + 115,28,0,0,0,116,0,124,0,131,1,100,1,107,2,115, + 16,116,1,130,1,116,2,160,3,124,0,100,2,161,2,83, + 0,41,3,122,47,67,111,110,118,101,114,116,32,50,32,98, + 121,116,101,115,32,105,110,32,108,105,116,116,108,101,45,101, + 110,100,105,97,110,32,116,111,32,97,110,32,105,110,116,101, + 103,101,114,46,233,2,0,0,0,114,16,0,0,0,114,21, + 0,0,0,114,25,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,218,14,95,117,110,112,97,99,107, + 95,117,105,110,116,49,54,56,0,0,0,115,4,0,0,0, + 0,2,16,1,114,29,0,0,0,99,0,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,4,0,0,0,71,0, + 0,0,115,20,0,0,0,116,0,160,1,100,1,100,2,132, + 0,124,0,68,0,131,1,161,1,83,0,41,3,122,31,82, + 101,112,108,97,99,101,109,101,110,116,32,102,111,114,32,111, + 115,46,112,97,116,104,46,106,111,105,110,40,41,46,99,1, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,5, + 0,0,0,83,0,0,0,115,26,0,0,0,103,0,124,0, + 93,18,125,1,124,1,114,4,124,1,160,0,116,1,161,1, + 145,2,113,4,83,0,114,3,0,0,0,41,2,218,6,114, + 115,116,114,105,112,218,15,112,97,116,104,95,115,101,112,97, + 114,97,116,111,114,115,41,2,218,2,46,48,218,4,112,97, + 114,116,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,218,10,60,108,105,115,116,99,111,109,112,62,64,0,0, + 0,115,6,0,0,0,6,1,2,0,4,255,122,30,95,112, + 97,116,104,95,106,111,105,110,46,60,108,111,99,97,108,115, + 62,46,60,108,105,115,116,99,111,109,112,62,41,2,218,8, + 112,97,116,104,95,115,101,112,218,4,106,111,105,110,41,1, + 218,10,112,97,116,104,95,112,97,114,116,115,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,218,10,95,112,97, + 116,104,95,106,111,105,110,62,0,0,0,115,6,0,0,0, + 0,2,10,1,2,255,114,38,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,5,0,0,0,5,0,0,0, + 67,0,0,0,115,96,0,0,0,116,0,116,1,131,1,100, + 1,107,2,114,36,124,0,160,2,116,3,161,1,92,3,125, + 1,125,2,125,3,124,1,124,3,102,2,83,0,116,4,124, + 0,131,1,68,0,93,42,125,4,124,4,116,1,107,6,114, + 44,124,0,106,5,124,4,100,1,100,2,141,2,92,2,125, + 1,125,3,124,1,124,3,102,2,2,0,1,0,83,0,113, + 44,100,3,124,0,102,2,83,0,41,4,122,32,82,101,112, + 108,97,99,101,109,101,110,116,32,102,111,114,32,111,115,46, + 112,97,116,104,46,115,112,108,105,116,40,41,46,233,1,0, + 0,0,41,1,90,8,109,97,120,115,112,108,105,116,218,0, + 41,6,114,22,0,0,0,114,31,0,0,0,218,10,114,112, + 97,114,116,105,116,105,111,110,114,35,0,0,0,218,8,114, + 101,118,101,114,115,101,100,218,6,114,115,112,108,105,116,41, + 5,218,4,112,97,116,104,90,5,102,114,111,110,116,218,1, + 95,218,4,116,97,105,108,114,19,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,218,11,95,112,97, + 116,104,95,115,112,108,105,116,68,0,0,0,115,16,0,0, + 0,0,2,12,1,16,1,8,1,12,1,8,1,18,1,14, + 1,114,47,0,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, + 10,0,0,0,116,0,160,1,124,0,161,1,83,0,41,1, + 122,126,83,116,97,116,32,116,104,101,32,112,97,116,104,46, + 10,10,32,32,32,32,77,97,100,101,32,97,32,115,101,112, + 97,114,97,116,101,32,102,117,110,99,116,105,111,110,32,116, + 111,32,109,97,107,101,32,105,116,32,101,97,115,105,101,114, + 32,116,111,32,111,118,101,114,114,105,100,101,32,105,110,32, + 101,120,112,101,114,105,109,101,110,116,115,10,32,32,32,32, + 40,101,46,103,46,32,99,97,99,104,101,32,115,116,97,116, + 32,114,101,115,117,108,116,115,41,46,10,10,32,32,32,32, + 41,2,114,2,0,0,0,90,4,115,116,97,116,169,1,114, + 44,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,218,10,95,112,97,116,104,95,115,116,97,116,80, + 0,0,0,115,2,0,0,0,0,7,114,49,0,0,0,99, + 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 8,0,0,0,67,0,0,0,115,50,0,0,0,122,12,116, + 0,124,0,131,1,125,2,87,0,110,22,4,0,116,1,107, + 10,114,34,1,0,1,0,1,0,89,0,100,1,83,0,88, + 0,124,2,106,2,100,2,64,0,124,1,107,2,83,0,41, + 3,122,49,84,101,115,116,32,119,104,101,116,104,101,114,32, + 116,104,101,32,112,97,116,104,32,105,115,32,116,104,101,32, + 115,112,101,99,105,102,105,101,100,32,109,111,100,101,32,116, + 121,112,101,46,70,105,0,240,0,0,41,3,114,49,0,0, + 0,218,7,79,83,69,114,114,111,114,218,7,115,116,95,109, + 111,100,101,41,3,114,44,0,0,0,218,4,109,111,100,101, + 90,9,115,116,97,116,95,105,110,102,111,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,218,18,95,112,97,116, + 104,95,105,115,95,109,111,100,101,95,116,121,112,101,90,0, + 0,0,115,10,0,0,0,0,2,2,1,12,1,14,1,8, + 1,114,53,0,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, + 10,0,0,0,116,0,124,0,100,1,131,2,83,0,41,2, + 122,31,82,101,112,108,97,99,101,109,101,110,116,32,102,111, + 114,32,111,115,46,112,97,116,104,46,105,115,102,105,108,101, + 46,105,0,128,0,0,41,1,114,53,0,0,0,114,48,0, 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,11,95,112,97,116,104,95,105,115,97,98,115,111,0, - 0,0,115,2,0,0,0,0,6,114,59,0,0,0,233,182, - 1,0,0,99,3,0,0,0,0,0,0,0,0,0,0,0, - 6,0,0,0,11,0,0,0,67,0,0,0,115,162,0,0, - 0,100,1,160,0,124,0,116,1,124,0,131,1,161,2,125, - 3,116,2,160,3,124,3,116,2,106,4,116,2,106,5,66, - 0,116,2,106,6,66,0,124,2,100,2,64,0,161,3,125, - 4,122,50,116,7,160,8,124,4,100,3,161,2,143,16,125, - 5,124,5,160,9,124,1,161,1,1,0,87,0,53,0,81, - 0,82,0,88,0,116,2,160,10,124,3,124,0,161,2,1, - 0,87,0,110,58,4,0,116,11,107,10,114,156,1,0,1, - 0,1,0,122,14,116,2,160,12,124,3,161,1,1,0,87, - 0,110,20,4,0,116,11,107,10,114,148,1,0,1,0,1, - 0,89,0,110,2,88,0,130,0,89,0,110,2,88,0,100, - 4,83,0,41,5,122,162,66,101,115,116,45,101,102,102,111, - 114,116,32,102,117,110,99,116,105,111,110,32,116,111,32,119, - 114,105,116,101,32,100,97,116,97,32,116,111,32,97,32,112, - 97,116,104,32,97,116,111,109,105,99,97,108,108,121,46,10, - 32,32,32,32,66,101,32,112,114,101,112,97,114,101,100,32, - 116,111,32,104,97,110,100,108,101,32,97,32,70,105,108,101, - 69,120,105,115,116,115,69,114,114,111,114,32,105,102,32,99, - 111,110,99,117,114,114,101,110,116,32,119,114,105,116,105,110, - 103,32,111,102,32,116,104,101,10,32,32,32,32,116,101,109, - 112,111,114,97,114,121,32,102,105,108,101,32,105,115,32,97, - 116,116,101,109,112,116,101,100,46,250,5,123,125,46,123,125, - 114,60,0,0,0,90,2,119,98,78,41,13,218,6,102,111, - 114,109,97,116,218,2,105,100,114,2,0,0,0,90,4,111, - 112,101,110,90,6,79,95,69,88,67,76,90,7,79,95,67, - 82,69,65,84,90,8,79,95,87,82,79,78,76,89,218,3, - 95,105,111,218,6,70,105,108,101,73,79,218,5,119,114,105, - 116,101,218,7,114,101,112,108,97,99,101,114,50,0,0,0, - 90,6,117,110,108,105,110,107,41,6,114,44,0,0,0,114, - 26,0,0,0,114,52,0,0,0,90,8,112,97,116,104,95, - 116,109,112,90,2,102,100,218,4,102,105,108,101,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,13,95,119, - 114,105,116,101,95,97,116,111,109,105,99,120,0,0,0,115, - 30,0,0,0,0,5,16,1,6,1,16,0,6,255,4,2, - 2,3,14,1,20,1,16,1,14,1,2,1,14,1,14,1, - 6,1,114,69,0,0,0,105,82,13,0,0,114,28,0,0, - 0,114,16,0,0,0,115,2,0,0,0,13,10,90,11,95, - 95,112,121,99,97,99,104,101,95,95,122,4,111,112,116,45, - 122,3,46,112,121,122,4,46,112,121,99,78,41,1,218,12, - 111,112,116,105,109,105,122,97,116,105,111,110,99,2,0,0, - 0,0,0,0,0,1,0,0,0,12,0,0,0,5,0,0, - 0,67,0,0,0,115,88,1,0,0,124,1,100,1,107,9, - 114,52,116,0,160,1,100,2,116,2,161,2,1,0,124,2, - 100,1,107,9,114,40,100,3,125,3,116,3,124,3,131,1, - 130,1,124,1,114,48,100,4,110,2,100,5,125,2,116,4, - 160,5,124,0,161,1,125,0,116,6,124,0,131,1,92,2, - 125,4,125,5,124,5,160,7,100,6,161,1,92,3,125,6, - 125,7,125,8,116,8,106,9,106,10,125,9,124,9,100,1, - 107,8,114,114,116,11,100,7,131,1,130,1,100,4,160,12, - 124,6,114,126,124,6,110,2,124,8,124,7,124,9,103,3, - 161,1,125,10,124,2,100,1,107,8,114,172,116,8,106,13, - 106,14,100,8,107,2,114,164,100,4,125,2,110,8,116,8, - 106,13,106,14,125,2,116,15,124,2,131,1,125,2,124,2, - 100,4,107,3,114,224,124,2,160,16,161,0,115,210,116,17, - 100,9,160,18,124,2,161,1,131,1,130,1,100,10,160,18, - 124,10,116,19,124,2,161,3,125,10,124,10,116,20,100,8, - 25,0,23,0,125,11,116,8,106,21,100,1,107,9,144,1, - 114,76,116,22,124,4,131,1,144,1,115,16,116,23,116,4, - 160,24,161,0,124,4,131,2,125,4,124,4,100,5,25,0, - 100,11,107,2,144,1,114,56,124,4,100,8,25,0,116,25, - 107,7,144,1,114,56,124,4,100,12,100,1,133,2,25,0, - 125,4,116,23,116,8,106,21,124,4,160,26,116,25,161,1, - 124,11,131,3,83,0,116,23,124,4,116,27,124,11,131,3, - 83,0,41,13,97,254,2,0,0,71,105,118,101,110,32,116, - 104,101,32,112,97,116,104,32,116,111,32,97,32,46,112,121, - 32,102,105,108,101,44,32,114,101,116,117,114,110,32,116,104, - 101,32,112,97,116,104,32,116,111,32,105,116,115,32,46,112, - 121,99,32,102,105,108,101,46,10,10,32,32,32,32,84,104, - 101,32,46,112,121,32,102,105,108,101,32,100,111,101,115,32, - 110,111,116,32,110,101,101,100,32,116,111,32,101,120,105,115, - 116,59,32,116,104,105,115,32,115,105,109,112,108,121,32,114, - 101,116,117,114,110,115,32,116,104,101,32,112,97,116,104,32, - 116,111,32,116,104,101,10,32,32,32,32,46,112,121,99,32, - 102,105,108,101,32,99,97,108,99,117,108,97,116,101,100,32, - 97,115,32,105,102,32,116,104,101,32,46,112,121,32,102,105, - 108,101,32,119,101,114,101,32,105,109,112,111,114,116,101,100, - 46,10,10,32,32,32,32,84,104,101,32,39,111,112,116,105, - 109,105,122,97,116,105,111,110,39,32,112,97,114,97,109,101, - 116,101,114,32,99,111,110,116,114,111,108,115,32,116,104,101, - 32,112,114,101,115,117,109,101,100,32,111,112,116,105,109,105, - 122,97,116,105,111,110,32,108,101,118,101,108,32,111,102,10, - 32,32,32,32,116,104,101,32,98,121,116,101,99,111,100,101, - 32,102,105,108,101,46,32,73,102,32,39,111,112,116,105,109, - 105,122,97,116,105,111,110,39,32,105,115,32,110,111,116,32, - 78,111,110,101,44,32,116,104,101,32,115,116,114,105,110,103, - 32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,10, - 32,32,32,32,111,102,32,116,104,101,32,97,114,103,117,109, - 101,110,116,32,105,115,32,116,97,107,101,110,32,97,110,100, - 32,118,101,114,105,102,105,101,100,32,116,111,32,98,101,32, - 97,108,112,104,97,110,117,109,101,114,105,99,32,40,101,108, - 115,101,32,86,97,108,117,101,69,114,114,111,114,10,32,32, - 32,32,105,115,32,114,97,105,115,101,100,41,46,10,10,32, - 32,32,32,84,104,101,32,100,101,98,117,103,95,111,118,101, - 114,114,105,100,101,32,112,97,114,97,109,101,116,101,114,32, - 105,115,32,100,101,112,114,101,99,97,116,101,100,46,32,73, - 102,32,100,101,98,117,103,95,111,118,101,114,114,105,100,101, - 32,105,115,32,110,111,116,32,78,111,110,101,44,10,32,32, - 32,32,97,32,84,114,117,101,32,118,97,108,117,101,32,105, - 115,32,116,104,101,32,115,97,109,101,32,97,115,32,115,101, + 0,218,12,95,112,97,116,104,95,105,115,102,105,108,101,99, + 0,0,0,115,2,0,0,0,0,2,114,54,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, + 3,0,0,0,67,0,0,0,115,22,0,0,0,124,0,115, + 12,116,0,160,1,161,0,125,0,116,2,124,0,100,1,131, + 2,83,0,41,2,122,30,82,101,112,108,97,99,101,109,101, + 110,116,32,102,111,114,32,111,115,46,112,97,116,104,46,105, + 115,100,105,114,46,105,0,64,0,0,41,3,114,2,0,0, + 0,218,6,103,101,116,99,119,100,114,53,0,0,0,114,48, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,218,11,95,112,97,116,104,95,105,115,100,105,114,104, + 0,0,0,115,6,0,0,0,0,2,4,1,8,1,114,56, + 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,0,3,0,0,0,67,0,0,0,115,26,0,0, + 0,124,0,160,0,116,1,161,1,112,24,124,0,100,1,100, + 2,133,2,25,0,116,2,107,6,83,0,41,3,122,142,82, + 101,112,108,97,99,101,109,101,110,116,32,102,111,114,32,111, + 115,46,112,97,116,104,46,105,115,97,98,115,46,10,10,32, + 32,32,32,67,111,110,115,105,100,101,114,115,32,97,32,87, + 105,110,100,111,119,115,32,100,114,105,118,101,45,114,101,108, + 97,116,105,118,101,32,112,97,116,104,32,40,110,111,32,100, + 114,105,118,101,44,32,98,117,116,32,115,116,97,114,116,115, + 32,119,105,116,104,32,115,108,97,115,104,41,32,116,111,10, + 32,32,32,32,115,116,105,108,108,32,98,101,32,34,97,98, + 115,111,108,117,116,101,34,46,10,32,32,32,32,114,39,0, + 0,0,233,3,0,0,0,41,3,114,10,0,0,0,114,31, + 0,0,0,218,20,95,112,97,116,104,115,101,112,115,95,119, + 105,116,104,95,99,111,108,111,110,114,48,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,218,11,95, + 112,97,116,104,95,105,115,97,98,115,111,0,0,0,115,2, + 0,0,0,0,6,114,59,0,0,0,233,182,1,0,0,99, + 3,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0, + 11,0,0,0,67,0,0,0,115,162,0,0,0,100,1,160, + 0,124,0,116,1,124,0,131,1,161,2,125,3,116,2,160, + 3,124,3,116,2,106,4,116,2,106,5,66,0,116,2,106, + 6,66,0,124,2,100,2,64,0,161,3,125,4,122,50,116, + 7,160,8,124,4,100,3,161,2,143,16,125,5,124,5,160, + 9,124,1,161,1,1,0,87,0,53,0,81,0,82,0,88, + 0,116,2,160,10,124,3,124,0,161,2,1,0,87,0,110, + 58,4,0,116,11,107,10,114,156,1,0,1,0,1,0,122, + 14,116,2,160,12,124,3,161,1,1,0,87,0,110,20,4, + 0,116,11,107,10,114,148,1,0,1,0,1,0,89,0,110, + 2,88,0,130,0,89,0,110,2,88,0,100,4,83,0,41, + 5,122,162,66,101,115,116,45,101,102,102,111,114,116,32,102, + 117,110,99,116,105,111,110,32,116,111,32,119,114,105,116,101, + 32,100,97,116,97,32,116,111,32,97,32,112,97,116,104,32, + 97,116,111,109,105,99,97,108,108,121,46,10,32,32,32,32, + 66,101,32,112,114,101,112,97,114,101,100,32,116,111,32,104, + 97,110,100,108,101,32,97,32,70,105,108,101,69,120,105,115, + 116,115,69,114,114,111,114,32,105,102,32,99,111,110,99,117, + 114,114,101,110,116,32,119,114,105,116,105,110,103,32,111,102, + 32,116,104,101,10,32,32,32,32,116,101,109,112,111,114,97, + 114,121,32,102,105,108,101,32,105,115,32,97,116,116,101,109, + 112,116,101,100,46,250,5,123,125,46,123,125,114,60,0,0, + 0,90,2,119,98,78,41,13,218,6,102,111,114,109,97,116, + 218,2,105,100,114,2,0,0,0,90,4,111,112,101,110,90, + 6,79,95,69,88,67,76,90,7,79,95,67,82,69,65,84, + 90,8,79,95,87,82,79,78,76,89,218,3,95,105,111,218, + 6,70,105,108,101,73,79,218,5,119,114,105,116,101,218,7, + 114,101,112,108,97,99,101,114,50,0,0,0,90,6,117,110, + 108,105,110,107,41,6,114,44,0,0,0,114,26,0,0,0, + 114,52,0,0,0,90,8,112,97,116,104,95,116,109,112,90, + 2,102,100,218,4,102,105,108,101,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,13,95,119,114,105,116,101, + 95,97,116,111,109,105,99,120,0,0,0,115,30,0,0,0, + 0,5,16,1,6,1,16,0,6,255,4,2,2,3,14,1, + 20,1,16,1,14,1,2,1,14,1,14,1,6,1,114,69, + 0,0,0,105,82,13,0,0,114,28,0,0,0,114,16,0, + 0,0,115,2,0,0,0,13,10,90,11,95,95,112,121,99, + 97,99,104,101,95,95,122,4,111,112,116,45,122,3,46,112, + 121,122,4,46,112,121,99,78,41,1,218,12,111,112,116,105, + 109,105,122,97,116,105,111,110,99,2,0,0,0,0,0,0, + 0,1,0,0,0,12,0,0,0,5,0,0,0,67,0,0, + 0,115,88,1,0,0,124,1,100,1,107,9,114,52,116,0, + 160,1,100,2,116,2,161,2,1,0,124,2,100,1,107,9, + 114,40,100,3,125,3,116,3,124,3,131,1,130,1,124,1, + 114,48,100,4,110,2,100,5,125,2,116,4,160,5,124,0, + 161,1,125,0,116,6,124,0,131,1,92,2,125,4,125,5, + 124,5,160,7,100,6,161,1,92,3,125,6,125,7,125,8, + 116,8,106,9,106,10,125,9,124,9,100,1,107,8,114,114, + 116,11,100,7,131,1,130,1,100,4,160,12,124,6,114,126, + 124,6,110,2,124,8,124,7,124,9,103,3,161,1,125,10, + 124,2,100,1,107,8,114,172,116,8,106,13,106,14,100,8, + 107,2,114,164,100,4,125,2,110,8,116,8,106,13,106,14, + 125,2,116,15,124,2,131,1,125,2,124,2,100,4,107,3, + 114,224,124,2,160,16,161,0,115,210,116,17,100,9,160,18, + 124,2,161,1,131,1,130,1,100,10,160,18,124,10,116,19, + 124,2,161,3,125,10,124,10,116,20,100,8,25,0,23,0, + 125,11,116,8,106,21,100,1,107,9,144,1,114,76,116,22, + 124,4,131,1,144,1,115,16,116,23,116,4,160,24,161,0, + 124,4,131,2,125,4,124,4,100,5,25,0,100,11,107,2, + 144,1,114,56,124,4,100,8,25,0,116,25,107,7,144,1, + 114,56,124,4,100,12,100,1,133,2,25,0,125,4,116,23, + 116,8,106,21,124,4,160,26,116,25,161,1,124,11,131,3, + 83,0,116,23,124,4,116,27,124,11,131,3,83,0,41,13, + 97,254,2,0,0,71,105,118,101,110,32,116,104,101,32,112, + 97,116,104,32,116,111,32,97,32,46,112,121,32,102,105,108, + 101,44,32,114,101,116,117,114,110,32,116,104,101,32,112,97, + 116,104,32,116,111,32,105,116,115,32,46,112,121,99,32,102, + 105,108,101,46,10,10,32,32,32,32,84,104,101,32,46,112, + 121,32,102,105,108,101,32,100,111,101,115,32,110,111,116,32, + 110,101,101,100,32,116,111,32,101,120,105,115,116,59,32,116, + 104,105,115,32,115,105,109,112,108,121,32,114,101,116,117,114, + 110,115,32,116,104,101,32,112,97,116,104,32,116,111,32,116, + 104,101,10,32,32,32,32,46,112,121,99,32,102,105,108,101, + 32,99,97,108,99,117,108,97,116,101,100,32,97,115,32,105, + 102,32,116,104,101,32,46,112,121,32,102,105,108,101,32,119, + 101,114,101,32,105,109,112,111,114,116,101,100,46,10,10,32, + 32,32,32,84,104,101,32,39,111,112,116,105,109,105,122,97, + 116,105,111,110,39,32,112,97,114,97,109,101,116,101,114,32, + 99,111,110,116,114,111,108,115,32,116,104,101,32,112,114,101, + 115,117,109,101,100,32,111,112,116,105,109,105,122,97,116,105, + 111,110,32,108,101,118,101,108,32,111,102,10,32,32,32,32, + 116,104,101,32,98,121,116,101,99,111,100,101,32,102,105,108, + 101,46,32,73,102,32,39,111,112,116,105,109,105,122,97,116, + 105,111,110,39,32,105,115,32,110,111,116,32,78,111,110,101, + 44,32,116,104,101,32,115,116,114,105,110,103,32,114,101,112, + 114,101,115,101,110,116,97,116,105,111,110,10,32,32,32,32, + 111,102,32,116,104,101,32,97,114,103,117,109,101,110,116,32, + 105,115,32,116,97,107,101,110,32,97,110,100,32,118,101,114, + 105,102,105,101,100,32,116,111,32,98,101,32,97,108,112,104, + 97,110,117,109,101,114,105,99,32,40,101,108,115,101,32,86, + 97,108,117,101,69,114,114,111,114,10,32,32,32,32,105,115, + 32,114,97,105,115,101,100,41,46,10,10,32,32,32,32,84, + 104,101,32,100,101,98,117,103,95,111,118,101,114,114,105,100, + 101,32,112,97,114,97,109,101,116,101,114,32,105,115,32,100, + 101,112,114,101,99,97,116,101,100,46,32,73,102,32,100,101, + 98,117,103,95,111,118,101,114,114,105,100,101,32,105,115,32, + 110,111,116,32,78,111,110,101,44,10,32,32,32,32,97,32, + 84,114,117,101,32,118,97,108,117,101,32,105,115,32,116,104, + 101,32,115,97,109,101,32,97,115,32,115,101,116,116,105,110, + 103,32,39,111,112,116,105,109,105,122,97,116,105,111,110,39, + 32,116,111,32,116,104,101,32,101,109,112,116,121,32,115,116, + 114,105,110,103,10,32,32,32,32,119,104,105,108,101,32,97, + 32,70,97,108,115,101,32,118,97,108,117,101,32,105,115,32, + 101,113,117,105,118,97,108,101,110,116,32,116,111,32,115,101, 116,116,105,110,103,32,39,111,112,116,105,109,105,122,97,116, - 105,111,110,39,32,116,111,32,116,104,101,32,101,109,112,116, - 121,32,115,116,114,105,110,103,10,32,32,32,32,119,104,105, - 108,101,32,97,32,70,97,108,115,101,32,118,97,108,117,101, - 32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116, - 111,32,115,101,116,116,105,110,103,32,39,111,112,116,105,109, - 105,122,97,116,105,111,110,39,32,116,111,32,39,49,39,46, - 10,10,32,32,32,32,73,102,32,115,121,115,46,105,109,112, - 108,101,109,101,110,116,97,116,105,111,110,46,99,97,99,104, - 101,95,116,97,103,32,105,115,32,78,111,110,101,32,116,104, - 101,110,32,78,111,116,73,109,112,108,101,109,101,110,116,101, - 100,69,114,114,111,114,32,105,115,32,114,97,105,115,101,100, - 46,10,10,32,32,32,32,78,122,70,116,104,101,32,100,101, - 98,117,103,95,111,118,101,114,114,105,100,101,32,112,97,114, - 97,109,101,116,101,114,32,105,115,32,100,101,112,114,101,99, - 97,116,101,100,59,32,117,115,101,32,39,111,112,116,105,109, - 105,122,97,116,105,111,110,39,32,105,110,115,116,101,97,100, - 122,50,100,101,98,117,103,95,111,118,101,114,114,105,100,101, - 32,111,114,32,111,112,116,105,109,105,122,97,116,105,111,110, - 32,109,117,115,116,32,98,101,32,115,101,116,32,116,111,32, - 78,111,110,101,114,40,0,0,0,114,39,0,0,0,218,1, - 46,250,36,115,121,115,46,105,109,112,108,101,109,101,110,116, - 97,116,105,111,110,46,99,97,99,104,101,95,116,97,103,32, - 105,115,32,78,111,110,101,233,0,0,0,0,122,24,123,33, - 114,125,32,105,115,32,110,111,116,32,97,108,112,104,97,110, - 117,109,101,114,105,99,122,7,123,125,46,123,125,123,125,250, - 1,58,114,28,0,0,0,41,28,218,9,95,119,97,114,110, - 105,110,103,115,218,4,119,97,114,110,218,18,68,101,112,114, - 101,99,97,116,105,111,110,87,97,114,110,105,110,103,218,9, - 84,121,112,101,69,114,114,111,114,114,2,0,0,0,218,6, - 102,115,112,97,116,104,114,47,0,0,0,114,41,0,0,0, - 114,8,0,0,0,218,14,105,109,112,108,101,109,101,110,116, - 97,116,105,111,110,218,9,99,97,99,104,101,95,116,97,103, - 218,19,78,111,116,73,109,112,108,101,109,101,110,116,101,100, - 69,114,114,111,114,114,36,0,0,0,218,5,102,108,97,103, - 115,218,8,111,112,116,105,109,105,122,101,218,3,115,116,114, - 218,7,105,115,97,108,110,117,109,218,10,86,97,108,117,101, - 69,114,114,111,114,114,62,0,0,0,218,4,95,79,80,84, - 218,17,66,89,84,69,67,79,68,69,95,83,85,70,70,73, - 88,69,83,218,14,112,121,99,97,99,104,101,95,112,114,101, - 102,105,120,114,59,0,0,0,114,38,0,0,0,114,55,0, - 0,0,114,31,0,0,0,218,6,108,115,116,114,105,112,218, - 8,95,80,89,67,65,67,72,69,41,12,114,44,0,0,0, - 90,14,100,101,98,117,103,95,111,118,101,114,114,105,100,101, - 114,70,0,0,0,218,7,109,101,115,115,97,103,101,218,4, - 104,101,97,100,114,46,0,0,0,90,4,98,97,115,101,218, - 3,115,101,112,218,4,114,101,115,116,90,3,116,97,103,90, - 15,97,108,109,111,115,116,95,102,105,108,101,110,97,109,101, - 218,8,102,105,108,101,110,97,109,101,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,17,99,97,99,104,101, - 95,102,114,111,109,95,115,111,117,114,99,101,33,1,0,0, - 115,72,0,0,0,0,18,8,1,6,1,2,255,4,2,8, - 1,4,1,8,1,12,1,10,1,12,1,16,1,8,1,8, - 1,8,1,24,1,8,1,12,1,6,2,8,1,8,1,8, - 1,8,1,14,1,14,1,12,1,12,9,10,1,14,5,28, - 1,12,4,2,1,4,1,8,1,2,253,4,5,114,98,0, - 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,10, - 0,0,0,5,0,0,0,67,0,0,0,115,46,1,0,0, - 116,0,106,1,106,2,100,1,107,8,114,20,116,3,100,2, - 131,1,130,1,116,4,160,5,124,0,161,1,125,0,116,6, - 124,0,131,1,92,2,125,1,125,2,100,3,125,3,116,0, - 106,7,100,1,107,9,114,102,116,0,106,7,160,8,116,9, - 161,1,125,4,124,1,160,10,124,4,116,11,23,0,161,1, - 114,102,124,1,116,12,124,4,131,1,100,1,133,2,25,0, - 125,1,100,4,125,3,124,3,115,144,116,6,124,1,131,1, - 92,2,125,1,125,5,124,5,116,13,107,3,114,144,116,14, - 116,13,155,0,100,5,124,0,155,2,157,3,131,1,130,1, - 124,2,160,15,100,6,161,1,125,6,124,6,100,7,107,7, - 114,178,116,14,100,8,124,2,155,2,157,2,131,1,130,1, - 110,92,124,6,100,9,107,2,144,1,114,14,124,2,160,16, - 100,6,100,10,161,2,100,11,25,0,125,7,124,7,160,10, - 116,17,161,1,115,228,116,14,100,12,116,17,155,2,157,2, - 131,1,130,1,124,7,116,12,116,17,131,1,100,1,133,2, - 25,0,125,8,124,8,160,18,161,0,144,1,115,14,116,14, - 100,13,124,7,155,2,100,14,157,3,131,1,130,1,124,2, - 160,19,100,6,161,1,100,15,25,0,125,9,116,20,124,1, - 124,9,116,21,100,15,25,0,23,0,131,2,83,0,41,16, - 97,110,1,0,0,71,105,118,101,110,32,116,104,101,32,112, - 97,116,104,32,116,111,32,97,32,46,112,121,99,46,32,102, - 105,108,101,44,32,114,101,116,117,114,110,32,116,104,101,32, - 112,97,116,104,32,116,111,32,105,116,115,32,46,112,121,32, - 102,105,108,101,46,10,10,32,32,32,32,84,104,101,32,46, - 112,121,99,32,102,105,108,101,32,100,111,101,115,32,110,111, - 116,32,110,101,101,100,32,116,111,32,101,120,105,115,116,59, - 32,116,104,105,115,32,115,105,109,112,108,121,32,114,101,116, - 117,114,110,115,32,116,104,101,32,112,97,116,104,32,116,111, - 10,32,32,32,32,116,104,101,32,46,112,121,32,102,105,108, - 101,32,99,97,108,99,117,108,97,116,101,100,32,116,111,32, - 99,111,114,114,101,115,112,111,110,100,32,116,111,32,116,104, - 101,32,46,112,121,99,32,102,105,108,101,46,32,32,73,102, - 32,112,97,116,104,32,100,111,101,115,10,32,32,32,32,110, - 111,116,32,99,111,110,102,111,114,109,32,116,111,32,80,69, - 80,32,51,49,52,55,47,52,56,56,32,102,111,114,109,97, - 116,44,32,86,97,108,117,101,69,114,114,111,114,32,119,105, - 108,108,32,98,101,32,114,97,105,115,101,100,46,32,73,102, - 10,32,32,32,32,115,121,115,46,105,109,112,108,101,109,101, + 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,114,72,0,0,0,70,84,122,31,32,110,111, - 116,32,98,111,116,116,111,109,45,108,101,118,101,108,32,100, - 105,114,101,99,116,111,114,121,32,105,110,32,114,71,0,0, - 0,62,2,0,0,0,114,28,0,0,0,114,57,0,0,0, - 122,29,101,120,112,101,99,116,101,100,32,111,110,108,121,32, - 50,32,111,114,32,51,32,100,111,116,115,32,105,110,32,114, - 57,0,0,0,114,28,0,0,0,233,254,255,255,255,122,53, - 111,112,116,105,109,105,122,97,116,105,111,110,32,112,111,114, - 116,105,111,110,32,111,102,32,102,105,108,101,110,97,109,101, - 32,100,111,101,115,32,110,111,116,32,115,116,97,114,116,32, - 119,105,116,104,32,122,19,111,112,116,105,109,105,122,97,116, - 105,111,110,32,108,101,118,101,108,32,122,29,32,105,115,32, - 110,111,116,32,97,110,32,97,108,112,104,97,110,117,109,101, - 114,105,99,32,118,97,108,117,101,114,73,0,0,0,41,22, - 114,8,0,0,0,114,80,0,0,0,114,81,0,0,0,114, - 82,0,0,0,114,2,0,0,0,114,79,0,0,0,114,47, - 0,0,0,114,90,0,0,0,114,30,0,0,0,114,31,0, - 0,0,114,10,0,0,0,114,35,0,0,0,114,22,0,0, - 0,114,92,0,0,0,114,87,0,0,0,218,5,99,111,117, - 110,116,114,43,0,0,0,114,88,0,0,0,114,86,0,0, - 0,218,9,112,97,114,116,105,116,105,111,110,114,38,0,0, - 0,218,15,83,79,85,82,67,69,95,83,85,70,70,73,88, - 69,83,41,10,114,44,0,0,0,114,94,0,0,0,90,16, - 112,121,99,97,99,104,101,95,102,105,108,101,110,97,109,101, - 90,23,102,111,117,110,100,95,105,110,95,112,121,99,97,99, - 104,101,95,112,114,101,102,105,120,90,13,115,116,114,105,112, - 112,101,100,95,112,97,116,104,90,7,112,121,99,97,99,104, - 101,90,9,100,111,116,95,99,111,117,110,116,114,70,0,0, - 0,90,9,111,112,116,95,108,101,118,101,108,90,13,98,97, - 115,101,95,102,105,108,101,110,97,109,101,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,17,115,111,117,114, - 99,101,95,102,114,111,109,95,99,97,99,104,101,104,1,0, - 0,115,52,0,0,0,0,9,12,1,8,1,10,1,12,1, - 4,1,10,1,12,1,14,1,16,1,4,1,4,1,12,1, - 8,1,18,2,10,1,8,1,16,1,10,1,16,1,10,1, - 14,2,16,1,10,1,16,2,14,1,114,103,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, - 9,0,0,0,67,0,0,0,115,126,0,0,0,116,0,124, - 0,131,1,100,1,107,2,114,16,100,2,83,0,124,0,160, - 1,100,3,161,1,92,3,125,1,125,2,125,3,124,1,114, - 56,124,3,160,2,161,0,100,4,100,5,133,2,25,0,100, - 6,107,3,114,60,124,0,83,0,122,12,116,3,124,0,131, - 1,125,4,87,0,110,36,4,0,116,4,116,5,102,2,107, - 10,114,108,1,0,1,0,1,0,124,0,100,2,100,5,133, - 2,25,0,125,4,89,0,110,2,88,0,116,6,124,4,131, - 1,114,122,124,4,83,0,124,0,83,0,41,7,122,188,67, - 111,110,118,101,114,116,32,97,32,98,121,116,101,99,111,100, - 101,32,102,105,108,101,32,112,97,116,104,32,116,111,32,97, - 32,115,111,117,114,99,101,32,112,97,116,104,32,40,105,102, - 32,112,111,115,115,105,98,108,101,41,46,10,10,32,32,32, - 32,84,104,105,115,32,102,117,110,99,116,105,111,110,32,101, - 120,105,115,116,115,32,112,117,114,101,108,121,32,102,111,114, - 32,98,97,99,107,119,97,114,100,115,45,99,111,109,112,97, - 116,105,98,105,108,105,116,121,32,102,111,114,10,32,32,32, - 32,80,121,73,109,112,111,114,116,95,69,120,101,99,67,111, - 100,101,77,111,100,117,108,101,87,105,116,104,70,105,108,101, - 110,97,109,101,115,40,41,32,105,110,32,116,104,101,32,67, - 32,65,80,73,46,10,10,32,32,32,32,114,73,0,0,0, - 78,114,71,0,0,0,233,253,255,255,255,233,255,255,255,255, - 90,2,112,121,41,7,114,22,0,0,0,114,41,0,0,0, - 218,5,108,111,119,101,114,114,103,0,0,0,114,82,0,0, - 0,114,87,0,0,0,114,54,0,0,0,41,5,218,13,98, - 121,116,101,99,111,100,101,95,112,97,116,104,114,96,0,0, - 0,114,45,0,0,0,90,9,101,120,116,101,110,115,105,111, - 110,218,11,115,111,117,114,99,101,95,112,97,116,104,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,218,15,95, - 103,101,116,95,115,111,117,114,99,101,102,105,108,101,144,1, - 0,0,115,20,0,0,0,0,7,12,1,4,1,16,1,24, - 1,4,1,2,1,12,1,18,1,18,1,114,109,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,8,0,0,0,67,0,0,0,115,74,0,0,0,124,0, - 160,0,116,1,116,2,131,1,161,1,114,48,122,10,116,3, - 124,0,131,1,87,0,83,0,4,0,116,4,107,10,114,44, - 1,0,1,0,1,0,89,0,113,70,88,0,110,22,124,0, - 160,0,116,1,116,5,131,1,161,1,114,66,124,0,83,0, - 100,0,83,0,100,0,83,0,169,1,78,41,6,218,8,101, - 110,100,115,119,105,116,104,218,5,116,117,112,108,101,114,102, - 0,0,0,114,98,0,0,0,114,82,0,0,0,114,89,0, - 0,0,41,1,114,97,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,11,95,103,101,116,95,99, - 97,99,104,101,100,163,1,0,0,115,16,0,0,0,0,1, - 14,1,2,1,10,1,14,1,8,1,14,1,4,2,114,113, - 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,8,0,0,0,67,0,0,0,115,52,0,0, - 0,122,14,116,0,124,0,131,1,106,1,125,1,87,0,110, - 24,4,0,116,2,107,10,114,38,1,0,1,0,1,0,100, - 1,125,1,89,0,110,2,88,0,124,1,100,2,79,0,125, - 1,124,1,83,0,41,3,122,51,67,97,108,99,117,108,97, - 116,101,32,116,104,101,32,109,111,100,101,32,112,101,114,109, - 105,115,115,105,111,110,115,32,102,111,114,32,97,32,98,121, - 116,101,99,111,100,101,32,102,105,108,101,46,114,60,0,0, - 0,233,128,0,0,0,41,3,114,49,0,0,0,114,51,0, - 0,0,114,50,0,0,0,41,2,114,44,0,0,0,114,52, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,218,10,95,99,97,108,99,95,109,111,100,101,175,1, - 0,0,115,12,0,0,0,0,2,2,1,14,1,14,1,10, - 3,8,1,114,115,0,0,0,99,1,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,8,0,0,0,3,0,0, - 0,115,68,0,0,0,100,6,135,0,102,1,100,2,100,3, - 132,9,125,1,122,10,116,0,106,1,125,2,87,0,110,28, - 4,0,116,2,107,10,114,52,1,0,1,0,1,0,100,4, - 100,5,132,0,125,2,89,0,110,2,88,0,124,2,124,1, - 136,0,131,2,1,0,124,1,83,0,41,7,122,252,68,101, - 99,111,114,97,116,111,114,32,116,111,32,118,101,114,105,102, - 121,32,116,104,97,116,32,116,104,101,32,109,111,100,117,108, - 101,32,98,101,105,110,103,32,114,101,113,117,101,115,116,101, - 100,32,109,97,116,99,104,101,115,32,116,104,101,32,111,110, - 101,32,116,104,101,10,32,32,32,32,108,111,97,100,101,114, - 32,99,97,110,32,104,97,110,100,108,101,46,10,10,32,32, - 32,32,84,104,101,32,102,105,114,115,116,32,97,114,103,117, - 109,101,110,116,32,40,115,101,108,102,41,32,109,117,115,116, - 32,100,101,102,105,110,101,32,95,110,97,109,101,32,119,104, - 105,99,104,32,116,104,101,32,115,101,99,111,110,100,32,97, - 114,103,117,109,101,110,116,32,105,115,10,32,32,32,32,99, - 111,109,112,97,114,101,100,32,97,103,97,105,110,115,116,46, - 32,73,102,32,116,104,101,32,99,111,109,112,97,114,105,115, - 111,110,32,102,97,105,108,115,32,116,104,101,110,32,73,109, - 112,111,114,116,69,114,114,111,114,32,105,115,32,114,97,105, - 115,101,100,46,10,10,32,32,32,32,78,99,2,0,0,0, - 0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0, - 31,0,0,0,115,66,0,0,0,124,1,100,0,107,8,114, - 16,124,0,106,0,125,1,110,32,124,0,106,0,124,1,107, - 3,114,48,116,1,100,1,124,0,106,0,124,1,102,2,22, - 0,124,1,100,2,141,2,130,1,136,0,124,0,124,1,102, - 2,124,2,158,2,124,3,142,1,83,0,41,3,78,122,30, - 108,111,97,100,101,114,32,102,111,114,32,37,115,32,99,97, - 110,110,111,116,32,104,97,110,100,108,101,32,37,115,169,1, - 218,4,110,97,109,101,41,2,114,117,0,0,0,218,11,73, - 109,112,111,114,116,69,114,114,111,114,41,4,218,4,115,101, - 108,102,114,117,0,0,0,218,4,97,114,103,115,90,6,107, - 119,97,114,103,115,169,1,218,6,109,101,116,104,111,100,114, - 3,0,0,0,114,6,0,0,0,218,19,95,99,104,101,99, - 107,95,110,97,109,101,95,119,114,97,112,112,101,114,195,1, - 0,0,115,18,0,0,0,0,1,8,1,8,1,10,1,4, - 1,8,255,2,1,2,255,6,2,122,40,95,99,104,101,99, - 107,95,110,97,109,101,46,60,108,111,99,97,108,115,62,46, - 95,99,104,101,99,107,95,110,97,109,101,95,119,114,97,112, - 112,101,114,99,2,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,7,0,0,0,83,0,0,0,115,56,0,0, - 0,100,1,68,0,93,32,125,2,116,0,124,1,124,2,131, - 2,114,4,116,1,124,0,124,2,116,2,124,1,124,2,131, - 2,131,3,1,0,113,4,124,0,106,3,160,4,124,1,106, - 3,161,1,1,0,100,0,83,0,41,2,78,41,4,218,10, - 95,95,109,111,100,117,108,101,95,95,218,8,95,95,110,97, - 109,101,95,95,218,12,95,95,113,117,97,108,110,97,109,101, - 95,95,218,7,95,95,100,111,99,95,95,41,5,218,7,104, - 97,115,97,116,116,114,218,7,115,101,116,97,116,116,114,218, - 7,103,101,116,97,116,116,114,218,8,95,95,100,105,99,116, - 95,95,218,6,117,112,100,97,116,101,41,3,90,3,110,101, - 119,90,3,111,108,100,114,67,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,5,95,119,114,97, - 112,206,1,0,0,115,8,0,0,0,0,1,8,1,10,1, - 20,1,122,26,95,99,104,101,99,107,95,110,97,109,101,46, - 60,108,111,99,97,108,115,62,46,95,119,114,97,112,41,1, - 78,41,3,218,10,95,98,111,111,116,115,116,114,97,112,114, - 133,0,0,0,218,9,78,97,109,101,69,114,114,111,114,41, - 3,114,122,0,0,0,114,123,0,0,0,114,133,0,0,0, - 114,3,0,0,0,114,121,0,0,0,114,6,0,0,0,218, - 11,95,99,104,101,99,107,95,110,97,109,101,187,1,0,0, - 115,14,0,0,0,0,8,14,7,2,1,10,1,14,2,14, - 5,10,1,114,136,0,0,0,99,2,0,0,0,0,0,0, - 0,0,0,0,0,5,0,0,0,6,0,0,0,67,0,0, - 0,115,60,0,0,0,124,0,160,0,124,1,161,1,92,2, - 125,2,125,3,124,2,100,1,107,8,114,56,116,1,124,3, - 131,1,114,56,100,2,125,4,116,2,160,3,124,4,160,4, - 124,3,100,3,25,0,161,1,116,5,161,2,1,0,124,2, - 83,0,41,4,122,155,84,114,121,32,116,111,32,102,105,110, - 100,32,97,32,108,111,97,100,101,114,32,102,111,114,32,116, - 104,101,32,115,112,101,99,105,102,105,101,100,32,109,111,100, - 117,108,101,32,98,121,32,100,101,108,101,103,97,116,105,110, - 103,32,116,111,10,32,32,32,32,115,101,108,102,46,102,105, - 110,100,95,108,111,97,100,101,114,40,41,46,10,10,32,32, - 32,32,84,104,105,115,32,109,101,116,104,111,100,32,105,115, - 32,100,101,112,114,101,99,97,116,101,100,32,105,110,32,102, - 97,118,111,114,32,111,102,32,102,105,110,100,101,114,46,102, - 105,110,100,95,115,112,101,99,40,41,46,10,10,32,32,32, - 32,78,122,44,78,111,116,32,105,109,112,111,114,116,105,110, - 103,32,100,105,114,101,99,116,111,114,121,32,123,125,58,32, - 109,105,115,115,105,110,103,32,95,95,105,110,105,116,95,95, - 114,73,0,0,0,41,6,218,11,102,105,110,100,95,108,111, - 97,100,101,114,114,22,0,0,0,114,75,0,0,0,114,76, - 0,0,0,114,62,0,0,0,218,13,73,109,112,111,114,116, - 87,97,114,110,105,110,103,41,5,114,119,0,0,0,218,8, - 102,117,108,108,110,97,109,101,218,6,108,111,97,100,101,114, - 218,8,112,111,114,116,105,111,110,115,218,3,109,115,103,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,17, - 95,102,105,110,100,95,109,111,100,117,108,101,95,115,104,105, - 109,215,1,0,0,115,10,0,0,0,0,10,14,1,16,1, - 4,1,22,1,114,143,0,0,0,99,3,0,0,0,0,0, - 0,0,0,0,0,0,6,0,0,0,4,0,0,0,67,0, - 0,0,115,158,0,0,0,124,0,100,1,100,2,133,2,25, - 0,125,3,124,3,116,0,107,3,114,60,100,3,124,1,155, - 2,100,4,124,3,155,2,157,4,125,4,116,1,160,2,100, - 5,124,4,161,2,1,0,116,3,124,4,102,1,124,2,142, - 1,130,1,116,4,124,0,131,1,100,6,107,0,114,102,100, - 7,124,1,155,2,157,2,125,4,116,1,160,2,100,5,124, - 4,161,2,1,0,116,5,124,4,131,1,130,1,116,6,124, - 0,100,2,100,8,133,2,25,0,131,1,125,5,124,5,100, - 9,64,0,114,154,100,10,124,5,155,2,100,11,124,1,155, - 2,157,4,125,4,116,3,124,4,102,1,124,2,142,1,130, - 1,124,5,83,0,41,12,97,84,2,0,0,80,101,114,102, - 111,114,109,32,98,97,115,105,99,32,118,97,108,105,100,105, - 116,121,32,99,104,101,99,107,105,110,103,32,111,102,32,97, - 32,112,121,99,32,104,101,97,100,101,114,32,97,110,100,32, - 114,101,116,117,114,110,32,116,104,101,32,102,108,97,103,115, - 32,102,105,101,108,100,44,10,32,32,32,32,119,104,105,99, - 104,32,100,101,116,101,114,109,105,110,101,115,32,104,111,119, - 32,116,104,101,32,112,121,99,32,115,104,111,117,108,100,32, - 98,101,32,102,117,114,116,104,101,114,32,118,97,108,105,100, - 97,116,101,100,32,97,103,97,105,110,115,116,32,116,104,101, - 32,115,111,117,114,99,101,46,10,10,32,32,32,32,42,100, + 32,32,32,78,122,70,116,104,101,32,100,101,98,117,103,95, + 111,118,101,114,114,105,100,101,32,112,97,114,97,109,101,116, + 101,114,32,105,115,32,100,101,112,114,101,99,97,116,101,100, + 59,32,117,115,101,32,39,111,112,116,105,109,105,122,97,116, + 105,111,110,39,32,105,110,115,116,101,97,100,122,50,100,101, + 98,117,103,95,111,118,101,114,114,105,100,101,32,111,114,32, + 111,112,116,105,109,105,122,97,116,105,111,110,32,109,117,115, + 116,32,98,101,32,115,101,116,32,116,111,32,78,111,110,101, + 114,40,0,0,0,114,39,0,0,0,218,1,46,250,36,115, + 121,115,46,105,109,112,108,101,109,101,110,116,97,116,105,111, + 110,46,99,97,99,104,101,95,116,97,103,32,105,115,32,78, + 111,110,101,233,0,0,0,0,122,24,123,33,114,125,32,105, + 115,32,110,111,116,32,97,108,112,104,97,110,117,109,101,114, + 105,99,122,7,123,125,46,123,125,123,125,250,1,58,114,28, + 0,0,0,41,28,218,9,95,119,97,114,110,105,110,103,115, + 218,4,119,97,114,110,218,18,68,101,112,114,101,99,97,116, + 105,111,110,87,97,114,110,105,110,103,218,9,84,121,112,101, + 69,114,114,111,114,114,2,0,0,0,218,6,102,115,112,97, + 116,104,114,47,0,0,0,114,41,0,0,0,114,8,0,0, + 0,218,14,105,109,112,108,101,109,101,110,116,97,116,105,111, + 110,218,9,99,97,99,104,101,95,116,97,103,218,19,78,111, + 116,73,109,112,108,101,109,101,110,116,101,100,69,114,114,111, + 114,114,36,0,0,0,218,5,102,108,97,103,115,218,8,111, + 112,116,105,109,105,122,101,218,3,115,116,114,218,7,105,115, + 97,108,110,117,109,218,10,86,97,108,117,101,69,114,114,111, + 114,114,62,0,0,0,218,4,95,79,80,84,218,17,66,89, + 84,69,67,79,68,69,95,83,85,70,70,73,88,69,83,218, + 14,112,121,99,97,99,104,101,95,112,114,101,102,105,120,114, + 59,0,0,0,114,38,0,0,0,114,55,0,0,0,114,31, + 0,0,0,218,6,108,115,116,114,105,112,218,8,95,80,89, + 67,65,67,72,69,41,12,114,44,0,0,0,90,14,100,101, + 98,117,103,95,111,118,101,114,114,105,100,101,114,70,0,0, + 0,218,7,109,101,115,115,97,103,101,218,4,104,101,97,100, + 114,46,0,0,0,90,4,98,97,115,101,218,3,115,101,112, + 218,4,114,101,115,116,90,3,116,97,103,90,15,97,108,109, + 111,115,116,95,102,105,108,101,110,97,109,101,218,8,102,105, + 108,101,110,97,109,101,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,218,17,99,97,99,104,101,95,102,114,111, + 109,95,115,111,117,114,99,101,33,1,0,0,115,72,0,0, + 0,0,18,8,1,6,1,2,255,4,2,8,1,4,1,8, + 1,12,1,10,1,12,1,16,1,8,1,8,1,8,1,24, + 1,8,1,12,1,6,2,8,1,8,1,8,1,8,1,14, + 1,14,1,12,1,12,9,10,1,14,5,28,1,12,4,2, + 1,4,1,8,1,2,253,4,5,114,98,0,0,0,99,1, + 0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,5, + 0,0,0,67,0,0,0,115,46,1,0,0,116,0,106,1, + 106,2,100,1,107,8,114,20,116,3,100,2,131,1,130,1, + 116,4,160,5,124,0,161,1,125,0,116,6,124,0,131,1, + 92,2,125,1,125,2,100,3,125,3,116,0,106,7,100,1, + 107,9,114,102,116,0,106,7,160,8,116,9,161,1,125,4, + 124,1,160,10,124,4,116,11,23,0,161,1,114,102,124,1, + 116,12,124,4,131,1,100,1,133,2,25,0,125,1,100,4, + 125,3,124,3,115,144,116,6,124,1,131,1,92,2,125,1, + 125,5,124,5,116,13,107,3,114,144,116,14,116,13,155,0, + 100,5,124,0,155,2,157,3,131,1,130,1,124,2,160,15, + 100,6,161,1,125,6,124,6,100,7,107,7,114,178,116,14, + 100,8,124,2,155,2,157,2,131,1,130,1,110,92,124,6, + 100,9,107,2,144,1,114,14,124,2,160,16,100,6,100,10, + 161,2,100,11,25,0,125,7,124,7,160,10,116,17,161,1, + 115,228,116,14,100,12,116,17,155,2,157,2,131,1,130,1, + 124,7,116,12,116,17,131,1,100,1,133,2,25,0,125,8, + 124,8,160,18,161,0,144,1,115,14,116,14,100,13,124,7, + 155,2,100,14,157,3,131,1,130,1,124,2,160,19,100,6, + 161,1,100,15,25,0,125,9,116,20,124,1,124,9,116,21, + 100,15,25,0,23,0,131,2,83,0,41,16,97,110,1,0, + 0,71,105,118,101,110,32,116,104,101,32,112,97,116,104,32, + 116,111,32,97,32,46,112,121,99,46,32,102,105,108,101,44, + 32,114,101,116,117,114,110,32,116,104,101,32,112,97,116,104, + 32,116,111,32,105,116,115,32,46,112,121,32,102,105,108,101, + 46,10,10,32,32,32,32,84,104,101,32,46,112,121,99,32, + 102,105,108,101,32,100,111,101,115,32,110,111,116,32,110,101, + 101,100,32,116,111,32,101,120,105,115,116,59,32,116,104,105, + 115,32,115,105,109,112,108,121,32,114,101,116,117,114,110,115, + 32,116,104,101,32,112,97,116,104,32,116,111,10,32,32,32, + 32,116,104,101,32,46,112,121,32,102,105,108,101,32,99,97, + 108,99,117,108,97,116,101,100,32,116,111,32,99,111,114,114, + 101,115,112,111,110,100,32,116,111,32,116,104,101,32,46,112, + 121,99,32,102,105,108,101,46,32,32,73,102,32,112,97,116, + 104,32,100,111,101,115,10,32,32,32,32,110,111,116,32,99, + 111,110,102,111,114,109,32,116,111,32,80,69,80,32,51,49, + 52,55,47,52,56,56,32,102,111,114,109,97,116,44,32,86, + 97,108,117,101,69,114,114,111,114,32,119,105,108,108,32,98, + 101,32,114,97,105,115,101,100,46,32,73,102,10,32,32,32, + 32,115,121,115,46,105,109,112,108,101,109,101,110,116,97,116, + 105,111,110,46,99,97,99,104,101,95,116,97,103,32,105,115, + 32,78,111,110,101,32,116,104,101,110,32,78,111,116,73,109, + 112,108,101,109,101,110,116,101,100,69,114,114,111,114,32,105, + 115,32,114,97,105,115,101,100,46,10,10,32,32,32,32,78, + 114,72,0,0,0,70,84,122,31,32,110,111,116,32,98,111, + 116,116,111,109,45,108,101,118,101,108,32,100,105,114,101,99, + 116,111,114,121,32,105,110,32,114,71,0,0,0,62,2,0, + 0,0,114,28,0,0,0,114,57,0,0,0,122,29,101,120, + 112,101,99,116,101,100,32,111,110,108,121,32,50,32,111,114, + 32,51,32,100,111,116,115,32,105,110,32,114,57,0,0,0, + 114,28,0,0,0,233,254,255,255,255,122,53,111,112,116,105, + 109,105,122,97,116,105,111,110,32,112,111,114,116,105,111,110, + 32,111,102,32,102,105,108,101,110,97,109,101,32,100,111,101, + 115,32,110,111,116,32,115,116,97,114,116,32,119,105,116,104, + 32,122,19,111,112,116,105,109,105,122,97,116,105,111,110,32, + 108,101,118,101,108,32,122,29,32,105,115,32,110,111,116,32, + 97,110,32,97,108,112,104,97,110,117,109,101,114,105,99,32, + 118,97,108,117,101,114,73,0,0,0,41,22,114,8,0,0, + 0,114,80,0,0,0,114,81,0,0,0,114,82,0,0,0, + 114,2,0,0,0,114,79,0,0,0,114,47,0,0,0,114, + 90,0,0,0,114,30,0,0,0,114,31,0,0,0,114,10, + 0,0,0,114,35,0,0,0,114,22,0,0,0,114,92,0, + 0,0,114,87,0,0,0,218,5,99,111,117,110,116,114,43, + 0,0,0,114,88,0,0,0,114,86,0,0,0,218,9,112, + 97,114,116,105,116,105,111,110,114,38,0,0,0,218,15,83, + 79,85,82,67,69,95,83,85,70,70,73,88,69,83,41,10, + 114,44,0,0,0,114,94,0,0,0,90,16,112,121,99,97, + 99,104,101,95,102,105,108,101,110,97,109,101,90,23,102,111, + 117,110,100,95,105,110,95,112,121,99,97,99,104,101,95,112, + 114,101,102,105,120,90,13,115,116,114,105,112,112,101,100,95, + 112,97,116,104,90,7,112,121,99,97,99,104,101,90,9,100, + 111,116,95,99,111,117,110,116,114,70,0,0,0,90,9,111, + 112,116,95,108,101,118,101,108,90,13,98,97,115,101,95,102, + 105,108,101,110,97,109,101,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,218,17,115,111,117,114,99,101,95,102, + 114,111,109,95,99,97,99,104,101,104,1,0,0,115,52,0, + 0,0,0,9,12,1,8,1,10,1,12,1,4,1,10,1, + 12,1,14,1,16,1,4,1,4,1,12,1,8,1,18,2, + 10,1,8,1,16,1,10,1,16,1,10,1,14,2,16,1, + 10,1,16,2,14,1,114,103,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,5,0,0,0,9,0,0,0, + 67,0,0,0,115,126,0,0,0,116,0,124,0,131,1,100, + 1,107,2,114,16,100,2,83,0,124,0,160,1,100,3,161, + 1,92,3,125,1,125,2,125,3,124,1,114,56,124,3,160, + 2,161,0,100,4,100,5,133,2,25,0,100,6,107,3,114, + 60,124,0,83,0,122,12,116,3,124,0,131,1,125,4,87, + 0,110,36,4,0,116,4,116,5,102,2,107,10,114,108,1, + 0,1,0,1,0,124,0,100,2,100,5,133,2,25,0,125, + 4,89,0,110,2,88,0,116,6,124,4,131,1,114,122,124, + 4,83,0,124,0,83,0,41,7,122,188,67,111,110,118,101, + 114,116,32,97,32,98,121,116,101,99,111,100,101,32,102,105, + 108,101,32,112,97,116,104,32,116,111,32,97,32,115,111,117, + 114,99,101,32,112,97,116,104,32,40,105,102,32,112,111,115, + 115,105,98,108,101,41,46,10,10,32,32,32,32,84,104,105, + 115,32,102,117,110,99,116,105,111,110,32,101,120,105,115,116, + 115,32,112,117,114,101,108,121,32,102,111,114,32,98,97,99, + 107,119,97,114,100,115,45,99,111,109,112,97,116,105,98,105, + 108,105,116,121,32,102,111,114,10,32,32,32,32,80,121,73, + 109,112,111,114,116,95,69,120,101,99,67,111,100,101,77,111, + 100,117,108,101,87,105,116,104,70,105,108,101,110,97,109,101, + 115,40,41,32,105,110,32,116,104,101,32,67,32,65,80,73, + 46,10,10,32,32,32,32,114,73,0,0,0,78,114,71,0, + 0,0,233,253,255,255,255,233,255,255,255,255,90,2,112,121, + 41,7,114,22,0,0,0,114,41,0,0,0,218,5,108,111, + 119,101,114,114,103,0,0,0,114,82,0,0,0,114,87,0, + 0,0,114,54,0,0,0,41,5,218,13,98,121,116,101,99, + 111,100,101,95,112,97,116,104,114,96,0,0,0,114,45,0, + 0,0,90,9,101,120,116,101,110,115,105,111,110,218,11,115, + 111,117,114,99,101,95,112,97,116,104,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,218,15,95,103,101,116,95, + 115,111,117,114,99,101,102,105,108,101,144,1,0,0,115,20, + 0,0,0,0,7,12,1,4,1,16,1,24,1,4,1,2, + 1,12,1,18,1,18,1,114,109,0,0,0,99,1,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0, + 0,67,0,0,0,115,74,0,0,0,124,0,160,0,116,1, + 116,2,131,1,161,1,114,48,122,10,116,3,124,0,131,1, + 87,0,83,0,4,0,116,4,107,10,114,44,1,0,1,0, + 1,0,89,0,113,70,88,0,110,22,124,0,160,0,116,1, + 116,5,131,1,161,1,114,66,124,0,83,0,100,0,83,0, + 100,0,83,0,169,1,78,41,6,218,8,101,110,100,115,119, + 105,116,104,218,5,116,117,112,108,101,114,102,0,0,0,114, + 98,0,0,0,114,82,0,0,0,114,89,0,0,0,41,1, + 114,97,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,218,11,95,103,101,116,95,99,97,99,104,101, + 100,163,1,0,0,115,16,0,0,0,0,1,14,1,2,1, + 10,1,14,1,8,1,14,1,4,2,114,113,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 8,0,0,0,67,0,0,0,115,52,0,0,0,122,14,116, + 0,124,0,131,1,106,1,125,1,87,0,110,24,4,0,116, + 2,107,10,114,38,1,0,1,0,1,0,100,1,125,1,89, + 0,110,2,88,0,124,1,100,2,79,0,125,1,124,1,83, + 0,41,3,122,51,67,97,108,99,117,108,97,116,101,32,116, + 104,101,32,109,111,100,101,32,112,101,114,109,105,115,115,105, + 111,110,115,32,102,111,114,32,97,32,98,121,116,101,99,111, + 100,101,32,102,105,108,101,46,114,60,0,0,0,233,128,0, + 0,0,41,3,114,49,0,0,0,114,51,0,0,0,114,50, + 0,0,0,41,2,114,44,0,0,0,114,52,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,10, + 95,99,97,108,99,95,109,111,100,101,175,1,0,0,115,12, + 0,0,0,0,2,2,1,14,1,14,1,10,3,8,1,114, + 115,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,8,0,0,0,3,0,0,0,115,68,0, + 0,0,100,6,135,0,102,1,100,2,100,3,132,9,125,1, + 122,10,116,0,106,1,125,2,87,0,110,28,4,0,116,2, + 107,10,114,52,1,0,1,0,1,0,100,4,100,5,132,0, + 125,2,89,0,110,2,88,0,124,2,124,1,136,0,131,2, + 1,0,124,1,83,0,41,7,122,252,68,101,99,111,114,97, + 116,111,114,32,116,111,32,118,101,114,105,102,121,32,116,104, + 97,116,32,116,104,101,32,109,111,100,117,108,101,32,98,101, + 105,110,103,32,114,101,113,117,101,115,116,101,100,32,109,97, + 116,99,104,101,115,32,116,104,101,32,111,110,101,32,116,104, + 101,10,32,32,32,32,108,111,97,100,101,114,32,99,97,110, + 32,104,97,110,100,108,101,46,10,10,32,32,32,32,84,104, + 101,32,102,105,114,115,116,32,97,114,103,117,109,101,110,116, + 32,40,115,101,108,102,41,32,109,117,115,116,32,100,101,102, + 105,110,101,32,95,110,97,109,101,32,119,104,105,99,104,32, + 116,104,101,32,115,101,99,111,110,100,32,97,114,103,117,109, + 101,110,116,32,105,115,10,32,32,32,32,99,111,109,112,97, + 114,101,100,32,97,103,97,105,110,115,116,46,32,73,102,32, + 116,104,101,32,99,111,109,112,97,114,105,115,111,110,32,102, + 97,105,108,115,32,116,104,101,110,32,73,109,112,111,114,116, + 69,114,114,111,114,32,105,115,32,114,97,105,115,101,100,46, + 10,10,32,32,32,32,78,99,2,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,4,0,0,0,31,0,0,0, + 115,66,0,0,0,124,1,100,0,107,8,114,16,124,0,106, + 0,125,1,110,32,124,0,106,0,124,1,107,3,114,48,116, + 1,100,1,124,0,106,0,124,1,102,2,22,0,124,1,100, + 2,141,2,130,1,136,0,124,0,124,1,102,2,124,2,158, + 2,124,3,142,1,83,0,41,3,78,122,30,108,111,97,100, + 101,114,32,102,111,114,32,37,115,32,99,97,110,110,111,116, + 32,104,97,110,100,108,101,32,37,115,169,1,218,4,110,97, + 109,101,41,2,114,117,0,0,0,218,11,73,109,112,111,114, + 116,69,114,114,111,114,41,4,218,4,115,101,108,102,114,117, + 0,0,0,218,4,97,114,103,115,90,6,107,119,97,114,103, + 115,169,1,218,6,109,101,116,104,111,100,114,3,0,0,0, + 114,6,0,0,0,218,19,95,99,104,101,99,107,95,110,97, + 109,101,95,119,114,97,112,112,101,114,195,1,0,0,115,18, + 0,0,0,0,1,8,1,8,1,10,1,4,1,8,255,2, + 1,2,255,6,2,122,40,95,99,104,101,99,107,95,110,97, + 109,101,46,60,108,111,99,97,108,115,62,46,95,99,104,101, + 99,107,95,110,97,109,101,95,119,114,97,112,112,101,114,99, + 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 7,0,0,0,83,0,0,0,115,56,0,0,0,100,1,68, + 0,93,32,125,2,116,0,124,1,124,2,131,2,114,4,116, + 1,124,0,124,2,116,2,124,1,124,2,131,2,131,3,1, + 0,113,4,124,0,106,3,160,4,124,1,106,3,161,1,1, + 0,100,0,83,0,41,2,78,41,4,218,10,95,95,109,111, + 100,117,108,101,95,95,218,8,95,95,110,97,109,101,95,95, + 218,12,95,95,113,117,97,108,110,97,109,101,95,95,218,7, + 95,95,100,111,99,95,95,41,5,218,7,104,97,115,97,116, + 116,114,218,7,115,101,116,97,116,116,114,218,7,103,101,116, + 97,116,116,114,218,8,95,95,100,105,99,116,95,95,218,6, + 117,112,100,97,116,101,41,3,90,3,110,101,119,90,3,111, + 108,100,114,67,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,218,5,95,119,114,97,112,206,1,0, + 0,115,8,0,0,0,0,1,8,1,10,1,20,1,122,26, + 95,99,104,101,99,107,95,110,97,109,101,46,60,108,111,99, + 97,108,115,62,46,95,119,114,97,112,41,1,78,41,3,218, + 10,95,98,111,111,116,115,116,114,97,112,114,133,0,0,0, + 218,9,78,97,109,101,69,114,114,111,114,41,3,114,122,0, + 0,0,114,123,0,0,0,114,133,0,0,0,114,3,0,0, + 0,114,121,0,0,0,114,6,0,0,0,218,11,95,99,104, + 101,99,107,95,110,97,109,101,187,1,0,0,115,14,0,0, + 0,0,8,14,7,2,1,10,1,14,2,14,5,10,1,114, + 136,0,0,0,99,2,0,0,0,0,0,0,0,0,0,0, + 0,5,0,0,0,6,0,0,0,67,0,0,0,115,60,0, + 0,0,124,0,160,0,124,1,161,1,92,2,125,2,125,3, + 124,2,100,1,107,8,114,56,116,1,124,3,131,1,114,56, + 100,2,125,4,116,2,160,3,124,4,160,4,124,3,100,3, + 25,0,161,1,116,5,161,2,1,0,124,2,83,0,41,4, + 122,155,84,114,121,32,116,111,32,102,105,110,100,32,97,32, + 108,111,97,100,101,114,32,102,111,114,32,116,104,101,32,115, + 112,101,99,105,102,105,101,100,32,109,111,100,117,108,101,32, + 98,121,32,100,101,108,101,103,97,116,105,110,103,32,116,111, + 10,32,32,32,32,115,101,108,102,46,102,105,110,100,95,108, + 111,97,100,101,114,40,41,46,10,10,32,32,32,32,84,104, + 105,115,32,109,101,116,104,111,100,32,105,115,32,100,101,112, + 114,101,99,97,116,101,100,32,105,110,32,102,97,118,111,114, + 32,111,102,32,102,105,110,100,101,114,46,102,105,110,100,95, + 115,112,101,99,40,41,46,10,10,32,32,32,32,78,122,44, + 78,111,116,32,105,109,112,111,114,116,105,110,103,32,100,105, + 114,101,99,116,111,114,121,32,123,125,58,32,109,105,115,115, + 105,110,103,32,95,95,105,110,105,116,95,95,114,73,0,0, + 0,41,6,218,11,102,105,110,100,95,108,111,97,100,101,114, + 114,22,0,0,0,114,75,0,0,0,114,76,0,0,0,114, + 62,0,0,0,218,13,73,109,112,111,114,116,87,97,114,110, + 105,110,103,41,5,114,119,0,0,0,218,8,102,117,108,108, + 110,97,109,101,218,6,108,111,97,100,101,114,218,8,112,111, + 114,116,105,111,110,115,218,3,109,115,103,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,218,17,95,102,105,110, + 100,95,109,111,100,117,108,101,95,115,104,105,109,215,1,0, + 0,115,10,0,0,0,0,10,14,1,16,1,4,1,22,1, + 114,143,0,0,0,99,3,0,0,0,0,0,0,0,0,0, + 0,0,6,0,0,0,4,0,0,0,67,0,0,0,115,158, + 0,0,0,124,0,100,1,100,2,133,2,25,0,125,3,124, + 3,116,0,107,3,114,60,100,3,124,1,155,2,100,4,124, + 3,155,2,157,4,125,4,116,1,160,2,100,5,124,4,161, + 2,1,0,116,3,124,4,102,1,124,2,142,1,130,1,116, + 4,124,0,131,1,100,6,107,0,114,102,100,7,124,1,155, + 2,157,2,125,4,116,1,160,2,100,5,124,4,161,2,1, + 0,116,5,124,4,131,1,130,1,116,6,124,0,100,2,100, + 8,133,2,25,0,131,1,125,5,124,5,100,9,64,0,114, + 154,100,10,124,5,155,2,100,11,124,1,155,2,157,4,125, + 4,116,3,124,4,102,1,124,2,142,1,130,1,124,5,83, + 0,41,12,97,84,2,0,0,80,101,114,102,111,114,109,32, + 98,97,115,105,99,32,118,97,108,105,100,105,116,121,32,99, + 104,101,99,107,105,110,103,32,111,102,32,97,32,112,121,99, + 32,104,101,97,100,101,114,32,97,110,100,32,114,101,116,117, + 114,110,32,116,104,101,32,102,108,97,103,115,32,102,105,101, + 108,100,44,10,32,32,32,32,119,104,105,99,104,32,100,101, + 116,101,114,109,105,110,101,115,32,104,111,119,32,116,104,101, + 32,112,121,99,32,115,104,111,117,108,100,32,98,101,32,102, + 117,114,116,104,101,114,32,118,97,108,105,100,97,116,101,100, + 32,97,103,97,105,110,115,116,32,116,104,101,32,115,111,117, + 114,99,101,46,10,10,32,32,32,32,42,100,97,116,97,42, + 32,105,115,32,116,104,101,32,99,111,110,116,101,110,116,115, + 32,111,102,32,116,104,101,32,112,121,99,32,102,105,108,101, + 46,32,40,79,110,108,121,32,116,104,101,32,102,105,114,115, + 116,32,49,54,32,98,121,116,101,115,32,97,114,101,10,32, + 32,32,32,114,101,113,117,105,114,101,100,44,32,116,104,111, + 117,103,104,46,41,10,10,32,32,32,32,42,110,97,109,101, + 42,32,105,115,32,116,104,101,32,110,97,109,101,32,111,102, + 32,116,104,101,32,109,111,100,117,108,101,32,98,101,105,110, + 103,32,105,109,112,111,114,116,101,100,46,32,73,116,32,105, + 115,32,117,115,101,100,32,102,111,114,32,108,111,103,103,105, + 110,103,46,10,10,32,32,32,32,42,101,120,99,95,100,101, + 116,97,105,108,115,42,32,105,115,32,97,32,100,105,99,116, + 105,111,110,97,114,121,32,112,97,115,115,101,100,32,116,111, + 32,73,109,112,111,114,116,69,114,114,111,114,32,105,102,32, + 105,116,32,114,97,105,115,101,100,32,102,111,114,10,32,32, + 32,32,105,109,112,114,111,118,101,100,32,100,101,98,117,103, + 103,105,110,103,46,10,10,32,32,32,32,73,109,112,111,114, + 116,69,114,114,111,114,32,105,115,32,114,97,105,115,101,100, + 32,119,104,101,110,32,116,104,101,32,109,97,103,105,99,32, + 110,117,109,98,101,114,32,105,115,32,105,110,99,111,114,114, + 101,99,116,32,111,114,32,119,104,101,110,32,116,104,101,32, + 102,108,97,103,115,10,32,32,32,32,102,105,101,108,100,32, + 105,115,32,105,110,118,97,108,105,100,46,32,69,79,70,69, + 114,114,111,114,32,105,115,32,114,97,105,115,101,100,32,119, + 104,101,110,32,116,104,101,32,100,97,116,97,32,105,115,32, + 102,111,117,110,100,32,116,111,32,98,101,32,116,114,117,110, + 99,97,116,101,100,46,10,10,32,32,32,32,78,114,15,0, + 0,0,122,20,98,97,100,32,109,97,103,105,99,32,110,117, + 109,98,101,114,32,105,110,32,122,2,58,32,250,2,123,125, + 233,16,0,0,0,122,40,114,101,97,99,104,101,100,32,69, + 79,70,32,119,104,105,108,101,32,114,101,97,100,105,110,103, + 32,112,121,99,32,104,101,97,100,101,114,32,111,102,32,233, + 8,0,0,0,233,252,255,255,255,122,14,105,110,118,97,108, + 105,100,32,102,108,97,103,115,32,122,4,32,105,110,32,41, + 7,218,12,77,65,71,73,67,95,78,85,77,66,69,82,114, + 134,0,0,0,218,16,95,118,101,114,98,111,115,101,95,109, + 101,115,115,97,103,101,114,118,0,0,0,114,22,0,0,0, + 218,8,69,79,70,69,114,114,111,114,114,27,0,0,0,41, + 6,114,26,0,0,0,114,117,0,0,0,218,11,101,120,99, + 95,100,101,116,97,105,108,115,90,5,109,97,103,105,99,114, + 93,0,0,0,114,83,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,13,95,99,108,97,115,115, + 105,102,121,95,112,121,99,232,1,0,0,115,28,0,0,0, + 0,16,12,1,8,1,16,1,12,1,12,1,12,1,10,1, + 12,1,8,1,16,2,8,1,16,1,12,1,114,152,0,0, + 0,99,5,0,0,0,0,0,0,0,0,0,0,0,6,0, + 0,0,4,0,0,0,67,0,0,0,115,112,0,0,0,116, + 0,124,0,100,1,100,2,133,2,25,0,131,1,124,1,100, + 3,64,0,107,3,114,58,100,4,124,3,155,2,157,2,125, + 5,116,1,160,2,100,5,124,5,161,2,1,0,116,3,124, + 5,102,1,124,4,142,1,130,1,124,2,100,6,107,9,114, + 108,116,0,124,0,100,2,100,7,133,2,25,0,131,1,124, + 2,100,3,64,0,107,3,114,108,116,3,100,4,124,3,155, + 2,157,2,102,1,124,4,142,1,130,1,100,6,83,0,41, + 8,97,7,2,0,0,86,97,108,105,100,97,116,101,32,97, + 32,112,121,99,32,97,103,97,105,110,115,116,32,116,104,101, + 32,115,111,117,114,99,101,32,108,97,115,116,45,109,111,100, + 105,102,105,101,100,32,116,105,109,101,46,10,10,32,32,32, + 32,42,100,97,116,97,42,32,105,115,32,116,104,101,32,99, + 111,110,116,101,110,116,115,32,111,102,32,116,104,101,32,112, + 121,99,32,102,105,108,101,46,32,40,79,110,108,121,32,116, + 104,101,32,102,105,114,115,116,32,49,54,32,98,121,116,101, + 115,32,97,114,101,10,32,32,32,32,114,101,113,117,105,114, + 101,100,46,41,10,10,32,32,32,32,42,115,111,117,114,99, + 101,95,109,116,105,109,101,42,32,105,115,32,116,104,101,32, + 108,97,115,116,32,109,111,100,105,102,105,101,100,32,116,105, + 109,101,115,116,97,109,112,32,111,102,32,116,104,101,32,115, + 111,117,114,99,101,32,102,105,108,101,46,10,10,32,32,32, + 32,42,115,111,117,114,99,101,95,115,105,122,101,42,32,105, + 115,32,78,111,110,101,32,111,114,32,116,104,101,32,115,105, + 122,101,32,111,102,32,116,104,101,32,115,111,117,114,99,101, + 32,102,105,108,101,32,105,110,32,98,121,116,101,115,46,10, + 10,32,32,32,32,42,110,97,109,101,42,32,105,115,32,116, + 104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,109, + 111,100,117,108,101,32,98,101,105,110,103,32,105,109,112,111, + 114,116,101,100,46,32,73,116,32,105,115,32,117,115,101,100, + 32,102,111,114,32,108,111,103,103,105,110,103,46,10,10,32, + 32,32,32,42,101,120,99,95,100,101,116,97,105,108,115,42, + 32,105,115,32,97,32,100,105,99,116,105,111,110,97,114,121, + 32,112,97,115,115,101,100,32,116,111,32,73,109,112,111,114, + 116,69,114,114,111,114,32,105,102,32,105,116,32,114,97,105, + 115,101,100,32,102,111,114,10,32,32,32,32,105,109,112,114, + 111,118,101,100,32,100,101,98,117,103,103,105,110,103,46,10, + 10,32,32,32,32,65,110,32,73,109,112,111,114,116,69,114, + 114,111,114,32,105,115,32,114,97,105,115,101,100,32,105,102, + 32,116,104,101,32,98,121,116,101,99,111,100,101,32,105,115, + 32,115,116,97,108,101,46,10,10,32,32,32,32,114,146,0, + 0,0,233,12,0,0,0,114,14,0,0,0,122,22,98,121, + 116,101,99,111,100,101,32,105,115,32,115,116,97,108,101,32, + 102,111,114,32,114,144,0,0,0,78,114,145,0,0,0,41, + 4,114,27,0,0,0,114,134,0,0,0,114,149,0,0,0, + 114,118,0,0,0,41,6,114,26,0,0,0,218,12,115,111, + 117,114,99,101,95,109,116,105,109,101,218,11,115,111,117,114, + 99,101,95,115,105,122,101,114,117,0,0,0,114,151,0,0, + 0,114,93,0,0,0,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,218,23,95,118,97,108,105,100,97,116,101, + 95,116,105,109,101,115,116,97,109,112,95,112,121,99,9,2, + 0,0,115,16,0,0,0,0,19,24,1,10,1,12,1,12, + 1,8,1,22,255,2,2,114,156,0,0,0,99,4,0,0, + 0,0,0,0,0,0,0,0,0,4,0,0,0,3,0,0, + 0,67,0,0,0,115,38,0,0,0,124,0,100,1,100,2, + 133,2,25,0,124,1,107,3,114,34,116,0,100,3,124,2, + 155,2,157,2,102,1,124,3,142,1,130,1,100,4,83,0, + 41,5,97,243,1,0,0,86,97,108,105,100,97,116,101,32, + 97,32,104,97,115,104,45,98,97,115,101,100,32,112,121,99, + 32,98,121,32,99,104,101,99,107,105,110,103,32,116,104,101, + 32,114,101,97,108,32,115,111,117,114,99,101,32,104,97,115, + 104,32,97,103,97,105,110,115,116,32,116,104,101,32,111,110, + 101,32,105,110,10,32,32,32,32,116,104,101,32,112,121,99, + 32,104,101,97,100,101,114,46,10,10,32,32,32,32,42,100, 97,116,97,42,32,105,115,32,116,104,101,32,99,111,110,116, 101,110,116,115,32,111,102,32,116,104,101,32,112,121,99,32, 102,105,108,101,46,32,40,79,110,108,121,32,116,104,101,32, 102,105,114,115,116,32,49,54,32,98,121,116,101,115,32,97, - 114,101,10,32,32,32,32,114,101,113,117,105,114,101,100,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,15,0,0,0,122,20,98,97,100,32,109,97,103,105, - 99,32,110,117,109,98,101,114,32,105,110,32,122,2,58,32, - 250,2,123,125,233,16,0,0,0,122,40,114,101,97,99,104, - 101,100,32,69,79,70,32,119,104,105,108,101,32,114,101,97, - 100,105,110,103,32,112,121,99,32,104,101,97,100,101,114,32, - 111,102,32,233,8,0,0,0,233,252,255,255,255,122,14,105, - 110,118,97,108,105,100,32,102,108,97,103,115,32,122,4,32, - 105,110,32,41,7,218,12,77,65,71,73,67,95,78,85,77, - 66,69,82,114,134,0,0,0,218,16,95,118,101,114,98,111, - 115,101,95,109,101,115,115,97,103,101,114,118,0,0,0,114, - 22,0,0,0,218,8,69,79,70,69,114,114,111,114,114,27, - 0,0,0,41,6,114,26,0,0,0,114,117,0,0,0,218, - 11,101,120,99,95,100,101,116,97,105,108,115,90,5,109,97, - 103,105,99,114,93,0,0,0,114,83,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,13,95,99, - 108,97,115,115,105,102,121,95,112,121,99,232,1,0,0,115, - 28,0,0,0,0,16,12,1,8,1,16,1,12,1,12,1, - 12,1,10,1,12,1,8,1,16,2,8,1,16,1,12,1, - 114,152,0,0,0,99,5,0,0,0,0,0,0,0,0,0, - 0,0,6,0,0,0,4,0,0,0,67,0,0,0,115,112, - 0,0,0,116,0,124,0,100,1,100,2,133,2,25,0,131, - 1,124,1,100,3,64,0,107,3,114,58,100,4,124,3,155, - 2,157,2,125,5,116,1,160,2,100,5,124,5,161,2,1, - 0,116,3,124,5,102,1,124,4,142,1,130,1,124,2,100, - 6,107,9,114,108,116,0,124,0,100,2,100,7,133,2,25, - 0,131,1,124,2,100,3,64,0,107,3,114,108,116,3,100, - 4,124,3,155,2,157,2,102,1,124,4,142,1,130,1,100, - 6,83,0,41,8,97,7,2,0,0,86,97,108,105,100,97, - 116,101,32,97,32,112,121,99,32,97,103,97,105,110,115,116, - 32,116,104,101,32,115,111,117,114,99,101,32,108,97,115,116, - 45,109,111,100,105,102,105,101,100,32,116,105,109,101,46,10, - 10,32,32,32,32,42,100,97,116,97,42,32,105,115,32,116, - 104,101,32,99,111,110,116,101,110,116,115,32,111,102,32,116, - 104,101,32,112,121,99,32,102,105,108,101,46,32,40,79,110, - 108,121,32,116,104,101,32,102,105,114,115,116,32,49,54,32, - 98,121,116,101,115,32,97,114,101,10,32,32,32,32,114,101, - 113,117,105,114,101,100,46,41,10,10,32,32,32,32,42,115, - 111,117,114,99,101,95,109,116,105,109,101,42,32,105,115,32, - 116,104,101,32,108,97,115,116,32,109,111,100,105,102,105,101, - 100,32,116,105,109,101,115,116,97,109,112,32,111,102,32,116, - 104,101,32,115,111,117,114,99,101,32,102,105,108,101,46,10, - 10,32,32,32,32,42,115,111,117,114,99,101,95,115,105,122, - 101,42,32,105,115,32,78,111,110,101,32,111,114,32,116,104, - 101,32,115,105,122,101,32,111,102,32,116,104,101,32,115,111, - 117,114,99,101,32,102,105,108,101,32,105,110,32,98,121,116, - 101,115,46,10,10,32,32,32,32,42,110,97,109,101,42,32, - 105,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116, - 104,101,32,109,111,100,117,108,101,32,98,101,105,110,103,32, - 105,109,112,111,114,116,101,100,46,32,73,116,32,105,115,32, - 117,115,101,100,32,102,111,114,32,108,111,103,103,105,110,103, - 46,10,10,32,32,32,32,42,101,120,99,95,100,101,116,97, - 105,108,115,42,32,105,115,32,97,32,100,105,99,116,105,111, - 110,97,114,121,32,112,97,115,115,101,100,32,116,111,32,73, - 109,112,111,114,116,69,114,114,111,114,32,105,102,32,105,116, - 32,114,97,105,115,101,100,32,102,111,114,10,32,32,32,32, - 105,109,112,114,111,118,101,100,32,100,101,98,117,103,103,105, - 110,103,46,10,10,32,32,32,32,65,110,32,73,109,112,111, - 114,116,69,114,114,111,114,32,105,115,32,114,97,105,115,101, - 100,32,105,102,32,116,104,101,32,98,121,116,101,99,111,100, - 101,32,105,115,32,115,116,97,108,101,46,10,10,32,32,32, - 32,114,146,0,0,0,233,12,0,0,0,114,14,0,0,0, - 122,22,98,121,116,101,99,111,100,101,32,105,115,32,115,116, - 97,108,101,32,102,111,114,32,114,144,0,0,0,78,114,145, - 0,0,0,41,4,114,27,0,0,0,114,134,0,0,0,114, - 149,0,0,0,114,118,0,0,0,41,6,114,26,0,0,0, - 218,12,115,111,117,114,99,101,95,109,116,105,109,101,218,11, - 115,111,117,114,99,101,95,115,105,122,101,114,117,0,0,0, - 114,151,0,0,0,114,93,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,23,95,118,97,108,105, - 100,97,116,101,95,116,105,109,101,115,116,97,109,112,95,112, - 121,99,9,2,0,0,115,16,0,0,0,0,19,24,1,10, - 1,12,1,12,1,8,1,22,255,2,2,114,156,0,0,0, - 99,4,0,0,0,0,0,0,0,0,0,0,0,4,0,0, - 0,3,0,0,0,67,0,0,0,115,38,0,0,0,124,0, - 100,1,100,2,133,2,25,0,124,1,107,3,114,34,116,0, - 100,3,124,2,155,2,157,2,102,1,124,3,142,1,130,1, - 100,4,83,0,41,5,97,243,1,0,0,86,97,108,105,100, - 97,116,101,32,97,32,104,97,115,104,45,98,97,115,101,100, - 32,112,121,99,32,98,121,32,99,104,101,99,107,105,110,103, - 32,116,104,101,32,114,101,97,108,32,115,111,117,114,99,101, - 32,104,97,115,104,32,97,103,97,105,110,115,116,32,116,104, - 101,32,111,110,101,32,105,110,10,32,32,32,32,116,104,101, - 32,112,121,99,32,104,101,97,100,101,114,46,10,10,32,32, - 32,32,42,100,97,116,97,42,32,105,115,32,116,104,101,32, - 99,111,110,116,101,110,116,115,32,111,102,32,116,104,101,32, - 112,121,99,32,102,105,108,101,46,32,40,79,110,108,121,32, - 116,104,101,32,102,105,114,115,116,32,49,54,32,98,121,116, - 101,115,32,97,114,101,10,32,32,32,32,114,101,113,117,105, - 114,101,100,46,41,10,10,32,32,32,32,42,115,111,117,114, - 99,101,95,104,97,115,104,42,32,105,115,32,116,104,101,32, - 105,109,112,111,114,116,108,105,98,46,117,116,105,108,46,115, - 111,117,114,99,101,95,104,97,115,104,40,41,32,111,102,32, - 116,104,101,32,115,111,117,114,99,101,32,102,105,108,101,46, - 10,10,32,32,32,32,42,110,97,109,101,42,32,105,115,32, - 116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32, - 109,111,100,117,108,101,32,98,101,105,110,103,32,105,109,112, - 111,114,116,101,100,46,32,73,116,32,105,115,32,117,115,101, - 100,32,102,111,114,32,108,111,103,103,105,110,103,46,10,10, - 32,32,32,32,42,101,120,99,95,100,101,116,97,105,108,115, - 42,32,105,115,32,97,32,100,105,99,116,105,111,110,97,114, - 121,32,112,97,115,115,101,100,32,116,111,32,73,109,112,111, - 114,116,69,114,114,111,114,32,105,102,32,105,116,32,114,97, - 105,115,101,100,32,102,111,114,10,32,32,32,32,105,109,112, - 114,111,118,101,100,32,100,101,98,117,103,103,105,110,103,46, - 10,10,32,32,32,32,65,110,32,73,109,112,111,114,116,69, - 114,114,111,114,32,105,115,32,114,97,105,115,101,100,32,105, - 102,32,116,104,101,32,98,121,116,101,99,111,100,101,32,105, - 115,32,115,116,97,108,101,46,10,10,32,32,32,32,114,146, - 0,0,0,114,145,0,0,0,122,46,104,97,115,104,32,105, - 110,32,98,121,116,101,99,111,100,101,32,100,111,101,115,110, - 39,116,32,109,97,116,99,104,32,104,97,115,104,32,111,102, - 32,115,111,117,114,99,101,32,78,41,1,114,118,0,0,0, - 41,4,114,26,0,0,0,218,11,115,111,117,114,99,101,95, - 104,97,115,104,114,117,0,0,0,114,151,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,218,18,95, - 118,97,108,105,100,97,116,101,95,104,97,115,104,95,112,121, - 99,37,2,0,0,115,12,0,0,0,0,17,16,1,2,1, - 8,255,2,2,2,254,114,158,0,0,0,99,4,0,0,0, - 0,0,0,0,0,0,0,0,5,0,0,0,5,0,0,0, - 67,0,0,0,115,82,0,0,0,116,0,160,1,124,0,161, - 1,125,4,116,2,124,4,116,3,131,2,114,58,116,4,160, - 5,100,1,124,2,161,2,1,0,124,3,100,2,107,9,114, - 52,116,6,160,7,124,4,124,3,161,2,1,0,124,4,83, - 0,110,20,116,8,100,3,160,9,124,2,161,1,124,1,124, - 2,100,4,141,3,130,1,100,2,83,0,41,5,122,35,67, - 111,109,112,105,108,101,32,98,121,116,101,99,111,100,101,32, - 97,115,32,102,111,117,110,100,32,105,110,32,97,32,112,121, - 99,46,122,21,99,111,100,101,32,111,98,106,101,99,116,32, - 102,114,111,109,32,123,33,114,125,78,122,23,78,111,110,45, - 99,111,100,101,32,111,98,106,101,99,116,32,105,110,32,123, - 33,114,125,169,2,114,117,0,0,0,114,44,0,0,0,41, - 10,218,7,109,97,114,115,104,97,108,90,5,108,111,97,100, - 115,218,10,105,115,105,110,115,116,97,110,99,101,218,10,95, - 99,111,100,101,95,116,121,112,101,114,134,0,0,0,114,149, - 0,0,0,218,4,95,105,109,112,90,16,95,102,105,120,95, - 99,111,95,102,105,108,101,110,97,109,101,114,118,0,0,0, - 114,62,0,0,0,41,5,114,26,0,0,0,114,117,0,0, - 0,114,107,0,0,0,114,108,0,0,0,218,4,99,111,100, - 101,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 218,17,95,99,111,109,112,105,108,101,95,98,121,116,101,99, - 111,100,101,61,2,0,0,115,20,0,0,0,0,2,10,1, - 10,1,12,1,8,1,12,1,6,2,10,1,2,0,2,255, - 114,165,0,0,0,114,73,0,0,0,99,3,0,0,0,0, - 0,0,0,0,0,0,0,4,0,0,0,5,0,0,0,67, - 0,0,0,115,70,0,0,0,116,0,116,1,131,1,125,3, - 124,3,160,2,116,3,100,1,131,1,161,1,1,0,124,3, - 160,2,116,3,124,1,131,1,161,1,1,0,124,3,160,2, - 116,3,124,2,131,1,161,1,1,0,124,3,160,2,116,4, - 160,5,124,0,161,1,161,1,1,0,124,3,83,0,41,2, - 122,43,80,114,111,100,117,99,101,32,116,104,101,32,100,97, - 116,97,32,102,111,114,32,97,32,116,105,109,101,115,116,97, - 109,112,45,98,97,115,101,100,32,112,121,99,46,114,73,0, - 0,0,41,6,218,9,98,121,116,101,97,114,114,97,121,114, - 148,0,0,0,218,6,101,120,116,101,110,100,114,20,0,0, - 0,114,160,0,0,0,218,5,100,117,109,112,115,41,4,114, - 164,0,0,0,218,5,109,116,105,109,101,114,155,0,0,0, - 114,26,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,218,22,95,99,111,100,101,95,116,111,95,116, - 105,109,101,115,116,97,109,112,95,112,121,99,74,2,0,0, - 115,12,0,0,0,0,2,8,1,14,1,14,1,14,1,16, - 1,114,170,0,0,0,84,99,3,0,0,0,0,0,0,0, + 114,101,10,32,32,32,32,114,101,113,117,105,114,101,100,46, + 41,10,10,32,32,32,32,42,115,111,117,114,99,101,95,104, + 97,115,104,42,32,105,115,32,116,104,101,32,105,109,112,111, + 114,116,108,105,98,46,117,116,105,108,46,115,111,117,114,99, + 101,95,104,97,115,104,40,41,32,111,102,32,116,104,101,32, + 115,111,117,114,99,101,32,102,105,108,101,46,10,10,32,32, + 32,32,42,110,97,109,101,42,32,105,115,32,116,104,101,32, + 110,97,109,101,32,111,102,32,116,104,101,32,109,111,100,117, + 108,101,32,98,101,105,110,103,32,105,109,112,111,114,116,101, + 100,46,32,73,116,32,105,115,32,117,115,101,100,32,102,111, + 114,32,108,111,103,103,105,110,103,46,10,10,32,32,32,32, + 42,101,120,99,95,100,101,116,97,105,108,115,42,32,105,115, + 32,97,32,100,105,99,116,105,111,110,97,114,121,32,112,97, + 115,115,101,100,32,116,111,32,73,109,112,111,114,116,69,114, + 114,111,114,32,105,102,32,105,116,32,114,97,105,115,101,100, + 32,102,111,114,10,32,32,32,32,105,109,112,114,111,118,101, + 100,32,100,101,98,117,103,103,105,110,103,46,10,10,32,32, + 32,32,65,110,32,73,109,112,111,114,116,69,114,114,111,114, + 32,105,115,32,114,97,105,115,101,100,32,105,102,32,116,104, + 101,32,98,121,116,101,99,111,100,101,32,105,115,32,115,116, + 97,108,101,46,10,10,32,32,32,32,114,146,0,0,0,114, + 145,0,0,0,122,46,104,97,115,104,32,105,110,32,98,121, + 116,101,99,111,100,101,32,100,111,101,115,110,39,116,32,109, + 97,116,99,104,32,104,97,115,104,32,111,102,32,115,111,117, + 114,99,101,32,78,41,1,114,118,0,0,0,41,4,114,26, + 0,0,0,218,11,115,111,117,114,99,101,95,104,97,115,104, + 114,117,0,0,0,114,151,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,218,18,95,118,97,108,105, + 100,97,116,101,95,104,97,115,104,95,112,121,99,37,2,0, + 0,115,12,0,0,0,0,17,16,1,2,1,8,255,2,2, + 2,254,114,158,0,0,0,99,4,0,0,0,0,0,0,0, 0,0,0,0,5,0,0,0,5,0,0,0,67,0,0,0, - 115,80,0,0,0,116,0,116,1,131,1,125,3,100,1,124, - 2,100,1,62,0,66,0,125,4,124,3,160,2,116,3,124, - 4,131,1,161,1,1,0,116,4,124,1,131,1,100,2,107, - 2,115,50,116,5,130,1,124,3,160,2,124,1,161,1,1, - 0,124,3,160,2,116,6,160,7,124,0,161,1,161,1,1, - 0,124,3,83,0,41,3,122,38,80,114,111,100,117,99,101, - 32,116,104,101,32,100,97,116,97,32,102,111,114,32,97,32, - 104,97,115,104,45,98,97,115,101,100,32,112,121,99,46,114, - 39,0,0,0,114,146,0,0,0,41,8,114,166,0,0,0, - 114,148,0,0,0,114,167,0,0,0,114,20,0,0,0,114, - 22,0,0,0,114,23,0,0,0,114,160,0,0,0,114,168, - 0,0,0,41,5,114,164,0,0,0,114,157,0,0,0,90, - 7,99,104,101,99,107,101,100,114,26,0,0,0,114,83,0, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,17,95,99,111,100,101,95,116,111,95,104,97,115,104, - 95,112,121,99,84,2,0,0,115,14,0,0,0,0,2,8, - 1,12,1,14,1,16,1,10,1,16,1,114,171,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,5,0,0, - 0,6,0,0,0,67,0,0,0,115,62,0,0,0,100,1, - 100,2,108,0,125,1,116,1,160,2,124,0,161,1,106,3, - 125,2,124,1,160,4,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,73,0,0,0,78,84, - 41,7,218,8,116,111,107,101,110,105,122,101,114,64,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,172,0,0,0,90,21,115, - 111,117,114,99,101,95,98,121,116,101,115,95,114,101,97,100, - 108,105,110,101,218,8,101,110,99,111,100,105,110,103,90,15, - 110,101,119,108,105,110,101,95,100,101,99,111,100,101,114,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,13, - 100,101,99,111,100,101,95,115,111,117,114,99,101,95,2,0, - 0,115,10,0,0,0,0,5,8,1,12,1,10,1,12,1, - 114,176,0,0,0,169,2,114,140,0,0,0,218,26,115,117, - 98,109,111,100,117,108,101,95,115,101,97,114,99,104,95,108, - 111,99,97,116,105,111,110,115,99,2,0,0,0,0,0,0, - 0,2,0,0,0,9,0,0,0,8,0,0,0,67,0,0, - 0,115,16,1,0,0,124,1,100,1,107,8,114,60,100,2, - 125,1,116,0,124,2,100,3,131,2,114,70,122,14,124,2, - 160,1,124,0,161,1,125,1,87,0,113,70,4,0,116,2, - 107,10,114,56,1,0,1,0,1,0,89,0,113,70,88,0, - 110,10,116,3,160,4,124,1,161,1,125,1,116,5,106,6, - 124,0,124,2,124,1,100,4,141,3,125,4,100,5,124,4, - 95,7,124,2,100,1,107,8,114,154,116,8,131,0,68,0, - 93,42,92,2,125,5,125,6,124,1,160,9,116,10,124,6, - 131,1,161,1,114,106,124,5,124,0,124,1,131,2,125,2, - 124,2,124,4,95,11,1,0,113,154,113,106,100,1,83,0, - 124,3,116,12,107,8,114,220,116,0,124,2,100,6,131,2, - 114,226,122,14,124,2,160,13,124,0,161,1,125,7,87,0, - 110,20,4,0,116,2,107,10,114,206,1,0,1,0,1,0, - 89,0,113,226,88,0,124,7,114,226,103,0,124,4,95,14, - 110,6,124,3,124,4,95,14,124,4,106,14,103,0,107,2, - 144,1,114,12,124,1,144,1,114,12,116,15,124,1,131,1, - 100,7,25,0,125,8,124,4,106,14,160,16,124,8,161,1, - 1,0,124,4,83,0,41,8,97,61,1,0,0,82,101,116, - 117,114,110,32,97,32,109,111,100,117,108,101,32,115,112,101, - 99,32,98,97,115,101,100,32,111,110,32,97,32,102,105,108, - 101,32,108,111,99,97,116,105,111,110,46,10,10,32,32,32, - 32,84,111,32,105,110,100,105,99,97,116,101,32,116,104,97, - 116,32,116,104,101,32,109,111,100,117,108,101,32,105,115,32, - 97,32,112,97,99,107,97,103,101,44,32,115,101,116,10,32, - 32,32,32,115,117,98,109,111,100,117,108,101,95,115,101,97, - 114,99,104,95,108,111,99,97,116,105,111,110,115,32,116,111, - 32,97,32,108,105,115,116,32,111,102,32,100,105,114,101,99, - 116,111,114,121,32,112,97,116,104,115,46,32,32,65,110,10, - 32,32,32,32,101,109,112,116,121,32,108,105,115,116,32,105, - 115,32,115,117,102,102,105,99,105,101,110,116,44,32,116,104, - 111,117,103,104,32,105,116,115,32,110,111,116,32,111,116,104, - 101,114,119,105,115,101,32,117,115,101,102,117,108,32,116,111, - 32,116,104,101,10,32,32,32,32,105,109,112,111,114,116,32, - 115,121,115,116,101,109,46,10,10,32,32,32,32,84,104,101, - 32,108,111,97,100,101,114,32,109,117,115,116,32,116,97,107, - 101,32,97,32,115,112,101,99,32,97,115,32,105,116,115,32, - 111,110,108,121,32,95,95,105,110,105,116,95,95,40,41,32, - 97,114,103,46,10,10,32,32,32,32,78,122,9,60,117,110, - 107,110,111,119,110,62,218,12,103,101,116,95,102,105,108,101, - 110,97,109,101,169,1,218,6,111,114,105,103,105,110,84,218, - 10,105,115,95,112,97,99,107,97,103,101,114,73,0,0,0, - 41,17,114,128,0,0,0,114,179,0,0,0,114,118,0,0, - 0,114,2,0,0,0,114,79,0,0,0,114,134,0,0,0, - 218,10,77,111,100,117,108,101,83,112,101,99,90,13,95,115, - 101,116,95,102,105,108,101,97,116,116,114,218,27,95,103,101, - 116,95,115,117,112,112,111,114,116,101,100,95,102,105,108,101, - 95,108,111,97,100,101,114,115,114,111,0,0,0,114,112,0, - 0,0,114,140,0,0,0,218,9,95,80,79,80,85,76,65, - 84,69,114,182,0,0,0,114,178,0,0,0,114,47,0,0, - 0,218,6,97,112,112,101,110,100,41,9,114,117,0,0,0, - 90,8,108,111,99,97,116,105,111,110,114,140,0,0,0,114, - 178,0,0,0,218,4,115,112,101,99,218,12,108,111,97,100, - 101,114,95,99,108,97,115,115,218,8,115,117,102,102,105,120, - 101,115,114,182,0,0,0,90,7,100,105,114,110,97,109,101, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, - 23,115,112,101,99,95,102,114,111,109,95,102,105,108,101,95, - 108,111,99,97,116,105,111,110,112,2,0,0,115,62,0,0, - 0,0,12,8,4,4,1,10,2,2,1,14,1,14,1,8, - 2,10,8,16,1,6,3,8,1,14,1,14,1,10,1,6, - 1,6,2,4,3,8,2,10,1,2,1,14,1,14,1,6, - 2,4,1,8,2,6,1,12,1,6,1,12,1,12,2,114, - 190,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,4,0,0,0,64,0,0,0,115,86,0, - 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2, - 90,4,100,3,90,5,100,4,90,6,101,7,100,5,100,6, - 132,0,131,1,90,8,101,7,100,7,100,8,132,0,131,1, - 90,9,101,7,100,9,100,9,102,2,100,10,100,11,132,1, - 131,1,90,10,101,7,100,9,102,1,100,12,100,13,132,1, - 131,1,90,11,100,9,83,0,41,14,218,21,87,105,110,100, - 111,119,115,82,101,103,105,115,116,114,121,70,105,110,100,101, - 114,122,62,77,101,116,97,32,112,97,116,104,32,102,105,110, - 100,101,114,32,102,111,114,32,109,111,100,117,108,101,115,32, - 100,101,99,108,97,114,101,100,32,105,110,32,116,104,101,32, - 87,105,110,100,111,119,115,32,114,101,103,105,115,116,114,121, - 46,122,59,83,111,102,116,119,97,114,101,92,80,121,116,104, - 111,110,92,80,121,116,104,111,110,67,111,114,101,92,123,115, - 121,115,95,118,101,114,115,105,111,110,125,92,77,111,100,117, - 108,101,115,92,123,102,117,108,108,110,97,109,101,125,122,65, - 83,111,102,116,119,97,114,101,92,80,121,116,104,111,110,92, - 80,121,116,104,111,110,67,111,114,101,92,123,115,121,115,95, - 118,101,114,115,105,111,110,125,92,77,111,100,117,108,101,115, - 92,123,102,117,108,108,110,97,109,101,125,92,68,101,98,117, - 103,70,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,8,0,0,0,67,0,0,0,115,56,0,0,0, - 122,16,116,0,160,1,116,0,106,2,124,1,161,2,87,0, - 83,0,4,0,116,3,107,10,114,50,1,0,1,0,1,0, - 116,0,160,1,116,0,106,4,124,1,161,2,6,0,89,0, - 83,0,88,0,100,0,83,0,114,110,0,0,0,41,5,218, - 7,95,119,105,110,114,101,103,90,7,79,112,101,110,75,101, - 121,90,17,72,75,69,89,95,67,85,82,82,69,78,84,95, - 85,83,69,82,114,50,0,0,0,90,18,72,75,69,89,95, - 76,79,67,65,76,95,77,65,67,72,73,78,69,41,2,218, - 3,99,108,115,114,5,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,14,95,111,112,101,110,95, - 114,101,103,105,115,116,114,121,192,2,0,0,115,8,0,0, - 0,0,2,2,1,16,1,14,1,122,36,87,105,110,100,111, - 119,115,82,101,103,105,115,116,114,121,70,105,110,100,101,114, - 46,95,111,112,101,110,95,114,101,103,105,115,116,114,121,99, - 2,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0, - 9,0,0,0,67,0,0,0,115,118,0,0,0,124,0,106, - 0,114,14,124,0,106,1,125,2,110,6,124,0,106,2,125, - 2,124,2,106,3,124,1,100,1,116,4,106,5,100,0,100, - 2,133,2,25,0,22,0,100,3,141,2,125,3,122,38,124, - 0,160,6,124,3,161,1,143,18,125,4,116,7,160,8,124, - 4,100,4,161,2,125,5,87,0,53,0,81,0,82,0,88, - 0,87,0,110,26,4,0,116,9,107,10,114,112,1,0,1, - 0,1,0,89,0,100,0,83,0,89,0,110,2,88,0,124, + 115,80,0,0,0,116,0,160,1,124,0,161,1,125,4,116, + 2,124,4,116,3,131,2,114,56,116,4,160,5,100,1,124, + 2,161,2,1,0,124,3,100,2,107,9,114,52,116,6,160, + 7,124,4,124,3,161,2,1,0,124,4,83,0,116,8,100, + 3,160,9,124,2,161,1,124,1,124,2,100,4,141,3,130, + 1,100,2,83,0,41,5,122,35,67,111,109,112,105,108,101, + 32,98,121,116,101,99,111,100,101,32,97,115,32,102,111,117, + 110,100,32,105,110,32,97,32,112,121,99,46,122,21,99,111, + 100,101,32,111,98,106,101,99,116,32,102,114,111,109,32,123, + 33,114,125,78,122,23,78,111,110,45,99,111,100,101,32,111, + 98,106,101,99,116,32,105,110,32,123,33,114,125,169,2,114, + 117,0,0,0,114,44,0,0,0,41,10,218,7,109,97,114, + 115,104,97,108,90,5,108,111,97,100,115,218,10,105,115,105, + 110,115,116,97,110,99,101,218,10,95,99,111,100,101,95,116, + 121,112,101,114,134,0,0,0,114,149,0,0,0,218,4,95, + 105,109,112,90,16,95,102,105,120,95,99,111,95,102,105,108, + 101,110,97,109,101,114,118,0,0,0,114,62,0,0,0,41, + 5,114,26,0,0,0,114,117,0,0,0,114,107,0,0,0, + 114,108,0,0,0,218,4,99,111,100,101,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,218,17,95,99,111,109, + 112,105,108,101,95,98,121,116,101,99,111,100,101,61,2,0, + 0,115,20,0,0,0,0,2,10,1,10,1,12,1,8,1, + 12,1,4,2,10,1,2,0,2,255,114,165,0,0,0,114, + 73,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0, + 0,4,0,0,0,5,0,0,0,67,0,0,0,115,70,0, + 0,0,116,0,116,1,131,1,125,3,124,3,160,2,116,3, + 100,1,131,1,161,1,1,0,124,3,160,2,116,3,124,1, + 131,1,161,1,1,0,124,3,160,2,116,3,124,2,131,1, + 161,1,1,0,124,3,160,2,116,4,160,5,124,0,161,1, + 161,1,1,0,124,3,83,0,41,2,122,43,80,114,111,100, + 117,99,101,32,116,104,101,32,100,97,116,97,32,102,111,114, + 32,97,32,116,105,109,101,115,116,97,109,112,45,98,97,115, + 101,100,32,112,121,99,46,114,73,0,0,0,41,6,218,9, + 98,121,116,101,97,114,114,97,121,114,148,0,0,0,218,6, + 101,120,116,101,110,100,114,20,0,0,0,114,160,0,0,0, + 218,5,100,117,109,112,115,41,4,114,164,0,0,0,218,5, + 109,116,105,109,101,114,155,0,0,0,114,26,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,22, + 95,99,111,100,101,95,116,111,95,116,105,109,101,115,116,97, + 109,112,95,112,121,99,74,2,0,0,115,12,0,0,0,0, + 2,8,1,14,1,14,1,14,1,16,1,114,170,0,0,0, + 84,99,3,0,0,0,0,0,0,0,0,0,0,0,5,0, + 0,0,5,0,0,0,67,0,0,0,115,80,0,0,0,116, + 0,116,1,131,1,125,3,100,1,124,2,100,1,62,0,66, + 0,125,4,124,3,160,2,116,3,124,4,131,1,161,1,1, + 0,116,4,124,1,131,1,100,2,107,2,115,50,116,5,130, + 1,124,3,160,2,124,1,161,1,1,0,124,3,160,2,116, + 6,160,7,124,0,161,1,161,1,1,0,124,3,83,0,41, + 3,122,38,80,114,111,100,117,99,101,32,116,104,101,32,100, + 97,116,97,32,102,111,114,32,97,32,104,97,115,104,45,98, + 97,115,101,100,32,112,121,99,46,114,39,0,0,0,114,146, + 0,0,0,41,8,114,166,0,0,0,114,148,0,0,0,114, + 167,0,0,0,114,20,0,0,0,114,22,0,0,0,114,23, + 0,0,0,114,160,0,0,0,114,168,0,0,0,41,5,114, + 164,0,0,0,114,157,0,0,0,90,7,99,104,101,99,107, + 101,100,114,26,0,0,0,114,83,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,218,17,95,99,111, + 100,101,95,116,111,95,104,97,115,104,95,112,121,99,84,2, + 0,0,115,14,0,0,0,0,2,8,1,12,1,14,1,16, + 1,10,1,16,1,114,171,0,0,0,99,1,0,0,0,0, + 0,0,0,0,0,0,0,5,0,0,0,6,0,0,0,67, + 0,0,0,115,62,0,0,0,100,1,100,2,108,0,125,1, + 116,1,160,2,124,0,161,1,106,3,125,2,124,1,160,4, + 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,73,0,0,0,78,84,41,7,218,8,116,111, + 107,101,110,105,122,101,114,64,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,172,0,0,0,90,21,115,111,117,114,99,101,95, + 98,121,116,101,115,95,114,101,97,100,108,105,110,101,218,8, + 101,110,99,111,100,105,110,103,90,15,110,101,119,108,105,110, + 101,95,100,101,99,111,100,101,114,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,13,100,101,99,111,100,101, + 95,115,111,117,114,99,101,95,2,0,0,115,10,0,0,0, + 0,5,8,1,12,1,10,1,12,1,114,176,0,0,0,169, + 2,114,140,0,0,0,218,26,115,117,98,109,111,100,117,108, + 101,95,115,101,97,114,99,104,95,108,111,99,97,116,105,111, + 110,115,99,2,0,0,0,0,0,0,0,2,0,0,0,9, + 0,0,0,8,0,0,0,67,0,0,0,115,16,1,0,0, + 124,1,100,1,107,8,114,60,100,2,125,1,116,0,124,2, + 100,3,131,2,114,70,122,14,124,2,160,1,124,0,161,1, + 125,1,87,0,113,70,4,0,116,2,107,10,114,56,1,0, + 1,0,1,0,89,0,113,70,88,0,110,10,116,3,160,4, + 124,1,161,1,125,1,116,5,106,6,124,0,124,2,124,1, + 100,4,141,3,125,4,100,5,124,4,95,7,124,2,100,1, + 107,8,114,154,116,8,131,0,68,0,93,42,92,2,125,5, + 125,6,124,1,160,9,116,10,124,6,131,1,161,1,114,106, + 124,5,124,0,124,1,131,2,125,2,124,2,124,4,95,11, + 1,0,113,154,113,106,100,1,83,0,124,3,116,12,107,8, + 114,220,116,0,124,2,100,6,131,2,114,226,122,14,124,2, + 160,13,124,0,161,1,125,7,87,0,110,20,4,0,116,2, + 107,10,114,206,1,0,1,0,1,0,89,0,113,226,88,0, + 124,7,114,226,103,0,124,4,95,14,110,6,124,3,124,4, + 95,14,124,4,106,14,103,0,107,2,144,1,114,12,124,1, + 144,1,114,12,116,15,124,1,131,1,100,7,25,0,125,8, + 124,4,106,14,160,16,124,8,161,1,1,0,124,4,83,0, + 41,8,97,61,1,0,0,82,101,116,117,114,110,32,97,32, + 109,111,100,117,108,101,32,115,112,101,99,32,98,97,115,101, + 100,32,111,110,32,97,32,102,105,108,101,32,108,111,99,97, + 116,105,111,110,46,10,10,32,32,32,32,84,111,32,105,110, + 100,105,99,97,116,101,32,116,104,97,116,32,116,104,101,32, + 109,111,100,117,108,101,32,105,115,32,97,32,112,97,99,107, + 97,103,101,44,32,115,101,116,10,32,32,32,32,115,117,98, + 109,111,100,117,108,101,95,115,101,97,114,99,104,95,108,111, + 99,97,116,105,111,110,115,32,116,111,32,97,32,108,105,115, + 116,32,111,102,32,100,105,114,101,99,116,111,114,121,32,112, + 97,116,104,115,46,32,32,65,110,10,32,32,32,32,101,109, + 112,116,121,32,108,105,115,116,32,105,115,32,115,117,102,102, + 105,99,105,101,110,116,44,32,116,104,111,117,103,104,32,105, + 116,115,32,110,111,116,32,111,116,104,101,114,119,105,115,101, + 32,117,115,101,102,117,108,32,116,111,32,116,104,101,10,32, + 32,32,32,105,109,112,111,114,116,32,115,121,115,116,101,109, + 46,10,10,32,32,32,32,84,104,101,32,108,111,97,100,101, + 114,32,109,117,115,116,32,116,97,107,101,32,97,32,115,112, + 101,99,32,97,115,32,105,116,115,32,111,110,108,121,32,95, + 95,105,110,105,116,95,95,40,41,32,97,114,103,46,10,10, + 32,32,32,32,78,122,9,60,117,110,107,110,111,119,110,62, + 218,12,103,101,116,95,102,105,108,101,110,97,109,101,169,1, + 218,6,111,114,105,103,105,110,84,218,10,105,115,95,112,97, + 99,107,97,103,101,114,73,0,0,0,41,17,114,128,0,0, + 0,114,179,0,0,0,114,118,0,0,0,114,2,0,0,0, + 114,79,0,0,0,114,134,0,0,0,218,10,77,111,100,117, + 108,101,83,112,101,99,90,13,95,115,101,116,95,102,105,108, + 101,97,116,116,114,218,27,95,103,101,116,95,115,117,112,112, + 111,114,116,101,100,95,102,105,108,101,95,108,111,97,100,101, + 114,115,114,111,0,0,0,114,112,0,0,0,114,140,0,0, + 0,218,9,95,80,79,80,85,76,65,84,69,114,182,0,0, + 0,114,178,0,0,0,114,47,0,0,0,218,6,97,112,112, + 101,110,100,41,9,114,117,0,0,0,90,8,108,111,99,97, + 116,105,111,110,114,140,0,0,0,114,178,0,0,0,218,4, + 115,112,101,99,218,12,108,111,97,100,101,114,95,99,108,97, + 115,115,218,8,115,117,102,102,105,120,101,115,114,182,0,0, + 0,90,7,100,105,114,110,97,109,101,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,218,23,115,112,101,99,95, + 102,114,111,109,95,102,105,108,101,95,108,111,99,97,116,105, + 111,110,112,2,0,0,115,62,0,0,0,0,12,8,4,4, + 1,10,2,2,1,14,1,14,1,8,2,10,8,16,1,6, + 3,8,1,14,1,14,1,10,1,6,1,6,2,4,3,8, + 2,10,1,2,1,14,1,14,1,6,2,4,1,8,2,6, + 1,12,1,6,1,12,1,12,2,114,190,0,0,0,99,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, + 0,0,0,64,0,0,0,115,80,0,0,0,101,0,90,1, + 100,0,90,2,100,1,90,3,100,2,90,4,100,3,90,5, + 100,4,90,6,101,7,100,5,100,6,132,0,131,1,90,8, + 101,7,100,7,100,8,132,0,131,1,90,9,101,7,100,14, + 100,10,100,11,132,1,131,1,90,10,101,7,100,15,100,12, + 100,13,132,1,131,1,90,11,100,9,83,0,41,16,218,21, + 87,105,110,100,111,119,115,82,101,103,105,115,116,114,121,70, + 105,110,100,101,114,122,62,77,101,116,97,32,112,97,116,104, + 32,102,105,110,100,101,114,32,102,111,114,32,109,111,100,117, + 108,101,115,32,100,101,99,108,97,114,101,100,32,105,110,32, + 116,104,101,32,87,105,110,100,111,119,115,32,114,101,103,105, + 115,116,114,121,46,122,59,83,111,102,116,119,97,114,101,92, + 80,121,116,104,111,110,92,80,121,116,104,111,110,67,111,114, + 101,92,123,115,121,115,95,118,101,114,115,105,111,110,125,92, + 77,111,100,117,108,101,115,92,123,102,117,108,108,110,97,109, + 101,125,122,65,83,111,102,116,119,97,114,101,92,80,121,116, + 104,111,110,92,80,121,116,104,111,110,67,111,114,101,92,123, + 115,121,115,95,118,101,114,115,105,111,110,125,92,77,111,100, + 117,108,101,115,92,123,102,117,108,108,110,97,109,101,125,92, + 68,101,98,117,103,70,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,8,0,0,0,67,0,0,0,115, + 56,0,0,0,122,16,116,0,160,1,116,0,106,2,124,1, + 161,2,87,0,83,0,4,0,116,3,107,10,114,50,1,0, + 1,0,1,0,116,0,160,1,116,0,106,4,124,1,161,2, + 6,0,89,0,83,0,88,0,100,0,83,0,114,110,0,0, + 0,41,5,218,7,95,119,105,110,114,101,103,90,7,79,112, + 101,110,75,101,121,90,17,72,75,69,89,95,67,85,82,82, + 69,78,84,95,85,83,69,82,114,50,0,0,0,90,18,72, + 75,69,89,95,76,79,67,65,76,95,77,65,67,72,73,78, + 69,41,2,218,3,99,108,115,114,5,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,218,14,95,111, + 112,101,110,95,114,101,103,105,115,116,114,121,192,2,0,0, + 115,8,0,0,0,0,2,2,1,16,1,14,1,122,36,87, + 105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,105, + 110,100,101,114,46,95,111,112,101,110,95,114,101,103,105,115, + 116,114,121,99,2,0,0,0,0,0,0,0,0,0,0,0, + 6,0,0,0,9,0,0,0,67,0,0,0,115,114,0,0, + 0,124,0,106,0,114,14,124,0,106,1,125,2,110,6,124, + 0,106,2,125,2,124,2,106,3,124,1,100,1,116,4,106, + 5,100,0,100,2,133,2,25,0,22,0,100,3,141,2,125, + 3,122,38,124,0,160,6,124,3,161,1,143,18,125,4,116, + 7,160,8,124,4,100,4,161,2,125,5,87,0,53,0,81, + 0,82,0,88,0,87,0,110,22,4,0,116,9,107,10,114, + 108,1,0,1,0,1,0,89,0,100,0,83,0,88,0,124, 5,83,0,41,5,78,122,5,37,100,46,37,100,114,28,0, 0,0,41,2,114,139,0,0,0,90,11,115,121,115,95,118, 101,114,115,105,111,110,114,40,0,0,0,41,10,218,11,68, @@ -1013,7 +1011,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,3,0,0,0,114,6,0,0,0,218,16,95, 115,101,97,114,99,104,95,114,101,103,105,115,116,114,121,199, 2,0,0,115,24,0,0,0,0,2,6,1,8,2,6,1, - 6,1,16,255,6,2,2,1,12,1,26,1,14,1,12,1, + 6,1,16,255,6,2,2,1,12,1,26,1,14,1,8,1, 122,38,87,105,110,100,111,119,115,82,101,103,105,115,116,114, 121,70,105,110,100,101,114,46,95,115,101,97,114,99,104,95, 114,101,103,105,115,116,114,121,78,99,4,0,0,0,0,0, @@ -1057,1781 +1055,1783 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 115,8,0,0,0,0,7,12,1,8,1,6,2,122,33,87, 105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,105, 110,100,101,114,46,102,105,110,100,95,109,111,100,117,108,101, - 41,12,114,125,0,0,0,114,124,0,0,0,114,126,0,0, - 0,114,127,0,0,0,114,197,0,0,0,114,196,0,0,0, - 114,195,0,0,0,218,11,99,108,97,115,115,109,101,116,104, - 111,100,114,194,0,0,0,114,200,0,0,0,114,203,0,0, - 0,114,206,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,191,0,0,0,180, - 2,0,0,115,28,0,0,0,8,2,4,3,2,255,2,4, - 2,255,2,3,4,2,2,1,10,6,2,1,10,14,2,1, - 16,15,2,1,114,191,0,0,0,99,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,64,0, - 0,0,115,48,0,0,0,101,0,90,1,100,0,90,2,100, - 1,90,3,100,2,100,3,132,0,90,4,100,4,100,5,132, - 0,90,5,100,6,100,7,132,0,90,6,100,8,100,9,132, - 0,90,7,100,10,83,0,41,11,218,13,95,76,111,97,100, - 101,114,66,97,115,105,99,115,122,83,66,97,115,101,32,99, - 108,97,115,115,32,111,102,32,99,111,109,109,111,110,32,99, - 111,100,101,32,110,101,101,100,101,100,32,98,121,32,98,111, - 116,104,32,83,111,117,114,99,101,76,111,97,100,101,114,32, - 97,110,100,10,32,32,32,32,83,111,117,114,99,101,108,101, - 115,115,70,105,108,101,76,111,97,100,101,114,46,99,2,0, - 0,0,0,0,0,0,0,0,0,0,5,0,0,0,4,0, - 0,0,67,0,0,0,115,64,0,0,0,116,0,124,0,160, - 1,124,1,161,1,131,1,100,1,25,0,125,2,124,2,160, - 2,100,2,100,1,161,2,100,3,25,0,125,3,124,1,160, - 3,100,2,161,1,100,4,25,0,125,4,124,3,100,5,107, - 2,111,62,124,4,100,5,107,3,83,0,41,6,122,141,67, - 111,110,99,114,101,116,101,32,105,109,112,108,101,109,101,110, - 116,97,116,105,111,110,32,111,102,32,73,110,115,112,101,99, - 116,76,111,97,100,101,114,46,105,115,95,112,97,99,107,97, - 103,101,32,98,121,32,99,104,101,99,107,105,110,103,32,105, - 102,10,32,32,32,32,32,32,32,32,116,104,101,32,112,97, - 116,104,32,114,101,116,117,114,110,101,100,32,98,121,32,103, - 101,116,95,102,105,108,101,110,97,109,101,32,104,97,115,32, - 97,32,102,105,108,101,110,97,109,101,32,111,102,32,39,95, - 95,105,110,105,116,95,95,46,112,121,39,46,114,39,0,0, - 0,114,71,0,0,0,114,73,0,0,0,114,28,0,0,0, - 218,8,95,95,105,110,105,116,95,95,41,4,114,47,0,0, - 0,114,179,0,0,0,114,43,0,0,0,114,41,0,0,0, - 41,5,114,119,0,0,0,114,139,0,0,0,114,97,0,0, - 0,90,13,102,105,108,101,110,97,109,101,95,98,97,115,101, - 90,9,116,97,105,108,95,110,97,109,101,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,182,0,0,0,249, - 2,0,0,115,8,0,0,0,0,3,18,1,16,1,14,1, - 122,24,95,76,111,97,100,101,114,66,97,115,105,99,115,46, - 105,115,95,112,97,99,107,97,103,101,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, - 0,0,0,115,4,0,0,0,100,1,83,0,169,2,122,42, - 85,115,101,32,100,101,102,97,117,108,116,32,115,101,109,97, - 110,116,105,99,115,32,102,111,114,32,109,111,100,117,108,101, - 32,99,114,101,97,116,105,111,110,46,78,114,3,0,0,0, - 169,2,114,119,0,0,0,114,187,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,218,13,99,114,101, - 97,116,101,95,109,111,100,117,108,101,1,3,0,0,115,2, - 0,0,0,0,1,122,27,95,76,111,97,100,101,114,66,97, - 115,105,99,115,46,99,114,101,97,116,101,95,109,111,100,117, - 108,101,99,2,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,5,0,0,0,67,0,0,0,115,56,0,0,0, - 124,0,160,0,124,1,106,1,161,1,125,2,124,2,100,1, - 107,8,114,36,116,2,100,2,160,3,124,1,106,1,161,1, - 131,1,130,1,116,4,160,5,116,6,124,2,124,1,106,7, - 161,3,1,0,100,1,83,0,41,3,122,19,69,120,101,99, - 117,116,101,32,116,104,101,32,109,111,100,117,108,101,46,78, - 122,52,99,97,110,110,111,116,32,108,111,97,100,32,109,111, - 100,117,108,101,32,123,33,114,125,32,119,104,101,110,32,103, - 101,116,95,99,111,100,101,40,41,32,114,101,116,117,114,110, - 115,32,78,111,110,101,41,8,218,8,103,101,116,95,99,111, - 100,101,114,125,0,0,0,114,118,0,0,0,114,62,0,0, - 0,114,134,0,0,0,218,25,95,99,97,108,108,95,119,105, - 116,104,95,102,114,97,109,101,115,95,114,101,109,111,118,101, - 100,218,4,101,120,101,99,114,131,0,0,0,41,3,114,119, - 0,0,0,218,6,109,111,100,117,108,101,114,164,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, - 11,101,120,101,99,95,109,111,100,117,108,101,4,3,0,0, - 115,12,0,0,0,0,2,12,1,8,1,6,1,4,255,6, - 2,122,25,95,76,111,97,100,101,114,66,97,115,105,99,115, - 46,101,120,101,99,95,109,111,100,117,108,101,99,2,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0, - 0,67,0,0,0,115,12,0,0,0,116,0,160,1,124,0, - 124,1,161,2,83,0,41,1,122,26,84,104,105,115,32,109, - 111,100,117,108,101,32,105,115,32,100,101,112,114,101,99,97, - 116,101,100,46,41,2,114,134,0,0,0,218,17,95,108,111, - 97,100,95,109,111,100,117,108,101,95,115,104,105,109,169,2, - 114,119,0,0,0,114,139,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,11,108,111,97,100,95, - 109,111,100,117,108,101,12,3,0,0,115,2,0,0,0,0, - 2,122,25,95,76,111,97,100,101,114,66,97,115,105,99,115, - 46,108,111,97,100,95,109,111,100,117,108,101,78,41,8,114, - 125,0,0,0,114,124,0,0,0,114,126,0,0,0,114,127, - 0,0,0,114,182,0,0,0,114,212,0,0,0,114,217,0, - 0,0,114,220,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,208,0,0,0, - 244,2,0,0,115,10,0,0,0,8,2,4,3,8,8,8, - 3,8,8,114,208,0,0,0,99,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,64,0,0, - 0,115,74,0,0,0,101,0,90,1,100,0,90,2,100,1, - 100,2,132,0,90,3,100,3,100,4,132,0,90,4,100,5, - 100,6,132,0,90,5,100,7,100,8,132,0,90,6,100,9, - 100,10,132,0,90,7,100,11,100,12,156,1,100,13,100,14, - 132,2,90,8,100,15,100,16,132,0,90,9,100,17,83,0, - 41,18,218,12,83,111,117,114,99,101,76,111,97,100,101,114, - 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,1,0,0,0,67,0,0,0,115,8,0,0,0,116,0, - 130,1,100,1,83,0,41,2,122,165,79,112,116,105,111,110, - 97,108,32,109,101,116,104,111,100,32,116,104,97,116,32,114, - 101,116,117,114,110,115,32,116,104,101,32,109,111,100,105,102, - 105,99,97,116,105,111,110,32,116,105,109,101,32,40,97,110, - 32,105,110,116,41,32,102,111,114,32,116,104,101,10,32,32, - 32,32,32,32,32,32,115,112,101,99,105,102,105,101,100,32, - 112,97,116,104,32,40,97,32,115,116,114,41,46,10,10,32, - 32,32,32,32,32,32,32,82,97,105,115,101,115,32,79,83, - 69,114,114,111,114,32,119,104,101,110,32,116,104,101,32,112, - 97,116,104,32,99,97,110,110,111,116,32,98,101,32,104,97, - 110,100,108,101,100,46,10,32,32,32,32,32,32,32,32,78, - 41,1,114,50,0,0,0,169,2,114,119,0,0,0,114,44, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,218,10,112,97,116,104,95,109,116,105,109,101,19,3, - 0,0,115,2,0,0,0,0,6,122,23,83,111,117,114,99, - 101,76,111,97,100,101,114,46,112,97,116,104,95,109,116,105, - 109,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,4,0,0,0,67,0,0,0,115,14,0,0,0, - 100,1,124,0,160,0,124,1,161,1,105,1,83,0,41,2, - 97,158,1,0,0,79,112,116,105,111,110,97,108,32,109,101, - 116,104,111,100,32,114,101,116,117,114,110,105,110,103,32,97, - 32,109,101,116,97,100,97,116,97,32,100,105,99,116,32,102, - 111,114,32,116,104,101,32,115,112,101,99,105,102,105,101,100, - 10,32,32,32,32,32,32,32,32,112,97,116,104,32,40,97, - 32,115,116,114,41,46,10,10,32,32,32,32,32,32,32,32, - 80,111,115,115,105,98,108,101,32,107,101,121,115,58,10,32, - 32,32,32,32,32,32,32,45,32,39,109,116,105,109,101,39, - 32,40,109,97,110,100,97,116,111,114,121,41,32,105,115,32, - 116,104,101,32,110,117,109,101,114,105,99,32,116,105,109,101, - 115,116,97,109,112,32,111,102,32,108,97,115,116,32,115,111, - 117,114,99,101,10,32,32,32,32,32,32,32,32,32,32,99, - 111,100,101,32,109,111,100,105,102,105,99,97,116,105,111,110, - 59,10,32,32,32,32,32,32,32,32,45,32,39,115,105,122, - 101,39,32,40,111,112,116,105,111,110,97,108,41,32,105,115, - 32,116,104,101,32,115,105,122,101,32,105,110,32,98,121,116, - 101,115,32,111,102,32,116,104,101,32,115,111,117,114,99,101, - 32,99,111,100,101,46,10,10,32,32,32,32,32,32,32,32, - 73,109,112,108,101,109,101,110,116,105,110,103,32,116,104,105, - 115,32,109,101,116,104,111,100,32,97,108,108,111,119,115,32, - 116,104,101,32,108,111,97,100,101,114,32,116,111,32,114,101, - 97,100,32,98,121,116,101,99,111,100,101,32,102,105,108,101, - 115,46,10,32,32,32,32,32,32,32,32,82,97,105,115,101, - 115,32,79,83,69,114,114,111,114,32,119,104,101,110,32,116, - 104,101,32,112,97,116,104,32,99,97,110,110,111,116,32,98, - 101,32,104,97,110,100,108,101,100,46,10,32,32,32,32,32, - 32,32,32,114,169,0,0,0,41,1,114,223,0,0,0,114, - 222,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,218,10,112,97,116,104,95,115,116,97,116,115,27, - 3,0,0,115,2,0,0,0,0,12,122,23,83,111,117,114, - 99,101,76,111,97,100,101,114,46,112,97,116,104,95,115,116, - 97,116,115,99,4,0,0,0,0,0,0,0,0,0,0,0, - 4,0,0,0,4,0,0,0,67,0,0,0,115,12,0,0, - 0,124,0,160,0,124,2,124,3,161,2,83,0,41,1,122, - 228,79,112,116,105,111,110,97,108,32,109,101,116,104,111,100, - 32,119,104,105,99,104,32,119,114,105,116,101,115,32,100,97, - 116,97,32,40,98,121,116,101,115,41,32,116,111,32,97,32, - 102,105,108,101,32,112,97,116,104,32,40,97,32,115,116,114, - 41,46,10,10,32,32,32,32,32,32,32,32,73,109,112,108, - 101,109,101,110,116,105,110,103,32,116,104,105,115,32,109,101, - 116,104,111,100,32,97,108,108,111,119,115,32,102,111,114,32, - 116,104,101,32,119,114,105,116,105,110,103,32,111,102,32,98, - 121,116,101,99,111,100,101,32,102,105,108,101,115,46,10,10, - 32,32,32,32,32,32,32,32,84,104,101,32,115,111,117,114, - 99,101,32,112,97,116,104,32,105,115,32,110,101,101,100,101, - 100,32,105,110,32,111,114,100,101,114,32,116,111,32,99,111, - 114,114,101,99,116,108,121,32,116,114,97,110,115,102,101,114, - 32,112,101,114,109,105,115,115,105,111,110,115,10,32,32,32, - 32,32,32,32,32,41,1,218,8,115,101,116,95,100,97,116, - 97,41,4,114,119,0,0,0,114,108,0,0,0,90,10,99, - 97,99,104,101,95,112,97,116,104,114,26,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,218,15,95, - 99,97,99,104,101,95,98,121,116,101,99,111,100,101,41,3, - 0,0,115,2,0,0,0,0,8,122,28,83,111,117,114,99, - 101,76,111,97,100,101,114,46,95,99,97,99,104,101,95,98, - 121,116,101,99,111,100,101,99,3,0,0,0,0,0,0,0, - 0,0,0,0,3,0,0,0,1,0,0,0,67,0,0,0, - 115,4,0,0,0,100,1,83,0,41,2,122,150,79,112,116, - 105,111,110,97,108,32,109,101,116,104,111,100,32,119,104,105, - 99,104,32,119,114,105,116,101,115,32,100,97,116,97,32,40, - 98,121,116,101,115,41,32,116,111,32,97,32,102,105,108,101, - 32,112,97,116,104,32,40,97,32,115,116,114,41,46,10,10, - 32,32,32,32,32,32,32,32,73,109,112,108,101,109,101,110, - 116,105,110,103,32,116,104,105,115,32,109,101,116,104,111,100, - 32,97,108,108,111,119,115,32,102,111,114,32,116,104,101,32, - 119,114,105,116,105,110,103,32,111,102,32,98,121,116,101,99, - 111,100,101,32,102,105,108,101,115,46,10,32,32,32,32,32, - 32,32,32,78,114,3,0,0,0,41,3,114,119,0,0,0, - 114,44,0,0,0,114,26,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,225,0,0,0,51,3, - 0,0,115,2,0,0,0,0,1,122,21,83,111,117,114,99, - 101,76,111,97,100,101,114,46,115,101,116,95,100,97,116,97, - 99,2,0,0,0,0,0,0,0,0,0,0,0,5,0,0, - 0,10,0,0,0,67,0,0,0,115,82,0,0,0,124,0, - 160,0,124,1,161,1,125,2,122,14,124,0,160,1,124,2, - 161,1,125,3,87,0,110,48,4,0,116,2,107,10,114,72, - 1,0,125,4,1,0,122,18,116,3,100,1,124,1,100,2, - 141,2,124,4,130,2,87,0,53,0,100,3,125,4,126,4, - 88,0,89,0,110,2,88,0,116,4,124,3,131,1,83,0, - 41,4,122,52,67,111,110,99,114,101,116,101,32,105,109,112, - 108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,73, - 110,115,112,101,99,116,76,111,97,100,101,114,46,103,101,116, - 95,115,111,117,114,99,101,46,122,39,115,111,117,114,99,101, - 32,110,111,116,32,97,118,97,105,108,97,98,108,101,32,116, - 104,114,111,117,103,104,32,103,101,116,95,100,97,116,97,40, - 41,114,116,0,0,0,78,41,5,114,179,0,0,0,218,8, - 103,101,116,95,100,97,116,97,114,50,0,0,0,114,118,0, - 0,0,114,176,0,0,0,41,5,114,119,0,0,0,114,139, - 0,0,0,114,44,0,0,0,114,174,0,0,0,218,3,101, - 120,99,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,10,103,101,116,95,115,111,117,114,99,101,58,3,0, - 0,115,20,0,0,0,0,2,10,1,2,1,14,1,16,1, - 4,1,2,255,4,1,2,255,20,2,122,23,83,111,117,114, - 99,101,76,111,97,100,101,114,46,103,101,116,95,115,111,117, - 114,99,101,114,105,0,0,0,41,1,218,9,95,111,112,116, - 105,109,105,122,101,99,3,0,0,0,0,0,0,0,1,0, - 0,0,4,0,0,0,8,0,0,0,67,0,0,0,115,22, - 0,0,0,116,0,106,1,116,2,124,1,124,2,100,1,100, - 2,124,3,100,3,141,6,83,0,41,4,122,130,82,101,116, - 117,114,110,32,116,104,101,32,99,111,100,101,32,111,98,106, - 101,99,116,32,99,111,109,112,105,108,101,100,32,102,114,111, - 109,32,115,111,117,114,99,101,46,10,10,32,32,32,32,32, - 32,32,32,84,104,101,32,39,100,97,116,97,39,32,97,114, - 103,117,109,101,110,116,32,99,97,110,32,98,101,32,97,110, - 121,32,111,98,106,101,99,116,32,116,121,112,101,32,116,104, - 97,116,32,99,111,109,112,105,108,101,40,41,32,115,117,112, - 112,111,114,116,115,46,10,32,32,32,32,32,32,32,32,114, - 215,0,0,0,84,41,2,218,12,100,111,110,116,95,105,110, - 104,101,114,105,116,114,84,0,0,0,41,3,114,134,0,0, - 0,114,214,0,0,0,218,7,99,111,109,112,105,108,101,41, - 4,114,119,0,0,0,114,26,0,0,0,114,44,0,0,0, - 114,230,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,218,14,115,111,117,114,99,101,95,116,111,95, - 99,111,100,101,68,3,0,0,115,8,0,0,0,0,5,12, - 1,2,0,2,255,122,27,83,111,117,114,99,101,76,111,97, - 100,101,114,46,115,111,117,114,99,101,95,116,111,95,99,111, - 100,101,99,2,0,0,0,0,0,0,0,0,0,0,0,15, - 0,0,0,9,0,0,0,67,0,0,0,115,34,2,0,0, - 124,0,160,0,124,1,161,1,125,2,100,1,125,3,100,1, - 125,4,100,1,125,5,100,2,125,6,100,3,125,7,122,12, - 116,1,124,2,131,1,125,8,87,0,110,26,4,0,116,2, - 107,10,114,68,1,0,1,0,1,0,100,1,125,8,89,0, - 144,1,110,48,88,0,122,14,124,0,160,3,124,2,161,1, - 125,9,87,0,110,22,4,0,116,4,107,10,114,106,1,0, - 1,0,1,0,89,0,144,1,110,10,88,0,116,5,124,9, - 100,4,25,0,131,1,125,3,122,14,124,0,160,6,124,8, - 161,1,125,10,87,0,110,20,4,0,116,4,107,10,114,154, - 1,0,1,0,1,0,89,0,110,218,88,0,124,1,124,8, - 100,5,156,2,125,11,122,148,116,7,124,10,124,1,124,11, - 131,3,125,12,116,8,124,10,131,1,100,6,100,1,133,2, - 25,0,125,13,124,12,100,7,64,0,100,8,107,3,125,6, - 124,6,144,1,114,36,124,12,100,9,64,0,100,8,107,3, - 125,7,116,9,106,10,100,10,107,3,144,1,114,34,124,7, - 115,254,116,9,106,10,100,11,107,2,144,1,114,34,124,0, - 160,6,124,2,161,1,125,4,116,9,160,11,116,12,124,4, - 161,2,125,5,116,13,124,10,124,5,124,1,124,11,131,4, - 1,0,110,20,116,14,124,10,124,3,124,9,100,12,25,0, - 124,1,124,11,131,5,1,0,87,0,110,26,4,0,116,15, - 116,16,102,2,107,10,144,1,114,84,1,0,1,0,1,0, - 89,0,110,32,88,0,116,17,160,18,100,13,124,8,124,2, - 161,3,1,0,116,19,124,13,124,1,124,8,124,2,100,14, - 141,4,83,0,124,4,100,1,107,8,144,1,114,136,124,0, - 160,6,124,2,161,1,125,4,124,0,160,20,124,4,124,2, - 161,2,125,14,116,17,160,18,100,15,124,2,161,2,1,0, - 116,21,106,22,144,2,115,30,124,8,100,1,107,9,144,2, - 114,30,124,3,100,1,107,9,144,2,114,30,124,6,144,1, - 114,228,124,5,100,1,107,8,144,1,114,214,116,9,160,11, - 124,4,161,1,125,5,116,23,124,14,124,5,124,7,131,3, - 125,10,110,16,116,24,124,14,124,3,116,25,124,4,131,1, - 131,3,125,10,122,18,124,0,160,26,124,2,124,8,124,10, - 161,3,1,0,87,0,110,22,4,0,116,2,107,10,144,2, - 114,28,1,0,1,0,1,0,89,0,110,2,88,0,124,14, - 83,0,41,16,122,190,67,111,110,99,114,101,116,101,32,105, - 109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,102, - 32,73,110,115,112,101,99,116,76,111,97,100,101,114,46,103, - 101,116,95,99,111,100,101,46,10,10,32,32,32,32,32,32, - 32,32,82,101,97,100,105,110,103,32,111,102,32,98,121,116, - 101,99,111,100,101,32,114,101,113,117,105,114,101,115,32,112, - 97,116,104,95,115,116,97,116,115,32,116,111,32,98,101,32, - 105,109,112,108,101,109,101,110,116,101,100,46,32,84,111,32, - 119,114,105,116,101,10,32,32,32,32,32,32,32,32,98,121, - 116,101,99,111,100,101,44,32,115,101,116,95,100,97,116,97, - 32,109,117,115,116,32,97,108,115,111,32,98,101,32,105,109, - 112,108,101,109,101,110,116,101,100,46,10,10,32,32,32,32, - 32,32,32,32,78,70,84,114,169,0,0,0,114,159,0,0, - 0,114,145,0,0,0,114,39,0,0,0,114,73,0,0,0, - 114,28,0,0,0,90,5,110,101,118,101,114,90,6,97,108, - 119,97,121,115,218,4,115,105,122,101,122,13,123,125,32,109, - 97,116,99,104,101,115,32,123,125,41,3,114,117,0,0,0, - 114,107,0,0,0,114,108,0,0,0,122,19,99,111,100,101, - 32,111,98,106,101,99,116,32,102,114,111,109,32,123,125,41, - 27,114,179,0,0,0,114,98,0,0,0,114,82,0,0,0, - 114,224,0,0,0,114,50,0,0,0,114,17,0,0,0,114, - 227,0,0,0,114,152,0,0,0,218,10,109,101,109,111,114, - 121,118,105,101,119,114,163,0,0,0,90,21,99,104,101,99, - 107,95,104,97,115,104,95,98,97,115,101,100,95,112,121,99, - 115,114,157,0,0,0,218,17,95,82,65,87,95,77,65,71, - 73,67,95,78,85,77,66,69,82,114,158,0,0,0,114,156, - 0,0,0,114,118,0,0,0,114,150,0,0,0,114,134,0, - 0,0,114,149,0,0,0,114,165,0,0,0,114,233,0,0, - 0,114,8,0,0,0,218,19,100,111,110,116,95,119,114,105, - 116,101,95,98,121,116,101,99,111,100,101,114,171,0,0,0, - 114,170,0,0,0,114,22,0,0,0,114,226,0,0,0,41, - 15,114,119,0,0,0,114,139,0,0,0,114,108,0,0,0, - 114,154,0,0,0,114,174,0,0,0,114,157,0,0,0,90, - 10,104,97,115,104,95,98,97,115,101,100,90,12,99,104,101, - 99,107,95,115,111,117,114,99,101,114,107,0,0,0,218,2, - 115,116,114,26,0,0,0,114,151,0,0,0,114,83,0,0, - 0,90,10,98,121,116,101,115,95,100,97,116,97,90,11,99, - 111,100,101,95,111,98,106,101,99,116,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,213,0,0,0,76,3, - 0,0,115,152,0,0,0,0,7,10,1,4,1,4,1,4, - 1,4,1,4,1,2,1,12,1,14,1,12,2,2,1,14, - 1,14,1,8,2,12,1,2,1,14,1,14,1,6,3,2, - 1,2,254,6,4,2,1,12,1,16,1,12,1,6,1,12, - 1,12,1,2,255,2,2,8,254,4,3,10,1,4,1,2, - 1,2,254,4,4,8,1,2,255,6,3,2,1,2,1,2, - 1,6,1,2,1,2,251,8,7,20,1,6,2,8,1,2, - 255,4,2,6,1,2,1,2,254,6,3,10,1,10,1,12, - 1,12,1,18,1,6,255,4,2,6,1,10,1,10,1,14, - 2,6,1,6,255,4,2,2,1,18,1,16,1,6,1,122, - 21,83,111,117,114,99,101,76,111,97,100,101,114,46,103,101, - 116,95,99,111,100,101,78,41,10,114,125,0,0,0,114,124, - 0,0,0,114,126,0,0,0,114,223,0,0,0,114,224,0, - 0,0,114,226,0,0,0,114,225,0,0,0,114,229,0,0, - 0,114,233,0,0,0,114,213,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 221,0,0,0,17,3,0,0,115,14,0,0,0,8,2,8, - 8,8,14,8,10,8,7,8,10,14,8,114,221,0,0,0, + 41,2,78,78,41,1,78,41,12,114,125,0,0,0,114,124, + 0,0,0,114,126,0,0,0,114,127,0,0,0,114,197,0, + 0,0,114,196,0,0,0,114,195,0,0,0,218,11,99,108, + 97,115,115,109,101,116,104,111,100,114,194,0,0,0,114,200, + 0,0,0,114,203,0,0,0,114,206,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,114,191,0,0,0,180,2,0,0,115,28,0,0,0,8, + 2,4,3,2,255,2,4,2,255,2,3,4,2,2,1,10, + 6,2,1,10,14,2,1,12,15,2,1,114,191,0,0,0, 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,0,0,0,0,115,124,0,0,0,101,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,101,7,135,0,102,1,100,8,100,9,132,8,131,1, - 90,8,101,7,100,10,100,11,132,0,131,1,90,9,100,12, - 100,13,132,0,90,10,101,7,100,14,100,15,132,0,131,1, - 90,11,100,16,100,17,132,0,90,12,100,18,100,19,132,0, - 90,13,100,20,100,21,132,0,90,14,100,22,100,23,132,0, - 90,15,135,0,4,0,90,16,83,0,41,24,218,10,70,105, - 108,101,76,111,97,100,101,114,122,103,66,97,115,101,32,102, - 105,108,101,32,108,111,97,100,101,114,32,99,108,97,115,115, - 32,119,104,105,99,104,32,105,109,112,108,101,109,101,110,116, - 115,32,116,104,101,32,108,111,97,100,101,114,32,112,114,111, - 116,111,99,111,108,32,109,101,116,104,111,100,115,32,116,104, - 97,116,10,32,32,32,32,114,101,113,117,105,114,101,32,102, - 105,108,101,32,115,121,115,116,101,109,32,117,115,97,103,101, - 46,99,3,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,2,0,0,0,67,0,0,0,115,16,0,0,0,124, - 1,124,0,95,0,124,2,124,0,95,1,100,1,83,0,41, - 2,122,75,67,97,99,104,101,32,116,104,101,32,109,111,100, - 117,108,101,32,110,97,109,101,32,97,110,100,32,116,104,101, - 32,112,97,116,104,32,116,111,32,116,104,101,32,102,105,108, - 101,32,102,111,117,110,100,32,98,121,32,116,104,101,10,32, - 32,32,32,32,32,32,32,102,105,110,100,101,114,46,78,114, - 159,0,0,0,41,3,114,119,0,0,0,114,139,0,0,0, - 114,44,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,209,0,0,0,166,3,0,0,115,4,0, - 0,0,0,3,6,1,122,19,70,105,108,101,76,111,97,100, - 101,114,46,95,95,105,110,105,116,95,95,99,2,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0, - 67,0,0,0,115,24,0,0,0,124,0,106,0,124,1,106, - 0,107,2,111,22,124,0,106,1,124,1,106,1,107,2,83, - 0,114,110,0,0,0,169,2,218,9,95,95,99,108,97,115, - 115,95,95,114,131,0,0,0,169,2,114,119,0,0,0,90, - 5,111,116,104,101,114,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,6,95,95,101,113,95,95,172,3,0, - 0,115,6,0,0,0,0,1,12,1,10,255,122,17,70,105, - 108,101,76,111,97,100,101,114,46,95,95,101,113,95,95,99, - 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 3,0,0,0,67,0,0,0,115,20,0,0,0,116,0,124, - 0,106,1,131,1,116,0,124,0,106,2,131,1,65,0,83, - 0,114,110,0,0,0,169,3,218,4,104,97,115,104,114,117, - 0,0,0,114,44,0,0,0,169,1,114,119,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,8, - 95,95,104,97,115,104,95,95,176,3,0,0,115,2,0,0, - 0,0,1,122,19,70,105,108,101,76,111,97,100,101,114,46, - 95,95,104,97,115,104,95,95,99,2,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,3,0,0,0,3,0,0, - 0,115,16,0,0,0,116,0,116,1,124,0,131,2,160,2, - 124,1,161,1,83,0,41,1,122,100,76,111,97,100,32,97, - 32,109,111,100,117,108,101,32,102,114,111,109,32,97,32,102, - 105,108,101,46,10,10,32,32,32,32,32,32,32,32,84,104, - 105,115,32,109,101,116,104,111,100,32,105,115,32,100,101,112, - 114,101,99,97,116,101,100,46,32,32,85,115,101,32,101,120, - 101,99,95,109,111,100,117,108,101,40,41,32,105,110,115,116, - 101,97,100,46,10,10,32,32,32,32,32,32,32,32,41,3, - 218,5,115,117,112,101,114,114,239,0,0,0,114,220,0,0, - 0,114,219,0,0,0,169,1,114,241,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,220,0,0,0,179,3,0,0, - 115,2,0,0,0,0,10,122,22,70,105,108,101,76,111,97, - 100,101,114,46,108,111,97,100,95,109,111,100,117,108,101,99, + 90,6,100,8,100,9,132,0,90,7,100,10,83,0,41,11, + 218,13,95,76,111,97,100,101,114,66,97,115,105,99,115,122, + 83,66,97,115,101,32,99,108,97,115,115,32,111,102,32,99, + 111,109,109,111,110,32,99,111,100,101,32,110,101,101,100,101, + 100,32,98,121,32,98,111,116,104,32,83,111,117,114,99,101, + 76,111,97,100,101,114,32,97,110,100,10,32,32,32,32,83, + 111,117,114,99,101,108,101,115,115,70,105,108,101,76,111,97, + 100,101,114,46,99,2,0,0,0,0,0,0,0,0,0,0, + 0,5,0,0,0,4,0,0,0,67,0,0,0,115,64,0, + 0,0,116,0,124,0,160,1,124,1,161,1,131,1,100,1, + 25,0,125,2,124,2,160,2,100,2,100,1,161,2,100,3, + 25,0,125,3,124,1,160,3,100,2,161,1,100,4,25,0, + 125,4,124,3,100,5,107,2,111,62,124,4,100,5,107,3, + 83,0,41,6,122,141,67,111,110,99,114,101,116,101,32,105, + 109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,102, + 32,73,110,115,112,101,99,116,76,111,97,100,101,114,46,105, + 115,95,112,97,99,107,97,103,101,32,98,121,32,99,104,101, + 99,107,105,110,103,32,105,102,10,32,32,32,32,32,32,32, + 32,116,104,101,32,112,97,116,104,32,114,101,116,117,114,110, + 101,100,32,98,121,32,103,101,116,95,102,105,108,101,110,97, + 109,101,32,104,97,115,32,97,32,102,105,108,101,110,97,109, + 101,32,111,102,32,39,95,95,105,110,105,116,95,95,46,112, + 121,39,46,114,39,0,0,0,114,71,0,0,0,114,73,0, + 0,0,114,28,0,0,0,218,8,95,95,105,110,105,116,95, + 95,41,4,114,47,0,0,0,114,179,0,0,0,114,43,0, + 0,0,114,41,0,0,0,41,5,114,119,0,0,0,114,139, + 0,0,0,114,97,0,0,0,90,13,102,105,108,101,110,97, + 109,101,95,98,97,115,101,90,9,116,97,105,108,95,110,97, + 109,101,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,114,182,0,0,0,249,2,0,0,115,8,0,0,0,0, + 3,18,1,16,1,14,1,122,24,95,76,111,97,100,101,114, + 66,97,115,105,99,115,46,105,115,95,112,97,99,107,97,103, + 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, + 1,83,0,169,2,122,42,85,115,101,32,100,101,102,97,117, + 108,116,32,115,101,109,97,110,116,105,99,115,32,102,111,114, + 32,109,111,100,117,108,101,32,99,114,101,97,116,105,111,110, + 46,78,114,3,0,0,0,169,2,114,119,0,0,0,114,187, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,218,13,99,114,101,97,116,101,95,109,111,100,117,108, + 101,1,3,0,0,115,2,0,0,0,0,1,122,27,95,76, + 111,97,100,101,114,66,97,115,105,99,115,46,99,114,101,97, + 116,101,95,109,111,100,117,108,101,99,2,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,5,0,0,0,67,0, + 0,0,115,56,0,0,0,124,0,160,0,124,1,106,1,161, + 1,125,2,124,2,100,1,107,8,114,36,116,2,100,2,160, + 3,124,1,106,1,161,1,131,1,130,1,116,4,160,5,116, + 6,124,2,124,1,106,7,161,3,1,0,100,1,83,0,41, + 3,122,19,69,120,101,99,117,116,101,32,116,104,101,32,109, + 111,100,117,108,101,46,78,122,52,99,97,110,110,111,116,32, + 108,111,97,100,32,109,111,100,117,108,101,32,123,33,114,125, + 32,119,104,101,110,32,103,101,116,95,99,111,100,101,40,41, + 32,114,101,116,117,114,110,115,32,78,111,110,101,41,8,218, + 8,103,101,116,95,99,111,100,101,114,125,0,0,0,114,118, + 0,0,0,114,62,0,0,0,114,134,0,0,0,218,25,95, + 99,97,108,108,95,119,105,116,104,95,102,114,97,109,101,115, + 95,114,101,109,111,118,101,100,218,4,101,120,101,99,114,131, + 0,0,0,41,3,114,119,0,0,0,218,6,109,111,100,117, + 108,101,114,164,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,218,11,101,120,101,99,95,109,111,100, + 117,108,101,4,3,0,0,115,12,0,0,0,0,2,12,1, + 8,1,6,1,4,255,6,2,122,25,95,76,111,97,100,101, + 114,66,97,115,105,99,115,46,101,120,101,99,95,109,111,100, + 117,108,101,99,2,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,4,0,0,0,67,0,0,0,115,12,0,0, + 0,116,0,160,1,124,0,124,1,161,2,83,0,41,1,122, + 26,84,104,105,115,32,109,111,100,117,108,101,32,105,115,32, + 100,101,112,114,101,99,97,116,101,100,46,41,2,114,134,0, + 0,0,218,17,95,108,111,97,100,95,109,111,100,117,108,101, + 95,115,104,105,109,169,2,114,119,0,0,0,114,139,0,0, + 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 218,11,108,111,97,100,95,109,111,100,117,108,101,12,3,0, + 0,115,2,0,0,0,0,2,122,25,95,76,111,97,100,101, + 114,66,97,115,105,99,115,46,108,111,97,100,95,109,111,100, + 117,108,101,78,41,8,114,125,0,0,0,114,124,0,0,0, + 114,126,0,0,0,114,127,0,0,0,114,182,0,0,0,114, + 212,0,0,0,114,217,0,0,0,114,220,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,114,208,0,0,0,244,2,0,0,115,10,0,0,0, + 8,2,4,3,8,8,8,3,8,8,114,208,0,0,0,99, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,64,0,0,0,115,74,0,0,0,101,0,90, + 1,100,0,90,2,100,1,100,2,132,0,90,3,100,3,100, + 4,132,0,90,4,100,5,100,6,132,0,90,5,100,7,100, + 8,132,0,90,6,100,9,100,10,132,0,90,7,100,11,100, + 12,156,1,100,13,100,14,132,2,90,8,100,15,100,16,132, + 0,90,9,100,17,83,0,41,18,218,12,83,111,117,114,99, + 101,76,111,97,100,101,114,99,2,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,0, + 115,8,0,0,0,116,0,130,1,100,1,83,0,41,2,122, + 165,79,112,116,105,111,110,97,108,32,109,101,116,104,111,100, + 32,116,104,97,116,32,114,101,116,117,114,110,115,32,116,104, + 101,32,109,111,100,105,102,105,99,97,116,105,111,110,32,116, + 105,109,101,32,40,97,110,32,105,110,116,41,32,102,111,114, + 32,116,104,101,10,32,32,32,32,32,32,32,32,115,112,101, + 99,105,102,105,101,100,32,112,97,116,104,32,40,97,32,115, + 116,114,41,46,10,10,32,32,32,32,32,32,32,32,82,97, + 105,115,101,115,32,79,83,69,114,114,111,114,32,119,104,101, + 110,32,116,104,101,32,112,97,116,104,32,99,97,110,110,111, + 116,32,98,101,32,104,97,110,100,108,101,100,46,10,32,32, + 32,32,32,32,32,32,78,41,1,114,50,0,0,0,169,2, + 114,119,0,0,0,114,44,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,218,10,112,97,116,104,95, + 109,116,105,109,101,19,3,0,0,115,2,0,0,0,0,6, + 122,23,83,111,117,114,99,101,76,111,97,100,101,114,46,112, + 97,116,104,95,109,116,105,109,101,99,2,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,4,0,0,0,67,0, + 0,0,115,14,0,0,0,100,1,124,0,160,0,124,1,161, + 1,105,1,83,0,41,2,97,158,1,0,0,79,112,116,105, + 111,110,97,108,32,109,101,116,104,111,100,32,114,101,116,117, + 114,110,105,110,103,32,97,32,109,101,116,97,100,97,116,97, + 32,100,105,99,116,32,102,111,114,32,116,104,101,32,115,112, + 101,99,105,102,105,101,100,10,32,32,32,32,32,32,32,32, + 112,97,116,104,32,40,97,32,115,116,114,41,46,10,10,32, + 32,32,32,32,32,32,32,80,111,115,115,105,98,108,101,32, + 107,101,121,115,58,10,32,32,32,32,32,32,32,32,45,32, + 39,109,116,105,109,101,39,32,40,109,97,110,100,97,116,111, + 114,121,41,32,105,115,32,116,104,101,32,110,117,109,101,114, + 105,99,32,116,105,109,101,115,116,97,109,112,32,111,102,32, + 108,97,115,116,32,115,111,117,114,99,101,10,32,32,32,32, + 32,32,32,32,32,32,99,111,100,101,32,109,111,100,105,102, + 105,99,97,116,105,111,110,59,10,32,32,32,32,32,32,32, + 32,45,32,39,115,105,122,101,39,32,40,111,112,116,105,111, + 110,97,108,41,32,105,115,32,116,104,101,32,115,105,122,101, + 32,105,110,32,98,121,116,101,115,32,111,102,32,116,104,101, + 32,115,111,117,114,99,101,32,99,111,100,101,46,10,10,32, + 32,32,32,32,32,32,32,73,109,112,108,101,109,101,110,116, + 105,110,103,32,116,104,105,115,32,109,101,116,104,111,100,32, + 97,108,108,111,119,115,32,116,104,101,32,108,111,97,100,101, + 114,32,116,111,32,114,101,97,100,32,98,121,116,101,99,111, + 100,101,32,102,105,108,101,115,46,10,32,32,32,32,32,32, + 32,32,82,97,105,115,101,115,32,79,83,69,114,114,111,114, + 32,119,104,101,110,32,116,104,101,32,112,97,116,104,32,99, + 97,110,110,111,116,32,98,101,32,104,97,110,100,108,101,100, + 46,10,32,32,32,32,32,32,32,32,114,169,0,0,0,41, + 1,114,223,0,0,0,114,222,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,218,10,112,97,116,104, + 95,115,116,97,116,115,27,3,0,0,115,2,0,0,0,0, + 12,122,23,83,111,117,114,99,101,76,111,97,100,101,114,46, + 112,97,116,104,95,115,116,97,116,115,99,4,0,0,0,0, + 0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,67, + 0,0,0,115,12,0,0,0,124,0,160,0,124,2,124,3, + 161,2,83,0,41,1,122,228,79,112,116,105,111,110,97,108, + 32,109,101,116,104,111,100,32,119,104,105,99,104,32,119,114, + 105,116,101,115,32,100,97,116,97,32,40,98,121,116,101,115, + 41,32,116,111,32,97,32,102,105,108,101,32,112,97,116,104, + 32,40,97,32,115,116,114,41,46,10,10,32,32,32,32,32, + 32,32,32,73,109,112,108,101,109,101,110,116,105,110,103,32, + 116,104,105,115,32,109,101,116,104,111,100,32,97,108,108,111, + 119,115,32,102,111,114,32,116,104,101,32,119,114,105,116,105, + 110,103,32,111,102,32,98,121,116,101,99,111,100,101,32,102, + 105,108,101,115,46,10,10,32,32,32,32,32,32,32,32,84, + 104,101,32,115,111,117,114,99,101,32,112,97,116,104,32,105, + 115,32,110,101,101,100,101,100,32,105,110,32,111,114,100,101, + 114,32,116,111,32,99,111,114,114,101,99,116,108,121,32,116, + 114,97,110,115,102,101,114,32,112,101,114,109,105,115,115,105, + 111,110,115,10,32,32,32,32,32,32,32,32,41,1,218,8, + 115,101,116,95,100,97,116,97,41,4,114,119,0,0,0,114, + 108,0,0,0,90,10,99,97,99,104,101,95,112,97,116,104, + 114,26,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,218,15,95,99,97,99,104,101,95,98,121,116, + 101,99,111,100,101,41,3,0,0,115,2,0,0,0,0,8, + 122,28,83,111,117,114,99,101,76,111,97,100,101,114,46,95, + 99,97,99,104,101,95,98,121,116,101,99,111,100,101,99,3, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,1, + 0,0,0,67,0,0,0,115,4,0,0,0,100,1,83,0, + 41,2,122,150,79,112,116,105,111,110,97,108,32,109,101,116, + 104,111,100,32,119,104,105,99,104,32,119,114,105,116,101,115, + 32,100,97,116,97,32,40,98,121,116,101,115,41,32,116,111, + 32,97,32,102,105,108,101,32,112,97,116,104,32,40,97,32, + 115,116,114,41,46,10,10,32,32,32,32,32,32,32,32,73, + 109,112,108,101,109,101,110,116,105,110,103,32,116,104,105,115, + 32,109,101,116,104,111,100,32,97,108,108,111,119,115,32,102, + 111,114,32,116,104,101,32,119,114,105,116,105,110,103,32,111, + 102,32,98,121,116,101,99,111,100,101,32,102,105,108,101,115, + 46,10,32,32,32,32,32,32,32,32,78,114,3,0,0,0, + 41,3,114,119,0,0,0,114,44,0,0,0,114,26,0,0, + 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 114,225,0,0,0,51,3,0,0,115,2,0,0,0,0,1, + 122,21,83,111,117,114,99,101,76,111,97,100,101,114,46,115, + 101,116,95,100,97,116,97,99,2,0,0,0,0,0,0,0, + 0,0,0,0,5,0,0,0,10,0,0,0,67,0,0,0, + 115,82,0,0,0,124,0,160,0,124,1,161,1,125,2,122, + 14,124,0,160,1,124,2,161,1,125,3,87,0,110,48,4, + 0,116,2,107,10,114,72,1,0,125,4,1,0,122,18,116, + 3,100,1,124,1,100,2,141,2,124,4,130,2,87,0,53, + 0,100,3,125,4,126,4,88,0,89,0,110,2,88,0,116, + 4,124,3,131,1,83,0,41,4,122,52,67,111,110,99,114, + 101,116,101,32,105,109,112,108,101,109,101,110,116,97,116,105, + 111,110,32,111,102,32,73,110,115,112,101,99,116,76,111,97, + 100,101,114,46,103,101,116,95,115,111,117,114,99,101,46,122, + 39,115,111,117,114,99,101,32,110,111,116,32,97,118,97,105, + 108,97,98,108,101,32,116,104,114,111,117,103,104,32,103,101, + 116,95,100,97,116,97,40,41,114,116,0,0,0,78,41,5, + 114,179,0,0,0,218,8,103,101,116,95,100,97,116,97,114, + 50,0,0,0,114,118,0,0,0,114,176,0,0,0,41,5, + 114,119,0,0,0,114,139,0,0,0,114,44,0,0,0,114, + 174,0,0,0,218,3,101,120,99,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,10,103,101,116,95,115,111, + 117,114,99,101,58,3,0,0,115,20,0,0,0,0,2,10, + 1,2,1,14,1,16,1,4,1,2,255,4,1,2,255,20, + 2,122,23,83,111,117,114,99,101,76,111,97,100,101,114,46, + 103,101,116,95,115,111,117,114,99,101,114,105,0,0,0,41, + 1,218,9,95,111,112,116,105,109,105,122,101,99,3,0,0, + 0,0,0,0,0,1,0,0,0,4,0,0,0,8,0,0, + 0,67,0,0,0,115,22,0,0,0,116,0,106,1,116,2, + 124,1,124,2,100,1,100,2,124,3,100,3,141,6,83,0, + 41,4,122,130,82,101,116,117,114,110,32,116,104,101,32,99, + 111,100,101,32,111,98,106,101,99,116,32,99,111,109,112,105, + 108,101,100,32,102,114,111,109,32,115,111,117,114,99,101,46, + 10,10,32,32,32,32,32,32,32,32,84,104,101,32,39,100, + 97,116,97,39,32,97,114,103,117,109,101,110,116,32,99,97, + 110,32,98,101,32,97,110,121,32,111,98,106,101,99,116,32, + 116,121,112,101,32,116,104,97,116,32,99,111,109,112,105,108, + 101,40,41,32,115,117,112,112,111,114,116,115,46,10,32,32, + 32,32,32,32,32,32,114,215,0,0,0,84,41,2,218,12, + 100,111,110,116,95,105,110,104,101,114,105,116,114,84,0,0, + 0,41,3,114,134,0,0,0,114,214,0,0,0,218,7,99, + 111,109,112,105,108,101,41,4,114,119,0,0,0,114,26,0, + 0,0,114,44,0,0,0,114,230,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,218,14,115,111,117, + 114,99,101,95,116,111,95,99,111,100,101,68,3,0,0,115, + 8,0,0,0,0,5,12,1,2,0,2,255,122,27,83,111, + 117,114,99,101,76,111,97,100,101,114,46,115,111,117,114,99, + 101,95,116,111,95,99,111,100,101,99,2,0,0,0,0,0, + 0,0,0,0,0,0,15,0,0,0,9,0,0,0,67,0, + 0,0,115,34,2,0,0,124,0,160,0,124,1,161,1,125, + 2,100,1,125,3,100,1,125,4,100,1,125,5,100,2,125, + 6,100,3,125,7,122,12,116,1,124,2,131,1,125,8,87, + 0,110,26,4,0,116,2,107,10,114,68,1,0,1,0,1, + 0,100,1,125,8,89,0,144,1,110,48,88,0,122,14,124, + 0,160,3,124,2,161,1,125,9,87,0,110,22,4,0,116, + 4,107,10,114,106,1,0,1,0,1,0,89,0,144,1,110, + 10,88,0,116,5,124,9,100,4,25,0,131,1,125,3,122, + 14,124,0,160,6,124,8,161,1,125,10,87,0,110,20,4, + 0,116,4,107,10,114,154,1,0,1,0,1,0,89,0,110, + 218,88,0,124,1,124,8,100,5,156,2,125,11,122,148,116, + 7,124,10,124,1,124,11,131,3,125,12,116,8,124,10,131, + 1,100,6,100,1,133,2,25,0,125,13,124,12,100,7,64, + 0,100,8,107,3,125,6,124,6,144,1,114,36,124,12,100, + 9,64,0,100,8,107,3,125,7,116,9,106,10,100,10,107, + 3,144,1,114,56,124,7,115,254,116,9,106,10,100,11,107, + 2,144,1,114,56,124,0,160,6,124,2,161,1,125,4,116, + 9,160,11,116,12,124,4,161,2,125,5,116,13,124,10,124, + 5,124,1,124,11,131,4,1,0,110,20,116,14,124,10,124, + 3,124,9,100,12,25,0,124,1,124,11,131,5,1,0,87, + 0,110,26,4,0,116,15,116,16,102,2,107,10,144,1,114, + 84,1,0,1,0,1,0,89,0,110,32,88,0,116,17,160, + 18,100,13,124,8,124,2,161,3,1,0,116,19,124,13,124, + 1,124,8,124,2,100,14,141,4,83,0,124,4,100,1,107, + 8,144,1,114,136,124,0,160,6,124,2,161,1,125,4,124, + 0,160,20,124,4,124,2,161,2,125,14,116,17,160,18,100, + 15,124,2,161,2,1,0,116,21,106,22,144,2,115,30,124, + 8,100,1,107,9,144,2,114,30,124,3,100,1,107,9,144, + 2,114,30,124,6,144,1,114,228,124,5,100,1,107,8,144, + 1,114,214,116,9,160,11,124,4,161,1,125,5,116,23,124, + 14,124,5,124,7,131,3,125,10,110,16,116,24,124,14,124, + 3,116,25,124,4,131,1,131,3,125,10,122,18,124,0,160, + 26,124,2,124,8,124,10,161,3,1,0,87,0,110,22,4, + 0,116,2,107,10,144,2,114,28,1,0,1,0,1,0,89, + 0,110,2,88,0,124,14,83,0,41,16,122,190,67,111,110, + 99,114,101,116,101,32,105,109,112,108,101,109,101,110,116,97, + 116,105,111,110,32,111,102,32,73,110,115,112,101,99,116,76, + 111,97,100,101,114,46,103,101,116,95,99,111,100,101,46,10, + 10,32,32,32,32,32,32,32,32,82,101,97,100,105,110,103, + 32,111,102,32,98,121,116,101,99,111,100,101,32,114,101,113, + 117,105,114,101,115,32,112,97,116,104,95,115,116,97,116,115, + 32,116,111,32,98,101,32,105,109,112,108,101,109,101,110,116, + 101,100,46,32,84,111,32,119,114,105,116,101,10,32,32,32, + 32,32,32,32,32,98,121,116,101,99,111,100,101,44,32,115, + 101,116,95,100,97,116,97,32,109,117,115,116,32,97,108,115, + 111,32,98,101,32,105,109,112,108,101,109,101,110,116,101,100, + 46,10,10,32,32,32,32,32,32,32,32,78,70,84,114,169, + 0,0,0,114,159,0,0,0,114,145,0,0,0,114,39,0, + 0,0,114,73,0,0,0,114,28,0,0,0,90,5,110,101, + 118,101,114,90,6,97,108,119,97,121,115,218,4,115,105,122, + 101,122,13,123,125,32,109,97,116,99,104,101,115,32,123,125, + 41,3,114,117,0,0,0,114,107,0,0,0,114,108,0,0, + 0,122,19,99,111,100,101,32,111,98,106,101,99,116,32,102, + 114,111,109,32,123,125,41,27,114,179,0,0,0,114,98,0, + 0,0,114,82,0,0,0,114,224,0,0,0,114,50,0,0, + 0,114,17,0,0,0,114,227,0,0,0,114,152,0,0,0, + 218,10,109,101,109,111,114,121,118,105,101,119,114,163,0,0, + 0,90,21,99,104,101,99,107,95,104,97,115,104,95,98,97, + 115,101,100,95,112,121,99,115,114,157,0,0,0,218,17,95, + 82,65,87,95,77,65,71,73,67,95,78,85,77,66,69,82, + 114,158,0,0,0,114,156,0,0,0,114,118,0,0,0,114, + 150,0,0,0,114,134,0,0,0,114,149,0,0,0,114,165, + 0,0,0,114,233,0,0,0,114,8,0,0,0,218,19,100, + 111,110,116,95,119,114,105,116,101,95,98,121,116,101,99,111, + 100,101,114,171,0,0,0,114,170,0,0,0,114,22,0,0, + 0,114,226,0,0,0,41,15,114,119,0,0,0,114,139,0, + 0,0,114,108,0,0,0,114,154,0,0,0,114,174,0,0, + 0,114,157,0,0,0,90,10,104,97,115,104,95,98,97,115, + 101,100,90,12,99,104,101,99,107,95,115,111,117,114,99,101, + 114,107,0,0,0,218,2,115,116,114,26,0,0,0,114,151, + 0,0,0,114,83,0,0,0,90,10,98,121,116,101,115,95, + 100,97,116,97,90,11,99,111,100,101,95,111,98,106,101,99, + 116,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 114,213,0,0,0,76,3,0,0,115,152,0,0,0,0,7, + 10,1,4,1,4,1,4,1,4,1,4,1,2,1,12,1, + 14,1,12,2,2,1,14,1,14,1,8,2,12,1,2,1, + 14,1,14,1,6,3,2,1,2,254,6,4,2,1,12,1, + 16,1,12,1,6,1,12,1,12,1,2,255,2,2,8,254, + 4,3,10,1,4,1,2,1,2,254,4,4,8,1,2,255, + 6,3,2,1,2,1,2,1,6,1,2,1,2,251,8,7, + 20,1,6,2,8,1,2,255,4,2,6,1,2,1,2,254, + 6,3,10,1,10,1,12,1,12,1,18,1,6,255,4,2, + 6,1,10,1,10,1,14,2,6,1,6,255,4,2,2,1, + 18,1,16,1,6,1,122,21,83,111,117,114,99,101,76,111, + 97,100,101,114,46,103,101,116,95,99,111,100,101,78,41,10, + 114,125,0,0,0,114,124,0,0,0,114,126,0,0,0,114, + 223,0,0,0,114,224,0,0,0,114,226,0,0,0,114,225, + 0,0,0,114,229,0,0,0,114,233,0,0,0,114,213,0, + 0,0,114,3,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,114,221,0,0,0,17,3,0,0,115, + 14,0,0,0,8,2,8,8,8,14,8,10,8,7,8,10, + 14,8,114,221,0,0,0,99,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0, + 115,124,0,0,0,101,0,90,1,100,0,90,2,100,1,90, + 3,100,2,100,3,132,0,90,4,100,4,100,5,132,0,90, + 5,100,6,100,7,132,0,90,6,101,7,135,0,102,1,100, + 8,100,9,132,8,131,1,90,8,101,7,100,10,100,11,132, + 0,131,1,90,9,100,12,100,13,132,0,90,10,101,7,100, + 14,100,15,132,0,131,1,90,11,100,16,100,17,132,0,90, + 12,100,18,100,19,132,0,90,13,100,20,100,21,132,0,90, + 14,100,22,100,23,132,0,90,15,135,0,4,0,90,16,83, + 0,41,24,218,10,70,105,108,101,76,111,97,100,101,114,122, + 103,66,97,115,101,32,102,105,108,101,32,108,111,97,100,101, + 114,32,99,108,97,115,115,32,119,104,105,99,104,32,105,109, + 112,108,101,109,101,110,116,115,32,116,104,101,32,108,111,97, + 100,101,114,32,112,114,111,116,111,99,111,108,32,109,101,116, + 104,111,100,115,32,116,104,97,116,10,32,32,32,32,114,101, + 113,117,105,114,101,32,102,105,108,101,32,115,121,115,116,101, + 109,32,117,115,97,103,101,46,99,3,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,2,0,0,0,67,0,0, + 0,115,16,0,0,0,124,1,124,0,95,0,124,2,124,0, + 95,1,100,1,83,0,41,2,122,75,67,97,99,104,101,32, + 116,104,101,32,109,111,100,117,108,101,32,110,97,109,101,32, + 97,110,100,32,116,104,101,32,112,97,116,104,32,116,111,32, + 116,104,101,32,102,105,108,101,32,102,111,117,110,100,32,98, + 121,32,116,104,101,10,32,32,32,32,32,32,32,32,102,105, + 110,100,101,114,46,78,114,159,0,0,0,41,3,114,119,0, + 0,0,114,139,0,0,0,114,44,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,114,209,0,0,0, + 166,3,0,0,115,4,0,0,0,0,3,6,1,122,19,70, + 105,108,101,76,111,97,100,101,114,46,95,95,105,110,105,116, + 95,95,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,2,0,0,0,67,0,0,0,115,24,0,0,0, + 124,0,106,0,124,1,106,0,107,2,111,22,124,0,106,1, + 124,1,106,1,107,2,83,0,114,110,0,0,0,169,2,218, + 9,95,95,99,108,97,115,115,95,95,114,131,0,0,0,169, + 2,114,119,0,0,0,90,5,111,116,104,101,114,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,218,6,95,95, + 101,113,95,95,172,3,0,0,115,6,0,0,0,0,1,12, + 1,10,255,122,17,70,105,108,101,76,111,97,100,101,114,46, + 95,95,101,113,95,95,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, + 20,0,0,0,116,0,124,0,106,1,131,1,116,0,124,0, + 106,2,131,1,65,0,83,0,114,110,0,0,0,169,3,218, + 4,104,97,115,104,114,117,0,0,0,114,44,0,0,0,169, + 1,114,119,0,0,0,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,218,8,95,95,104,97,115,104,95,95,176, + 3,0,0,115,2,0,0,0,0,1,122,19,70,105,108,101, + 76,111,97,100,101,114,46,95,95,104,97,115,104,95,95,99, 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 1,0,0,0,67,0,0,0,115,6,0,0,0,124,0,106, - 0,83,0,169,1,122,58,82,101,116,117,114,110,32,116,104, - 101,32,112,97,116,104,32,116,111,32,116,104,101,32,115,111, - 117,114,99,101,32,102,105,108,101,32,97,115,32,102,111,117, - 110,100,32,98,121,32,116,104,101,32,102,105,110,100,101,114, - 46,114,48,0,0,0,114,219,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,179,0,0,0,191, - 3,0,0,115,2,0,0,0,0,3,122,23,70,105,108,101, - 76,111,97,100,101,114,46,103,101,116,95,102,105,108,101,110, - 97,109,101,99,2,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,10,0,0,0,67,0,0,0,115,102,0,0, - 0,116,0,124,0,116,1,116,2,102,2,131,2,114,58,116, - 3,160,4,116,5,124,1,131,1,161,1,143,22,125,2,124, - 2,160,6,161,0,87,0,2,0,53,0,81,0,82,0,163, - 0,83,0,81,0,82,0,88,0,110,40,116,3,160,7,124, - 1,100,1,161,2,143,22,125,2,124,2,160,6,161,0,87, - 0,2,0,53,0,81,0,82,0,163,0,83,0,81,0,82, - 0,88,0,100,2,83,0,41,3,122,39,82,101,116,117,114, - 110,32,116,104,101,32,100,97,116,97,32,102,114,111,109,32, - 112,97,116,104,32,97,115,32,114,97,119,32,98,121,116,101, - 115,46,218,1,114,78,41,8,114,161,0,0,0,114,221,0, - 0,0,218,19,69,120,116,101,110,115,105,111,110,70,105,108, - 101,76,111,97,100,101,114,114,64,0,0,0,90,9,111,112, - 101,110,95,99,111,100,101,114,85,0,0,0,90,4,114,101, - 97,100,114,65,0,0,0,41,3,114,119,0,0,0,114,44, - 0,0,0,114,68,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,227,0,0,0,196,3,0,0, - 115,10,0,0,0,0,2,14,1,16,1,28,2,14,1,122, - 19,70,105,108,101,76,111,97,100,101,114,46,103,101,116,95, - 100,97,116,97,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,3,0,0,0,67,0,0,0,115,18,0, - 0,0,124,0,160,0,124,1,161,1,114,14,124,0,83,0, - 100,0,83,0,114,110,0,0,0,41,1,114,182,0,0,0, - 169,2,114,119,0,0,0,114,216,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,218,19,103,101,116, - 95,114,101,115,111,117,114,99,101,95,114,101,97,100,101,114, - 207,3,0,0,115,6,0,0,0,0,2,10,1,4,1,122, - 30,70,105,108,101,76,111,97,100,101,114,46,103,101,116,95, - 114,101,115,111,117,114,99,101,95,114,101,97,100,101,114,99, - 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 4,0,0,0,67,0,0,0,115,32,0,0,0,116,0,116, - 1,124,0,106,2,131,1,100,1,25,0,124,1,131,2,125, - 2,116,3,160,4,124,2,100,2,161,2,83,0,41,3,78, - 114,73,0,0,0,114,251,0,0,0,41,5,114,38,0,0, - 0,114,47,0,0,0,114,44,0,0,0,114,64,0,0,0, - 114,65,0,0,0,169,3,114,119,0,0,0,90,8,114,101, - 115,111,117,114,99,101,114,44,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,13,111,112,101,110, - 95,114,101,115,111,117,114,99,101,213,3,0,0,115,4,0, - 0,0,0,1,20,1,122,24,70,105,108,101,76,111,97,100, - 101,114,46,111,112,101,110,95,114,101,115,111,117,114,99,101, - 99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,3,0,0,0,67,0,0,0,115,38,0,0,0,124,0, - 160,0,124,1,161,1,115,14,116,1,130,1,116,2,116,3, - 124,0,106,4,131,1,100,1,25,0,124,1,131,2,125,2, - 124,2,83,0,169,2,78,114,73,0,0,0,41,5,218,11, - 105,115,95,114,101,115,111,117,114,99,101,218,17,70,105,108, - 101,78,111,116,70,111,117,110,100,69,114,114,111,114,114,38, - 0,0,0,114,47,0,0,0,114,44,0,0,0,114,255,0, + 3,0,0,0,3,0,0,0,115,16,0,0,0,116,0,116, + 1,124,0,131,2,160,2,124,1,161,1,83,0,41,1,122, + 100,76,111,97,100,32,97,32,109,111,100,117,108,101,32,102, + 114,111,109,32,97,32,102,105,108,101,46,10,10,32,32,32, + 32,32,32,32,32,84,104,105,115,32,109,101,116,104,111,100, + 32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,32, + 32,85,115,101,32,101,120,101,99,95,109,111,100,117,108,101, + 40,41,32,105,110,115,116,101,97,100,46,10,10,32,32,32, + 32,32,32,32,32,41,3,218,5,115,117,112,101,114,114,239, + 0,0,0,114,220,0,0,0,114,219,0,0,0,169,1,114, + 241,0,0,0,114,3,0,0,0,114,6,0,0,0,114,220, + 0,0,0,179,3,0,0,115,2,0,0,0,0,10,122,22, + 70,105,108,101,76,111,97,100,101,114,46,108,111,97,100,95, + 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, + 6,0,0,0,124,0,106,0,83,0,169,1,122,58,82,101, + 116,117,114,110,32,116,104,101,32,112,97,116,104,32,116,111, + 32,116,104,101,32,115,111,117,114,99,101,32,102,105,108,101, + 32,97,115,32,102,111,117,110,100,32,98,121,32,116,104,101, + 32,102,105,110,100,101,114,46,114,48,0,0,0,114,219,0, 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,13,114,101,115,111,117,114,99,101,95,112,97,116,104, - 217,3,0,0,115,8,0,0,0,0,1,10,1,4,1,20, - 1,122,24,70,105,108,101,76,111,97,100,101,114,46,114,101, - 115,111,117,114,99,101,95,112,97,116,104,99,2,0,0,0, - 0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, - 67,0,0,0,115,40,0,0,0,116,0,124,1,107,6,114, - 12,100,1,83,0,116,1,116,2,124,0,106,3,131,1,100, - 2,25,0,124,1,131,2,125,2,116,4,124,2,131,1,83, - 0,41,3,78,70,114,73,0,0,0,41,5,114,35,0,0, - 0,114,38,0,0,0,114,47,0,0,0,114,44,0,0,0, - 114,54,0,0,0,169,3,114,119,0,0,0,114,117,0,0, - 0,114,44,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,2,1,0,0,223,3,0,0,115,8, - 0,0,0,0,1,8,1,4,1,20,1,122,22,70,105,108, - 101,76,111,97,100,101,114,46,105,115,95,114,101,115,111,117, - 114,99,101,99,1,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,5,0,0,0,67,0,0,0,115,24,0,0, - 0,116,0,116,1,160,2,116,3,124,0,106,4,131,1,100, - 1,25,0,161,1,131,1,83,0,114,1,1,0,0,41,5, - 218,4,105,116,101,114,114,2,0,0,0,218,7,108,105,115, - 116,100,105,114,114,47,0,0,0,114,44,0,0,0,114,246, + 0,114,179,0,0,0,191,3,0,0,115,2,0,0,0,0, + 3,122,23,70,105,108,101,76,111,97,100,101,114,46,103,101, + 116,95,102,105,108,101,110,97,109,101,99,2,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,10,0,0,0,67, + 0,0,0,115,102,0,0,0,116,0,124,0,116,1,116,2, + 102,2,131,2,114,58,116,3,160,4,116,5,124,1,131,1, + 161,1,143,22,125,2,124,2,160,6,161,0,87,0,2,0, + 53,0,81,0,82,0,163,0,83,0,81,0,82,0,88,0, + 110,40,116,3,160,7,124,1,100,1,161,2,143,22,125,2, + 124,2,160,6,161,0,87,0,2,0,53,0,81,0,82,0, + 163,0,83,0,81,0,82,0,88,0,100,2,83,0,41,3, + 122,39,82,101,116,117,114,110,32,116,104,101,32,100,97,116, + 97,32,102,114,111,109,32,112,97,116,104,32,97,115,32,114, + 97,119,32,98,121,116,101,115,46,218,1,114,78,41,8,114, + 161,0,0,0,114,221,0,0,0,218,19,69,120,116,101,110, + 115,105,111,110,70,105,108,101,76,111,97,100,101,114,114,64, + 0,0,0,90,9,111,112,101,110,95,99,111,100,101,114,85, + 0,0,0,90,4,114,101,97,100,114,65,0,0,0,41,3, + 114,119,0,0,0,114,44,0,0,0,114,68,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,227, + 0,0,0,196,3,0,0,115,10,0,0,0,0,2,14,1, + 16,1,28,2,14,1,122,19,70,105,108,101,76,111,97,100, + 101,114,46,103,101,116,95,100,97,116,97,99,2,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, + 67,0,0,0,115,18,0,0,0,124,0,160,0,124,1,161, + 1,114,14,124,0,83,0,100,0,83,0,114,110,0,0,0, + 41,1,114,182,0,0,0,169,2,114,119,0,0,0,114,216, 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,218,8,99,111,110,116,101,110,116,115,229,3,0,0, - 115,2,0,0,0,0,1,122,19,70,105,108,101,76,111,97, - 100,101,114,46,99,111,110,116,101,110,116,115,41,17,114,125, - 0,0,0,114,124,0,0,0,114,126,0,0,0,114,127,0, - 0,0,114,209,0,0,0,114,243,0,0,0,114,247,0,0, - 0,114,136,0,0,0,114,220,0,0,0,114,179,0,0,0, - 114,227,0,0,0,114,254,0,0,0,114,0,1,0,0,114, - 4,1,0,0,114,2,1,0,0,114,8,1,0,0,90,13, - 95,95,99,108,97,115,115,99,101,108,108,95,95,114,3,0, - 0,0,114,3,0,0,0,114,249,0,0,0,114,6,0,0, - 0,114,239,0,0,0,161,3,0,0,115,30,0,0,0,8, - 2,4,3,8,6,8,4,8,3,2,1,14,11,2,1,10, - 4,8,11,2,1,10,5,8,4,8,6,8,6,114,239,0, - 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,64,0,0,0,115,46,0,0,0, - 101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,3, - 132,0,90,4,100,4,100,5,132,0,90,5,100,6,100,7, - 156,1,100,8,100,9,132,2,90,6,100,10,83,0,41,11, - 218,16,83,111,117,114,99,101,70,105,108,101,76,111,97,100, - 101,114,122,62,67,111,110,99,114,101,116,101,32,105,109,112, - 108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,83, - 111,117,114,99,101,76,111,97,100,101,114,32,117,115,105,110, - 103,32,116,104,101,32,102,105,108,101,32,115,121,115,116,101, - 109,46,99,2,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,3,0,0,0,67,0,0,0,115,22,0,0,0, - 116,0,124,1,131,1,125,2,124,2,106,1,124,2,106,2, - 100,1,156,2,83,0,41,2,122,33,82,101,116,117,114,110, - 32,116,104,101,32,109,101,116,97,100,97,116,97,32,102,111, - 114,32,116,104,101,32,112,97,116,104,46,41,2,114,169,0, - 0,0,114,234,0,0,0,41,3,114,49,0,0,0,218,8, - 115,116,95,109,116,105,109,101,90,7,115,116,95,115,105,122, - 101,41,3,114,119,0,0,0,114,44,0,0,0,114,238,0, + 0,0,218,19,103,101,116,95,114,101,115,111,117,114,99,101, + 95,114,101,97,100,101,114,207,3,0,0,115,6,0,0,0, + 0,2,10,1,4,1,122,30,70,105,108,101,76,111,97,100, + 101,114,46,103,101,116,95,114,101,115,111,117,114,99,101,95, + 114,101,97,100,101,114,99,2,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,4,0,0,0,67,0,0,0,115, + 32,0,0,0,116,0,116,1,124,0,106,2,131,1,100,1, + 25,0,124,1,131,2,125,2,116,3,160,4,124,2,100,2, + 161,2,83,0,41,3,78,114,73,0,0,0,114,251,0,0, + 0,41,5,114,38,0,0,0,114,47,0,0,0,114,44,0, + 0,0,114,64,0,0,0,114,65,0,0,0,169,3,114,119, + 0,0,0,90,8,114,101,115,111,117,114,99,101,114,44,0, 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,224,0,0,0,237,3,0,0,115,4,0,0,0,0, - 2,8,1,122,27,83,111,117,114,99,101,70,105,108,101,76, - 111,97,100,101,114,46,112,97,116,104,95,115,116,97,116,115, - 99,4,0,0,0,0,0,0,0,0,0,0,0,5,0,0, - 0,5,0,0,0,67,0,0,0,115,24,0,0,0,116,0, - 124,1,131,1,125,4,124,0,106,1,124,2,124,3,124,4, - 100,1,141,3,83,0,41,2,78,169,1,218,5,95,109,111, - 100,101,41,2,114,115,0,0,0,114,225,0,0,0,41,5, - 114,119,0,0,0,114,108,0,0,0,114,107,0,0,0,114, - 26,0,0,0,114,52,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,226,0,0,0,242,3,0, - 0,115,4,0,0,0,0,2,8,1,122,32,83,111,117,114, - 99,101,70,105,108,101,76,111,97,100,101,114,46,95,99,97, - 99,104,101,95,98,121,116,101,99,111,100,101,114,60,0,0, - 0,114,11,1,0,0,99,3,0,0,0,0,0,0,0,1, - 0,0,0,9,0,0,0,11,0,0,0,67,0,0,0,115, - 0,1,0,0,116,0,124,1,131,1,92,2,125,4,125,5, - 103,0,125,6,124,4,114,52,116,1,124,4,131,1,115,52, - 116,0,124,4,131,1,92,2,125,4,125,7,124,6,160,2, - 124,7,161,1,1,0,113,16,116,3,124,6,131,1,68,0, - 93,112,125,7,116,4,124,4,124,7,131,2,125,4,122,14, - 116,5,160,6,124,4,161,1,1,0,87,0,110,82,4,0, - 116,7,107,10,114,112,1,0,1,0,1,0,89,0,113,60, - 89,0,110,60,4,0,116,8,107,10,114,170,1,0,125,8, - 1,0,122,30,116,9,160,10,100,1,124,4,124,8,161,3, - 1,0,87,0,89,0,162,10,1,0,100,2,83,0,87,0, - 53,0,100,2,125,8,126,8,88,0,89,0,110,2,88,0, - 113,60,122,28,116,11,124,1,124,2,124,3,131,3,1,0, - 116,9,160,10,100,3,124,1,161,2,1,0,87,0,110,48, - 4,0,116,8,107,10,114,250,1,0,125,8,1,0,122,18, - 116,9,160,10,100,1,124,1,124,8,161,3,1,0,87,0, - 53,0,100,2,125,8,126,8,88,0,89,0,110,2,88,0, - 100,2,83,0,41,4,122,27,87,114,105,116,101,32,98,121, - 116,101,115,32,100,97,116,97,32,116,111,32,97,32,102,105, - 108,101,46,122,27,99,111,117,108,100,32,110,111,116,32,99, - 114,101,97,116,101,32,123,33,114,125,58,32,123,33,114,125, - 78,122,12,99,114,101,97,116,101,100,32,123,33,114,125,41, - 12,114,47,0,0,0,114,56,0,0,0,114,186,0,0,0, - 114,42,0,0,0,114,38,0,0,0,114,2,0,0,0,90, - 5,109,107,100,105,114,218,15,70,105,108,101,69,120,105,115, - 116,115,69,114,114,111,114,114,50,0,0,0,114,134,0,0, - 0,114,149,0,0,0,114,69,0,0,0,41,9,114,119,0, - 0,0,114,44,0,0,0,114,26,0,0,0,114,12,1,0, - 0,218,6,112,97,114,101,110,116,114,97,0,0,0,114,37, - 0,0,0,114,33,0,0,0,114,228,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,225,0,0, - 0,247,3,0,0,115,48,0,0,0,0,2,12,1,4,2, - 12,1,12,1,12,2,12,1,10,1,2,1,14,1,14,2, - 8,1,16,3,6,1,2,0,2,255,4,2,32,1,2,1, - 12,1,16,1,16,2,8,1,2,255,122,25,83,111,117,114, - 99,101,70,105,108,101,76,111,97,100,101,114,46,115,101,116, - 95,100,97,116,97,78,41,7,114,125,0,0,0,114,124,0, - 0,0,114,126,0,0,0,114,127,0,0,0,114,224,0,0, - 0,114,226,0,0,0,114,225,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 9,1,0,0,233,3,0,0,115,8,0,0,0,8,2,4, - 2,8,5,8,5,114,9,1,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,64, - 0,0,0,115,32,0,0,0,101,0,90,1,100,0,90,2, - 100,1,90,3,100,2,100,3,132,0,90,4,100,4,100,5, - 132,0,90,5,100,6,83,0,41,7,218,20,83,111,117,114, - 99,101,108,101,115,115,70,105,108,101,76,111,97,100,101,114, - 122,45,76,111,97,100,101,114,32,119,104,105,99,104,32,104, - 97,110,100,108,101,115,32,115,111,117,114,99,101,108,101,115, - 115,32,102,105,108,101,32,105,109,112,111,114,116,115,46,99, - 2,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, - 5,0,0,0,67,0,0,0,115,68,0,0,0,124,0,160, - 0,124,1,161,1,125,2,124,0,160,1,124,2,161,1,125, - 3,124,1,124,2,100,1,156,2,125,4,116,2,124,3,124, - 1,124,4,131,3,1,0,116,3,116,4,124,3,131,1,100, - 2,100,0,133,2,25,0,124,1,124,2,100,3,141,3,83, - 0,41,4,78,114,159,0,0,0,114,145,0,0,0,41,2, - 114,117,0,0,0,114,107,0,0,0,41,5,114,179,0,0, - 0,114,227,0,0,0,114,152,0,0,0,114,165,0,0,0, - 114,235,0,0,0,41,5,114,119,0,0,0,114,139,0,0, - 0,114,44,0,0,0,114,26,0,0,0,114,151,0,0,0, + 0,218,13,111,112,101,110,95,114,101,115,111,117,114,99,101, + 213,3,0,0,115,4,0,0,0,0,1,20,1,122,24,70, + 105,108,101,76,111,97,100,101,114,46,111,112,101,110,95,114, + 101,115,111,117,114,99,101,99,2,0,0,0,0,0,0,0, + 0,0,0,0,3,0,0,0,3,0,0,0,67,0,0,0, + 115,38,0,0,0,124,0,160,0,124,1,161,1,115,14,116, + 1,130,1,116,2,116,3,124,0,106,4,131,1,100,1,25, + 0,124,1,131,2,125,2,124,2,83,0,169,2,78,114,73, + 0,0,0,41,5,218,11,105,115,95,114,101,115,111,117,114, + 99,101,218,17,70,105,108,101,78,111,116,70,111,117,110,100, + 69,114,114,111,114,114,38,0,0,0,114,47,0,0,0,114, + 44,0,0,0,114,255,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,13,114,101,115,111,117,114, + 99,101,95,112,97,116,104,217,3,0,0,115,8,0,0,0, + 0,1,10,1,4,1,20,1,122,24,70,105,108,101,76,111, + 97,100,101,114,46,114,101,115,111,117,114,99,101,95,112,97, + 116,104,99,2,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,3,0,0,0,67,0,0,0,115,40,0,0,0, + 116,0,124,1,107,6,114,12,100,1,83,0,116,1,116,2, + 124,0,106,3,131,1,100,2,25,0,124,1,131,2,125,2, + 116,4,124,2,131,1,83,0,41,3,78,70,114,73,0,0, + 0,41,5,114,35,0,0,0,114,38,0,0,0,114,47,0, + 0,0,114,44,0,0,0,114,54,0,0,0,169,3,114,119, + 0,0,0,114,117,0,0,0,114,44,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,2,1,0, + 0,223,3,0,0,115,8,0,0,0,0,1,8,1,4,1, + 20,1,122,22,70,105,108,101,76,111,97,100,101,114,46,105, + 115,95,114,101,115,111,117,114,99,101,99,1,0,0,0,0, + 0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,67, + 0,0,0,115,24,0,0,0,116,0,116,1,160,2,116,3, + 124,0,106,4,131,1,100,1,25,0,161,1,131,1,83,0, + 114,1,1,0,0,41,5,218,4,105,116,101,114,114,2,0, + 0,0,218,7,108,105,115,116,100,105,114,114,47,0,0,0, + 114,44,0,0,0,114,246,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,218,8,99,111,110,116,101, + 110,116,115,229,3,0,0,115,2,0,0,0,0,1,122,19, + 70,105,108,101,76,111,97,100,101,114,46,99,111,110,116,101, + 110,116,115,41,17,114,125,0,0,0,114,124,0,0,0,114, + 126,0,0,0,114,127,0,0,0,114,209,0,0,0,114,243, + 0,0,0,114,247,0,0,0,114,136,0,0,0,114,220,0, + 0,0,114,179,0,0,0,114,227,0,0,0,114,254,0,0, + 0,114,0,1,0,0,114,4,1,0,0,114,2,1,0,0, + 114,8,1,0,0,90,13,95,95,99,108,97,115,115,99,101, + 108,108,95,95,114,3,0,0,0,114,3,0,0,0,114,249, + 0,0,0,114,6,0,0,0,114,239,0,0,0,161,3,0, + 0,115,30,0,0,0,8,2,4,3,8,6,8,4,8,3, + 2,1,14,11,2,1,10,4,8,11,2,1,10,5,8,4, + 8,6,8,6,114,239,0,0,0,99,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,64,0, + 0,0,115,46,0,0,0,101,0,90,1,100,0,90,2,100, + 1,90,3,100,2,100,3,132,0,90,4,100,4,100,5,132, + 0,90,5,100,6,100,7,156,1,100,8,100,9,132,2,90, + 6,100,10,83,0,41,11,218,16,83,111,117,114,99,101,70, + 105,108,101,76,111,97,100,101,114,122,62,67,111,110,99,114, + 101,116,101,32,105,109,112,108,101,109,101,110,116,97,116,105, + 111,110,32,111,102,32,83,111,117,114,99,101,76,111,97,100, + 101,114,32,117,115,105,110,103,32,116,104,101,32,102,105,108, + 101,32,115,121,115,116,101,109,46,99,2,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,3,0,0,0,67,0, + 0,0,115,22,0,0,0,116,0,124,1,131,1,125,2,124, + 2,106,1,124,2,106,2,100,1,156,2,83,0,41,2,122, + 33,82,101,116,117,114,110,32,116,104,101,32,109,101,116,97, + 100,97,116,97,32,102,111,114,32,116,104,101,32,112,97,116, + 104,46,41,2,114,169,0,0,0,114,234,0,0,0,41,3, + 114,49,0,0,0,218,8,115,116,95,109,116,105,109,101,90, + 7,115,116,95,115,105,122,101,41,3,114,119,0,0,0,114, + 44,0,0,0,114,238,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,114,224,0,0,0,237,3,0, + 0,115,4,0,0,0,0,2,8,1,122,27,83,111,117,114, + 99,101,70,105,108,101,76,111,97,100,101,114,46,112,97,116, + 104,95,115,116,97,116,115,99,4,0,0,0,0,0,0,0, + 0,0,0,0,5,0,0,0,5,0,0,0,67,0,0,0, + 115,24,0,0,0,116,0,124,1,131,1,125,4,124,0,106, + 1,124,2,124,3,124,4,100,1,141,3,83,0,41,2,78, + 169,1,218,5,95,109,111,100,101,41,2,114,115,0,0,0, + 114,225,0,0,0,41,5,114,119,0,0,0,114,108,0,0, + 0,114,107,0,0,0,114,26,0,0,0,114,52,0,0,0, 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 213,0,0,0,26,4,0,0,115,22,0,0,0,0,1,10, - 1,10,4,2,1,2,254,6,4,12,1,2,1,14,1,2, - 1,2,253,122,29,83,111,117,114,99,101,108,101,115,115,70, - 105,108,101,76,111,97,100,101,114,46,103,101,116,95,99,111, - 100,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0, - 100,1,83,0,41,2,122,39,82,101,116,117,114,110,32,78, - 111,110,101,32,97,115,32,116,104,101,114,101,32,105,115,32, - 110,111,32,115,111,117,114,99,101,32,99,111,100,101,46,78, - 114,3,0,0,0,114,219,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,229,0,0,0,42,4, - 0,0,115,2,0,0,0,0,2,122,31,83,111,117,114,99, - 101,108,101,115,115,70,105,108,101,76,111,97,100,101,114,46, - 103,101,116,95,115,111,117,114,99,101,78,41,6,114,125,0, - 0,0,114,124,0,0,0,114,126,0,0,0,114,127,0,0, - 0,114,213,0,0,0,114,229,0,0,0,114,3,0,0,0, + 226,0,0,0,242,3,0,0,115,4,0,0,0,0,2,8, + 1,122,32,83,111,117,114,99,101,70,105,108,101,76,111,97, + 100,101,114,46,95,99,97,99,104,101,95,98,121,116,101,99, + 111,100,101,114,60,0,0,0,114,11,1,0,0,99,3,0, + 0,0,0,0,0,0,1,0,0,0,9,0,0,0,11,0, + 0,0,67,0,0,0,115,252,0,0,0,116,0,124,1,131, + 1,92,2,125,4,125,5,103,0,125,6,124,4,114,52,116, + 1,124,4,131,1,115,52,116,0,124,4,131,1,92,2,125, + 4,125,7,124,6,160,2,124,7,161,1,1,0,113,16,116, + 3,124,6,131,1,68,0,93,108,125,7,116,4,124,4,124, + 7,131,2,125,4,122,14,116,5,160,6,124,4,161,1,1, + 0,87,0,113,60,4,0,116,7,107,10,114,112,1,0,1, + 0,1,0,89,0,113,60,89,0,113,60,4,0,116,8,107, + 10,114,166,1,0,125,8,1,0,122,26,116,9,160,10,100, + 1,124,4,124,8,161,3,1,0,87,0,89,0,162,6,1, + 0,100,2,83,0,100,2,125,8,126,8,88,0,89,0,113, + 60,88,0,113,60,122,28,116,11,124,1,124,2,124,3,131, + 3,1,0,116,9,160,10,100,3,124,1,161,2,1,0,87, + 0,110,48,4,0,116,8,107,10,114,246,1,0,125,8,1, + 0,122,18,116,9,160,10,100,1,124,1,124,8,161,3,1, + 0,87,0,53,0,100,2,125,8,126,8,88,0,89,0,110, + 2,88,0,100,2,83,0,41,4,122,27,87,114,105,116,101, + 32,98,121,116,101,115,32,100,97,116,97,32,116,111,32,97, + 32,102,105,108,101,46,122,27,99,111,117,108,100,32,110,111, + 116,32,99,114,101,97,116,101,32,123,33,114,125,58,32,123, + 33,114,125,78,122,12,99,114,101,97,116,101,100,32,123,33, + 114,125,41,12,114,47,0,0,0,114,56,0,0,0,114,186, + 0,0,0,114,42,0,0,0,114,38,0,0,0,114,2,0, + 0,0,90,5,109,107,100,105,114,218,15,70,105,108,101,69, + 120,105,115,116,115,69,114,114,111,114,114,50,0,0,0,114, + 134,0,0,0,114,149,0,0,0,114,69,0,0,0,41,9, + 114,119,0,0,0,114,44,0,0,0,114,26,0,0,0,114, + 12,1,0,0,218,6,112,97,114,101,110,116,114,97,0,0, + 0,114,37,0,0,0,114,33,0,0,0,114,228,0,0,0, 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 15,1,0,0,22,4,0,0,115,6,0,0,0,8,2,4, - 2,8,16,114,15,1,0,0,99,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,64,0,0, - 0,115,92,0,0,0,101,0,90,1,100,0,90,2,100,1, - 90,3,100,2,100,3,132,0,90,4,100,4,100,5,132,0, - 90,5,100,6,100,7,132,0,90,6,100,8,100,9,132,0, - 90,7,100,10,100,11,132,0,90,8,100,12,100,13,132,0, - 90,9,100,14,100,15,132,0,90,10,100,16,100,17,132,0, - 90,11,101,12,100,18,100,19,132,0,131,1,90,13,100,20, - 83,0,41,21,114,252,0,0,0,122,93,76,111,97,100,101, - 114,32,102,111,114,32,101,120,116,101,110,115,105,111,110,32, - 109,111,100,117,108,101,115,46,10,10,32,32,32,32,84,104, - 101,32,99,111,110,115,116,114,117,99,116,111,114,32,105,115, - 32,100,101,115,105,103,110,101,100,32,116,111,32,119,111,114, - 107,32,119,105,116,104,32,70,105,108,101,70,105,110,100,101, - 114,46,10,10,32,32,32,32,99,3,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,2,0,0,0,67,0,0, - 0,115,16,0,0,0,124,1,124,0,95,0,124,2,124,0, - 95,1,100,0,83,0,114,110,0,0,0,114,159,0,0,0, - 114,5,1,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,209,0,0,0,59,4,0,0,115,4,0, - 0,0,0,1,6,1,122,28,69,120,116,101,110,115,105,111, - 110,70,105,108,101,76,111,97,100,101,114,46,95,95,105,110, - 105,116,95,95,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,2,0,0,0,67,0,0,0,115,24,0, - 0,0,124,0,106,0,124,1,106,0,107,2,111,22,124,0, - 106,1,124,1,106,1,107,2,83,0,114,110,0,0,0,114, - 240,0,0,0,114,242,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,243,0,0,0,63,4,0, - 0,115,6,0,0,0,0,1,12,1,10,255,122,26,69,120, - 116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,101, - 114,46,95,95,101,113,95,95,99,1,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, - 0,115,20,0,0,0,116,0,124,0,106,1,131,1,116,0, - 124,0,106,2,131,1,65,0,83,0,114,110,0,0,0,114, - 244,0,0,0,114,246,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,247,0,0,0,67,4,0, - 0,115,2,0,0,0,0,1,122,28,69,120,116,101,110,115, - 105,111,110,70,105,108,101,76,111,97,100,101,114,46,95,95, - 104,97,115,104,95,95,99,2,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,5,0,0,0,67,0,0,0,115, - 36,0,0,0,116,0,160,1,116,2,106,3,124,1,161,2, - 125,2,116,0,160,4,100,1,124,1,106,5,124,0,106,6, - 161,3,1,0,124,2,83,0,41,2,122,38,67,114,101,97, - 116,101,32,97,110,32,117,110,105,116,105,97,108,105,122,101, - 100,32,101,120,116,101,110,115,105,111,110,32,109,111,100,117, - 108,101,122,38,101,120,116,101,110,115,105,111,110,32,109,111, - 100,117,108,101,32,123,33,114,125,32,108,111,97,100,101,100, - 32,102,114,111,109,32,123,33,114,125,41,7,114,134,0,0, - 0,114,214,0,0,0,114,163,0,0,0,90,14,99,114,101, - 97,116,101,95,100,121,110,97,109,105,99,114,149,0,0,0, - 114,117,0,0,0,114,44,0,0,0,41,3,114,119,0,0, - 0,114,187,0,0,0,114,216,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,212,0,0,0,70, - 4,0,0,115,18,0,0,0,0,2,4,1,4,0,2,255, - 4,2,6,1,4,0,4,255,4,2,122,33,69,120,116,101, - 110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46, - 99,114,101,97,116,101,95,109,111,100,117,108,101,99,2,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,5,0, - 0,0,67,0,0,0,115,36,0,0,0,116,0,160,1,116, - 2,106,3,124,1,161,2,1,0,116,0,160,4,100,1,124, - 0,106,5,124,0,106,6,161,3,1,0,100,2,83,0,41, - 3,122,30,73,110,105,116,105,97,108,105,122,101,32,97,110, - 32,101,120,116,101,110,115,105,111,110,32,109,111,100,117,108, - 101,122,40,101,120,116,101,110,115,105,111,110,32,109,111,100, - 117,108,101,32,123,33,114,125,32,101,120,101,99,117,116,101, - 100,32,102,114,111,109,32,123,33,114,125,78,41,7,114,134, - 0,0,0,114,214,0,0,0,114,163,0,0,0,90,12,101, - 120,101,99,95,100,121,110,97,109,105,99,114,149,0,0,0, - 114,117,0,0,0,114,44,0,0,0,114,253,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,217, - 0,0,0,78,4,0,0,115,10,0,0,0,0,2,14,1, - 6,1,4,0,4,255,122,31,69,120,116,101,110,115,105,111, - 110,70,105,108,101,76,111,97,100,101,114,46,101,120,101,99, - 95,109,111,100,117,108,101,99,2,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,4,0,0,0,3,0,0,0, - 115,36,0,0,0,116,0,124,0,106,1,131,1,100,1,25, - 0,137,0,116,2,135,0,102,1,100,2,100,3,132,8,116, - 3,68,0,131,1,131,1,83,0,41,4,122,49,82,101,116, - 117,114,110,32,84,114,117,101,32,105,102,32,116,104,101,32, - 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101, - 32,105,115,32,97,32,112,97,99,107,97,103,101,46,114,39, - 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,4,0,0,0,51,0,0,0,115,26,0,0, - 0,124,0,93,18,125,1,136,0,100,0,124,1,23,0,107, - 2,86,0,1,0,113,2,100,1,83,0,41,2,114,209,0, - 0,0,78,114,3,0,0,0,169,2,114,32,0,0,0,218, - 6,115,117,102,102,105,120,169,1,90,9,102,105,108,101,95, - 110,97,109,101,114,3,0,0,0,114,6,0,0,0,218,9, - 60,103,101,110,101,120,112,114,62,87,4,0,0,115,4,0, - 0,0,4,1,2,255,122,49,69,120,116,101,110,115,105,111, - 110,70,105,108,101,76,111,97,100,101,114,46,105,115,95,112, - 97,99,107,97,103,101,46,60,108,111,99,97,108,115,62,46, - 60,103,101,110,101,120,112,114,62,41,4,114,47,0,0,0, - 114,44,0,0,0,218,3,97,110,121,218,18,69,88,84,69, - 78,83,73,79,78,95,83,85,70,70,73,88,69,83,114,219, - 0,0,0,114,3,0,0,0,114,18,1,0,0,114,6,0, - 0,0,114,182,0,0,0,84,4,0,0,115,8,0,0,0, - 0,2,14,1,12,1,2,255,122,30,69,120,116,101,110,115, - 105,111,110,70,105,108,101,76,111,97,100,101,114,46,105,115, - 95,112,97,99,107,97,103,101,99,2,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, - 0,115,4,0,0,0,100,1,83,0,41,2,122,63,82,101, - 116,117,114,110,32,78,111,110,101,32,97,115,32,97,110,32, - 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101, - 32,99,97,110,110,111,116,32,99,114,101,97,116,101,32,97, - 32,99,111,100,101,32,111,98,106,101,99,116,46,78,114,3, - 0,0,0,114,219,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,213,0,0,0,90,4,0,0, - 115,2,0,0,0,0,2,122,28,69,120,116,101,110,115,105, - 111,110,70,105,108,101,76,111,97,100,101,114,46,103,101,116, + 225,0,0,0,247,3,0,0,115,48,0,0,0,0,2,12, + 1,4,2,12,1,12,1,12,2,12,1,10,1,2,1,14, + 1,14,2,8,1,16,3,6,1,2,0,2,255,4,2,28, + 1,2,1,12,1,16,1,16,2,8,1,2,255,122,25,83, + 111,117,114,99,101,70,105,108,101,76,111,97,100,101,114,46, + 115,101,116,95,100,97,116,97,78,41,7,114,125,0,0,0, + 114,124,0,0,0,114,126,0,0,0,114,127,0,0,0,114, + 224,0,0,0,114,226,0,0,0,114,225,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,114,9,1,0,0,233,3,0,0,115,8,0,0,0, + 8,2,4,2,8,5,8,5,114,9,1,0,0,99,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,64,0,0,0,115,32,0,0,0,101,0,90,1,100, + 0,90,2,100,1,90,3,100,2,100,3,132,0,90,4,100, + 4,100,5,132,0,90,5,100,6,83,0,41,7,218,20,83, + 111,117,114,99,101,108,101,115,115,70,105,108,101,76,111,97, + 100,101,114,122,45,76,111,97,100,101,114,32,119,104,105,99, + 104,32,104,97,110,100,108,101,115,32,115,111,117,114,99,101, + 108,101,115,115,32,102,105,108,101,32,105,109,112,111,114,116, + 115,46,99,2,0,0,0,0,0,0,0,0,0,0,0,5, + 0,0,0,5,0,0,0,67,0,0,0,115,68,0,0,0, + 124,0,160,0,124,1,161,1,125,2,124,0,160,1,124,2, + 161,1,125,3,124,1,124,2,100,1,156,2,125,4,116,2, + 124,3,124,1,124,4,131,3,1,0,116,3,116,4,124,3, + 131,1,100,2,100,0,133,2,25,0,124,1,124,2,100,3, + 141,3,83,0,41,4,78,114,159,0,0,0,114,145,0,0, + 0,41,2,114,117,0,0,0,114,107,0,0,0,41,5,114, + 179,0,0,0,114,227,0,0,0,114,152,0,0,0,114,165, + 0,0,0,114,235,0,0,0,41,5,114,119,0,0,0,114, + 139,0,0,0,114,44,0,0,0,114,26,0,0,0,114,151, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,114,213,0,0,0,26,4,0,0,115,22,0,0,0, + 0,1,10,1,10,4,2,1,2,254,6,4,12,1,2,1, + 14,1,2,1,2,253,122,29,83,111,117,114,99,101,108,101, + 115,115,70,105,108,101,76,111,97,100,101,114,46,103,101,116, 95,99,111,100,101,99,2,0,0,0,0,0,0,0,0,0, 0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,4, - 0,0,0,100,1,83,0,41,2,122,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, + 0,0,0,100,1,83,0,41,2,122,39,82,101,116,117,114, + 110,32,78,111,110,101,32,97,115,32,116,104,101,114,101,32, + 105,115,32,110,111,32,115,111,117,114,99,101,32,99,111,100, + 101,46,78,114,3,0,0,0,114,219,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,229,0,0, + 0,42,4,0,0,115,2,0,0,0,0,2,122,31,83,111, + 117,114,99,101,108,101,115,115,70,105,108,101,76,111,97,100, + 101,114,46,103,101,116,95,115,111,117,114,99,101,78,41,6, + 114,125,0,0,0,114,124,0,0,0,114,126,0,0,0,114, + 127,0,0,0,114,213,0,0,0,114,229,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,114,15,1,0,0,22,4,0,0,115,6,0,0,0, + 8,2,4,2,8,16,114,15,1,0,0,99,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 64,0,0,0,115,92,0,0,0,101,0,90,1,100,0,90, + 2,100,1,90,3,100,2,100,3,132,0,90,4,100,4,100, + 5,132,0,90,5,100,6,100,7,132,0,90,6,100,8,100, + 9,132,0,90,7,100,10,100,11,132,0,90,8,100,12,100, + 13,132,0,90,9,100,14,100,15,132,0,90,10,100,16,100, + 17,132,0,90,11,101,12,100,18,100,19,132,0,131,1,90, + 13,100,20,83,0,41,21,114,252,0,0,0,122,93,76,111, + 97,100,101,114,32,102,111,114,32,101,120,116,101,110,115,105, + 111,110,32,109,111,100,117,108,101,115,46,10,10,32,32,32, + 32,84,104,101,32,99,111,110,115,116,114,117,99,116,111,114, + 32,105,115,32,100,101,115,105,103,110,101,100,32,116,111,32, + 119,111,114,107,32,119,105,116,104,32,70,105,108,101,70,105, + 110,100,101,114,46,10,10,32,32,32,32,99,3,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,2,0,0,0, + 67,0,0,0,115,16,0,0,0,124,1,124,0,95,0,124, + 2,124,0,95,1,100,0,83,0,114,110,0,0,0,114,159, + 0,0,0,114,5,1,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,209,0,0,0,59,4,0,0, + 115,4,0,0,0,0,1,6,1,122,28,69,120,116,101,110, + 115,105,111,110,70,105,108,101,76,111,97,100,101,114,46,95, + 95,105,110,105,116,95,95,99,2,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,2,0,0,0,67,0,0,0, + 115,24,0,0,0,124,0,106,0,124,1,106,0,107,2,111, + 22,124,0,106,1,124,1,106,1,107,2,83,0,114,110,0, + 0,0,114,240,0,0,0,114,242,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,114,243,0,0,0, + 63,4,0,0,115,6,0,0,0,0,1,12,1,10,255,122, + 26,69,120,116,101,110,115,105,111,110,70,105,108,101,76,111, + 97,100,101,114,46,95,95,101,113,95,95,99,1,0,0,0, + 0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0, + 67,0,0,0,115,20,0,0,0,116,0,124,0,106,1,131, + 1,116,0,124,0,106,2,131,1,65,0,83,0,114,110,0, + 0,0,114,244,0,0,0,114,246,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,114,247,0,0,0, + 67,4,0,0,115,2,0,0,0,0,1,122,28,69,120,116, + 101,110,115,105,111,110,70,105,108,101,76,111,97,100,101,114, + 46,95,95,104,97,115,104,95,95,99,2,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,5,0,0,0,67,0, + 0,0,115,36,0,0,0,116,0,160,1,116,2,106,3,124, + 1,161,2,125,2,116,0,160,4,100,1,124,1,106,5,124, + 0,106,6,161,3,1,0,124,2,83,0,41,2,122,38,67, + 114,101,97,116,101,32,97,110,32,117,110,105,116,105,97,108, + 105,122,101,100,32,101,120,116,101,110,115,105,111,110,32,109, + 111,100,117,108,101,122,38,101,120,116,101,110,115,105,111,110, + 32,109,111,100,117,108,101,32,123,33,114,125,32,108,111,97, + 100,101,100,32,102,114,111,109,32,123,33,114,125,41,7,114, + 134,0,0,0,114,214,0,0,0,114,163,0,0,0,90,14, + 99,114,101,97,116,101,95,100,121,110,97,109,105,99,114,149, + 0,0,0,114,117,0,0,0,114,44,0,0,0,41,3,114, + 119,0,0,0,114,187,0,0,0,114,216,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,114,212,0, + 0,0,70,4,0,0,115,18,0,0,0,0,2,4,1,4, + 0,2,255,4,2,6,1,4,0,4,255,4,2,122,33,69, + 120,116,101,110,115,105,111,110,70,105,108,101,76,111,97,100, + 101,114,46,99,114,101,97,116,101,95,109,111,100,117,108,101, + 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,5,0,0,0,67,0,0,0,115,36,0,0,0,116,0, + 160,1,116,2,106,3,124,1,161,2,1,0,116,0,160,4, + 100,1,124,0,106,5,124,0,106,6,161,3,1,0,100,2, + 83,0,41,3,122,30,73,110,105,116,105,97,108,105,122,101, + 32,97,110,32,101,120,116,101,110,115,105,111,110,32,109,111, + 100,117,108,101,122,40,101,120,116,101,110,115,105,111,110,32, + 109,111,100,117,108,101,32,123,33,114,125,32,101,120,101,99, + 117,116,101,100,32,102,114,111,109,32,123,33,114,125,78,41, + 7,114,134,0,0,0,114,214,0,0,0,114,163,0,0,0, + 90,12,101,120,101,99,95,100,121,110,97,109,105,99,114,149, + 0,0,0,114,117,0,0,0,114,44,0,0,0,114,253,0, + 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,114,217,0,0,0,78,4,0,0,115,10,0,0,0,0, + 2,14,1,6,1,4,0,4,255,122,31,69,120,116,101,110, + 115,105,111,110,70,105,108,101,76,111,97,100,101,114,46,101, + 120,101,99,95,109,111,100,117,108,101,99,2,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,3, + 0,0,0,115,36,0,0,0,116,0,124,0,106,1,131,1, + 100,1,25,0,137,0,116,2,135,0,102,1,100,2,100,3, + 132,8,116,3,68,0,131,1,131,1,83,0,41,4,122,49, + 82,101,116,117,114,110,32,84,114,117,101,32,105,102,32,116, + 104,101,32,101,120,116,101,110,115,105,111,110,32,109,111,100, + 117,108,101,32,105,115,32,97,32,112,97,99,107,97,103,101, + 46,114,39,0,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,4,0,0,0,51,0,0,0,115, + 26,0,0,0,124,0,93,18,125,1,136,0,100,0,124,1, + 23,0,107,2,86,0,1,0,113,2,100,1,83,0,41,2, + 114,209,0,0,0,78,114,3,0,0,0,169,2,114,32,0, + 0,0,218,6,115,117,102,102,105,120,169,1,90,9,102,105, + 108,101,95,110,97,109,101,114,3,0,0,0,114,6,0,0, + 0,218,9,60,103,101,110,101,120,112,114,62,87,4,0,0, + 115,4,0,0,0,4,1,2,255,122,49,69,120,116,101,110, + 115,105,111,110,70,105,108,101,76,111,97,100,101,114,46,105, + 115,95,112,97,99,107,97,103,101,46,60,108,111,99,97,108, + 115,62,46,60,103,101,110,101,120,112,114,62,41,4,114,47, + 0,0,0,114,44,0,0,0,218,3,97,110,121,218,18,69, + 88,84,69,78,83,73,79,78,95,83,85,70,70,73,88,69, + 83,114,219,0,0,0,114,3,0,0,0,114,18,1,0,0, + 114,6,0,0,0,114,182,0,0,0,84,4,0,0,115,8, + 0,0,0,0,2,14,1,12,1,2,255,122,30,69,120,116, + 101,110,115,105,111,110,70,105,108,101,76,111,97,100,101,114, + 46,105,115,95,112,97,99,107,97,103,101,99,2,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0, + 67,0,0,0,115,4,0,0,0,100,1,83,0,41,2,122, + 63,82,101,116,117,114,110,32,78,111,110,101,32,97,115,32, + 97,110,32,101,120,116,101,110,115,105,111,110,32,109,111,100, + 117,108,101,32,99,97,110,110,111,116,32,99,114,101,97,116, + 101,32,97,32,99,111,100,101,32,111,98,106,101,99,116,46, 78,114,3,0,0,0,114,219,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,229,0,0,0,94, - 4,0,0,115,2,0,0,0,0,2,122,30,69,120,116,101, + 114,3,0,0,0,114,6,0,0,0,114,213,0,0,0,90, + 4,0,0,115,2,0,0,0,0,2,122,28,69,120,116,101, 110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46, - 103,101,116,95,115,111,117,114,99,101,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, - 0,0,0,115,6,0,0,0,124,0,106,0,83,0,114,250, - 0,0,0,114,48,0,0,0,114,219,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,179,0,0, - 0,98,4,0,0,115,2,0,0,0,0,3,122,32,69,120, - 116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,101, - 114,46,103,101,116,95,102,105,108,101,110,97,109,101,78,41, - 14,114,125,0,0,0,114,124,0,0,0,114,126,0,0,0, - 114,127,0,0,0,114,209,0,0,0,114,243,0,0,0,114, - 247,0,0,0,114,212,0,0,0,114,217,0,0,0,114,182, - 0,0,0,114,213,0,0,0,114,229,0,0,0,114,136,0, - 0,0,114,179,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,252,0,0,0, - 51,4,0,0,115,22,0,0,0,8,2,4,6,8,4,8, - 4,8,3,8,8,8,6,8,6,8,4,8,4,2,1,114, - 252,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,64,0,0,0,115,104,0, - 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2, - 100,3,132,0,90,4,100,4,100,5,132,0,90,5,100,6, - 100,7,132,0,90,6,100,8,100,9,132,0,90,7,100,10, - 100,11,132,0,90,8,100,12,100,13,132,0,90,9,100,14, - 100,15,132,0,90,10,100,16,100,17,132,0,90,11,100,18, - 100,19,132,0,90,12,100,20,100,21,132,0,90,13,100,22, - 100,23,132,0,90,14,100,24,83,0,41,25,218,14,95,78, - 97,109,101,115,112,97,99,101,80,97,116,104,97,38,1,0, - 0,82,101,112,114,101,115,101,110,116,115,32,97,32,110,97, - 109,101,115,112,97,99,101,32,112,97,99,107,97,103,101,39, - 115,32,112,97,116,104,46,32,32,73,116,32,117,115,101,115, - 32,116,104,101,32,109,111,100,117,108,101,32,110,97,109,101, - 10,32,32,32,32,116,111,32,102,105,110,100,32,105,116,115, - 32,112,97,114,101,110,116,32,109,111,100,117,108,101,44,32, - 97,110,100,32,102,114,111,109,32,116,104,101,114,101,32,105, - 116,32,108,111,111,107,115,32,117,112,32,116,104,101,32,112, - 97,114,101,110,116,39,115,10,32,32,32,32,95,95,112,97, - 116,104,95,95,46,32,32,87,104,101,110,32,116,104,105,115, - 32,99,104,97,110,103,101,115,44,32,116,104,101,32,109,111, - 100,117,108,101,39,115,32,111,119,110,32,112,97,116,104,32, - 105,115,32,114,101,99,111,109,112,117,116,101,100,44,10,32, - 32,32,32,117,115,105,110,103,32,112,97,116,104,95,102,105, - 110,100,101,114,46,32,32,70,111,114,32,116,111,112,45,108, - 101,118,101,108,32,109,111,100,117,108,101,115,44,32,116,104, - 101,32,112,97,114,101,110,116,32,109,111,100,117,108,101,39, - 115,32,112,97,116,104,10,32,32,32,32,105,115,32,115,121, - 115,46,112,97,116,104,46,99,4,0,0,0,0,0,0,0, - 0,0,0,0,4,0,0,0,3,0,0,0,67,0,0,0, - 115,36,0,0,0,124,1,124,0,95,0,124,2,124,0,95, - 1,116,2,124,0,160,3,161,0,131,1,124,0,95,4,124, - 3,124,0,95,5,100,0,83,0,114,110,0,0,0,41,6, - 218,5,95,110,97,109,101,218,5,95,112,97,116,104,114,112, - 0,0,0,218,16,95,103,101,116,95,112,97,114,101,110,116, - 95,112,97,116,104,218,17,95,108,97,115,116,95,112,97,114, - 101,110,116,95,112,97,116,104,218,12,95,112,97,116,104,95, - 102,105,110,100,101,114,169,4,114,119,0,0,0,114,117,0, - 0,0,114,44,0,0,0,90,11,112,97,116,104,95,102,105, - 110,100,101,114,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,114,209,0,0,0,111,4,0,0,115,8,0,0, - 0,0,1,6,1,6,1,14,1,122,23,95,78,97,109,101, - 115,112,97,99,101,80,97,116,104,46,95,95,105,110,105,116, - 95,95,99,1,0,0,0,0,0,0,0,0,0,0,0,4, - 0,0,0,3,0,0,0,67,0,0,0,115,38,0,0,0, - 124,0,106,0,160,1,100,1,161,1,92,3,125,1,125,2, - 125,3,124,2,100,2,107,2,114,30,100,3,83,0,124,1, - 100,4,102,2,83,0,41,5,122,62,82,101,116,117,114,110, - 115,32,97,32,116,117,112,108,101,32,111,102,32,40,112,97, - 114,101,110,116,45,109,111,100,117,108,101,45,110,97,109,101, - 44,32,112,97,114,101,110,116,45,112,97,116,104,45,97,116, - 116,114,45,110,97,109,101,41,114,71,0,0,0,114,40,0, - 0,0,41,2,114,8,0,0,0,114,44,0,0,0,90,8, - 95,95,112,97,116,104,95,95,41,2,114,23,1,0,0,114, - 41,0,0,0,41,4,114,119,0,0,0,114,14,1,0,0, - 218,3,100,111,116,90,2,109,101,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,23,95,102,105,110,100,95, - 112,97,114,101,110,116,95,112,97,116,104,95,110,97,109,101, - 115,117,4,0,0,115,8,0,0,0,0,2,18,1,8,2, - 4,3,122,38,95,78,97,109,101,115,112,97,99,101,80,97, - 116,104,46,95,102,105,110,100,95,112,97,114,101,110,116,95, - 112,97,116,104,95,110,97,109,101,115,99,1,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,67, - 0,0,0,115,28,0,0,0,124,0,160,0,161,0,92,2, - 125,1,125,2,116,1,116,2,106,3,124,1,25,0,124,2, - 131,2,83,0,114,110,0,0,0,41,4,114,30,1,0,0, - 114,130,0,0,0,114,8,0,0,0,218,7,109,111,100,117, - 108,101,115,41,3,114,119,0,0,0,90,18,112,97,114,101, - 110,116,95,109,111,100,117,108,101,95,110,97,109,101,90,14, - 112,97,116,104,95,97,116,116,114,95,110,97,109,101,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,25,1, - 0,0,127,4,0,0,115,4,0,0,0,0,1,12,1,122, - 31,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46, - 95,103,101,116,95,112,97,114,101,110,116,95,112,97,116,104, - 99,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,4,0,0,0,67,0,0,0,115,80,0,0,0,116,0, - 124,0,160,1,161,0,131,1,125,1,124,1,124,0,106,2, - 107,3,114,74,124,0,160,3,124,0,106,4,124,1,161,2, - 125,2,124,2,100,0,107,9,114,68,124,2,106,5,100,0, - 107,8,114,68,124,2,106,6,114,68,124,2,106,6,124,0, - 95,7,124,1,124,0,95,2,124,0,106,7,83,0,114,110, - 0,0,0,41,8,114,112,0,0,0,114,25,1,0,0,114, - 26,1,0,0,114,27,1,0,0,114,23,1,0,0,114,140, - 0,0,0,114,178,0,0,0,114,24,1,0,0,41,3,114, - 119,0,0,0,90,11,112,97,114,101,110,116,95,112,97,116, - 104,114,187,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,12,95,114,101,99,97,108,99,117,108, - 97,116,101,131,4,0,0,115,16,0,0,0,0,2,12,1, - 10,1,14,3,18,1,6,1,8,1,6,1,122,27,95,78, - 97,109,101,115,112,97,99,101,80,97,116,104,46,95,114,101, - 99,97,108,99,117,108,97,116,101,99,1,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,0, - 0,0,115,12,0,0,0,116,0,124,0,160,1,161,0,131, - 1,83,0,114,110,0,0,0,41,2,114,6,1,0,0,114, - 32,1,0,0,114,246,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,8,95,95,105,116,101,114, - 95,95,144,4,0,0,115,2,0,0,0,0,1,122,23,95, - 78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,95, - 105,116,101,114,95,95,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,2,0,0,0,67,0,0,0,115, - 12,0,0,0,124,0,160,0,161,0,124,1,25,0,83,0, - 114,110,0,0,0,169,1,114,32,1,0,0,41,2,114,119, - 0,0,0,218,5,105,110,100,101,120,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,11,95,95,103,101,116, - 105,116,101,109,95,95,147,4,0,0,115,2,0,0,0,0, - 1,122,26,95,78,97,109,101,115,112,97,99,101,80,97,116, - 104,46,95,95,103,101,116,105,116,101,109,95,95,99,3,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0, - 0,0,67,0,0,0,115,14,0,0,0,124,2,124,0,106, - 0,124,1,60,0,100,0,83,0,114,110,0,0,0,41,1, - 114,24,1,0,0,41,3,114,119,0,0,0,114,35,1,0, - 0,114,44,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,11,95,95,115,101,116,105,116,101,109, - 95,95,150,4,0,0,115,2,0,0,0,0,1,122,26,95, - 78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,95, - 115,101,116,105,116,101,109,95,95,99,1,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,0, - 0,0,115,12,0,0,0,116,0,124,0,160,1,161,0,131, - 1,83,0,114,110,0,0,0,41,2,114,22,0,0,0,114, - 32,1,0,0,114,246,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,7,95,95,108,101,110,95, - 95,153,4,0,0,115,2,0,0,0,0,1,122,22,95,78, - 97,109,101,115,112,97,99,101,80,97,116,104,46,95,95,108, - 101,110,95,95,99,1,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,3,0,0,0,67,0,0,0,115,12,0, - 0,0,100,1,160,0,124,0,106,1,161,1,83,0,41,2, - 78,122,20,95,78,97,109,101,115,112,97,99,101,80,97,116, - 104,40,123,33,114,125,41,41,2,114,62,0,0,0,114,24, - 1,0,0,114,246,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,218,8,95,95,114,101,112,114,95, - 95,156,4,0,0,115,2,0,0,0,0,1,122,23,95,78, - 97,109,101,115,112,97,99,101,80,97,116,104,46,95,95,114, - 101,112,114,95,95,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,12, - 0,0,0,124,1,124,0,160,0,161,0,107,6,83,0,114, - 110,0,0,0,114,34,1,0,0,169,2,114,119,0,0,0, - 218,4,105,116,101,109,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,12,95,95,99,111,110,116,97,105,110, - 115,95,95,159,4,0,0,115,2,0,0,0,0,1,122,27, - 95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,95, - 95,99,111,110,116,97,105,110,115,95,95,99,2,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, - 67,0,0,0,115,16,0,0,0,124,0,106,0,160,1,124, - 1,161,1,1,0,100,0,83,0,114,110,0,0,0,41,2, - 114,24,1,0,0,114,186,0,0,0,114,40,1,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,186, - 0,0,0,162,4,0,0,115,2,0,0,0,0,1,122,21, - 95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,97, - 112,112,101,110,100,78,41,15,114,125,0,0,0,114,124,0, - 0,0,114,126,0,0,0,114,127,0,0,0,114,209,0,0, - 0,114,30,1,0,0,114,25,1,0,0,114,32,1,0,0, - 114,33,1,0,0,114,36,1,0,0,114,37,1,0,0,114, - 38,1,0,0,114,39,1,0,0,114,42,1,0,0,114,186, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,22,1,0,0,104,4,0,0, - 115,24,0,0,0,8,1,4,6,8,6,8,10,8,4,8, - 13,8,3,8,3,8,3,8,3,8,3,8,3,114,22,1, - 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,64,0,0,0,115,80,0,0,0, - 101,0,90,1,100,0,90,2,100,1,100,2,132,0,90,3, - 101,4,100,3,100,4,132,0,131,1,90,5,100,5,100,6, - 132,0,90,6,100,7,100,8,132,0,90,7,100,9,100,10, - 132,0,90,8,100,11,100,12,132,0,90,9,100,13,100,14, - 132,0,90,10,100,15,100,16,132,0,90,11,100,17,83,0, - 41,18,218,16,95,78,97,109,101,115,112,97,99,101,76,111, - 97,100,101,114,99,4,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,4,0,0,0,67,0,0,0,115,18,0, - 0,0,116,0,124,1,124,2,124,3,131,3,124,0,95,1, - 100,0,83,0,114,110,0,0,0,41,2,114,22,1,0,0, - 114,24,1,0,0,114,28,1,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,209,0,0,0,168,4, - 0,0,115,2,0,0,0,0,1,122,25,95,78,97,109,101, - 115,112,97,99,101,76,111,97,100,101,114,46,95,95,105,110, - 105,116,95,95,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,3,0,0,0,67,0,0,0,115,12,0, - 0,0,100,1,160,0,124,1,106,1,161,1,83,0,41,2, - 122,115,82,101,116,117,114,110,32,114,101,112,114,32,102,111, - 114,32,116,104,101,32,109,111,100,117,108,101,46,10,10,32, - 32,32,32,32,32,32,32,84,104,101,32,109,101,116,104,111, - 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46, - 32,32,84,104,101,32,105,109,112,111,114,116,32,109,97,99, - 104,105,110,101,114,121,32,100,111,101,115,32,116,104,101,32, - 106,111,98,32,105,116,115,101,108,102,46,10,10,32,32,32, - 32,32,32,32,32,122,25,60,109,111,100,117,108,101,32,123, - 33,114,125,32,40,110,97,109,101,115,112,97,99,101,41,62, - 41,2,114,62,0,0,0,114,125,0,0,0,41,2,114,193, - 0,0,0,114,216,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,218,11,109,111,100,117,108,101,95, - 114,101,112,114,171,4,0,0,115,2,0,0,0,0,7,122, - 28,95,78,97,109,101,115,112,97,99,101,76,111,97,100,101, - 114,46,109,111,100,117,108,101,95,114,101,112,114,99,2,0, + 103,101,116,95,99,111,100,101,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, + 0,115,4,0,0,0,100,1,83,0,41,2,122,53,82,101, + 116,117,114,110,32,78,111,110,101,32,97,115,32,101,120,116, + 101,110,115,105,111,110,32,109,111,100,117,108,101,115,32,104, + 97,118,101,32,110,111,32,115,111,117,114,99,101,32,99,111, + 100,101,46,78,114,3,0,0,0,114,219,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,114,229,0, + 0,0,94,4,0,0,115,2,0,0,0,0,2,122,30,69, + 120,116,101,110,115,105,111,110,70,105,108,101,76,111,97,100, + 101,114,46,103,101,116,95,115,111,117,114,99,101,99,2,0, 0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0, - 0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,41, - 2,78,84,114,3,0,0,0,114,219,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,182,0,0, - 0,180,4,0,0,115,2,0,0,0,0,1,122,27,95,78, - 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,105, - 115,95,112,97,99,107,97,103,101,99,2,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,1,0,0,0,67,0, - 0,0,115,4,0,0,0,100,1,83,0,41,2,78,114,40, - 0,0,0,114,3,0,0,0,114,219,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,229,0,0, - 0,183,4,0,0,115,2,0,0,0,0,1,122,27,95,78, - 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,103, - 101,116,95,115,111,117,114,99,101,99,2,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,6,0,0,0,67,0, - 0,0,115,16,0,0,0,116,0,100,1,100,2,100,3,100, - 4,100,5,141,4,83,0,41,6,78,114,40,0,0,0,122, - 8,60,115,116,114,105,110,103,62,114,215,0,0,0,84,41, - 1,114,231,0,0,0,41,1,114,232,0,0,0,114,219,0, + 0,0,67,0,0,0,115,6,0,0,0,124,0,106,0,83, + 0,114,250,0,0,0,114,48,0,0,0,114,219,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, + 179,0,0,0,98,4,0,0,115,2,0,0,0,0,3,122, + 32,69,120,116,101,110,115,105,111,110,70,105,108,101,76,111, + 97,100,101,114,46,103,101,116,95,102,105,108,101,110,97,109, + 101,78,41,14,114,125,0,0,0,114,124,0,0,0,114,126, + 0,0,0,114,127,0,0,0,114,209,0,0,0,114,243,0, + 0,0,114,247,0,0,0,114,212,0,0,0,114,217,0,0, + 0,114,182,0,0,0,114,213,0,0,0,114,229,0,0,0, + 114,136,0,0,0,114,179,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,252, + 0,0,0,51,4,0,0,115,22,0,0,0,8,2,4,6, + 8,4,8,4,8,3,8,8,8,6,8,6,8,4,8,4, + 2,1,114,252,0,0,0,99,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,64,0,0,0, + 115,104,0,0,0,101,0,90,1,100,0,90,2,100,1,90, + 3,100,2,100,3,132,0,90,4,100,4,100,5,132,0,90, + 5,100,6,100,7,132,0,90,6,100,8,100,9,132,0,90, + 7,100,10,100,11,132,0,90,8,100,12,100,13,132,0,90, + 9,100,14,100,15,132,0,90,10,100,16,100,17,132,0,90, + 11,100,18,100,19,132,0,90,12,100,20,100,21,132,0,90, + 13,100,22,100,23,132,0,90,14,100,24,83,0,41,25,218, + 14,95,78,97,109,101,115,112,97,99,101,80,97,116,104,97, + 38,1,0,0,82,101,112,114,101,115,101,110,116,115,32,97, + 32,110,97,109,101,115,112,97,99,101,32,112,97,99,107,97, + 103,101,39,115,32,112,97,116,104,46,32,32,73,116,32,117, + 115,101,115,32,116,104,101,32,109,111,100,117,108,101,32,110, + 97,109,101,10,32,32,32,32,116,111,32,102,105,110,100,32, + 105,116,115,32,112,97,114,101,110,116,32,109,111,100,117,108, + 101,44,32,97,110,100,32,102,114,111,109,32,116,104,101,114, + 101,32,105,116,32,108,111,111,107,115,32,117,112,32,116,104, + 101,32,112,97,114,101,110,116,39,115,10,32,32,32,32,95, + 95,112,97,116,104,95,95,46,32,32,87,104,101,110,32,116, + 104,105,115,32,99,104,97,110,103,101,115,44,32,116,104,101, + 32,109,111,100,117,108,101,39,115,32,111,119,110,32,112,97, + 116,104,32,105,115,32,114,101,99,111,109,112,117,116,101,100, + 44,10,32,32,32,32,117,115,105,110,103,32,112,97,116,104, + 95,102,105,110,100,101,114,46,32,32,70,111,114,32,116,111, + 112,45,108,101,118,101,108,32,109,111,100,117,108,101,115,44, + 32,116,104,101,32,112,97,114,101,110,116,32,109,111,100,117, + 108,101,39,115,32,112,97,116,104,10,32,32,32,32,105,115, + 32,115,121,115,46,112,97,116,104,46,99,4,0,0,0,0, + 0,0,0,0,0,0,0,4,0,0,0,3,0,0,0,67, + 0,0,0,115,36,0,0,0,124,1,124,0,95,0,124,2, + 124,0,95,1,116,2,124,0,160,3,161,0,131,1,124,0, + 95,4,124,3,124,0,95,5,100,0,83,0,114,110,0,0, + 0,41,6,218,5,95,110,97,109,101,218,5,95,112,97,116, + 104,114,112,0,0,0,218,16,95,103,101,116,95,112,97,114, + 101,110,116,95,112,97,116,104,218,17,95,108,97,115,116,95, + 112,97,114,101,110,116,95,112,97,116,104,218,12,95,112,97, + 116,104,95,102,105,110,100,101,114,169,4,114,119,0,0,0, + 114,117,0,0,0,114,44,0,0,0,90,11,112,97,116,104, + 95,102,105,110,100,101,114,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,114,209,0,0,0,111,4,0,0,115, + 8,0,0,0,0,1,6,1,6,1,14,1,122,23,95,78, + 97,109,101,115,112,97,99,101,80,97,116,104,46,95,95,105, + 110,105,116,95,95,99,1,0,0,0,0,0,0,0,0,0, + 0,0,4,0,0,0,3,0,0,0,67,0,0,0,115,38, + 0,0,0,124,0,106,0,160,1,100,1,161,1,92,3,125, + 1,125,2,125,3,124,2,100,2,107,2,114,30,100,3,83, + 0,124,1,100,4,102,2,83,0,41,5,122,62,82,101,116, + 117,114,110,115,32,97,32,116,117,112,108,101,32,111,102,32, + 40,112,97,114,101,110,116,45,109,111,100,117,108,101,45,110, + 97,109,101,44,32,112,97,114,101,110,116,45,112,97,116,104, + 45,97,116,116,114,45,110,97,109,101,41,114,71,0,0,0, + 114,40,0,0,0,41,2,114,8,0,0,0,114,44,0,0, + 0,90,8,95,95,112,97,116,104,95,95,41,2,114,23,1, + 0,0,114,41,0,0,0,41,4,114,119,0,0,0,114,14, + 1,0,0,218,3,100,111,116,90,2,109,101,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,218,23,95,102,105, + 110,100,95,112,97,114,101,110,116,95,112,97,116,104,95,110, + 97,109,101,115,117,4,0,0,115,8,0,0,0,0,2,18, + 1,8,2,4,3,122,38,95,78,97,109,101,115,112,97,99, + 101,80,97,116,104,46,95,102,105,110,100,95,112,97,114,101, + 110,116,95,112,97,116,104,95,110,97,109,101,115,99,1,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0, + 0,0,67,0,0,0,115,28,0,0,0,124,0,160,0,161, + 0,92,2,125,1,125,2,116,1,116,2,106,3,124,1,25, + 0,124,2,131,2,83,0,114,110,0,0,0,41,4,114,30, + 1,0,0,114,130,0,0,0,114,8,0,0,0,218,7,109, + 111,100,117,108,101,115,41,3,114,119,0,0,0,90,18,112, + 97,114,101,110,116,95,109,111,100,117,108,101,95,110,97,109, + 101,90,14,112,97,116,104,95,97,116,116,114,95,110,97,109, + 101,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 114,25,1,0,0,127,4,0,0,115,4,0,0,0,0,1, + 12,1,122,31,95,78,97,109,101,115,112,97,99,101,80,97, + 116,104,46,95,103,101,116,95,112,97,114,101,110,116,95,112, + 97,116,104,99,1,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,4,0,0,0,67,0,0,0,115,80,0,0, + 0,116,0,124,0,160,1,161,0,131,1,125,1,124,1,124, + 0,106,2,107,3,114,74,124,0,160,3,124,0,106,4,124, + 1,161,2,125,2,124,2,100,0,107,9,114,68,124,2,106, + 5,100,0,107,8,114,68,124,2,106,6,114,68,124,2,106, + 6,124,0,95,7,124,1,124,0,95,2,124,0,106,7,83, + 0,114,110,0,0,0,41,8,114,112,0,0,0,114,25,1, + 0,0,114,26,1,0,0,114,27,1,0,0,114,23,1,0, + 0,114,140,0,0,0,114,178,0,0,0,114,24,1,0,0, + 41,3,114,119,0,0,0,90,11,112,97,114,101,110,116,95, + 112,97,116,104,114,187,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,12,95,114,101,99,97,108, + 99,117,108,97,116,101,131,4,0,0,115,16,0,0,0,0, + 2,12,1,10,1,14,3,18,1,6,1,8,1,6,1,122, + 27,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46, + 95,114,101,99,97,108,99,117,108,97,116,101,99,1,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0, + 0,67,0,0,0,115,12,0,0,0,116,0,124,0,160,1, + 161,0,131,1,83,0,114,110,0,0,0,41,2,114,6,1, + 0,0,114,32,1,0,0,114,246,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,218,8,95,95,105, + 116,101,114,95,95,144,4,0,0,115,2,0,0,0,0,1, + 122,23,95,78,97,109,101,115,112,97,99,101,80,97,116,104, + 46,95,95,105,116,101,114,95,95,99,2,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,2,0,0,0,67,0, + 0,0,115,12,0,0,0,124,0,160,0,161,0,124,1,25, + 0,83,0,114,110,0,0,0,169,1,114,32,1,0,0,41, + 2,114,119,0,0,0,218,5,105,110,100,101,120,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,218,11,95,95, + 103,101,116,105,116,101,109,95,95,147,4,0,0,115,2,0, + 0,0,0,1,122,26,95,78,97,109,101,115,112,97,99,101, + 80,97,116,104,46,95,95,103,101,116,105,116,101,109,95,95, + 99,3,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,3,0,0,0,67,0,0,0,115,14,0,0,0,124,2, + 124,0,106,0,124,1,60,0,100,0,83,0,114,110,0,0, + 0,41,1,114,24,1,0,0,41,3,114,119,0,0,0,114, + 35,1,0,0,114,44,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,11,95,95,115,101,116,105, + 116,101,109,95,95,150,4,0,0,115,2,0,0,0,0,1, + 122,26,95,78,97,109,101,115,112,97,99,101,80,97,116,104, + 46,95,95,115,101,116,105,116,101,109,95,95,99,1,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0, + 0,67,0,0,0,115,12,0,0,0,116,0,124,0,160,1, + 161,0,131,1,83,0,114,110,0,0,0,41,2,114,22,0, + 0,0,114,32,1,0,0,114,246,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,218,7,95,95,108, + 101,110,95,95,153,4,0,0,115,2,0,0,0,0,1,122, + 22,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46, + 95,95,108,101,110,95,95,99,1,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,0, + 115,12,0,0,0,100,1,160,0,124,0,106,1,161,1,83, + 0,41,2,78,122,20,95,78,97,109,101,115,112,97,99,101, + 80,97,116,104,40,123,33,114,125,41,41,2,114,62,0,0, + 0,114,24,1,0,0,114,246,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,218,8,95,95,114,101, + 112,114,95,95,156,4,0,0,115,2,0,0,0,0,1,122, + 23,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46, + 95,95,114,101,112,114,95,95,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,3,0,0,0,67,0,0, + 0,115,12,0,0,0,124,1,124,0,160,0,161,0,107,6, + 83,0,114,110,0,0,0,114,34,1,0,0,169,2,114,119, + 0,0,0,218,4,105,116,101,109,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,12,95,95,99,111,110,116, + 97,105,110,115,95,95,159,4,0,0,115,2,0,0,0,0, + 1,122,27,95,78,97,109,101,115,112,97,99,101,80,97,116, + 104,46,95,95,99,111,110,116,97,105,110,115,95,95,99,2, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3, + 0,0,0,67,0,0,0,115,16,0,0,0,124,0,106,0, + 160,1,124,1,161,1,1,0,100,0,83,0,114,110,0,0, + 0,41,2,114,24,1,0,0,114,186,0,0,0,114,40,1, 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,213,0,0,0,186,4,0,0,115,2,0,0,0,0, - 1,122,25,95,78,97,109,101,115,112,97,99,101,76,111,97, - 100,101,114,46,103,101,116,95,99,111,100,101,99,2,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0, - 0,67,0,0,0,115,4,0,0,0,100,1,83,0,114,210, - 0,0,0,114,3,0,0,0,114,211,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,212,0,0, - 0,189,4,0,0,115,2,0,0,0,0,1,122,30,95,78, - 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,99, - 114,101,97,116,101,95,109,111,100,117,108,101,99,2,0,0, + 0,114,186,0,0,0,162,4,0,0,115,2,0,0,0,0, + 1,122,21,95,78,97,109,101,115,112,97,99,101,80,97,116, + 104,46,97,112,112,101,110,100,78,41,15,114,125,0,0,0, + 114,124,0,0,0,114,126,0,0,0,114,127,0,0,0,114, + 209,0,0,0,114,30,1,0,0,114,25,1,0,0,114,32, + 1,0,0,114,33,1,0,0,114,36,1,0,0,114,37,1, + 0,0,114,38,1,0,0,114,39,1,0,0,114,42,1,0, + 0,114,186,0,0,0,114,3,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,22,1,0,0,104, + 4,0,0,115,24,0,0,0,8,1,4,6,8,6,8,10, + 8,4,8,13,8,3,8,3,8,3,8,3,8,3,8,3, + 114,22,1,0,0,99,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,64,0,0,0,115,80, + 0,0,0,101,0,90,1,100,0,90,2,100,1,100,2,132, + 0,90,3,101,4,100,3,100,4,132,0,131,1,90,5,100, + 5,100,6,132,0,90,6,100,7,100,8,132,0,90,7,100, + 9,100,10,132,0,90,8,100,11,100,12,132,0,90,9,100, + 13,100,14,132,0,90,10,100,15,100,16,132,0,90,11,100, + 17,83,0,41,18,218,16,95,78,97,109,101,115,112,97,99, + 101,76,111,97,100,101,114,99,4,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,4,0,0,0,67,0,0,0, + 115,18,0,0,0,116,0,124,1,124,2,124,3,131,3,124, + 0,95,1,100,0,83,0,114,110,0,0,0,41,2,114,22, + 1,0,0,114,24,1,0,0,114,28,1,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,209,0,0, + 0,168,4,0,0,115,2,0,0,0,0,1,122,25,95,78, + 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,95, + 95,105,110,105,116,95,95,99,2,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,3,0,0,0,67,0,0,0, + 115,12,0,0,0,100,1,160,0,124,1,106,1,161,1,83, + 0,41,2,122,115,82,101,116,117,114,110,32,114,101,112,114, + 32,102,111,114,32,116,104,101,32,109,111,100,117,108,101,46, + 10,10,32,32,32,32,32,32,32,32,84,104,101,32,109,101, + 116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116, + 101,100,46,32,32,84,104,101,32,105,109,112,111,114,116,32, + 109,97,99,104,105,110,101,114,121,32,100,111,101,115,32,116, + 104,101,32,106,111,98,32,105,116,115,101,108,102,46,10,10, + 32,32,32,32,32,32,32,32,122,25,60,109,111,100,117,108, + 101,32,123,33,114,125,32,40,110,97,109,101,115,112,97,99, + 101,41,62,41,2,114,62,0,0,0,114,125,0,0,0,41, + 2,114,193,0,0,0,114,216,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,218,11,109,111,100,117, + 108,101,95,114,101,112,114,171,4,0,0,115,2,0,0,0, + 0,7,122,28,95,78,97,109,101,115,112,97,99,101,76,111, + 97,100,101,114,46,109,111,100,117,108,101,95,114,101,112,114, + 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,1, + 83,0,41,2,78,84,114,3,0,0,0,114,219,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, + 182,0,0,0,180,4,0,0,115,2,0,0,0,0,1,122, + 27,95,78,97,109,101,115,112,97,99,101,76,111,97,100,101, + 114,46,105,115,95,112,97,99,107,97,103,101,99,2,0,0, 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0, - 0,67,0,0,0,115,4,0,0,0,100,0,83,0,114,110, - 0,0,0,114,3,0,0,0,114,253,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,217,0,0, - 0,192,4,0,0,115,2,0,0,0,0,1,122,28,95,78, - 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,101, - 120,101,99,95,109,111,100,117,108,101,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,67, - 0,0,0,115,26,0,0,0,116,0,160,1,100,1,124,0, - 106,2,161,2,1,0,116,0,160,3,124,0,124,1,161,2, - 83,0,41,2,122,98,76,111,97,100,32,97,32,110,97,109, - 101,115,112,97,99,101,32,109,111,100,117,108,101,46,10,10, - 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, - 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, - 100,46,32,32,85,115,101,32,101,120,101,99,95,109,111,100, - 117,108,101,40,41,32,105,110,115,116,101,97,100,46,10,10, - 32,32,32,32,32,32,32,32,122,38,110,97,109,101,115,112, - 97,99,101,32,109,111,100,117,108,101,32,108,111,97,100,101, - 100,32,119,105,116,104,32,112,97,116,104,32,123,33,114,125, - 41,4,114,134,0,0,0,114,149,0,0,0,114,24,1,0, - 0,114,218,0,0,0,114,219,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,220,0,0,0,195, - 4,0,0,115,8,0,0,0,0,7,6,1,4,255,4,2, - 122,28,95,78,97,109,101,115,112,97,99,101,76,111,97,100, - 101,114,46,108,111,97,100,95,109,111,100,117,108,101,78,41, - 12,114,125,0,0,0,114,124,0,0,0,114,126,0,0,0, - 114,209,0,0,0,114,207,0,0,0,114,44,1,0,0,114, - 182,0,0,0,114,229,0,0,0,114,213,0,0,0,114,212, - 0,0,0,114,217,0,0,0,114,220,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,43,1,0,0,167,4,0,0,115,18,0,0,0,8, - 1,8,3,2,1,10,8,8,3,8,3,8,3,8,3,8, - 3,114,43,1,0,0,99,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,4,0,0,0,64,0,0,0,115, - 172,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, - 101,4,100,2,100,3,132,0,131,1,90,5,101,4,100,4, - 100,5,132,0,131,1,90,6,101,4,100,6,100,7,132,0, - 131,1,90,7,101,4,100,8,100,9,132,0,131,1,90,8, - 101,4,100,28,100,11,100,12,132,1,131,1,90,9,101,4, - 100,29,100,13,100,14,132,1,131,1,90,10,101,4,100,30, - 100,15,100,16,132,1,131,1,90,11,100,17,90,12,101,4, - 100,31,100,18,100,19,132,1,131,1,90,13,101,4,100,20, - 100,21,132,0,131,1,90,14,101,15,100,22,100,23,132,0, - 131,1,90,16,101,4,100,24,100,25,132,0,131,1,90,17, - 101,4,100,26,100,27,132,0,131,1,90,18,100,10,83,0, - 41,32,218,10,80,97,116,104,70,105,110,100,101,114,122,62, - 77,101,116,97,32,112,97,116,104,32,102,105,110,100,101,114, - 32,102,111,114,32,115,121,115,46,112,97,116,104,32,97,110, - 100,32,112,97,99,107,97,103,101,32,95,95,112,97,116,104, - 95,95,32,97,116,116,114,105,98,117,116,101,115,46,99,1, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,4, - 0,0,0,67,0,0,0,115,64,0,0,0,116,0,116,1, - 106,2,160,3,161,0,131,1,68,0,93,44,92,2,125,1, - 125,2,124,2,100,1,107,8,114,40,116,1,106,2,124,1, - 61,0,113,14,116,4,124,2,100,2,131,2,114,14,124,2, - 160,5,161,0,1,0,113,14,100,1,83,0,41,3,122,125, - 67,97,108,108,32,116,104,101,32,105,110,118,97,108,105,100, - 97,116,101,95,99,97,99,104,101,115,40,41,32,109,101,116, - 104,111,100,32,111,110,32,97,108,108,32,112,97,116,104,32, - 101,110,116,114,121,32,102,105,110,100,101,114,115,10,32,32, - 32,32,32,32,32,32,115,116,111,114,101,100,32,105,110,32, - 115,121,115,46,112,97,116,104,95,105,109,112,111,114,116,101, - 114,95,99,97,99,104,101,115,32,40,119,104,101,114,101,32, - 105,109,112,108,101,109,101,110,116,101,100,41,46,78,218,17, - 105,110,118,97,108,105,100,97,116,101,95,99,97,99,104,101, - 115,41,6,218,4,108,105,115,116,114,8,0,0,0,218,19, - 112,97,116,104,95,105,109,112,111,114,116,101,114,95,99,97, - 99,104,101,218,5,105,116,101,109,115,114,128,0,0,0,114, - 46,1,0,0,41,3,114,193,0,0,0,114,117,0,0,0, - 218,6,102,105,110,100,101,114,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,46,1,0,0,213,4,0,0, - 115,10,0,0,0,0,4,22,1,8,1,10,1,10,1,122, - 28,80,97,116,104,70,105,110,100,101,114,46,105,110,118,97, - 108,105,100,97,116,101,95,99,97,99,104,101,115,99,2,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,9,0, - 0,0,67,0,0,0,115,84,0,0,0,116,0,106,1,100, - 1,107,9,114,28,116,0,106,1,115,28,116,2,160,3,100, - 2,116,4,161,2,1,0,116,0,106,1,68,0,93,44,125, - 2,122,14,124,2,124,1,131,1,87,0,2,0,1,0,83, - 0,4,0,116,5,107,10,114,76,1,0,1,0,1,0,89, - 0,113,34,89,0,113,34,88,0,113,34,100,1,83,0,41, - 3,122,46,83,101,97,114,99,104,32,115,121,115,46,112,97, - 116,104,95,104,111,111,107,115,32,102,111,114,32,97,32,102, - 105,110,100,101,114,32,102,111,114,32,39,112,97,116,104,39, - 46,78,122,23,115,121,115,46,112,97,116,104,95,104,111,111, - 107,115,32,105,115,32,101,109,112,116,121,41,6,114,8,0, - 0,0,218,10,112,97,116,104,95,104,111,111,107,115,114,75, - 0,0,0,114,76,0,0,0,114,138,0,0,0,114,118,0, - 0,0,41,3,114,193,0,0,0,114,44,0,0,0,90,4, - 104,111,111,107,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,218,11,95,112,97,116,104,95,104,111,111,107,115, - 223,4,0,0,115,16,0,0,0,0,3,16,1,12,1,10, - 1,2,1,14,1,14,1,12,2,122,22,80,97,116,104,70, - 105,110,100,101,114,46,95,112,97,116,104,95,104,111,111,107, - 115,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,8,0,0,0,67,0,0,0,115,104,0,0,0,124, - 1,100,1,107,2,114,44,122,12,116,0,160,1,161,0,125, - 1,87,0,110,22,4,0,116,2,107,10,114,42,1,0,1, - 0,1,0,89,0,100,2,83,0,88,0,122,14,116,3,106, - 4,124,1,25,0,125,2,87,0,110,40,4,0,116,5,107, - 10,114,98,1,0,1,0,1,0,124,0,160,6,124,1,161, - 1,125,2,124,2,116,3,106,4,124,1,60,0,89,0,110, - 2,88,0,124,2,83,0,41,3,122,210,71,101,116,32,116, - 104,101,32,102,105,110,100,101,114,32,102,111,114,32,116,104, - 101,32,112,97,116,104,32,101,110,116,114,121,32,102,114,111, - 109,32,115,121,115,46,112,97,116,104,95,105,109,112,111,114, - 116,101,114,95,99,97,99,104,101,46,10,10,32,32,32,32, - 32,32,32,32,73,102,32,116,104,101,32,112,97,116,104,32, - 101,110,116,114,121,32,105,115,32,110,111,116,32,105,110,32, - 116,104,101,32,99,97,99,104,101,44,32,102,105,110,100,32, - 116,104,101,32,97,112,112,114,111,112,114,105,97,116,101,32, - 102,105,110,100,101,114,10,32,32,32,32,32,32,32,32,97, - 110,100,32,99,97,99,104,101,32,105,116,46,32,73,102,32, - 110,111,32,102,105,110,100,101,114,32,105,115,32,97,118,97, - 105,108,97,98,108,101,44,32,115,116,111,114,101,32,78,111, - 110,101,46,10,10,32,32,32,32,32,32,32,32,114,40,0, - 0,0,78,41,7,114,2,0,0,0,114,55,0,0,0,114, - 3,1,0,0,114,8,0,0,0,114,48,1,0,0,218,8, - 75,101,121,69,114,114,111,114,114,52,1,0,0,41,3,114, - 193,0,0,0,114,44,0,0,0,114,50,1,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,218,20,95, - 112,97,116,104,95,105,109,112,111,114,116,101,114,95,99,97, - 99,104,101,236,4,0,0,115,22,0,0,0,0,8,8,1, - 2,1,12,1,14,3,8,1,2,1,14,1,14,1,10,1, - 16,1,122,31,80,97,116,104,70,105,110,100,101,114,46,95, - 112,97,116,104,95,105,109,112,111,114,116,101,114,95,99,97, - 99,104,101,99,3,0,0,0,0,0,0,0,0,0,0,0, - 6,0,0,0,4,0,0,0,67,0,0,0,115,82,0,0, - 0,116,0,124,2,100,1,131,2,114,26,124,2,160,1,124, - 1,161,1,92,2,125,3,125,4,110,14,124,2,160,2,124, - 1,161,1,125,3,103,0,125,4,124,3,100,0,107,9,114, - 60,116,3,160,4,124,1,124,3,161,2,83,0,116,3,160, - 5,124,1,100,0,161,2,125,5,124,4,124,5,95,6,124, - 5,83,0,41,2,78,114,137,0,0,0,41,7,114,128,0, - 0,0,114,137,0,0,0,114,206,0,0,0,114,134,0,0, - 0,114,201,0,0,0,114,183,0,0,0,114,178,0,0,0, - 41,6,114,193,0,0,0,114,139,0,0,0,114,50,1,0, - 0,114,140,0,0,0,114,141,0,0,0,114,187,0,0,0, + 0,67,0,0,0,115,4,0,0,0,100,1,83,0,41,2, + 78,114,40,0,0,0,114,3,0,0,0,114,219,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, + 229,0,0,0,183,4,0,0,115,2,0,0,0,0,1,122, + 27,95,78,97,109,101,115,112,97,99,101,76,111,97,100,101, + 114,46,103,101,116,95,115,111,117,114,99,101,99,2,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,6,0,0, + 0,67,0,0,0,115,16,0,0,0,116,0,100,1,100,2, + 100,3,100,4,100,5,141,4,83,0,41,6,78,114,40,0, + 0,0,122,8,60,115,116,114,105,110,103,62,114,215,0,0, + 0,84,41,1,114,231,0,0,0,41,1,114,232,0,0,0, + 114,219,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,213,0,0,0,186,4,0,0,115,2,0, + 0,0,0,1,122,25,95,78,97,109,101,115,112,97,99,101, + 76,111,97,100,101,114,46,103,101,116,95,99,111,100,101,99, + 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 1,0,0,0,67,0,0,0,115,4,0,0,0,100,1,83, + 0,114,210,0,0,0,114,3,0,0,0,114,211,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, + 212,0,0,0,189,4,0,0,115,2,0,0,0,0,1,122, + 30,95,78,97,109,101,115,112,97,99,101,76,111,97,100,101, + 114,46,99,114,101,97,116,101,95,109,111,100,117,108,101,99, + 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 1,0,0,0,67,0,0,0,115,4,0,0,0,100,0,83, + 0,114,110,0,0,0,114,3,0,0,0,114,253,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, + 217,0,0,0,192,4,0,0,115,2,0,0,0,0,1,122, + 28,95,78,97,109,101,115,112,97,99,101,76,111,97,100,101, + 114,46,101,120,101,99,95,109,111,100,117,108,101,99,2,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,4,0, + 0,0,67,0,0,0,115,26,0,0,0,116,0,160,1,100, + 1,124,0,106,2,161,2,1,0,116,0,160,3,124,0,124, + 1,161,2,83,0,41,2,122,98,76,111,97,100,32,97,32, + 110,97,109,101,115,112,97,99,101,32,109,111,100,117,108,101, + 46,10,10,32,32,32,32,32,32,32,32,84,104,105,115,32, + 109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,99, + 97,116,101,100,46,32,32,85,115,101,32,101,120,101,99,95, + 109,111,100,117,108,101,40,41,32,105,110,115,116,101,97,100, + 46,10,10,32,32,32,32,32,32,32,32,122,38,110,97,109, + 101,115,112,97,99,101,32,109,111,100,117,108,101,32,108,111, + 97,100,101,100,32,119,105,116,104,32,112,97,116,104,32,123, + 33,114,125,41,4,114,134,0,0,0,114,149,0,0,0,114, + 24,1,0,0,114,218,0,0,0,114,219,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,114,220,0, + 0,0,195,4,0,0,115,8,0,0,0,0,7,6,1,4, + 255,4,2,122,28,95,78,97,109,101,115,112,97,99,101,76, + 111,97,100,101,114,46,108,111,97,100,95,109,111,100,117,108, + 101,78,41,12,114,125,0,0,0,114,124,0,0,0,114,126, + 0,0,0,114,209,0,0,0,114,207,0,0,0,114,44,1, + 0,0,114,182,0,0,0,114,229,0,0,0,114,213,0,0, + 0,114,212,0,0,0,114,217,0,0,0,114,220,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,43,1,0,0,167,4,0,0,115,18,0, + 0,0,8,1,8,3,2,1,10,8,8,3,8,3,8,3, + 8,3,8,3,114,43,1,0,0,99,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,4,0,0,0,64,0, + 0,0,115,172,0,0,0,101,0,90,1,100,0,90,2,100, + 1,90,3,101,4,100,2,100,3,132,0,131,1,90,5,101, + 4,100,4,100,5,132,0,131,1,90,6,101,4,100,6,100, + 7,132,0,131,1,90,7,101,4,100,8,100,9,132,0,131, + 1,90,8,101,4,100,28,100,11,100,12,132,1,131,1,90, + 9,101,4,100,29,100,13,100,14,132,1,131,1,90,10,101, + 4,100,30,100,15,100,16,132,1,131,1,90,11,100,17,90, + 12,101,4,100,31,100,18,100,19,132,1,131,1,90,13,101, + 4,100,20,100,21,132,0,131,1,90,14,101,15,100,22,100, + 23,132,0,131,1,90,16,101,4,100,24,100,25,132,0,131, + 1,90,17,101,4,100,26,100,27,132,0,131,1,90,18,100, + 10,83,0,41,32,218,10,80,97,116,104,70,105,110,100,101, + 114,122,62,77,101,116,97,32,112,97,116,104,32,102,105,110, + 100,101,114,32,102,111,114,32,115,121,115,46,112,97,116,104, + 32,97,110,100,32,112,97,99,107,97,103,101,32,95,95,112, + 97,116,104,95,95,32,97,116,116,114,105,98,117,116,101,115, + 46,99,1,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,4,0,0,0,67,0,0,0,115,64,0,0,0,116, + 0,116,1,106,2,160,3,161,0,131,1,68,0,93,44,92, + 2,125,1,125,2,124,2,100,1,107,8,114,40,116,1,106, + 2,124,1,61,0,113,14,116,4,124,2,100,2,131,2,114, + 14,124,2,160,5,161,0,1,0,113,14,100,1,83,0,41, + 3,122,125,67,97,108,108,32,116,104,101,32,105,110,118,97, + 108,105,100,97,116,101,95,99,97,99,104,101,115,40,41,32, + 109,101,116,104,111,100,32,111,110,32,97,108,108,32,112,97, + 116,104,32,101,110,116,114,121,32,102,105,110,100,101,114,115, + 10,32,32,32,32,32,32,32,32,115,116,111,114,101,100,32, + 105,110,32,115,121,115,46,112,97,116,104,95,105,109,112,111, + 114,116,101,114,95,99,97,99,104,101,115,32,40,119,104,101, + 114,101,32,105,109,112,108,101,109,101,110,116,101,100,41,46, + 78,218,17,105,110,118,97,108,105,100,97,116,101,95,99,97, + 99,104,101,115,41,6,218,4,108,105,115,116,114,8,0,0, + 0,218,19,112,97,116,104,95,105,109,112,111,114,116,101,114, + 95,99,97,99,104,101,218,5,105,116,101,109,115,114,128,0, + 0,0,114,46,1,0,0,41,3,114,193,0,0,0,114,117, + 0,0,0,218,6,102,105,110,100,101,114,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,46,1,0,0,213, + 4,0,0,115,10,0,0,0,0,4,22,1,8,1,10,1, + 10,1,122,28,80,97,116,104,70,105,110,100,101,114,46,105, + 110,118,97,108,105,100,97,116,101,95,99,97,99,104,101,115, + 99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,9,0,0,0,67,0,0,0,115,84,0,0,0,116,0, + 106,1,100,1,107,9,114,28,116,0,106,1,115,28,116,2, + 160,3,100,2,116,4,161,2,1,0,116,0,106,1,68,0, + 93,44,125,2,122,14,124,2,124,1,131,1,87,0,2,0, + 1,0,83,0,4,0,116,5,107,10,114,76,1,0,1,0, + 1,0,89,0,113,34,89,0,113,34,88,0,113,34,100,1, + 83,0,41,3,122,46,83,101,97,114,99,104,32,115,121,115, + 46,112,97,116,104,95,104,111,111,107,115,32,102,111,114,32, + 97,32,102,105,110,100,101,114,32,102,111,114,32,39,112,97, + 116,104,39,46,78,122,23,115,121,115,46,112,97,116,104,95, + 104,111,111,107,115,32,105,115,32,101,109,112,116,121,41,6, + 114,8,0,0,0,218,10,112,97,116,104,95,104,111,111,107, + 115,114,75,0,0,0,114,76,0,0,0,114,138,0,0,0, + 114,118,0,0,0,41,3,114,193,0,0,0,114,44,0,0, + 0,90,4,104,111,111,107,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,218,11,95,112,97,116,104,95,104,111, + 111,107,115,223,4,0,0,115,16,0,0,0,0,3,16,1, + 12,1,10,1,2,1,14,1,14,1,12,2,122,22,80,97, + 116,104,70,105,110,100,101,114,46,95,112,97,116,104,95,104, + 111,111,107,115,99,2,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,8,0,0,0,67,0,0,0,115,104,0, + 0,0,124,1,100,1,107,2,114,44,122,12,116,0,160,1, + 161,0,125,1,87,0,110,22,4,0,116,2,107,10,114,42, + 1,0,1,0,1,0,89,0,100,2,83,0,88,0,122,14, + 116,3,106,4,124,1,25,0,125,2,87,0,110,40,4,0, + 116,5,107,10,114,98,1,0,1,0,1,0,124,0,160,6, + 124,1,161,1,125,2,124,2,116,3,106,4,124,1,60,0, + 89,0,110,2,88,0,124,2,83,0,41,3,122,210,71,101, + 116,32,116,104,101,32,102,105,110,100,101,114,32,102,111,114, + 32,116,104,101,32,112,97,116,104,32,101,110,116,114,121,32, + 102,114,111,109,32,115,121,115,46,112,97,116,104,95,105,109, + 112,111,114,116,101,114,95,99,97,99,104,101,46,10,10,32, + 32,32,32,32,32,32,32,73,102,32,116,104,101,32,112,97, + 116,104,32,101,110,116,114,121,32,105,115,32,110,111,116,32, + 105,110,32,116,104,101,32,99,97,99,104,101,44,32,102,105, + 110,100,32,116,104,101,32,97,112,112,114,111,112,114,105,97, + 116,101,32,102,105,110,100,101,114,10,32,32,32,32,32,32, + 32,32,97,110,100,32,99,97,99,104,101,32,105,116,46,32, + 73,102,32,110,111,32,102,105,110,100,101,114,32,105,115,32, + 97,118,97,105,108,97,98,108,101,44,32,115,116,111,114,101, + 32,78,111,110,101,46,10,10,32,32,32,32,32,32,32,32, + 114,40,0,0,0,78,41,7,114,2,0,0,0,114,55,0, + 0,0,114,3,1,0,0,114,8,0,0,0,114,48,1,0, + 0,218,8,75,101,121,69,114,114,111,114,114,52,1,0,0, + 41,3,114,193,0,0,0,114,44,0,0,0,114,50,1,0, + 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 218,20,95,112,97,116,104,95,105,109,112,111,114,116,101,114, + 95,99,97,99,104,101,236,4,0,0,115,22,0,0,0,0, + 8,8,1,2,1,12,1,14,3,8,1,2,1,14,1,14, + 1,10,1,16,1,122,31,80,97,116,104,70,105,110,100,101, + 114,46,95,112,97,116,104,95,105,109,112,111,114,116,101,114, + 95,99,97,99,104,101,99,3,0,0,0,0,0,0,0,0, + 0,0,0,6,0,0,0,4,0,0,0,67,0,0,0,115, + 82,0,0,0,116,0,124,2,100,1,131,2,114,26,124,2, + 160,1,124,1,161,1,92,2,125,3,125,4,110,14,124,2, + 160,2,124,1,161,1,125,3,103,0,125,4,124,3,100,0, + 107,9,114,60,116,3,160,4,124,1,124,3,161,2,83,0, + 116,3,160,5,124,1,100,0,161,2,125,5,124,4,124,5, + 95,6,124,5,83,0,41,2,78,114,137,0,0,0,41,7, + 114,128,0,0,0,114,137,0,0,0,114,206,0,0,0,114, + 134,0,0,0,114,201,0,0,0,114,183,0,0,0,114,178, + 0,0,0,41,6,114,193,0,0,0,114,139,0,0,0,114, + 50,1,0,0,114,140,0,0,0,114,141,0,0,0,114,187, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,218,16,95,108,101,103,97,99,121,95,103,101,116,95, + 115,112,101,99,2,5,0,0,115,18,0,0,0,0,4,10, + 1,16,2,10,1,4,1,8,1,12,1,12,1,6,1,122, + 27,80,97,116,104,70,105,110,100,101,114,46,95,108,101,103, + 97,99,121,95,103,101,116,95,115,112,101,99,78,99,4,0, + 0,0,0,0,0,0,0,0,0,0,9,0,0,0,5,0, + 0,0,67,0,0,0,115,166,0,0,0,103,0,125,4,124, + 2,68,0,93,134,125,5,116,0,124,5,116,1,116,2,102, + 2,131,2,115,28,113,8,124,0,160,3,124,5,161,1,125, + 6,124,6,100,1,107,9,114,8,116,4,124,6,100,2,131, + 2,114,70,124,6,160,5,124,1,124,3,161,2,125,7,110, + 12,124,0,160,6,124,1,124,6,161,2,125,7,124,7,100, + 1,107,8,114,92,113,8,124,7,106,7,100,1,107,9,114, + 110,124,7,2,0,1,0,83,0,124,7,106,8,125,8,124, + 8,100,1,107,8,114,132,116,9,100,3,131,1,130,1,124, + 4,160,10,124,8,161,1,1,0,113,8,116,11,160,12,124, + 1,100,1,161,2,125,7,124,4,124,7,95,8,124,7,83, + 0,41,4,122,63,70,105,110,100,32,116,104,101,32,108,111, + 97,100,101,114,32,111,114,32,110,97,109,101,115,112,97,99, + 101,95,112,97,116,104,32,102,111,114,32,116,104,105,115,32, + 109,111,100,117,108,101,47,112,97,99,107,97,103,101,32,110, + 97,109,101,46,78,114,203,0,0,0,122,19,115,112,101,99, + 32,109,105,115,115,105,110,103,32,108,111,97,100,101,114,41, + 13,114,161,0,0,0,114,85,0,0,0,218,5,98,121,116, + 101,115,114,54,1,0,0,114,128,0,0,0,114,203,0,0, + 0,114,55,1,0,0,114,140,0,0,0,114,178,0,0,0, + 114,118,0,0,0,114,167,0,0,0,114,134,0,0,0,114, + 183,0,0,0,41,9,114,193,0,0,0,114,139,0,0,0, + 114,44,0,0,0,114,202,0,0,0,218,14,110,97,109,101, + 115,112,97,99,101,95,112,97,116,104,90,5,101,110,116,114, + 121,114,50,1,0,0,114,187,0,0,0,114,141,0,0,0, 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, - 16,95,108,101,103,97,99,121,95,103,101,116,95,115,112,101, - 99,2,5,0,0,115,18,0,0,0,0,4,10,1,16,2, - 10,1,4,1,8,1,12,1,12,1,6,1,122,27,80,97, - 116,104,70,105,110,100,101,114,46,95,108,101,103,97,99,121, - 95,103,101,116,95,115,112,101,99,78,99,4,0,0,0,0, - 0,0,0,0,0,0,0,9,0,0,0,5,0,0,0,67, - 0,0,0,115,166,0,0,0,103,0,125,4,124,2,68,0, - 93,134,125,5,116,0,124,5,116,1,116,2,102,2,131,2, - 115,28,113,8,124,0,160,3,124,5,161,1,125,6,124,6, - 100,1,107,9,114,8,116,4,124,6,100,2,131,2,114,70, - 124,6,160,5,124,1,124,3,161,2,125,7,110,12,124,0, - 160,6,124,1,124,6,161,2,125,7,124,7,100,1,107,8, - 114,92,113,8,124,7,106,7,100,1,107,9,114,110,124,7, - 2,0,1,0,83,0,124,7,106,8,125,8,124,8,100,1, - 107,8,114,132,116,9,100,3,131,1,130,1,124,4,160,10, - 124,8,161,1,1,0,113,8,116,11,160,12,124,1,100,1, - 161,2,125,7,124,4,124,7,95,8,124,7,83,0,41,4, - 122,63,70,105,110,100,32,116,104,101,32,108,111,97,100,101, - 114,32,111,114,32,110,97,109,101,115,112,97,99,101,95,112, - 97,116,104,32,102,111,114,32,116,104,105,115,32,109,111,100, - 117,108,101,47,112,97,99,107,97,103,101,32,110,97,109,101, - 46,78,114,203,0,0,0,122,19,115,112,101,99,32,109,105, - 115,115,105,110,103,32,108,111,97,100,101,114,41,13,114,161, - 0,0,0,114,85,0,0,0,218,5,98,121,116,101,115,114, - 54,1,0,0,114,128,0,0,0,114,203,0,0,0,114,55, - 1,0,0,114,140,0,0,0,114,178,0,0,0,114,118,0, - 0,0,114,167,0,0,0,114,134,0,0,0,114,183,0,0, - 0,41,9,114,193,0,0,0,114,139,0,0,0,114,44,0, - 0,0,114,202,0,0,0,218,14,110,97,109,101,115,112,97, - 99,101,95,112,97,116,104,90,5,101,110,116,114,121,114,50, - 1,0,0,114,187,0,0,0,114,141,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,9,95,103, - 101,116,95,115,112,101,99,17,5,0,0,115,40,0,0,0, - 0,5,4,1,8,1,14,1,2,1,10,1,8,1,10,1, - 14,2,12,1,8,1,2,1,10,1,8,1,6,1,8,1, - 8,5,12,2,12,1,6,1,122,20,80,97,116,104,70,105, - 110,100,101,114,46,95,103,101,116,95,115,112,101,99,99,4, - 0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,5, - 0,0,0,67,0,0,0,115,100,0,0,0,124,2,100,1, - 107,8,114,14,116,0,106,1,125,2,124,0,160,2,124,1, - 124,2,124,3,161,3,125,4,124,4,100,1,107,8,114,40, - 100,1,83,0,124,4,106,3,100,1,107,8,114,92,124,4, - 106,4,125,5,124,5,114,86,100,1,124,4,95,5,116,6, - 124,1,124,5,124,0,106,2,131,3,124,4,95,4,124,4, - 83,0,100,1,83,0,110,4,124,4,83,0,100,1,83,0, - 41,2,122,141,84,114,121,32,116,111,32,102,105,110,100,32, - 97,32,115,112,101,99,32,102,111,114,32,39,102,117,108,108, - 110,97,109,101,39,32,111,110,32,115,121,115,46,112,97,116, - 104,32,111,114,32,39,112,97,116,104,39,46,10,10,32,32, - 32,32,32,32,32,32,84,104,101,32,115,101,97,114,99,104, - 32,105,115,32,98,97,115,101,100,32,111,110,32,115,121,115, - 46,112,97,116,104,95,104,111,111,107,115,32,97,110,100,32, - 115,121,115,46,112,97,116,104,95,105,109,112,111,114,116,101, - 114,95,99,97,99,104,101,46,10,32,32,32,32,32,32,32, - 32,78,41,7,114,8,0,0,0,114,44,0,0,0,114,58, - 1,0,0,114,140,0,0,0,114,178,0,0,0,114,181,0, - 0,0,114,22,1,0,0,41,6,114,193,0,0,0,114,139, - 0,0,0,114,44,0,0,0,114,202,0,0,0,114,187,0, - 0,0,114,57,1,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,203,0,0,0,49,5,0,0,115, - 26,0,0,0,0,6,8,1,6,1,14,1,8,1,4,1, - 10,1,6,1,4,3,6,1,16,1,4,2,6,2,122,20, - 80,97,116,104,70,105,110,100,101,114,46,102,105,110,100,95, - 115,112,101,99,99,3,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,4,0,0,0,67,0,0,0,115,30,0, - 0,0,124,0,160,0,124,1,124,2,161,2,125,3,124,3, - 100,1,107,8,114,24,100,1,83,0,124,3,106,1,83,0, - 41,2,122,170,102,105,110,100,32,116,104,101,32,109,111,100, - 117,108,101,32,111,110,32,115,121,115,46,112,97,116,104,32, - 111,114,32,39,112,97,116,104,39,32,98,97,115,101,100,32, - 111,110,32,115,121,115,46,112,97,116,104,95,104,111,111,107, - 115,32,97,110,100,10,32,32,32,32,32,32,32,32,115,121, - 115,46,112,97,116,104,95,105,109,112,111,114,116,101,114,95, - 99,97,99,104,101,46,10,10,32,32,32,32,32,32,32,32, + 9,95,103,101,116,95,115,112,101,99,17,5,0,0,115,40, + 0,0,0,0,5,4,1,8,1,14,1,2,1,10,1,8, + 1,10,1,14,2,12,1,8,1,2,1,10,1,8,1,6, + 1,8,1,8,5,12,2,12,1,6,1,122,20,80,97,116, + 104,70,105,110,100,101,114,46,95,103,101,116,95,115,112,101, + 99,99,4,0,0,0,0,0,0,0,0,0,0,0,6,0, + 0,0,5,0,0,0,67,0,0,0,115,100,0,0,0,124, + 2,100,1,107,8,114,14,116,0,106,1,125,2,124,0,160, + 2,124,1,124,2,124,3,161,3,125,4,124,4,100,1,107, + 8,114,40,100,1,83,0,124,4,106,3,100,1,107,8,114, + 92,124,4,106,4,125,5,124,5,114,86,100,1,124,4,95, + 5,116,6,124,1,124,5,124,0,106,2,131,3,124,4,95, + 4,124,4,83,0,100,1,83,0,110,4,124,4,83,0,100, + 1,83,0,41,2,122,141,84,114,121,32,116,111,32,102,105, + 110,100,32,97,32,115,112,101,99,32,102,111,114,32,39,102, + 117,108,108,110,97,109,101,39,32,111,110,32,115,121,115,46, + 112,97,116,104,32,111,114,32,39,112,97,116,104,39,46,10, + 10,32,32,32,32,32,32,32,32,84,104,101,32,115,101,97, + 114,99,104,32,105,115,32,98,97,115,101,100,32,111,110,32, + 115,121,115,46,112,97,116,104,95,104,111,111,107,115,32,97, + 110,100,32,115,121,115,46,112,97,116,104,95,105,109,112,111, + 114,116,101,114,95,99,97,99,104,101,46,10,32,32,32,32, + 32,32,32,32,78,41,7,114,8,0,0,0,114,44,0,0, + 0,114,58,1,0,0,114,140,0,0,0,114,178,0,0,0, + 114,181,0,0,0,114,22,1,0,0,41,6,114,193,0,0, + 0,114,139,0,0,0,114,44,0,0,0,114,202,0,0,0, + 114,187,0,0,0,114,57,1,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,203,0,0,0,49,5, + 0,0,115,26,0,0,0,0,6,8,1,6,1,14,1,8, + 1,4,1,10,1,6,1,4,3,6,1,16,1,4,2,6, + 2,122,20,80,97,116,104,70,105,110,100,101,114,46,102,105, + 110,100,95,115,112,101,99,99,3,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,4,0,0,0,67,0,0,0, + 115,30,0,0,0,124,0,160,0,124,1,124,2,161,2,125, + 3,124,3,100,1,107,8,114,24,100,1,83,0,124,3,106, + 1,83,0,41,2,122,170,102,105,110,100,32,116,104,101,32, + 109,111,100,117,108,101,32,111,110,32,115,121,115,46,112,97, + 116,104,32,111,114,32,39,112,97,116,104,39,32,98,97,115, + 101,100,32,111,110,32,115,121,115,46,112,97,116,104,95,104, + 111,111,107,115,32,97,110,100,10,32,32,32,32,32,32,32, + 32,115,121,115,46,112,97,116,104,95,105,109,112,111,114,116, + 101,114,95,99,97,99,104,101,46,10,10,32,32,32,32,32, + 32,32,32,84,104,105,115,32,109,101,116,104,111,100,32,105, + 115,32,100,101,112,114,101,99,97,116,101,100,46,32,32,85, + 115,101,32,102,105,110,100,95,115,112,101,99,40,41,32,105, + 110,115,116,101,97,100,46,10,10,32,32,32,32,32,32,32, + 32,78,114,204,0,0,0,114,205,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,114,206,0,0,0, + 73,5,0,0,115,8,0,0,0,0,8,12,1,8,1,4, + 1,122,22,80,97,116,104,70,105,110,100,101,114,46,102,105, + 110,100,95,109,111,100,117,108,101,122,45,40,63,58,123,112, + 97,116,116,101,114,110,125,40,45,46,42,41,63,92,46,40, + 100,105,115,116,124,101,103,103,41,45,105,110,102,111,124,69, + 71,71,45,73,78,70,79,41,99,3,0,0,0,0,0,0, + 0,0,0,0,0,7,0,0,0,4,0,0,0,67,0,0, + 0,115,78,0,0,0,100,1,100,2,108,0,125,3,100,1, + 100,3,108,1,109,2,125,4,1,0,124,2,100,2,107,8, + 114,34,116,3,106,4,125,2,124,1,100,2,107,8,114,46, + 100,4,110,8,124,3,160,5,124,1,161,1,125,5,124,0, + 160,6,124,5,124,2,161,2,125,6,116,7,124,4,124,6, + 131,2,83,0,41,5,97,37,1,0,0,10,32,32,32,32, + 32,32,32,32,70,105,110,100,32,100,105,115,116,114,105,98, + 117,116,105,111,110,115,46,10,10,32,32,32,32,32,32,32, + 32,82,101,116,117,114,110,32,97,110,32,105,116,101,114,97, + 98,108,101,32,111,102,32,97,108,108,32,68,105,115,116,114, + 105,98,117,116,105,111,110,32,105,110,115,116,97,110,99,101, + 115,32,99,97,112,97,98,108,101,32,111,102,10,32,32,32, + 32,32,32,32,32,108,111,97,100,105,110,103,32,116,104,101, + 32,109,101,116,97,100,97,116,97,32,102,111,114,32,112,97, + 99,107,97,103,101,115,32,109,97,116,99,104,105,110,103,32, + 116,104,101,32,96,96,110,97,109,101,96,96,10,32,32,32, + 32,32,32,32,32,40,111,114,32,97,108,108,32,110,97,109, + 101,115,32,105,102,32,110,111,116,32,115,117,112,112,108,105, + 101,100,41,32,97,108,111,110,103,32,116,104,101,32,112,97, + 116,104,115,32,105,110,32,116,104,101,32,108,105,115,116,10, + 32,32,32,32,32,32,32,32,111,102,32,100,105,114,101,99, + 116,111,114,105,101,115,32,96,96,112,97,116,104,96,96,32, + 40,100,101,102,97,117,108,116,115,32,116,111,32,115,121,115, + 46,112,97,116,104,41,46,10,32,32,32,32,32,32,32,32, + 114,73,0,0,0,78,41,1,218,16,80,97,116,104,68,105, + 115,116,114,105,98,117,116,105,111,110,122,2,46,42,41,8, + 218,2,114,101,90,18,105,109,112,111,114,116,108,105,98,46, + 109,101,116,97,100,97,116,97,114,59,1,0,0,114,8,0, + 0,0,114,44,0,0,0,90,6,101,115,99,97,112,101,218, + 13,95,115,101,97,114,99,104,95,112,97,116,104,115,218,3, + 109,97,112,41,7,114,193,0,0,0,114,117,0,0,0,114, + 44,0,0,0,114,60,1,0,0,114,59,1,0,0,218,7, + 112,97,116,116,101,114,110,90,5,102,111,117,110,100,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,218,18,102, + 105,110,100,95,100,105,115,116,114,105,98,117,116,105,111,110, + 115,88,5,0,0,115,14,0,0,0,0,10,8,1,12,1, + 8,1,6,1,22,1,12,1,122,29,80,97,116,104,70,105, + 110,100,101,114,46,102,105,110,100,95,100,105,115,116,114,105, + 98,117,116,105,111,110,115,99,3,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,6,0,0,0,3,0,0,0, + 115,44,0,0,0,100,1,100,2,108,0,125,3,124,3,106, + 1,160,2,135,0,135,1,102,2,100,3,100,4,132,8,116, + 3,136,0,106,4,124,2,131,2,68,0,131,1,161,1,83, + 0,41,5,122,49,70,105,110,100,32,109,101,116,97,100,97, + 116,97,32,100,105,114,101,99,116,111,114,105,101,115,32,105, + 110,32,112,97,116,104,115,32,104,101,117,114,105,115,116,105, + 99,97,108,108,121,46,114,73,0,0,0,78,99,1,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,5,0,0, + 0,51,0,0,0,115,26,0,0,0,124,0,93,18,125,1, + 136,0,160,0,124,1,136,1,161,2,86,0,1,0,113,2, + 100,0,83,0,114,110,0,0,0,41,1,218,12,95,115,101, + 97,114,99,104,95,112,97,116,104,41,2,114,32,0,0,0, + 114,44,0,0,0,169,2,114,193,0,0,0,114,63,1,0, + 0,114,3,0,0,0,114,6,0,0,0,114,19,1,0,0, + 110,5,0,0,115,4,0,0,0,4,2,2,255,122,43,80, + 97,116,104,70,105,110,100,101,114,46,95,115,101,97,114,99, + 104,95,112,97,116,104,115,46,60,108,111,99,97,108,115,62, + 46,60,103,101,110,101,120,112,114,62,41,5,218,9,105,116, + 101,114,116,111,111,108,115,90,5,99,104,97,105,110,90,13, + 102,114,111,109,95,105,116,101,114,97,98,108,101,114,62,1, + 0,0,218,12,95,115,119,105,116,99,104,95,112,97,116,104, + 41,4,114,193,0,0,0,114,63,1,0,0,90,5,112,97, + 116,104,115,114,67,1,0,0,114,3,0,0,0,114,66,1, + 0,0,114,6,0,0,0,114,61,1,0,0,106,5,0,0, + 115,8,0,0,0,0,3,8,1,18,2,10,254,122,24,80, + 97,116,104,70,105,110,100,101,114,46,95,115,101,97,114,99, + 104,95,112,97,116,104,115,99,1,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,10,0,0,0,67,0,0,0, + 115,78,0,0,0,100,1,100,2,108,0,109,1,125,1,1, + 0,100,1,100,0,108,2,125,2,100,1,100,3,108,3,109, + 4,125,3,1,0,124,1,116,5,131,1,143,24,1,0,124, + 2,160,4,124,0,161,1,87,0,2,0,53,0,81,0,82, + 0,163,0,83,0,81,0,82,0,88,0,124,3,124,0,131, + 1,83,0,41,4,78,114,73,0,0,0,41,1,218,8,115, + 117,112,112,114,101,115,115,41,1,218,4,80,97,116,104,41, + 6,90,10,99,111,110,116,101,120,116,108,105,98,114,69,1, + 0,0,218,7,122,105,112,102,105,108,101,90,7,112,97,116, + 104,108,105,98,114,70,1,0,0,218,9,69,120,99,101,112, + 116,105,111,110,41,4,114,44,0,0,0,114,69,1,0,0, + 114,71,1,0,0,114,70,1,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,68,1,0,0,115,5, + 0,0,115,12,0,0,0,0,2,12,1,8,1,12,1,10, + 1,28,1,122,23,80,97,116,104,70,105,110,100,101,114,46, + 95,115,119,105,116,99,104,95,112,97,116,104,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,32,0,0,0,100,1,100,0,108,0, + 125,4,124,4,106,1,124,1,116,2,124,3,106,3,131,1, + 124,4,106,4,100,2,141,3,83,0,41,3,78,114,73,0, + 0,0,41,1,114,83,0,0,0,41,5,114,60,1,0,0, + 90,5,109,97,116,99,104,114,85,0,0,0,114,117,0,0, + 0,90,10,73,71,78,79,82,69,67,65,83,69,41,5,114, + 193,0,0,0,114,63,1,0,0,218,4,114,111,111,116,114, + 41,1,0,0,114,60,1,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,10,95,112,114,101,100,105, + 99,97,116,101,124,5,0,0,115,4,0,0,0,0,2,8, + 1,122,21,80,97,116,104,70,105,110,100,101,114,46,95,112, + 114,101,100,105,99,97,116,101,99,3,0,0,0,0,0,0, + 0,0,0,0,0,4,0,0,0,4,0,0,0,3,0,0, + 0,115,64,0,0,0,136,2,160,0,161,0,115,12,100,1, + 83,0,124,2,160,1,100,2,100,3,161,2,125,3,136,0, + 106,2,106,3,124,3,100,4,141,1,137,1,135,0,135,1, + 135,2,102,3,100,5,100,6,132,8,136,2,160,4,161,0, + 68,0,131,1,83,0,41,7,78,114,3,0,0,0,250,1, + 45,114,45,0,0,0,41,1,114,63,1,0,0,99,1,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,6,0, + 0,0,51,0,0,0,115,32,0,0,0,124,0,93,24,125, + 1,136,0,160,0,136,1,136,2,124,1,161,3,114,2,124, + 1,86,0,1,0,113,2,100,0,83,0,114,110,0,0,0, + 41,1,114,74,1,0,0,41,2,114,32,0,0,0,114,41, + 1,0,0,169,3,114,193,0,0,0,90,7,109,97,116,99, + 104,101,114,114,73,1,0,0,114,3,0,0,0,114,6,0, + 0,0,114,19,1,0,0,135,5,0,0,115,6,0,0,0, + 4,0,2,1,14,255,122,42,80,97,116,104,70,105,110,100, + 101,114,46,95,115,101,97,114,99,104,95,112,97,116,104,46, + 60,108,111,99,97,108,115,62,46,60,103,101,110,101,120,112, + 114,62,41,5,90,6,105,115,95,100,105,114,114,67,0,0, + 0,218,15,115,101,97,114,99,104,95,116,101,109,112,108,97, + 116,101,114,62,0,0,0,90,7,105,116,101,114,100,105,114, + 41,4,114,193,0,0,0,114,73,1,0,0,114,63,1,0, + 0,90,10,110,111,114,109,97,108,105,122,101,100,114,3,0, + 0,0,114,76,1,0,0,114,6,0,0,0,114,65,1,0, + 0,129,5,0,0,115,10,0,0,0,0,2,8,1,4,1, + 12,1,14,1,122,23,80,97,116,104,70,105,110,100,101,114, + 46,95,115,101,97,114,99,104,95,112,97,116,104,41,1,78, + 41,2,78,78,41,1,78,41,2,78,78,41,19,114,125,0, + 0,0,114,124,0,0,0,114,126,0,0,0,114,127,0,0, + 0,114,207,0,0,0,114,46,1,0,0,114,52,1,0,0, + 114,54,1,0,0,114,55,1,0,0,114,58,1,0,0,114, + 203,0,0,0,114,206,0,0,0,114,77,1,0,0,114,64, + 1,0,0,114,61,1,0,0,218,12,115,116,97,116,105,99, + 109,101,116,104,111,100,114,68,1,0,0,114,74,1,0,0, + 114,65,1,0,0,114,3,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,45,1,0,0,209,4, + 0,0,115,52,0,0,0,8,2,4,2,2,1,10,9,2, + 1,10,12,2,1,10,21,2,1,10,14,2,1,12,31,2, + 1,12,23,2,1,12,12,4,2,2,1,12,17,2,1,10, + 8,2,1,10,8,2,1,10,4,2,1,114,45,1,0,0, + 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,64,0,0,0,115,90,0,0,0,101,0, + 90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,0, + 90,4,100,4,100,5,132,0,90,5,101,6,90,7,100,6, + 100,7,132,0,90,8,100,8,100,9,132,0,90,9,100,19, + 100,11,100,12,132,1,90,10,100,13,100,14,132,0,90,11, + 101,12,100,15,100,16,132,0,131,1,90,13,100,17,100,18, + 132,0,90,14,100,10,83,0,41,20,218,10,70,105,108,101, + 70,105,110,100,101,114,122,172,70,105,108,101,45,98,97,115, + 101,100,32,102,105,110,100,101,114,46,10,10,32,32,32,32, + 73,110,116,101,114,97,99,116,105,111,110,115,32,119,105,116, + 104,32,116,104,101,32,102,105,108,101,32,115,121,115,116,101, + 109,32,97,114,101,32,99,97,99,104,101,100,32,102,111,114, + 32,112,101,114,102,111,114,109,97,110,99,101,44,32,98,101, + 105,110,103,10,32,32,32,32,114,101,102,114,101,115,104,101, + 100,32,119,104,101,110,32,116,104,101,32,100,105,114,101,99, + 116,111,114,121,32,116,104,101,32,102,105,110,100,101,114,32, + 105,115,32,104,97,110,100,108,105,110,103,32,104,97,115,32, + 98,101,101,110,32,109,111,100,105,102,105,101,100,46,10,10, + 32,32,32,32,99,2,0,0,0,0,0,0,0,0,0,0, + 0,5,0,0,0,6,0,0,0,7,0,0,0,115,84,0, + 0,0,103,0,125,3,124,2,68,0,93,32,92,2,137,0, + 125,4,124,3,160,0,135,0,102,1,100,1,100,2,132,8, + 124,4,68,0,131,1,161,1,1,0,113,8,124,3,124,0, + 95,1,124,1,112,54,100,3,124,0,95,2,100,4,124,0, + 95,3,116,4,131,0,124,0,95,5,116,4,131,0,124,0, + 95,6,100,5,83,0,41,6,122,154,73,110,105,116,105,97, + 108,105,122,101,32,119,105,116,104,32,116,104,101,32,112,97, + 116,104,32,116,111,32,115,101,97,114,99,104,32,111,110,32, + 97,110,100,32,97,32,118,97,114,105,97,98,108,101,32,110, + 117,109,98,101,114,32,111,102,10,32,32,32,32,32,32,32, + 32,50,45,116,117,112,108,101,115,32,99,111,110,116,97,105, + 110,105,110,103,32,116,104,101,32,108,111,97,100,101,114,32, + 97,110,100,32,116,104,101,32,102,105,108,101,32,115,117,102, + 102,105,120,101,115,32,116,104,101,32,108,111,97,100,101,114, + 10,32,32,32,32,32,32,32,32,114,101,99,111,103,110,105, + 122,101,115,46,99,1,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,3,0,0,0,51,0,0,0,115,22,0, + 0,0,124,0,93,14,125,1,124,1,136,0,102,2,86,0, + 1,0,113,2,100,0,83,0,114,110,0,0,0,114,3,0, + 0,0,114,16,1,0,0,169,1,114,140,0,0,0,114,3, + 0,0,0,114,6,0,0,0,114,19,1,0,0,154,5,0, + 0,115,4,0,0,0,4,0,2,0,122,38,70,105,108,101, + 70,105,110,100,101,114,46,95,95,105,110,105,116,95,95,46, + 60,108,111,99,97,108,115,62,46,60,103,101,110,101,120,112, + 114,62,114,71,0,0,0,114,105,0,0,0,78,41,7,114, + 167,0,0,0,218,8,95,108,111,97,100,101,114,115,114,44, + 0,0,0,218,11,95,112,97,116,104,95,109,116,105,109,101, + 218,3,115,101,116,218,11,95,112,97,116,104,95,99,97,99, + 104,101,218,19,95,114,101,108,97,120,101,100,95,112,97,116, + 104,95,99,97,99,104,101,41,5,114,119,0,0,0,114,44, + 0,0,0,218,14,108,111,97,100,101,114,95,100,101,116,97, + 105,108,115,90,7,108,111,97,100,101,114,115,114,189,0,0, + 0,114,3,0,0,0,114,80,1,0,0,114,6,0,0,0, + 114,209,0,0,0,148,5,0,0,115,16,0,0,0,0,4, + 4,1,12,1,26,1,6,2,10,1,6,1,8,1,122,19, + 70,105,108,101,70,105,110,100,101,114,46,95,95,105,110,105, + 116,95,95,99,1,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,0,2,0,0,0,67,0,0,0,115,10,0,0, + 0,100,1,124,0,95,0,100,2,83,0,41,3,122,31,73, + 110,118,97,108,105,100,97,116,101,32,116,104,101,32,100,105, + 114,101,99,116,111,114,121,32,109,116,105,109,101,46,114,105, + 0,0,0,78,41,1,114,82,1,0,0,114,246,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, + 46,1,0,0,162,5,0,0,115,2,0,0,0,0,2,122, + 28,70,105,108,101,70,105,110,100,101,114,46,105,110,118,97, + 108,105,100,97,116,101,95,99,97,99,104,101,115,99,2,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0, + 0,0,67,0,0,0,115,42,0,0,0,124,0,160,0,124, + 1,161,1,125,2,124,2,100,1,107,8,114,26,100,1,103, + 0,102,2,83,0,124,2,106,1,124,2,106,2,112,38,103, + 0,102,2,83,0,41,2,122,197,84,114,121,32,116,111,32, + 102,105,110,100,32,97,32,108,111,97,100,101,114,32,102,111, + 114,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32, + 109,111,100,117,108,101,44,32,111,114,32,116,104,101,32,110, + 97,109,101,115,112,97,99,101,10,32,32,32,32,32,32,32, + 32,112,97,99,107,97,103,101,32,112,111,114,116,105,111,110, + 115,46,32,82,101,116,117,114,110,115,32,40,108,111,97,100, + 101,114,44,32,108,105,115,116,45,111,102,45,112,111,114,116, + 105,111,110,115,41,46,10,10,32,32,32,32,32,32,32,32, 84,104,105,115,32,109,101,116,104,111,100,32,105,115,32,100, 101,112,114,101,99,97,116,101,100,46,32,32,85,115,101,32, 102,105,110,100,95,115,112,101,99,40,41,32,105,110,115,116, - 101,97,100,46,10,10,32,32,32,32,32,32,32,32,78,114, - 204,0,0,0,114,205,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,206,0,0,0,73,5,0, - 0,115,8,0,0,0,0,8,12,1,8,1,4,1,122,22, - 80,97,116,104,70,105,110,100,101,114,46,102,105,110,100,95, - 109,111,100,117,108,101,122,45,40,63,58,123,112,97,116,116, - 101,114,110,125,40,45,46,42,41,63,92,46,40,100,105,115, - 116,124,101,103,103,41,45,105,110,102,111,124,69,71,71,45, - 73,78,70,79,41,99,3,0,0,0,0,0,0,0,0,0, - 0,0,7,0,0,0,4,0,0,0,67,0,0,0,115,78, - 0,0,0,100,1,100,2,108,0,125,3,100,1,100,3,108, - 1,109,2,125,4,1,0,124,2,100,2,107,8,114,34,116, - 3,106,4,125,2,124,1,100,2,107,8,114,46,100,4,110, - 8,124,3,160,5,124,1,161,1,125,5,124,0,160,6,124, - 5,124,2,161,2,125,6,116,7,124,4,124,6,131,2,83, - 0,41,5,97,37,1,0,0,10,32,32,32,32,32,32,32, - 32,70,105,110,100,32,100,105,115,116,114,105,98,117,116,105, - 111,110,115,46,10,10,32,32,32,32,32,32,32,32,82,101, - 116,117,114,110,32,97,110,32,105,116,101,114,97,98,108,101, - 32,111,102,32,97,108,108,32,68,105,115,116,114,105,98,117, - 116,105,111,110,32,105,110,115,116,97,110,99,101,115,32,99, - 97,112,97,98,108,101,32,111,102,10,32,32,32,32,32,32, - 32,32,108,111,97,100,105,110,103,32,116,104,101,32,109,101, - 116,97,100,97,116,97,32,102,111,114,32,112,97,99,107,97, - 103,101,115,32,109,97,116,99,104,105,110,103,32,116,104,101, - 32,96,96,110,97,109,101,96,96,10,32,32,32,32,32,32, - 32,32,40,111,114,32,97,108,108,32,110,97,109,101,115,32, - 105,102,32,110,111,116,32,115,117,112,112,108,105,101,100,41, - 32,97,108,111,110,103,32,116,104,101,32,112,97,116,104,115, - 32,105,110,32,116,104,101,32,108,105,115,116,10,32,32,32, - 32,32,32,32,32,111,102,32,100,105,114,101,99,116,111,114, - 105,101,115,32,96,96,112,97,116,104,96,96,32,40,100,101, - 102,97,117,108,116,115,32,116,111,32,115,121,115,46,112,97, - 116,104,41,46,10,32,32,32,32,32,32,32,32,114,73,0, - 0,0,78,41,1,218,16,80,97,116,104,68,105,115,116,114, - 105,98,117,116,105,111,110,122,2,46,42,41,8,218,2,114, - 101,90,18,105,109,112,111,114,116,108,105,98,46,109,101,116, - 97,100,97,116,97,114,59,1,0,0,114,8,0,0,0,114, - 44,0,0,0,90,6,101,115,99,97,112,101,218,13,95,115, - 101,97,114,99,104,95,112,97,116,104,115,218,3,109,97,112, - 41,7,114,193,0,0,0,114,117,0,0,0,114,44,0,0, - 0,114,60,1,0,0,114,59,1,0,0,218,7,112,97,116, - 116,101,114,110,90,5,102,111,117,110,100,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,18,102,105,110,100, - 95,100,105,115,116,114,105,98,117,116,105,111,110,115,88,5, - 0,0,115,14,0,0,0,0,10,8,1,12,1,8,1,6, - 1,22,1,12,1,122,29,80,97,116,104,70,105,110,100,101, - 114,46,102,105,110,100,95,100,105,115,116,114,105,98,117,116, - 105,111,110,115,99,3,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,6,0,0,0,3,0,0,0,115,44,0, - 0,0,100,1,100,2,108,0,125,3,124,3,106,1,160,2, - 135,0,135,1,102,2,100,3,100,4,132,8,116,3,136,0, - 106,4,124,2,131,2,68,0,131,1,161,1,83,0,41,5, - 122,49,70,105,110,100,32,109,101,116,97,100,97,116,97,32, - 100,105,114,101,99,116,111,114,105,101,115,32,105,110,32,112, - 97,116,104,115,32,104,101,117,114,105,115,116,105,99,97,108, - 108,121,46,114,73,0,0,0,78,99,1,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,5,0,0,0,51,0, - 0,0,115,26,0,0,0,124,0,93,18,125,1,136,0,160, - 0,124,1,136,1,161,2,86,0,1,0,113,2,100,0,83, - 0,114,110,0,0,0,41,1,218,12,95,115,101,97,114,99, - 104,95,112,97,116,104,41,2,114,32,0,0,0,114,44,0, - 0,0,169,2,114,193,0,0,0,114,63,1,0,0,114,3, - 0,0,0,114,6,0,0,0,114,19,1,0,0,110,5,0, - 0,115,4,0,0,0,4,2,2,255,122,43,80,97,116,104, - 70,105,110,100,101,114,46,95,115,101,97,114,99,104,95,112, - 97,116,104,115,46,60,108,111,99,97,108,115,62,46,60,103, - 101,110,101,120,112,114,62,41,5,218,9,105,116,101,114,116, - 111,111,108,115,90,5,99,104,97,105,110,90,13,102,114,111, - 109,95,105,116,101,114,97,98,108,101,114,62,1,0,0,218, - 12,95,115,119,105,116,99,104,95,112,97,116,104,41,4,114, - 193,0,0,0,114,63,1,0,0,90,5,112,97,116,104,115, - 114,67,1,0,0,114,3,0,0,0,114,66,1,0,0,114, - 6,0,0,0,114,61,1,0,0,106,5,0,0,115,8,0, - 0,0,0,3,8,1,18,2,10,254,122,24,80,97,116,104, - 70,105,110,100,101,114,46,95,115,101,97,114,99,104,95,112, - 97,116,104,115,99,1,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,10,0,0,0,67,0,0,0,115,78,0, - 0,0,100,1,100,2,108,0,109,1,125,1,1,0,100,1, - 100,0,108,2,125,2,100,1,100,3,108,3,109,4,125,3, - 1,0,124,1,116,5,131,1,143,24,1,0,124,2,160,4, - 124,0,161,1,87,0,2,0,53,0,81,0,82,0,163,0, - 83,0,81,0,82,0,88,0,124,3,124,0,131,1,83,0, - 41,4,78,114,73,0,0,0,41,1,218,8,115,117,112,112, - 114,101,115,115,41,1,218,4,80,97,116,104,41,6,90,10, - 99,111,110,116,101,120,116,108,105,98,114,69,1,0,0,218, - 7,122,105,112,102,105,108,101,90,7,112,97,116,104,108,105, - 98,114,70,1,0,0,218,9,69,120,99,101,112,116,105,111, - 110,41,4,114,44,0,0,0,114,69,1,0,0,114,71,1, - 0,0,114,70,1,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,68,1,0,0,115,5,0,0,115, - 12,0,0,0,0,2,12,1,8,1,12,1,10,1,28,1, - 122,23,80,97,116,104,70,105,110,100,101,114,46,95,115,119, - 105,116,99,104,95,112,97,116,104,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,32,0,0,0,100,1,100,0,108,0,125,4,124, - 4,106,1,124,1,116,2,124,3,106,3,131,1,124,4,106, - 4,100,2,141,3,83,0,41,3,78,114,73,0,0,0,41, - 1,114,83,0,0,0,41,5,114,60,1,0,0,90,5,109, - 97,116,99,104,114,85,0,0,0,114,117,0,0,0,90,10, - 73,71,78,79,82,69,67,65,83,69,41,5,114,193,0,0, - 0,114,63,1,0,0,218,4,114,111,111,116,114,41,1,0, - 0,114,60,1,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,10,95,112,114,101,100,105,99,97,116, - 101,124,5,0,0,115,4,0,0,0,0,2,8,1,122,21, - 80,97,116,104,70,105,110,100,101,114,46,95,112,114,101,100, - 105,99,97,116,101,99,3,0,0,0,0,0,0,0,0,0, - 0,0,4,0,0,0,4,0,0,0,3,0,0,0,115,64, - 0,0,0,136,2,160,0,161,0,115,12,100,1,83,0,124, - 2,160,1,100,2,100,3,161,2,125,3,136,0,106,2,106, - 3,124,3,100,4,141,1,137,1,135,0,135,1,135,2,102, - 3,100,5,100,6,132,8,136,2,160,4,161,0,68,0,131, - 1,83,0,41,7,78,114,3,0,0,0,250,1,45,114,45, - 0,0,0,41,1,114,63,1,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,6,0,0,0,51, - 0,0,0,115,32,0,0,0,124,0,93,24,125,1,136,0, - 160,0,136,1,136,2,124,1,161,3,114,26,124,1,86,0, - 1,0,113,2,100,0,83,0,114,110,0,0,0,41,1,114, - 74,1,0,0,41,2,114,32,0,0,0,114,41,1,0,0, - 169,3,114,193,0,0,0,90,7,109,97,116,99,104,101,114, - 114,73,1,0,0,114,3,0,0,0,114,6,0,0,0,114, - 19,1,0,0,135,5,0,0,115,6,0,0,0,4,0,2, - 1,14,255,122,42,80,97,116,104,70,105,110,100,101,114,46, - 95,115,101,97,114,99,104,95,112,97,116,104,46,60,108,111, - 99,97,108,115,62,46,60,103,101,110,101,120,112,114,62,41, - 5,90,6,105,115,95,100,105,114,114,67,0,0,0,218,15, - 115,101,97,114,99,104,95,116,101,109,112,108,97,116,101,114, - 62,0,0,0,90,7,105,116,101,114,100,105,114,41,4,114, - 193,0,0,0,114,73,1,0,0,114,63,1,0,0,90,10, - 110,111,114,109,97,108,105,122,101,100,114,3,0,0,0,114, - 76,1,0,0,114,6,0,0,0,114,65,1,0,0,129,5, - 0,0,115,10,0,0,0,0,2,8,1,4,1,12,1,14, - 1,122,23,80,97,116,104,70,105,110,100,101,114,46,95,115, - 101,97,114,99,104,95,112,97,116,104,41,1,78,41,2,78, - 78,41,1,78,41,2,78,78,41,19,114,125,0,0,0,114, - 124,0,0,0,114,126,0,0,0,114,127,0,0,0,114,207, - 0,0,0,114,46,1,0,0,114,52,1,0,0,114,54,1, - 0,0,114,55,1,0,0,114,58,1,0,0,114,203,0,0, - 0,114,206,0,0,0,114,77,1,0,0,114,64,1,0,0, - 114,61,1,0,0,218,12,115,116,97,116,105,99,109,101,116, - 104,111,100,114,68,1,0,0,114,74,1,0,0,114,65,1, - 0,0,114,3,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,45,1,0,0,209,4,0,0,115, - 52,0,0,0,8,2,4,2,2,1,10,9,2,1,10,12, - 2,1,10,21,2,1,10,14,2,1,12,31,2,1,12,23, - 2,1,12,12,4,2,2,1,12,17,2,1,10,8,2,1, - 10,8,2,1,10,4,2,1,114,45,1,0,0,99,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,64,0,0,0,115,90,0,0,0,101,0,90,1,100, - 0,90,2,100,1,90,3,100,2,100,3,132,0,90,4,100, - 4,100,5,132,0,90,5,101,6,90,7,100,6,100,7,132, - 0,90,8,100,8,100,9,132,0,90,9,100,19,100,11,100, - 12,132,1,90,10,100,13,100,14,132,0,90,11,101,12,100, - 15,100,16,132,0,131,1,90,13,100,17,100,18,132,0,90, - 14,100,10,83,0,41,20,218,10,70,105,108,101,70,105,110, - 100,101,114,122,172,70,105,108,101,45,98,97,115,101,100,32, - 102,105,110,100,101,114,46,10,10,32,32,32,32,73,110,116, - 101,114,97,99,116,105,111,110,115,32,119,105,116,104,32,116, - 104,101,32,102,105,108,101,32,115,121,115,116,101,109,32,97, - 114,101,32,99,97,99,104,101,100,32,102,111,114,32,112,101, - 114,102,111,114,109,97,110,99,101,44,32,98,101,105,110,103, - 10,32,32,32,32,114,101,102,114,101,115,104,101,100,32,119, - 104,101,110,32,116,104,101,32,100,105,114,101,99,116,111,114, - 121,32,116,104,101,32,102,105,110,100,101,114,32,105,115,32, - 104,97,110,100,108,105,110,103,32,104,97,115,32,98,101,101, - 110,32,109,111,100,105,102,105,101,100,46,10,10,32,32,32, - 32,99,2,0,0,0,0,0,0,0,0,0,0,0,5,0, - 0,0,6,0,0,0,7,0,0,0,115,84,0,0,0,103, - 0,125,3,124,2,68,0,93,32,92,2,137,0,125,4,124, - 3,160,0,135,0,102,1,100,1,100,2,132,8,124,4,68, - 0,131,1,161,1,1,0,113,8,124,3,124,0,95,1,124, - 1,112,54,100,3,124,0,95,2,100,4,124,0,95,3,116, - 4,131,0,124,0,95,5,116,4,131,0,124,0,95,6,100, - 5,83,0,41,6,122,154,73,110,105,116,105,97,108,105,122, - 101,32,119,105,116,104,32,116,104,101,32,112,97,116,104,32, - 116,111,32,115,101,97,114,99,104,32,111,110,32,97,110,100, - 32,97,32,118,97,114,105,97,98,108,101,32,110,117,109,98, - 101,114,32,111,102,10,32,32,32,32,32,32,32,32,50,45, - 116,117,112,108,101,115,32,99,111,110,116,97,105,110,105,110, - 103,32,116,104,101,32,108,111,97,100,101,114,32,97,110,100, - 32,116,104,101,32,102,105,108,101,32,115,117,102,102,105,120, - 101,115,32,116,104,101,32,108,111,97,100,101,114,10,32,32, - 32,32,32,32,32,32,114,101,99,111,103,110,105,122,101,115, - 46,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,3,0,0,0,51,0,0,0,115,22,0,0,0,124, - 0,93,14,125,1,124,1,136,0,102,2,86,0,1,0,113, - 2,100,0,83,0,114,110,0,0,0,114,3,0,0,0,114, - 16,1,0,0,169,1,114,140,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,19,1,0,0,154,5,0,0,115,4, - 0,0,0,4,0,2,0,122,38,70,105,108,101,70,105,110, - 100,101,114,46,95,95,105,110,105,116,95,95,46,60,108,111, - 99,97,108,115,62,46,60,103,101,110,101,120,112,114,62,114, - 71,0,0,0,114,105,0,0,0,78,41,7,114,167,0,0, - 0,218,8,95,108,111,97,100,101,114,115,114,44,0,0,0, - 218,11,95,112,97,116,104,95,109,116,105,109,101,218,3,115, - 101,116,218,11,95,112,97,116,104,95,99,97,99,104,101,218, - 19,95,114,101,108,97,120,101,100,95,112,97,116,104,95,99, - 97,99,104,101,41,5,114,119,0,0,0,114,44,0,0,0, - 218,14,108,111,97,100,101,114,95,100,101,116,97,105,108,115, - 90,7,108,111,97,100,101,114,115,114,189,0,0,0,114,3, - 0,0,0,114,80,1,0,0,114,6,0,0,0,114,209,0, - 0,0,148,5,0,0,115,16,0,0,0,0,4,4,1,12, - 1,26,1,6,2,10,1,6,1,8,1,122,19,70,105,108, - 101,70,105,110,100,101,114,46,95,95,105,110,105,116,95,95, + 101,97,100,46,10,10,32,32,32,32,32,32,32,32,78,41, + 3,114,203,0,0,0,114,140,0,0,0,114,178,0,0,0, + 41,3,114,119,0,0,0,114,139,0,0,0,114,187,0,0, + 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 114,137,0,0,0,168,5,0,0,115,8,0,0,0,0,7, + 10,1,8,1,8,1,122,22,70,105,108,101,70,105,110,100, + 101,114,46,102,105,110,100,95,108,111,97,100,101,114,99,6, + 0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,6, + 0,0,0,67,0,0,0,115,26,0,0,0,124,1,124,2, + 124,3,131,2,125,6,116,0,124,2,124,3,124,6,124,4, + 100,1,141,4,83,0,41,2,78,114,177,0,0,0,41,1, + 114,190,0,0,0,41,7,114,119,0,0,0,114,188,0,0, + 0,114,139,0,0,0,114,44,0,0,0,90,4,115,109,115, + 108,114,202,0,0,0,114,140,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,58,1,0,0,180, + 5,0,0,115,8,0,0,0,0,1,10,1,8,1,2,255, + 122,20,70,105,108,101,70,105,110,100,101,114,46,95,103,101, + 116,95,115,112,101,99,78,99,3,0,0,0,0,0,0,0, + 0,0,0,0,14,0,0,0,8,0,0,0,67,0,0,0, + 115,98,1,0,0,100,1,125,3,124,1,160,0,100,2,161, + 1,100,3,25,0,125,4,122,24,116,1,124,0,106,2,112, + 34,116,3,160,4,161,0,131,1,106,5,125,5,87,0,110, + 24,4,0,116,6,107,10,114,66,1,0,1,0,1,0,100, + 4,125,5,89,0,110,2,88,0,124,5,124,0,106,7,107, + 3,114,92,124,0,160,8,161,0,1,0,124,5,124,0,95, + 7,116,9,131,0,114,114,124,0,106,10,125,6,124,4,160, + 11,161,0,125,7,110,10,124,0,106,12,125,6,124,4,125, + 7,124,7,124,6,107,6,114,218,116,13,124,0,106,2,124, + 4,131,2,125,8,124,0,106,14,68,0,93,58,92,2,125, + 9,125,10,100,5,124,9,23,0,125,11,116,13,124,8,124, + 11,131,2,125,12,116,15,124,12,131,1,114,150,124,0,160, + 16,124,10,124,1,124,12,124,8,103,1,124,2,161,5,2, + 0,1,0,83,0,113,150,116,17,124,8,131,1,125,3,124, + 0,106,14,68,0,93,82,92,2,125,9,125,10,116,13,124, + 0,106,2,124,4,124,9,23,0,131,2,125,12,116,18,106, + 19,100,6,124,12,100,3,100,7,141,3,1,0,124,7,124, + 9,23,0,124,6,107,6,114,224,116,15,124,12,131,1,114, + 224,124,0,160,16,124,10,124,1,124,12,100,8,124,2,161, + 5,2,0,1,0,83,0,113,224,124,3,144,1,114,94,116, + 18,160,19,100,9,124,8,161,2,1,0,116,18,160,20,124, + 1,100,8,161,2,125,13,124,8,103,1,124,13,95,21,124, + 13,83,0,100,8,83,0,41,10,122,111,84,114,121,32,116, + 111,32,102,105,110,100,32,97,32,115,112,101,99,32,102,111, + 114,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32, + 109,111,100,117,108,101,46,10,10,32,32,32,32,32,32,32, + 32,82,101,116,117,114,110,115,32,116,104,101,32,109,97,116, + 99,104,105,110,103,32,115,112,101,99,44,32,111,114,32,78, + 111,110,101,32,105,102,32,110,111,116,32,102,111,117,110,100, + 46,10,32,32,32,32,32,32,32,32,70,114,71,0,0,0, + 114,28,0,0,0,114,105,0,0,0,114,209,0,0,0,122, + 9,116,114,121,105,110,103,32,123,125,41,1,90,9,118,101, + 114,98,111,115,105,116,121,78,122,25,112,111,115,115,105,98, + 108,101,32,110,97,109,101,115,112,97,99,101,32,102,111,114, + 32,123,125,41,22,114,41,0,0,0,114,49,0,0,0,114, + 44,0,0,0,114,2,0,0,0,114,55,0,0,0,114,10, + 1,0,0,114,50,0,0,0,114,82,1,0,0,218,11,95, + 102,105,108,108,95,99,97,99,104,101,114,7,0,0,0,114, + 85,1,0,0,114,106,0,0,0,114,84,1,0,0,114,38, + 0,0,0,114,81,1,0,0,114,54,0,0,0,114,58,1, + 0,0,114,56,0,0,0,114,134,0,0,0,114,149,0,0, + 0,114,183,0,0,0,114,178,0,0,0,41,14,114,119,0, + 0,0,114,139,0,0,0,114,202,0,0,0,90,12,105,115, + 95,110,97,109,101,115,112,97,99,101,90,11,116,97,105,108, + 95,109,111,100,117,108,101,114,169,0,0,0,90,5,99,97, + 99,104,101,90,12,99,97,99,104,101,95,109,111,100,117,108, + 101,90,9,98,97,115,101,95,112,97,116,104,114,17,1,0, + 0,114,188,0,0,0,90,13,105,110,105,116,95,102,105,108, + 101,110,97,109,101,90,9,102,117,108,108,95,112,97,116,104, + 114,187,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,203,0,0,0,185,5,0,0,115,74,0, + 0,0,0,5,4,1,14,1,2,1,24,1,14,1,10,1, + 10,1,8,1,6,2,6,1,6,1,10,2,6,1,4,2, + 8,1,12,1,14,1,8,1,10,1,8,1,26,4,8,2, + 14,1,16,1,16,1,12,1,8,1,10,1,2,0,2,255, + 10,2,6,1,12,1,12,1,8,1,4,1,122,20,70,105, + 108,101,70,105,110,100,101,114,46,102,105,110,100,95,115,112, + 101,99,99,1,0,0,0,0,0,0,0,0,0,0,0,9, + 0,0,0,10,0,0,0,67,0,0,0,115,190,0,0,0, + 124,0,106,0,125,1,122,22,116,1,160,2,124,1,112,22, + 116,1,160,3,161,0,161,1,125,2,87,0,110,30,4,0, + 116,4,116,5,116,6,102,3,107,10,114,58,1,0,1,0, + 1,0,103,0,125,2,89,0,110,2,88,0,116,7,106,8, + 160,9,100,1,161,1,115,84,116,10,124,2,131,1,124,0, + 95,11,110,74,116,10,131,0,125,3,124,2,68,0,93,56, + 125,4,124,4,160,12,100,2,161,1,92,3,125,5,125,6, + 125,7,124,6,114,136,100,3,160,13,124,5,124,7,160,14, + 161,0,161,2,125,8,110,4,124,5,125,8,124,3,160,15, + 124,8,161,1,1,0,113,94,124,3,124,0,95,11,116,7, + 106,8,160,9,116,16,161,1,114,186,100,4,100,5,132,0, + 124,2,68,0,131,1,124,0,95,17,100,6,83,0,41,7, + 122,68,70,105,108,108,32,116,104,101,32,99,97,99,104,101, + 32,111,102,32,112,111,116,101,110,116,105,97,108,32,109,111, + 100,117,108,101,115,32,97,110,100,32,112,97,99,107,97,103, + 101,115,32,102,111,114,32,116,104,105,115,32,100,105,114,101, + 99,116,111,114,121,46,114,0,0,0,0,114,71,0,0,0, + 114,61,0,0,0,99,1,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,4,0,0,0,83,0,0,0,115,20, + 0,0,0,104,0,124,0,93,12,125,1,124,1,160,0,161, + 0,146,2,113,4,83,0,114,3,0,0,0,41,1,114,106, + 0,0,0,41,2,114,32,0,0,0,90,2,102,110,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,218,9,60, + 115,101,116,99,111,109,112,62,6,6,0,0,115,4,0,0, + 0,6,0,2,0,122,41,70,105,108,101,70,105,110,100,101, + 114,46,95,102,105,108,108,95,99,97,99,104,101,46,60,108, + 111,99,97,108,115,62,46,60,115,101,116,99,111,109,112,62, + 78,41,18,114,44,0,0,0,114,2,0,0,0,114,7,1, + 0,0,114,55,0,0,0,114,3,1,0,0,218,15,80,101, + 114,109,105,115,115,105,111,110,69,114,114,111,114,218,18,78, + 111,116,65,68,105,114,101,99,116,111,114,121,69,114,114,111, + 114,114,8,0,0,0,114,9,0,0,0,114,10,0,0,0, + 114,83,1,0,0,114,84,1,0,0,114,101,0,0,0,114, + 62,0,0,0,114,106,0,0,0,218,3,97,100,100,114,11, + 0,0,0,114,85,1,0,0,41,9,114,119,0,0,0,114, + 44,0,0,0,114,8,1,0,0,90,21,108,111,119,101,114, + 95,115,117,102,102,105,120,95,99,111,110,116,101,110,116,115, + 114,41,1,0,0,114,117,0,0,0,114,29,1,0,0,114, + 17,1,0,0,90,8,110,101,119,95,110,97,109,101,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,114,87,1, + 0,0,233,5,0,0,115,34,0,0,0,0,2,6,1,2, + 1,22,1,20,3,10,3,12,1,12,7,6,1,8,1,16, + 1,4,1,18,2,4,1,12,1,6,1,12,1,122,22,70, + 105,108,101,70,105,110,100,101,114,46,95,102,105,108,108,95, + 99,97,99,104,101,99,1,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,3,0,0,0,7,0,0,0,115,18, + 0,0,0,135,0,135,1,102,2,100,1,100,2,132,8,125, + 2,124,2,83,0,41,3,97,20,1,0,0,65,32,99,108, + 97,115,115,32,109,101,116,104,111,100,32,119,104,105,99,104, + 32,114,101,116,117,114,110,115,32,97,32,99,108,111,115,117, + 114,101,32,116,111,32,117,115,101,32,111,110,32,115,121,115, + 46,112,97,116,104,95,104,111,111,107,10,32,32,32,32,32, + 32,32,32,119,104,105,99,104,32,119,105,108,108,32,114,101, + 116,117,114,110,32,97,110,32,105,110,115,116,97,110,99,101, + 32,117,115,105,110,103,32,116,104,101,32,115,112,101,99,105, + 102,105,101,100,32,108,111,97,100,101,114,115,32,97,110,100, + 32,116,104,101,32,112,97,116,104,10,32,32,32,32,32,32, + 32,32,99,97,108,108,101,100,32,111,110,32,116,104,101,32, + 99,108,111,115,117,114,101,46,10,10,32,32,32,32,32,32, + 32,32,73,102,32,116,104,101,32,112,97,116,104,32,99,97, + 108,108,101,100,32,111,110,32,116,104,101,32,99,108,111,115, + 117,114,101,32,105,115,32,110,111,116,32,97,32,100,105,114, + 101,99,116,111,114,121,44,32,73,109,112,111,114,116,69,114, + 114,111,114,32,105,115,10,32,32,32,32,32,32,32,32,114, + 97,105,115,101,100,46,10,10,32,32,32,32,32,32,32,32, 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,2,0,0,0,67,0,0,0,115,10,0,0,0,100,1, - 124,0,95,0,100,2,83,0,41,3,122,31,73,110,118,97, - 108,105,100,97,116,101,32,116,104,101,32,100,105,114,101,99, - 116,111,114,121,32,109,116,105,109,101,46,114,105,0,0,0, - 78,41,1,114,82,1,0,0,114,246,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,46,1,0, - 0,162,5,0,0,115,2,0,0,0,0,2,122,28,70,105, - 108,101,70,105,110,100,101,114,46,105,110,118,97,108,105,100, - 97,116,101,95,99,97,99,104,101,115,99,2,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,67, - 0,0,0,115,42,0,0,0,124,0,160,0,124,1,161,1, - 125,2,124,2,100,1,107,8,114,26,100,1,103,0,102,2, - 83,0,124,2,106,1,124,2,106,2,112,38,103,0,102,2, - 83,0,41,2,122,197,84,114,121,32,116,111,32,102,105,110, - 100,32,97,32,108,111,97,100,101,114,32,102,111,114,32,116, - 104,101,32,115,112,101,99,105,102,105,101,100,32,109,111,100, - 117,108,101,44,32,111,114,32,116,104,101,32,110,97,109,101, - 115,112,97,99,101,10,32,32,32,32,32,32,32,32,112,97, - 99,107,97,103,101,32,112,111,114,116,105,111,110,115,46,32, - 82,101,116,117,114,110,115,32,40,108,111,97,100,101,114,44, - 32,108,105,115,116,45,111,102,45,112,111,114,116,105,111,110, - 115,41,46,10,10,32,32,32,32,32,32,32,32,84,104,105, - 115,32,109,101,116,104,111,100,32,105,115,32,100,101,112,114, - 101,99,97,116,101,100,46,32,32,85,115,101,32,102,105,110, - 100,95,115,112,101,99,40,41,32,105,110,115,116,101,97,100, - 46,10,10,32,32,32,32,32,32,32,32,78,41,3,114,203, - 0,0,0,114,140,0,0,0,114,178,0,0,0,41,3,114, - 119,0,0,0,114,139,0,0,0,114,187,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,137,0, - 0,0,168,5,0,0,115,8,0,0,0,0,7,10,1,8, - 1,8,1,122,22,70,105,108,101,70,105,110,100,101,114,46, - 102,105,110,100,95,108,111,97,100,101,114,99,6,0,0,0, - 0,0,0,0,0,0,0,0,7,0,0,0,6,0,0,0, - 67,0,0,0,115,26,0,0,0,124,1,124,2,124,3,131, - 2,125,6,116,0,124,2,124,3,124,6,124,4,100,1,141, - 4,83,0,41,2,78,114,177,0,0,0,41,1,114,190,0, - 0,0,41,7,114,119,0,0,0,114,188,0,0,0,114,139, - 0,0,0,114,44,0,0,0,90,4,115,109,115,108,114,202, - 0,0,0,114,140,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,58,1,0,0,180,5,0,0, - 115,8,0,0,0,0,1,10,1,8,1,2,255,122,20,70, - 105,108,101,70,105,110,100,101,114,46,95,103,101,116,95,115, - 112,101,99,78,99,3,0,0,0,0,0,0,0,0,0,0, - 0,14,0,0,0,8,0,0,0,67,0,0,0,115,102,1, - 0,0,100,1,125,3,124,1,160,0,100,2,161,1,100,3, - 25,0,125,4,122,24,116,1,124,0,106,2,112,34,116,3, - 160,4,161,0,131,1,106,5,125,5,87,0,110,24,4,0, - 116,6,107,10,114,66,1,0,1,0,1,0,100,4,125,5, - 89,0,110,2,88,0,124,5,124,0,106,7,107,3,114,92, - 124,0,160,8,161,0,1,0,124,5,124,0,95,7,116,9, - 131,0,114,114,124,0,106,10,125,6,124,4,160,11,161,0, - 125,7,110,10,124,0,106,12,125,6,124,4,125,7,124,7, - 124,6,107,6,114,218,116,13,124,0,106,2,124,4,131,2, - 125,8,124,0,106,14,68,0,93,58,92,2,125,9,125,10, - 100,5,124,9,23,0,125,11,116,13,124,8,124,11,131,2, - 125,12,116,15,124,12,131,1,114,208,124,0,160,16,124,10, - 124,1,124,12,124,8,103,1,124,2,161,5,2,0,1,0, - 83,0,113,150,116,17,124,8,131,1,125,3,124,0,106,14, - 68,0,93,86,92,2,125,9,125,10,116,13,124,0,106,2, - 124,4,124,9,23,0,131,2,125,12,116,18,106,19,100,6, - 124,12,100,3,100,7,141,3,1,0,124,7,124,9,23,0, - 124,6,107,6,144,1,114,54,116,15,124,12,131,1,144,1, - 114,54,124,0,160,16,124,10,124,1,124,12,100,8,124,2, - 161,5,2,0,1,0,83,0,113,224,124,3,144,1,114,98, - 116,18,160,19,100,9,124,8,161,2,1,0,116,18,160,20, - 124,1,100,8,161,2,125,13,124,8,103,1,124,13,95,21, - 124,13,83,0,100,8,83,0,41,10,122,111,84,114,121,32, - 116,111,32,102,105,110,100,32,97,32,115,112,101,99,32,102, - 111,114,32,116,104,101,32,115,112,101,99,105,102,105,101,100, - 32,109,111,100,117,108,101,46,10,10,32,32,32,32,32,32, - 32,32,82,101,116,117,114,110,115,32,116,104,101,32,109,97, - 116,99,104,105,110,103,32,115,112,101,99,44,32,111,114,32, - 78,111,110,101,32,105,102,32,110,111,116,32,102,111,117,110, - 100,46,10,32,32,32,32,32,32,32,32,70,114,71,0,0, - 0,114,28,0,0,0,114,105,0,0,0,114,209,0,0,0, - 122,9,116,114,121,105,110,103,32,123,125,41,1,90,9,118, - 101,114,98,111,115,105,116,121,78,122,25,112,111,115,115,105, - 98,108,101,32,110,97,109,101,115,112,97,99,101,32,102,111, - 114,32,123,125,41,22,114,41,0,0,0,114,49,0,0,0, - 114,44,0,0,0,114,2,0,0,0,114,55,0,0,0,114, - 10,1,0,0,114,50,0,0,0,114,82,1,0,0,218,11, - 95,102,105,108,108,95,99,97,99,104,101,114,7,0,0,0, - 114,85,1,0,0,114,106,0,0,0,114,84,1,0,0,114, - 38,0,0,0,114,81,1,0,0,114,54,0,0,0,114,58, - 1,0,0,114,56,0,0,0,114,134,0,0,0,114,149,0, - 0,0,114,183,0,0,0,114,178,0,0,0,41,14,114,119, - 0,0,0,114,139,0,0,0,114,202,0,0,0,90,12,105, - 115,95,110,97,109,101,115,112,97,99,101,90,11,116,97,105, - 108,95,109,111,100,117,108,101,114,169,0,0,0,90,5,99, - 97,99,104,101,90,12,99,97,99,104,101,95,109,111,100,117, - 108,101,90,9,98,97,115,101,95,112,97,116,104,114,17,1, - 0,0,114,188,0,0,0,90,13,105,110,105,116,95,102,105, - 108,101,110,97,109,101,90,9,102,117,108,108,95,112,97,116, - 104,114,187,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,203,0,0,0,185,5,0,0,115,74, - 0,0,0,0,5,4,1,14,1,2,1,24,1,14,1,10, - 1,10,1,8,1,6,2,6,1,6,1,10,2,6,1,4, - 2,8,1,12,1,14,1,8,1,10,1,8,1,26,4,8, - 2,14,1,16,1,16,1,14,1,10,1,10,1,2,0,2, - 255,10,2,6,1,12,1,12,1,8,1,4,1,122,20,70, - 105,108,101,70,105,110,100,101,114,46,102,105,110,100,95,115, - 112,101,99,99,1,0,0,0,0,0,0,0,0,0,0,0, - 9,0,0,0,10,0,0,0,67,0,0,0,115,190,0,0, - 0,124,0,106,0,125,1,122,22,116,1,160,2,124,1,112, - 22,116,1,160,3,161,0,161,1,125,2,87,0,110,30,4, - 0,116,4,116,5,116,6,102,3,107,10,114,58,1,0,1, - 0,1,0,103,0,125,2,89,0,110,2,88,0,116,7,106, - 8,160,9,100,1,161,1,115,84,116,10,124,2,131,1,124, - 0,95,11,110,74,116,10,131,0,125,3,124,2,68,0,93, - 56,125,4,124,4,160,12,100,2,161,1,92,3,125,5,125, - 6,125,7,124,6,114,136,100,3,160,13,124,5,124,7,160, - 14,161,0,161,2,125,8,110,4,124,5,125,8,124,3,160, - 15,124,8,161,1,1,0,113,94,124,3,124,0,95,11,116, - 7,106,8,160,9,116,16,161,1,114,186,100,4,100,5,132, - 0,124,2,68,0,131,1,124,0,95,17,100,6,83,0,41, - 7,122,68,70,105,108,108,32,116,104,101,32,99,97,99,104, - 101,32,111,102,32,112,111,116,101,110,116,105,97,108,32,109, - 111,100,117,108,101,115,32,97,110,100,32,112,97,99,107,97, - 103,101,115,32,102,111,114,32,116,104,105,115,32,100,105,114, - 101,99,116,111,114,121,46,114,0,0,0,0,114,71,0,0, - 0,114,61,0,0,0,99,1,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,4,0,0,0,83,0,0,0,115, - 20,0,0,0,104,0,124,0,93,12,125,1,124,1,160,0, - 161,0,146,2,113,4,83,0,114,3,0,0,0,41,1,114, - 106,0,0,0,41,2,114,32,0,0,0,90,2,102,110,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,9, - 60,115,101,116,99,111,109,112,62,6,6,0,0,115,4,0, - 0,0,6,0,2,0,122,41,70,105,108,101,70,105,110,100, - 101,114,46,95,102,105,108,108,95,99,97,99,104,101,46,60, - 108,111,99,97,108,115,62,46,60,115,101,116,99,111,109,112, - 62,78,41,18,114,44,0,0,0,114,2,0,0,0,114,7, - 1,0,0,114,55,0,0,0,114,3,1,0,0,218,15,80, - 101,114,109,105,115,115,105,111,110,69,114,114,111,114,218,18, - 78,111,116,65,68,105,114,101,99,116,111,114,121,69,114,114, - 111,114,114,8,0,0,0,114,9,0,0,0,114,10,0,0, - 0,114,83,1,0,0,114,84,1,0,0,114,101,0,0,0, - 114,62,0,0,0,114,106,0,0,0,218,3,97,100,100,114, - 11,0,0,0,114,85,1,0,0,41,9,114,119,0,0,0, - 114,44,0,0,0,114,8,1,0,0,90,21,108,111,119,101, - 114,95,115,117,102,102,105,120,95,99,111,110,116,101,110,116, - 115,114,41,1,0,0,114,117,0,0,0,114,29,1,0,0, - 114,17,1,0,0,90,8,110,101,119,95,110,97,109,101,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,87, - 1,0,0,233,5,0,0,115,34,0,0,0,0,2,6,1, - 2,1,22,1,20,3,10,3,12,1,12,7,6,1,8,1, - 16,1,4,1,18,2,4,1,12,1,6,1,12,1,122,22, - 70,105,108,101,70,105,110,100,101,114,46,95,102,105,108,108, - 95,99,97,99,104,101,99,1,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,3,0,0,0,7,0,0,0,115, - 18,0,0,0,135,0,135,1,102,2,100,1,100,2,132,8, - 125,2,124,2,83,0,41,3,97,20,1,0,0,65,32,99, - 108,97,115,115,32,109,101,116,104,111,100,32,119,104,105,99, - 104,32,114,101,116,117,114,110,115,32,97,32,99,108,111,115, - 117,114,101,32,116,111,32,117,115,101,32,111,110,32,115,121, - 115,46,112,97,116,104,95,104,111,111,107,10,32,32,32,32, - 32,32,32,32,119,104,105,99,104,32,119,105,108,108,32,114, - 101,116,117,114,110,32,97,110,32,105,110,115,116,97,110,99, - 101,32,117,115,105,110,103,32,116,104,101,32,115,112,101,99, - 105,102,105,101,100,32,108,111,97,100,101,114,115,32,97,110, - 100,32,116,104,101,32,112,97,116,104,10,32,32,32,32,32, - 32,32,32,99,97,108,108,101,100,32,111,110,32,116,104,101, - 32,99,108,111,115,117,114,101,46,10,10,32,32,32,32,32, - 32,32,32,73,102,32,116,104,101,32,112,97,116,104,32,99, - 97,108,108,101,100,32,111,110,32,116,104,101,32,99,108,111, - 115,117,114,101,32,105,115,32,110,111,116,32,97,32,100,105, - 114,101,99,116,111,114,121,44,32,73,109,112,111,114,116,69, - 114,114,111,114,32,105,115,10,32,32,32,32,32,32,32,32, - 114,97,105,115,101,100,46,10,10,32,32,32,32,32,32,32, - 32,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,4,0,0,0,19,0,0,0,115,34,0,0,0,116, - 0,124,0,131,1,115,20,116,1,100,1,124,0,100,2,141, - 2,130,1,136,0,124,0,102,1,136,1,158,2,142,0,83, - 0,41,3,122,45,80,97,116,104,32,104,111,111,107,32,102, - 111,114,32,105,109,112,111,114,116,108,105,98,46,109,97,99, - 104,105,110,101,114,121,46,70,105,108,101,70,105,110,100,101, - 114,46,122,30,111,110,108,121,32,100,105,114,101,99,116,111, - 114,105,101,115,32,97,114,101,32,115,117,112,112,111,114,116, - 101,100,114,48,0,0,0,41,2,114,56,0,0,0,114,118, - 0,0,0,114,48,0,0,0,169,2,114,193,0,0,0,114, - 86,1,0,0,114,3,0,0,0,114,6,0,0,0,218,24, - 112,97,116,104,95,104,111,111,107,95,102,111,114,95,70,105, - 108,101,70,105,110,100,101,114,18,6,0,0,115,6,0,0, - 0,0,2,8,1,12,1,122,54,70,105,108,101,70,105,110, - 100,101,114,46,112,97,116,104,95,104,111,111,107,46,60,108, - 111,99,97,108,115,62,46,112,97,116,104,95,104,111,111,107, - 95,102,111,114,95,70,105,108,101,70,105,110,100,101,114,114, - 3,0,0,0,41,3,114,193,0,0,0,114,86,1,0,0, - 114,93,1,0,0,114,3,0,0,0,114,92,1,0,0,114, - 6,0,0,0,218,9,112,97,116,104,95,104,111,111,107,8, - 6,0,0,115,4,0,0,0,0,10,14,6,122,20,70,105, - 108,101,70,105,110,100,101,114,46,112,97,116,104,95,104,111, - 111,107,99,1,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,3,0,0,0,67,0,0,0,115,12,0,0,0, - 100,1,160,0,124,0,106,1,161,1,83,0,41,2,78,122, - 16,70,105,108,101,70,105,110,100,101,114,40,123,33,114,125, - 41,41,2,114,62,0,0,0,114,44,0,0,0,114,246,0, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,39,1,0,0,26,6,0,0,115,2,0,0,0,0, - 1,122,19,70,105,108,101,70,105,110,100,101,114,46,95,95, - 114,101,112,114,95,95,41,1,78,41,15,114,125,0,0,0, - 114,124,0,0,0,114,126,0,0,0,114,127,0,0,0,114, - 209,0,0,0,114,46,1,0,0,114,143,0,0,0,114,206, - 0,0,0,114,137,0,0,0,114,58,1,0,0,114,203,0, - 0,0,114,87,1,0,0,114,207,0,0,0,114,94,1,0, - 0,114,39,1,0,0,114,3,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,79,1,0,0,139, - 5,0,0,115,22,0,0,0,8,2,4,7,8,14,8,4, - 4,2,8,12,8,5,10,48,8,31,2,1,10,17,114,79, - 1,0,0,99,4,0,0,0,0,0,0,0,0,0,0,0, - 6,0,0,0,8,0,0,0,67,0,0,0,115,146,0,0, - 0,124,0,160,0,100,1,161,1,125,4,124,0,160,0,100, - 2,161,1,125,5,124,4,115,66,124,5,114,36,124,5,106, - 1,125,4,110,30,124,2,124,3,107,2,114,56,116,2,124, - 1,124,2,131,2,125,4,110,10,116,3,124,1,124,2,131, - 2,125,4,124,5,115,84,116,4,124,1,124,2,124,4,100, - 3,141,3,125,5,122,36,124,5,124,0,100,2,60,0,124, - 4,124,0,100,1,60,0,124,2,124,0,100,4,60,0,124, - 3,124,0,100,5,60,0,87,0,110,20,4,0,116,5,107, - 10,114,140,1,0,1,0,1,0,89,0,110,2,88,0,100, - 0,83,0,41,6,78,218,10,95,95,108,111,97,100,101,114, - 95,95,218,8,95,95,115,112,101,99,95,95,114,80,1,0, - 0,90,8,95,95,102,105,108,101,95,95,90,10,95,95,99, - 97,99,104,101,100,95,95,41,6,218,3,103,101,116,114,140, - 0,0,0,114,15,1,0,0,114,9,1,0,0,114,190,0, - 0,0,114,72,1,0,0,41,6,90,2,110,115,114,117,0, - 0,0,90,8,112,97,116,104,110,97,109,101,90,9,99,112, - 97,116,104,110,97,109,101,114,140,0,0,0,114,187,0,0, + 0,4,0,0,0,19,0,0,0,115,34,0,0,0,116,0, + 124,0,131,1,115,20,116,1,100,1,124,0,100,2,141,2, + 130,1,136,0,124,0,102,1,136,1,158,2,142,0,83,0, + 41,3,122,45,80,97,116,104,32,104,111,111,107,32,102,111, + 114,32,105,109,112,111,114,116,108,105,98,46,109,97,99,104, + 105,110,101,114,121,46,70,105,108,101,70,105,110,100,101,114, + 46,122,30,111,110,108,121,32,100,105,114,101,99,116,111,114, + 105,101,115,32,97,114,101,32,115,117,112,112,111,114,116,101, + 100,114,48,0,0,0,41,2,114,56,0,0,0,114,118,0, + 0,0,114,48,0,0,0,169,2,114,193,0,0,0,114,86, + 1,0,0,114,3,0,0,0,114,6,0,0,0,218,24,112, + 97,116,104,95,104,111,111,107,95,102,111,114,95,70,105,108, + 101,70,105,110,100,101,114,18,6,0,0,115,6,0,0,0, + 0,2,8,1,12,1,122,54,70,105,108,101,70,105,110,100, + 101,114,46,112,97,116,104,95,104,111,111,107,46,60,108,111, + 99,97,108,115,62,46,112,97,116,104,95,104,111,111,107,95, + 102,111,114,95,70,105,108,101,70,105,110,100,101,114,114,3, + 0,0,0,41,3,114,193,0,0,0,114,86,1,0,0,114, + 93,1,0,0,114,3,0,0,0,114,92,1,0,0,114,6, + 0,0,0,218,9,112,97,116,104,95,104,111,111,107,8,6, + 0,0,115,4,0,0,0,0,10,14,6,122,20,70,105,108, + 101,70,105,110,100,101,114,46,112,97,116,104,95,104,111,111, + 107,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,3,0,0,0,67,0,0,0,115,12,0,0,0,100, + 1,160,0,124,0,106,1,161,1,83,0,41,2,78,122,16, + 70,105,108,101,70,105,110,100,101,114,40,123,33,114,125,41, + 41,2,114,62,0,0,0,114,44,0,0,0,114,246,0,0, 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 218,14,95,102,105,120,95,117,112,95,109,111,100,117,108,101, - 32,6,0,0,115,34,0,0,0,0,2,10,1,10,1,4, - 1,4,1,8,1,8,1,12,2,10,1,4,1,14,1,2, - 1,8,1,8,1,8,1,12,1,14,2,114,98,1,0,0, - 99,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,3,0,0,0,67,0,0,0,115,38,0,0,0,116,0, - 116,1,160,2,161,0,102,2,125,0,116,3,116,4,102,2, - 125,1,116,5,116,6,102,2,125,2,124,0,124,1,124,2, - 103,3,83,0,41,1,122,95,82,101,116,117,114,110,115,32, - 97,32,108,105,115,116,32,111,102,32,102,105,108,101,45,98, - 97,115,101,100,32,109,111,100,117,108,101,32,108,111,97,100, - 101,114,115,46,10,10,32,32,32,32,69,97,99,104,32,105, - 116,101,109,32,105,115,32,97,32,116,117,112,108,101,32,40, - 108,111,97,100,101,114,44,32,115,117,102,102,105,120,101,115, - 41,46,10,32,32,32,32,41,7,114,252,0,0,0,114,163, - 0,0,0,218,18,101,120,116,101,110,115,105,111,110,95,115, - 117,102,102,105,120,101,115,114,9,1,0,0,114,102,0,0, - 0,114,15,1,0,0,114,89,0,0,0,41,3,90,10,101, - 120,116,101,110,115,105,111,110,115,90,6,115,111,117,114,99, - 101,90,8,98,121,116,101,99,111,100,101,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,184,0,0,0,55, - 6,0,0,115,8,0,0,0,0,5,12,1,8,1,8,1, - 114,184,0,0,0,99,1,0,0,0,0,0,0,0,0,0, - 0,0,12,0,0,0,9,0,0,0,67,0,0,0,115,178, - 1,0,0,124,0,97,0,116,0,106,1,97,1,116,0,106, - 2,97,2,116,1,106,3,116,4,25,0,125,1,100,1,68, - 0,93,48,125,2,124,2,116,1,106,3,107,7,114,56,116, - 0,160,5,124,2,161,1,125,3,110,10,116,1,106,3,124, - 2,25,0,125,3,116,6,124,1,124,2,124,3,131,3,1, - 0,113,30,100,2,100,3,103,1,102,2,100,4,100,5,100, - 3,103,2,102,2,102,2,125,4,124,4,68,0,93,110,92, - 2,125,5,125,6,116,7,100,6,100,7,132,0,124,6,68, - 0,131,1,131,1,115,136,116,8,130,1,124,6,100,8,25, - 0,125,7,124,5,116,1,106,3,107,6,114,170,116,1,106, - 3,124,5,25,0,125,8,1,0,113,226,113,106,122,20,116, - 0,160,5,124,5,161,1,125,8,87,0,1,0,113,226,87, - 0,113,106,4,0,116,9,107,10,114,214,1,0,1,0,1, - 0,89,0,113,106,89,0,113,106,88,0,113,106,116,9,100, - 9,131,1,130,1,116,6,124,1,100,10,124,8,131,3,1, - 0,116,6,124,1,100,11,124,7,131,3,1,0,116,6,124, - 1,100,12,100,13,160,10,124,6,161,1,131,3,1,0,116, - 6,124,1,100,14,100,15,100,16,132,0,124,6,68,0,131, - 1,131,3,1,0,116,0,160,5,100,17,161,1,125,9,116, - 6,124,1,100,17,124,9,131,3,1,0,116,0,160,5,100, - 18,161,1,125,10,116,6,124,1,100,18,124,10,131,3,1, - 0,124,5,100,4,107,2,144,1,114,110,116,0,160,5,100, - 19,161,1,125,11,116,6,124,1,100,20,124,11,131,3,1, - 0,116,6,124,1,100,21,116,11,131,0,131,3,1,0,116, - 12,160,13,116,2,160,14,161,0,161,1,1,0,124,5,100, - 4,107,2,144,1,114,174,116,15,160,16,100,22,161,1,1, - 0,100,23,116,12,107,6,144,1,114,174,100,24,116,17,95, - 18,100,25,83,0,41,26,122,205,83,101,116,117,112,32,116, - 104,101,32,112,97,116,104,45,98,97,115,101,100,32,105,109, - 112,111,114,116,101,114,115,32,102,111,114,32,105,109,112,111, - 114,116,108,105,98,32,98,121,32,105,109,112,111,114,116,105, - 110,103,32,110,101,101,100,101,100,10,32,32,32,32,98,117, - 105,108,116,45,105,110,32,109,111,100,117,108,101,115,32,97, - 110,100,32,105,110,106,101,99,116,105,110,103,32,116,104,101, - 109,32,105,110,116,111,32,116,104,101,32,103,108,111,98,97, - 108,32,110,97,109,101,115,112,97,99,101,46,10,10,32,32, - 32,32,79,116,104,101,114,32,99,111,109,112,111,110,101,110, - 116,115,32,97,114,101,32,101,120,116,114,97,99,116,101,100, - 32,102,114,111,109,32,116,104,101,32,99,111,114,101,32,98, - 111,111,116,115,116,114,97,112,32,109,111,100,117,108,101,46, - 10,10,32,32,32,32,41,4,114,64,0,0,0,114,75,0, - 0,0,218,8,98,117,105,108,116,105,110,115,114,160,0,0, - 0,90,5,112,111,115,105,120,250,1,47,90,2,110,116,250, - 1,92,99,1,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,3,0,0,0,115,0,0,0,115,26,0,0,0, - 124,0,93,18,125,1,116,0,124,1,131,1,100,0,107,2, - 86,0,1,0,113,2,100,1,83,0,41,2,114,39,0,0, - 0,78,41,1,114,22,0,0,0,41,2,114,32,0,0,0, - 114,95,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,19,1,0,0,91,6,0,0,115,4,0, - 0,0,4,0,2,0,122,25,95,115,101,116,117,112,46,60, - 108,111,99,97,108,115,62,46,60,103,101,110,101,120,112,114, - 62,114,73,0,0,0,122,30,105,109,112,111,114,116,108,105, - 98,32,114,101,113,117,105,114,101,115,32,112,111,115,105,120, - 32,111,114,32,110,116,114,2,0,0,0,114,35,0,0,0, - 114,31,0,0,0,114,40,0,0,0,114,58,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 4,0,0,0,83,0,0,0,115,22,0,0,0,104,0,124, - 0,93,14,125,1,100,0,124,1,155,0,157,2,146,2,113, - 4,83,0,41,1,114,74,0,0,0,114,3,0,0,0,41, - 2,114,32,0,0,0,218,1,115,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,88,1,0,0,107,6,0, - 0,115,4,0,0,0,6,0,2,0,122,25,95,115,101,116, - 117,112,46,60,108,111,99,97,108,115,62,46,60,115,101,116, - 99,111,109,112,62,90,7,95,116,104,114,101,97,100,90,8, - 95,119,101,97,107,114,101,102,90,6,119,105,110,114,101,103, - 114,192,0,0,0,114,7,0,0,0,122,4,46,112,121,119, - 122,6,95,100,46,112,121,100,84,78,41,19,114,134,0,0, - 0,114,8,0,0,0,114,163,0,0,0,114,31,1,0,0, - 114,125,0,0,0,90,18,95,98,117,105,108,116,105,110,95, - 102,114,111,109,95,110,97,109,101,114,129,0,0,0,218,3, - 97,108,108,114,23,0,0,0,114,118,0,0,0,114,36,0, - 0,0,114,13,0,0,0,114,21,1,0,0,114,167,0,0, - 0,114,99,1,0,0,114,102,0,0,0,114,186,0,0,0, - 114,191,0,0,0,114,195,0,0,0,41,12,218,17,95,98, - 111,111,116,115,116,114,97,112,95,109,111,100,117,108,101,90, - 11,115,101,108,102,95,109,111,100,117,108,101,90,12,98,117, - 105,108,116,105,110,95,110,97,109,101,90,14,98,117,105,108, - 116,105,110,95,109,111,100,117,108,101,90,10,111,115,95,100, - 101,116,97,105,108,115,90,10,98,117,105,108,116,105,110,95, - 111,115,114,31,0,0,0,114,35,0,0,0,90,9,111,115, - 95,109,111,100,117,108,101,90,13,116,104,114,101,97,100,95, - 109,111,100,117,108,101,90,14,119,101,97,107,114,101,102,95, - 109,111,100,117,108,101,90,13,119,105,110,114,101,103,95,109, - 111,100,117,108,101,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,218,6,95,115,101,116,117,112,66,6,0,0, - 115,78,0,0,0,0,8,4,1,6,1,6,3,10,1,8, - 1,10,1,12,2,10,1,14,3,22,1,12,2,22,1,8, - 1,10,1,10,1,6,2,2,1,10,1,10,1,14,1,12, - 2,8,1,12,1,12,1,18,1,22,3,10,1,12,3,10, - 1,12,3,10,1,10,1,12,3,14,1,14,1,10,1,10, - 1,10,1,114,106,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,106,1,0,0,114,184,0, - 0,0,114,8,0,0,0,114,51,1,0,0,114,167,0,0, - 0,114,79,1,0,0,114,94,1,0,0,218,9,109,101,116, - 97,95,112,97,116,104,114,186,0,0,0,114,45,1,0,0, - 41,2,114,105,1,0,0,90,17,115,117,112,112,111,114,116, - 101,100,95,108,111,97,100,101,114,115,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,8,95,105,110,115,116, - 97,108,108,131,6,0,0,115,8,0,0,0,0,2,8,1, - 6,1,20,1,114,108,1,0,0,41,63,114,127,0,0,0, - 114,12,0,0,0,90,37,95,67,65,83,69,95,73,78,83, - 69,78,83,73,84,73,86,69,95,80,76,65,84,70,79,82, - 77,83,95,66,89,84,69,83,95,75,69,89,114,11,0,0, - 0,114,13,0,0,0,114,20,0,0,0,114,27,0,0,0, - 114,29,0,0,0,114,38,0,0,0,114,47,0,0,0,114, - 49,0,0,0,114,53,0,0,0,114,54,0,0,0,114,56, - 0,0,0,114,59,0,0,0,114,69,0,0,0,218,4,116, - 121,112,101,218,8,95,95,99,111,100,101,95,95,114,162,0, - 0,0,114,18,0,0,0,114,148,0,0,0,114,17,0,0, - 0,114,24,0,0,0,114,236,0,0,0,114,92,0,0,0, - 114,88,0,0,0,114,102,0,0,0,114,89,0,0,0,90, - 23,68,69,66,85,71,95,66,89,84,69,67,79,68,69,95, - 83,85,70,70,73,88,69,83,90,27,79,80,84,73,77,73, - 90,69,68,95,66,89,84,69,67,79,68,69,95,83,85,70, - 70,73,88,69,83,114,98,0,0,0,114,103,0,0,0,114, - 109,0,0,0,114,113,0,0,0,114,115,0,0,0,114,136, - 0,0,0,114,143,0,0,0,114,152,0,0,0,114,156,0, - 0,0,114,158,0,0,0,114,165,0,0,0,114,170,0,0, - 0,114,171,0,0,0,114,176,0,0,0,218,6,111,98,106, - 101,99,116,114,185,0,0,0,114,190,0,0,0,114,191,0, - 0,0,114,208,0,0,0,114,221,0,0,0,114,239,0,0, - 0,114,9,1,0,0,114,15,1,0,0,114,21,1,0,0, - 114,252,0,0,0,114,22,1,0,0,114,43,1,0,0,114, - 45,1,0,0,114,79,1,0,0,114,98,1,0,0,114,184, - 0,0,0,114,106,1,0,0,114,108,1,0,0,114,3,0, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,8,60,109,111,100,117,108,101,62,1,0,0,0,115, - 126,0,0,0,4,22,4,1,4,1,2,1,2,255,4,4, - 8,17,8,5,8,5,8,6,8,6,8,12,8,10,8,9, - 8,5,8,7,8,9,12,22,10,127,0,8,16,1,12,2, - 4,1,4,2,6,2,6,2,8,2,18,71,8,40,8,19, - 8,12,8,12,8,28,8,17,8,33,8,28,8,24,16,13, - 14,10,12,11,8,14,6,3,6,1,2,255,12,68,14,64, - 14,29,16,127,0,17,14,72,18,45,18,26,4,3,18,53, - 14,63,14,42,14,127,0,59,14,127,0,22,12,23,8,11, - 8,65, + 114,39,1,0,0,26,6,0,0,115,2,0,0,0,0,1, + 122,19,70,105,108,101,70,105,110,100,101,114,46,95,95,114, + 101,112,114,95,95,41,1,78,41,15,114,125,0,0,0,114, + 124,0,0,0,114,126,0,0,0,114,127,0,0,0,114,209, + 0,0,0,114,46,1,0,0,114,143,0,0,0,114,206,0, + 0,0,114,137,0,0,0,114,58,1,0,0,114,203,0,0, + 0,114,87,1,0,0,114,207,0,0,0,114,94,1,0,0, + 114,39,1,0,0,114,3,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,79,1,0,0,139,5, + 0,0,115,22,0,0,0,8,2,4,7,8,14,8,4,4, + 2,8,12,8,5,10,48,8,31,2,1,10,17,114,79,1, + 0,0,99,4,0,0,0,0,0,0,0,0,0,0,0,6, + 0,0,0,8,0,0,0,67,0,0,0,115,146,0,0,0, + 124,0,160,0,100,1,161,1,125,4,124,0,160,0,100,2, + 161,1,125,5,124,4,115,66,124,5,114,36,124,5,106,1, + 125,4,110,30,124,2,124,3,107,2,114,56,116,2,124,1, + 124,2,131,2,125,4,110,10,116,3,124,1,124,2,131,2, + 125,4,124,5,115,84,116,4,124,1,124,2,124,4,100,3, + 141,3,125,5,122,36,124,5,124,0,100,2,60,0,124,4, + 124,0,100,1,60,0,124,2,124,0,100,4,60,0,124,3, + 124,0,100,5,60,0,87,0,110,20,4,0,116,5,107,10, + 114,140,1,0,1,0,1,0,89,0,110,2,88,0,100,0, + 83,0,41,6,78,218,10,95,95,108,111,97,100,101,114,95, + 95,218,8,95,95,115,112,101,99,95,95,114,80,1,0,0, + 90,8,95,95,102,105,108,101,95,95,90,10,95,95,99,97, + 99,104,101,100,95,95,41,6,218,3,103,101,116,114,140,0, + 0,0,114,15,1,0,0,114,9,1,0,0,114,190,0,0, + 0,114,72,1,0,0,41,6,90,2,110,115,114,117,0,0, + 0,90,8,112,97,116,104,110,97,109,101,90,9,99,112,97, + 116,104,110,97,109,101,114,140,0,0,0,114,187,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, + 14,95,102,105,120,95,117,112,95,109,111,100,117,108,101,32, + 6,0,0,115,34,0,0,0,0,2,10,1,10,1,4,1, + 4,1,8,1,8,1,12,2,10,1,4,1,14,1,2,1, + 8,1,8,1,8,1,12,1,14,2,114,98,1,0,0,99, + 0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 3,0,0,0,67,0,0,0,115,38,0,0,0,116,0,116, + 1,160,2,161,0,102,2,125,0,116,3,116,4,102,2,125, + 1,116,5,116,6,102,2,125,2,124,0,124,1,124,2,103, + 3,83,0,41,1,122,95,82,101,116,117,114,110,115,32,97, + 32,108,105,115,116,32,111,102,32,102,105,108,101,45,98,97, + 115,101,100,32,109,111,100,117,108,101,32,108,111,97,100,101, + 114,115,46,10,10,32,32,32,32,69,97,99,104,32,105,116, + 101,109,32,105,115,32,97,32,116,117,112,108,101,32,40,108, + 111,97,100,101,114,44,32,115,117,102,102,105,120,101,115,41, + 46,10,32,32,32,32,41,7,114,252,0,0,0,114,163,0, + 0,0,218,18,101,120,116,101,110,115,105,111,110,95,115,117, + 102,102,105,120,101,115,114,9,1,0,0,114,102,0,0,0, + 114,15,1,0,0,114,89,0,0,0,41,3,90,10,101,120, + 116,101,110,115,105,111,110,115,90,6,115,111,117,114,99,101, + 90,8,98,121,116,101,99,111,100,101,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,184,0,0,0,55,6, + 0,0,115,8,0,0,0,0,5,12,1,8,1,8,1,114, + 184,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,12,0,0,0,9,0,0,0,67,0,0,0,115,178,1, + 0,0,124,0,97,0,116,0,106,1,97,1,116,0,106,2, + 97,2,116,1,106,3,116,4,25,0,125,1,100,1,68,0, + 93,48,125,2,124,2,116,1,106,3,107,7,114,56,116,0, + 160,5,124,2,161,1,125,3,110,10,116,1,106,3,124,2, + 25,0,125,3,116,6,124,1,124,2,124,3,131,3,1,0, + 113,30,100,2,100,3,103,1,102,2,100,4,100,5,100,3, + 103,2,102,2,102,2,125,4,124,4,68,0,93,110,92,2, + 125,5,125,6,116,7,100,6,100,7,132,0,124,6,68,0, + 131,1,131,1,115,136,116,8,130,1,124,6,100,8,25,0, + 125,7,124,5,116,1,106,3,107,6,114,170,116,1,106,3, + 124,5,25,0,125,8,1,0,113,226,113,106,122,20,116,0, + 160,5,124,5,161,1,125,8,87,0,1,0,113,226,87,0, + 113,106,4,0,116,9,107,10,114,214,1,0,1,0,1,0, + 89,0,113,106,89,0,113,106,88,0,113,106,116,9,100,9, + 131,1,130,1,116,6,124,1,100,10,124,8,131,3,1,0, + 116,6,124,1,100,11,124,7,131,3,1,0,116,6,124,1, + 100,12,100,13,160,10,124,6,161,1,131,3,1,0,116,6, + 124,1,100,14,100,15,100,16,132,0,124,6,68,0,131,1, + 131,3,1,0,116,0,160,5,100,17,161,1,125,9,116,6, + 124,1,100,17,124,9,131,3,1,0,116,0,160,5,100,18, + 161,1,125,10,116,6,124,1,100,18,124,10,131,3,1,0, + 124,5,100,4,107,2,144,1,114,110,116,0,160,5,100,19, + 161,1,125,11,116,6,124,1,100,20,124,11,131,3,1,0, + 116,6,124,1,100,21,116,11,131,0,131,3,1,0,116,12, + 160,13,116,2,160,14,161,0,161,1,1,0,124,5,100,4, + 107,2,144,1,114,174,116,15,160,16,100,22,161,1,1,0, + 100,23,116,12,107,6,144,1,114,174,100,24,116,17,95,18, + 100,25,83,0,41,26,122,205,83,101,116,117,112,32,116,104, + 101,32,112,97,116,104,45,98,97,115,101,100,32,105,109,112, + 111,114,116,101,114,115,32,102,111,114,32,105,109,112,111,114, + 116,108,105,98,32,98,121,32,105,109,112,111,114,116,105,110, + 103,32,110,101,101,100,101,100,10,32,32,32,32,98,117,105, + 108,116,45,105,110,32,109,111,100,117,108,101,115,32,97,110, + 100,32,105,110,106,101,99,116,105,110,103,32,116,104,101,109, + 32,105,110,116,111,32,116,104,101,32,103,108,111,98,97,108, + 32,110,97,109,101,115,112,97,99,101,46,10,10,32,32,32, + 32,79,116,104,101,114,32,99,111,109,112,111,110,101,110,116, + 115,32,97,114,101,32,101,120,116,114,97,99,116,101,100,32, + 102,114,111,109,32,116,104,101,32,99,111,114,101,32,98,111, + 111,116,115,116,114,97,112,32,109,111,100,117,108,101,46,10, + 10,32,32,32,32,41,4,114,64,0,0,0,114,75,0,0, + 0,218,8,98,117,105,108,116,105,110,115,114,160,0,0,0, + 90,5,112,111,115,105,120,250,1,47,90,2,110,116,250,1, + 92,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,3,0,0,0,115,0,0,0,115,26,0,0,0,124, + 0,93,18,125,1,116,0,124,1,131,1,100,0,107,2,86, + 0,1,0,113,2,100,1,83,0,41,2,114,39,0,0,0, + 78,41,1,114,22,0,0,0,41,2,114,32,0,0,0,114, + 95,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,114,19,1,0,0,91,6,0,0,115,4,0,0, + 0,4,0,2,0,122,25,95,115,101,116,117,112,46,60,108, + 111,99,97,108,115,62,46,60,103,101,110,101,120,112,114,62, + 114,73,0,0,0,122,30,105,109,112,111,114,116,108,105,98, + 32,114,101,113,117,105,114,101,115,32,112,111,115,105,120,32, + 111,114,32,110,116,114,2,0,0,0,114,35,0,0,0,114, + 31,0,0,0,114,40,0,0,0,114,58,0,0,0,99,1, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,4, + 0,0,0,83,0,0,0,115,22,0,0,0,104,0,124,0, + 93,14,125,1,100,0,124,1,155,0,157,2,146,2,113,4, + 83,0,41,1,114,74,0,0,0,114,3,0,0,0,41,2, + 114,32,0,0,0,218,1,115,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,88,1,0,0,107,6,0,0, + 115,4,0,0,0,6,0,2,0,122,25,95,115,101,116,117, + 112,46,60,108,111,99,97,108,115,62,46,60,115,101,116,99, + 111,109,112,62,90,7,95,116,104,114,101,97,100,90,8,95, + 119,101,97,107,114,101,102,90,6,119,105,110,114,101,103,114, + 192,0,0,0,114,7,0,0,0,122,4,46,112,121,119,122, + 6,95,100,46,112,121,100,84,78,41,19,114,134,0,0,0, + 114,8,0,0,0,114,163,0,0,0,114,31,1,0,0,114, + 125,0,0,0,90,18,95,98,117,105,108,116,105,110,95,102, + 114,111,109,95,110,97,109,101,114,129,0,0,0,218,3,97, + 108,108,114,23,0,0,0,114,118,0,0,0,114,36,0,0, + 0,114,13,0,0,0,114,21,1,0,0,114,167,0,0,0, + 114,99,1,0,0,114,102,0,0,0,114,186,0,0,0,114, + 191,0,0,0,114,195,0,0,0,41,12,218,17,95,98,111, + 111,116,115,116,114,97,112,95,109,111,100,117,108,101,90,11, + 115,101,108,102,95,109,111,100,117,108,101,90,12,98,117,105, + 108,116,105,110,95,110,97,109,101,90,14,98,117,105,108,116, + 105,110,95,109,111,100,117,108,101,90,10,111,115,95,100,101, + 116,97,105,108,115,90,10,98,117,105,108,116,105,110,95,111, + 115,114,31,0,0,0,114,35,0,0,0,90,9,111,115,95, + 109,111,100,117,108,101,90,13,116,104,114,101,97,100,95,109, + 111,100,117,108,101,90,14,119,101,97,107,114,101,102,95,109, + 111,100,117,108,101,90,13,119,105,110,114,101,103,95,109,111, + 100,117,108,101,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,218,6,95,115,101,116,117,112,66,6,0,0,115, + 78,0,0,0,0,8,4,1,6,1,6,3,10,1,8,1, + 10,1,12,2,10,1,14,3,22,1,12,2,22,1,8,1, + 10,1,10,1,6,2,2,1,10,1,10,1,14,1,12,2, + 8,1,12,1,12,1,18,1,22,3,10,1,12,3,10,1, + 12,3,10,1,10,1,12,3,14,1,14,1,10,1,10,1, + 10,1,114,106,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,106,1,0,0,114,184,0,0, + 0,114,8,0,0,0,114,51,1,0,0,114,167,0,0,0, + 114,79,1,0,0,114,94,1,0,0,218,9,109,101,116,97, + 95,112,97,116,104,114,186,0,0,0,114,45,1,0,0,41, + 2,114,105,1,0,0,90,17,115,117,112,112,111,114,116,101, + 100,95,108,111,97,100,101,114,115,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,8,95,105,110,115,116,97, + 108,108,131,6,0,0,115,8,0,0,0,0,2,8,1,6, + 1,20,1,114,108,1,0,0,41,1,114,60,0,0,0,41, + 1,78,41,3,78,78,78,41,2,114,73,0,0,0,114,73, + 0,0,0,41,1,84,41,1,78,41,1,78,41,63,114,127, + 0,0,0,114,12,0,0,0,90,37,95,67,65,83,69,95, + 73,78,83,69,78,83,73,84,73,86,69,95,80,76,65,84, + 70,79,82,77,83,95,66,89,84,69,83,95,75,69,89,114, + 11,0,0,0,114,13,0,0,0,114,20,0,0,0,114,27, + 0,0,0,114,29,0,0,0,114,38,0,0,0,114,47,0, + 0,0,114,49,0,0,0,114,53,0,0,0,114,54,0,0, + 0,114,56,0,0,0,114,59,0,0,0,114,69,0,0,0, + 218,4,116,121,112,101,218,8,95,95,99,111,100,101,95,95, + 114,162,0,0,0,114,18,0,0,0,114,148,0,0,0,114, + 17,0,0,0,114,24,0,0,0,114,236,0,0,0,114,92, + 0,0,0,114,88,0,0,0,114,102,0,0,0,114,89,0, + 0,0,90,23,68,69,66,85,71,95,66,89,84,69,67,79, + 68,69,95,83,85,70,70,73,88,69,83,90,27,79,80,84, + 73,77,73,90,69,68,95,66,89,84,69,67,79,68,69,95, + 83,85,70,70,73,88,69,83,114,98,0,0,0,114,103,0, + 0,0,114,109,0,0,0,114,113,0,0,0,114,115,0,0, + 0,114,136,0,0,0,114,143,0,0,0,114,152,0,0,0, + 114,156,0,0,0,114,158,0,0,0,114,165,0,0,0,114, + 170,0,0,0,114,171,0,0,0,114,176,0,0,0,218,6, + 111,98,106,101,99,116,114,185,0,0,0,114,190,0,0,0, + 114,191,0,0,0,114,208,0,0,0,114,221,0,0,0,114, + 239,0,0,0,114,9,1,0,0,114,15,1,0,0,114,21, + 1,0,0,114,252,0,0,0,114,22,1,0,0,114,43,1, + 0,0,114,45,1,0,0,114,79,1,0,0,114,98,1,0, + 0,114,184,0,0,0,114,106,1,0,0,114,108,1,0,0, + 114,3,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,218,8,60,109,111,100,117,108,101,62,1,0, + 0,0,115,126,0,0,0,4,22,4,1,4,1,2,1,2, + 255,4,4,8,17,8,5,8,5,8,6,8,6,8,12,8, + 10,8,9,8,5,8,7,8,9,10,22,10,127,0,8,16, + 1,12,2,4,1,4,2,6,2,6,2,8,2,16,71,8, + 40,8,19,8,12,8,12,8,28,8,17,8,33,8,28,8, + 24,10,13,10,10,10,11,8,14,6,3,4,1,2,255,12, + 68,14,64,14,29,16,127,0,17,14,72,18,45,18,26,4, + 3,18,53,14,63,14,42,14,127,0,59,14,127,0,22,10, + 23,8,11,8,65, }; diff --git a/Python/importlib_zipimport.h b/Python/importlib_zipimport.h index cbb3d909a10b..056e85d343d8 100644 --- a/Python/importlib_zipimport.h +++ b/Python/importlib_zipimport.h @@ -783,301 +783,301 @@ const unsigned char _Py_M__zipimport[] = { 0,0,0,218,9,95,101,113,95,109,116,105,109,101,65,2, 0,0,115,2,0,0,0,0,2,114,147,0,0,0,99,5, 0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,8, - 0,0,0,67,0,0,0,115,68,1,0,0,124,3,124,2, + 0,0,0,67,0,0,0,115,60,1,0,0,124,3,124,2, 100,1,156,2,125,5,122,18,116,0,160,1,124,4,124,3, - 124,5,161,3,125,6,87,0,110,26,4,0,116,2,107,10, - 114,54,1,0,1,0,1,0,89,0,100,0,83,0,89,0, - 110,2,88,0,124,6,100,2,64,0,100,3,107,3,125,7, - 124,7,114,190,124,6,100,4,64,0,100,3,107,3,125,8, - 116,3,106,4,100,5,107,3,114,188,124,8,115,108,116,3, - 106,4,100,6,107,2,114,188,116,5,124,0,124,2,131,2, - 125,9,124,9,100,0,107,9,114,188,116,3,160,6,116,0, - 106,7,124,9,161,2,125,10,122,20,116,8,160,9,124,4, - 124,10,124,3,124,5,161,4,1,0,87,0,110,26,4,0, - 116,2,107,10,114,186,1,0,1,0,1,0,89,0,100,0, - 83,0,89,0,110,2,88,0,110,84,116,10,124,0,124,2, - 131,2,92,2,125,11,125,12,124,11,144,1,114,18,116,11, - 116,12,124,4,100,7,100,8,133,2,25,0,131,1,124,11, - 131,2,114,254,116,12,124,4,100,8,100,9,133,2,25,0, - 131,1,124,12,107,3,144,1,114,18,116,13,160,14,100,10, - 124,3,155,2,157,2,161,1,1,0,100,0,83,0,116,15, - 160,16,124,4,100,9,100,0,133,2,25,0,161,1,125,13, - 116,17,124,13,116,18,131,2,144,1,115,64,116,19,100,11, - 124,1,155,2,100,12,157,3,131,1,130,1,124,13,83,0, - 41,13,78,41,2,114,59,0,0,0,114,13,0,0,0,114, - 5,0,0,0,114,0,0,0,0,114,86,0,0,0,90,5, - 110,101,118,101,114,90,6,97,108,119,97,121,115,114,99,0, - 0,0,114,94,0,0,0,114,95,0,0,0,122,22,98,121, - 116,101,99,111,100,101,32,105,115,32,115,116,97,108,101,32, - 102,111,114,32,122,16,99,111,109,112,105,108,101,100,32,109, - 111,100,117,108,101,32,122,21,32,105,115,32,110,111,116,32, - 97,32,99,111,100,101,32,111,98,106,101,99,116,41,20,114, - 21,0,0,0,90,13,95,99,108,97,115,115,105,102,121,95, - 112,121,99,114,75,0,0,0,218,4,95,105,109,112,90,21, - 99,104,101,99,107,95,104,97,115,104,95,98,97,115,101,100, - 95,112,121,99,115,218,15,95,103,101,116,95,112,121,99,95, - 115,111,117,114,99,101,218,11,115,111,117,114,99,101,95,104, - 97,115,104,90,17,95,82,65,87,95,77,65,71,73,67,95, - 78,85,77,66,69,82,90,18,95,98,111,111,115,116,114,97, - 112,95,101,120,116,101,114,110,97,108,90,18,95,118,97,108, - 105,100,97,116,101,95,104,97,115,104,95,112,121,99,218,29, - 95,103,101,116,95,109,116,105,109,101,95,97,110,100,95,115, - 105,122,101,95,111,102,95,115,111,117,114,99,101,114,147,0, - 0,0,114,2,0,0,0,114,76,0,0,0,114,77,0,0, - 0,218,7,109,97,114,115,104,97,108,90,5,108,111,97,100, - 115,114,15,0,0,0,218,10,95,99,111,100,101,95,116,121, - 112,101,218,9,84,121,112,101,69,114,114,111,114,41,14,114, - 32,0,0,0,114,53,0,0,0,114,63,0,0,0,114,38, - 0,0,0,114,126,0,0,0,90,11,101,120,99,95,100,101, - 116,97,105,108,115,114,129,0,0,0,90,10,104,97,115,104, - 95,98,97,115,101,100,90,12,99,104,101,99,107,95,115,111, - 117,114,99,101,90,12,115,111,117,114,99,101,95,98,121,116, - 101,115,114,150,0,0,0,90,12,115,111,117,114,99,101,95, - 109,116,105,109,101,90,11,115,111,117,114,99,101,95,115,105, - 122,101,114,46,0,0,0,114,9,0,0,0,114,9,0,0, - 0,114,10,0,0,0,218,15,95,117,110,109,97,114,115,104, - 97,108,95,99,111,100,101,75,2,0,0,115,88,0,0,0, - 0,2,2,1,2,254,6,5,2,1,18,1,14,1,12,2, - 12,1,4,1,12,1,10,1,2,255,2,1,8,255,2,2, - 10,1,8,1,4,1,4,1,2,254,4,5,2,1,4,1, - 2,0,2,0,2,0,2,255,8,2,14,1,14,3,8,255, - 6,3,6,3,22,1,18,255,4,2,4,1,8,255,4,2, - 4,2,18,1,12,1,16,1,114,155,0,0,0,99,1,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0, - 0,0,67,0,0,0,115,28,0,0,0,124,0,160,0,100, - 1,100,2,161,2,125,0,124,0,160,0,100,3,100,2,161, - 2,125,0,124,0,83,0,41,4,78,115,2,0,0,0,13, - 10,243,1,0,0,0,10,243,1,0,0,0,13,41,1,114, - 19,0,0,0,41,1,218,6,115,111,117,114,99,101,114,9, - 0,0,0,114,9,0,0,0,114,10,0,0,0,218,23,95, - 110,111,114,109,97,108,105,122,101,95,108,105,110,101,95,101, - 110,100,105,110,103,115,126,2,0,0,115,6,0,0,0,0, - 1,12,1,12,1,114,159,0,0,0,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,6,0,0,0,67, - 0,0,0,115,24,0,0,0,116,0,124,1,131,1,125,1, - 116,1,124,1,124,0,100,1,100,2,100,3,141,4,83,0, - 41,4,78,114,74,0,0,0,84,41,1,90,12,100,111,110, - 116,95,105,110,104,101,114,105,116,41,2,114,159,0,0,0, - 218,7,99,111,109,112,105,108,101,41,2,114,53,0,0,0, - 114,158,0,0,0,114,9,0,0,0,114,9,0,0,0,114, - 10,0,0,0,218,15,95,99,111,109,112,105,108,101,95,115, - 111,117,114,99,101,133,2,0,0,115,4,0,0,0,0,1, - 8,1,114,161,0,0,0,99,2,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,11,0,0,0,67,0,0,0, - 115,68,0,0,0,116,0,160,1,124,0,100,1,63,0,100, - 2,23,0,124,0,100,3,63,0,100,4,64,0,124,0,100, - 5,64,0,124,1,100,6,63,0,124,1,100,3,63,0,100, - 7,64,0,124,1,100,5,64,0,100,8,20,0,100,9,100, - 9,100,9,102,9,161,1,83,0,41,10,78,233,9,0,0, - 0,105,188,7,0,0,233,5,0,0,0,233,15,0,0,0, - 233,31,0,0,0,233,11,0,0,0,233,63,0,0,0,114, - 86,0,0,0,114,14,0,0,0,41,2,114,131,0,0,0, - 90,6,109,107,116,105,109,101,41,2,218,1,100,114,138,0, - 0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, - 0,218,14,95,112,97,114,115,101,95,100,111,115,116,105,109, - 101,139,2,0,0,115,22,0,0,0,0,1,4,1,10,1, - 10,1,6,1,6,1,10,1,10,1,2,0,2,0,2,249, - 114,169,0,0,0,99,2,0,0,0,0,0,0,0,0,0, - 0,0,6,0,0,0,10,0,0,0,67,0,0,0,115,116, - 0,0,0,122,82,124,1,100,1,100,0,133,2,25,0,100, - 2,107,6,115,22,116,0,130,1,124,1,100,0,100,1,133, - 2,25,0,125,1,124,0,106,1,124,1,25,0,125,2,124, - 2,100,3,25,0,125,3,124,2,100,4,25,0,125,4,124, - 2,100,5,25,0,125,5,116,2,124,4,124,3,131,2,124, - 5,102,2,87,0,83,0,4,0,116,3,116,4,116,5,102, - 3,107,10,114,110,1,0,1,0,1,0,89,0,100,6,83, - 0,88,0,100,0,83,0,41,7,78,114,14,0,0,0,169, - 2,218,1,99,218,1,111,114,163,0,0,0,233,6,0,0, - 0,233,3,0,0,0,41,2,114,0,0,0,0,114,0,0, - 0,0,41,6,218,14,65,115,115,101,114,116,105,111,110,69, - 114,114,111,114,114,28,0,0,0,114,169,0,0,0,114,26, - 0,0,0,218,10,73,110,100,101,120,69,114,114,111,114,114, - 154,0,0,0,41,6,114,32,0,0,0,114,13,0,0,0, - 114,54,0,0,0,114,131,0,0,0,114,132,0,0,0,90, - 17,117,110,99,111,109,112,114,101,115,115,101,100,95,115,105, - 122,101,114,9,0,0,0,114,9,0,0,0,114,10,0,0, - 0,114,151,0,0,0,152,2,0,0,115,20,0,0,0,0, - 1,2,2,20,1,12,1,10,3,8,1,8,1,8,1,16, - 1,20,1,114,151,0,0,0,99,2,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,8,0,0,0,67,0,0, - 0,115,86,0,0,0,124,1,100,1,100,0,133,2,25,0, - 100,2,107,6,115,20,116,0,130,1,124,1,100,0,100,1, - 133,2,25,0,125,1,122,14,124,0,106,1,124,1,25,0, - 125,2,87,0,110,22,4,0,116,2,107,10,114,68,1,0, - 1,0,1,0,89,0,100,0,83,0,88,0,116,3,124,0, - 106,4,124,2,131,2,83,0,100,0,83,0,41,3,78,114, - 14,0,0,0,114,170,0,0,0,41,5,114,175,0,0,0, - 114,28,0,0,0,114,26,0,0,0,114,52,0,0,0,114, - 29,0,0,0,41,3,114,32,0,0,0,114,13,0,0,0, - 114,54,0,0,0,114,9,0,0,0,114,9,0,0,0,114, - 10,0,0,0,114,149,0,0,0,171,2,0,0,115,14,0, - 0,0,0,2,20,1,12,2,2,1,14,1,14,1,8,2, - 114,149,0,0,0,99,2,0,0,0,0,0,0,0,0,0, - 0,0,11,0,0,0,9,0,0,0,67,0,0,0,115,198, - 0,0,0,116,0,124,0,124,1,131,2,125,2,116,1,68, - 0,93,160,92,3,125,3,125,4,125,5,124,2,124,3,23, - 0,125,6,116,2,106,3,100,1,124,0,106,4,116,5,124, - 6,100,2,100,3,141,5,1,0,122,14,124,0,106,6,124, - 6,25,0,125,7,87,0,110,20,4,0,116,7,107,10,114, - 88,1,0,1,0,1,0,89,0,113,14,88,0,124,7,100, - 4,25,0,125,8,116,8,124,0,106,4,124,7,131,2,125, - 9,124,4,114,132,116,9,124,0,124,8,124,6,124,1,124, - 9,131,5,125,10,110,10,116,10,124,8,124,9,131,2,125, - 10,124,10,100,0,107,8,114,152,113,14,124,7,100,4,25, - 0,125,8,124,10,124,5,124,8,102,3,2,0,1,0,83, - 0,113,14,116,11,100,5,124,1,155,2,157,2,124,1,100, - 6,141,2,130,1,100,0,83,0,41,7,78,122,13,116,114, - 121,105,110,103,32,123,125,123,125,123,125,114,86,0,0,0, - 41,1,90,9,118,101,114,98,111,115,105,116,121,114,0,0, - 0,0,114,57,0,0,0,114,58,0,0,0,41,12,114,36, - 0,0,0,114,89,0,0,0,114,76,0,0,0,114,77,0, - 0,0,114,29,0,0,0,114,20,0,0,0,114,28,0,0, - 0,114,26,0,0,0,114,52,0,0,0,114,155,0,0,0, - 114,161,0,0,0,114,3,0,0,0,41,11,114,32,0,0, - 0,114,38,0,0,0,114,13,0,0,0,114,90,0,0,0, - 114,91,0,0,0,114,47,0,0,0,114,63,0,0,0,114, - 54,0,0,0,114,40,0,0,0,114,126,0,0,0,114,46, - 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, - 0,0,114,44,0,0,0,186,2,0,0,115,36,0,0,0, - 0,1,10,1,14,1,8,1,22,1,2,1,14,1,14,1, - 6,2,8,1,12,1,4,1,18,2,10,1,8,3,2,1, - 8,1,16,2,114,44,0,0,0,99,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,64,0, - 0,0,115,60,0,0,0,101,0,90,1,100,0,90,2,100, - 1,90,3,100,2,90,4,100,3,100,4,132,0,90,5,100, - 5,100,6,132,0,90,6,100,7,100,8,132,0,90,7,100, - 9,100,10,132,0,90,8,100,11,100,12,132,0,90,9,100, - 13,83,0,41,14,114,80,0,0,0,122,165,80,114,105,118, - 97,116,101,32,99,108,97,115,115,32,117,115,101,100,32,116, - 111,32,115,117,112,112,111,114,116,32,90,105,112,73,109,112, - 111,114,116,46,103,101,116,95,114,101,115,111,117,114,99,101, - 95,114,101,97,100,101,114,40,41,46,10,10,32,32,32,32, - 84,104,105,115,32,99,108,97,115,115,32,105,115,32,97,108, - 108,111,119,101,100,32,116,111,32,114,101,102,101,114,101,110, - 99,101,32,97,108,108,32,116,104,101,32,105,110,110,97,114, - 100,115,32,97,110,100,32,112,114,105,118,97,116,101,32,112, - 97,114,116,115,32,111,102,10,32,32,32,32,116,104,101,32, - 122,105,112,105,109,112,111,114,116,101,114,46,10,32,32,32, - 32,70,99,3,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,2,0,0,0,67,0,0,0,115,16,0,0,0, - 124,1,124,0,95,0,124,2,124,0,95,1,100,0,83,0, - 114,88,0,0,0,41,2,114,4,0,0,0,114,38,0,0, - 0,41,3,114,32,0,0,0,114,4,0,0,0,114,38,0, - 0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, - 0,114,34,0,0,0,220,2,0,0,115,4,0,0,0,0, - 1,6,1,122,33,95,90,105,112,73,109,112,111,114,116,82, - 101,115,111,117,114,99,101,82,101,97,100,101,114,46,95,95, - 105,110,105,116,95,95,99,2,0,0,0,0,0,0,0,0, - 0,0,0,5,0,0,0,8,0,0,0,67,0,0,0,115, - 92,0,0,0,124,0,106,0,160,1,100,1,100,2,161,2, - 125,2,124,2,155,0,100,2,124,1,155,0,157,3,125,3, - 100,3,100,4,108,2,109,3,125,4,1,0,122,18,124,4, - 124,0,106,4,160,5,124,3,161,1,131,1,87,0,83,0, - 4,0,116,6,107,10,114,86,1,0,1,0,1,0,116,7, - 124,3,131,1,130,1,89,0,110,2,88,0,100,0,83,0, - 41,5,78,114,85,0,0,0,114,109,0,0,0,114,0,0, - 0,0,41,1,218,7,66,121,116,101,115,73,79,41,8,114, - 38,0,0,0,114,19,0,0,0,90,2,105,111,114,177,0, - 0,0,114,4,0,0,0,114,55,0,0,0,114,22,0,0, - 0,218,17,70,105,108,101,78,111,116,70,111,117,110,100,69, - 114,114,111,114,41,5,114,32,0,0,0,218,8,114,101,115, - 111,117,114,99,101,218,16,102,117,108,108,110,97,109,101,95, - 97,115,95,112,97,116,104,114,13,0,0,0,114,177,0,0, - 0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, - 218,13,111,112,101,110,95,114,101,115,111,117,114,99,101,224, - 2,0,0,115,14,0,0,0,0,1,14,1,14,1,12,1, - 2,1,18,1,14,1,122,38,95,90,105,112,73,109,112,111, - 114,116,82,101,115,111,117,114,99,101,82,101,97,100,101,114, - 46,111,112,101,110,95,114,101,115,111,117,114,99,101,99,2, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1, - 0,0,0,67,0,0,0,115,8,0,0,0,116,0,130,1, - 100,0,83,0,114,88,0,0,0,41,1,114,178,0,0,0, - 41,2,114,32,0,0,0,114,179,0,0,0,114,9,0,0, - 0,114,9,0,0,0,114,10,0,0,0,218,13,114,101,115, - 111,117,114,99,101,95,112,97,116,104,233,2,0,0,115,2, - 0,0,0,0,4,122,38,95,90,105,112,73,109,112,111,114, - 116,82,101,115,111,117,114,99,101,82,101,97,100,101,114,46, - 114,101,115,111,117,114,99,101,95,112,97,116,104,99,2,0, - 0,0,0,0,0,0,0,0,0,0,4,0,0,0,8,0, - 0,0,67,0,0,0,115,72,0,0,0,124,0,106,0,160, - 1,100,1,100,2,161,2,125,2,124,2,155,0,100,2,124, - 1,155,0,157,3,125,3,122,16,124,0,106,2,160,3,124, - 3,161,1,1,0,87,0,110,22,4,0,116,4,107,10,114, - 66,1,0,1,0,1,0,89,0,100,3,83,0,88,0,100, - 4,83,0,41,5,78,114,85,0,0,0,114,109,0,0,0, - 70,84,41,5,114,38,0,0,0,114,19,0,0,0,114,4, - 0,0,0,114,55,0,0,0,114,22,0,0,0,41,4,114, - 32,0,0,0,114,59,0,0,0,114,180,0,0,0,114,13, - 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, - 0,0,218,11,105,115,95,114,101,115,111,117,114,99,101,239, - 2,0,0,115,14,0,0,0,0,3,14,1,14,1,2,1, - 16,1,14,1,8,1,122,36,95,90,105,112,73,109,112,111, - 114,116,82,101,115,111,117,114,99,101,82,101,97,100,101,114, - 46,105,115,95,114,101,115,111,117,114,99,101,99,1,0,0, - 0,0,0,0,0,0,0,0,0,9,0,0,0,9,0,0, - 0,99,0,0,0,115,186,0,0,0,100,1,100,2,108,0, - 109,1,125,1,1,0,124,1,124,0,106,2,160,3,124,0, - 106,4,161,1,131,1,125,2,124,2,160,5,124,0,106,2, - 106,6,161,1,125,3,124,3,106,7,100,3,107,2,115,58, - 116,8,130,1,124,3,106,9,125,4,116,10,131,0,125,5, - 124,0,106,2,106,11,68,0,93,102,125,6,122,18,124,1, - 124,6,131,1,160,5,124,4,161,1,125,7,87,0,110,24, - 4,0,116,12,107,10,114,124,1,0,1,0,1,0,89,0, - 113,78,89,0,110,2,88,0,124,7,106,9,106,7,125,8, - 116,13,124,8,131,1,100,1,107,2,114,156,124,7,106,7, - 86,0,1,0,113,78,124,8,124,5,107,7,114,78,124,5, - 160,14,124,8,161,1,1,0,124,8,86,0,1,0,113,78, - 100,0,83,0,41,4,78,114,0,0,0,0,41,1,218,4, - 80,97,116,104,114,60,0,0,0,41,15,90,7,112,97,116, - 104,108,105,98,114,184,0,0,0,114,4,0,0,0,114,56, - 0,0,0,114,38,0,0,0,90,11,114,101,108,97,116,105, - 118,101,95,116,111,114,29,0,0,0,114,59,0,0,0,114, - 175,0,0,0,90,6,112,97,114,101,110,116,218,3,115,101, - 116,114,28,0,0,0,114,23,0,0,0,114,51,0,0,0, - 218,3,97,100,100,41,9,114,32,0,0,0,114,184,0,0, - 0,90,13,102,117,108,108,110,97,109,101,95,112,97,116,104, - 90,13,114,101,108,97,116,105,118,101,95,112,97,116,104,90, - 12,112,97,99,107,97,103,101,95,112,97,116,104,90,12,115, - 117,98,100,105,114,115,95,115,101,101,110,218,8,102,105,108, - 101,110,97,109,101,90,8,114,101,108,97,116,105,118,101,90, - 11,112,97,114,101,110,116,95,110,97,109,101,114,9,0,0, - 0,114,9,0,0,0,114,10,0,0,0,218,8,99,111,110, - 116,101,110,116,115,250,2,0,0,115,34,0,0,0,0,8, - 12,1,18,1,14,3,14,1,6,1,6,1,12,1,2,1, - 18,1,14,1,10,5,8,1,12,1,10,1,8,1,10,1, - 122,33,95,90,105,112,73,109,112,111,114,116,82,101,115,111, - 117,114,99,101,82,101,97,100,101,114,46,99,111,110,116,101, - 110,116,115,78,41,10,114,6,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,84,0,0,0,114,81,0,0,0,114, - 34,0,0,0,114,181,0,0,0,114,182,0,0,0,114,183, - 0,0,0,114,188,0,0,0,114,9,0,0,0,114,9,0, - 0,0,114,9,0,0,0,114,10,0,0,0,114,80,0,0, - 0,212,2,0,0,115,14,0,0,0,8,1,4,5,4,2, - 8,4,8,9,8,6,8,11,114,80,0,0,0,41,45,114, - 84,0,0,0,90,26,95,102,114,111,122,101,110,95,105,109, - 112,111,114,116,108,105,98,95,101,120,116,101,114,110,97,108, - 114,21,0,0,0,114,1,0,0,0,114,2,0,0,0,90, - 17,95,102,114,111,122,101,110,95,105,109,112,111,114,116,108, - 105,98,114,76,0,0,0,114,148,0,0,0,114,110,0,0, - 0,114,152,0,0,0,114,67,0,0,0,114,131,0,0,0, - 90,7,95,95,97,108,108,95,95,114,20,0,0,0,90,15, - 112,97,116,104,95,115,101,112,97,114,97,116,111,114,115,114, - 18,0,0,0,114,75,0,0,0,114,3,0,0,0,114,25, - 0,0,0,218,4,116,121,112,101,114,70,0,0,0,114,113, - 0,0,0,114,115,0,0,0,114,117,0,0,0,114,4,0, - 0,0,114,89,0,0,0,114,36,0,0,0,114,37,0,0, - 0,114,35,0,0,0,114,27,0,0,0,114,122,0,0,0, - 114,142,0,0,0,114,144,0,0,0,114,52,0,0,0,114, - 147,0,0,0,114,155,0,0,0,218,8,95,95,99,111,100, - 101,95,95,114,153,0,0,0,114,159,0,0,0,114,161,0, - 0,0,114,169,0,0,0,114,151,0,0,0,114,149,0,0, - 0,114,44,0,0,0,114,80,0,0,0,114,9,0,0,0, - 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, - 8,60,109,111,100,117,108,101,62,1,0,0,0,115,88,0, - 0,0,4,16,8,1,16,1,8,1,8,1,8,1,8,1, - 8,1,8,2,8,3,6,1,14,3,16,4,4,2,8,2, - 4,1,4,1,4,2,14,127,0,127,0,1,12,1,12,1, - 2,1,2,252,4,9,8,4,8,9,8,31,8,126,2,254, - 2,29,4,5,8,21,8,46,8,10,8,46,10,5,8,7, - 8,6,8,13,8,19,8,15,8,26, + 124,5,161,3,125,6,87,0,110,22,4,0,116,2,107,10, + 114,50,1,0,1,0,1,0,89,0,100,0,83,0,88,0, + 124,6,100,2,64,0,100,3,107,3,125,7,124,7,114,182, + 124,6,100,4,64,0,100,3,107,3,125,8,116,3,106,4, + 100,5,107,3,114,180,124,8,115,104,116,3,106,4,100,6, + 107,2,114,180,116,5,124,0,124,2,131,2,125,9,124,9, + 100,0,107,9,114,180,116,3,160,6,116,0,106,7,124,9, + 161,2,125,10,122,20,116,8,160,9,124,4,124,10,124,3, + 124,5,161,4,1,0,87,0,110,22,4,0,116,2,107,10, + 114,178,1,0,1,0,1,0,89,0,100,0,83,0,88,0, + 110,84,116,10,124,0,124,2,131,2,92,2,125,11,125,12, + 124,11,144,1,114,10,116,11,116,12,124,4,100,7,100,8, + 133,2,25,0,131,1,124,11,131,2,114,246,116,12,124,4, + 100,8,100,9,133,2,25,0,131,1,124,12,107,3,144,1, + 114,10,116,13,160,14,100,10,124,3,155,2,157,2,161,1, + 1,0,100,0,83,0,116,15,160,16,124,4,100,9,100,0, + 133,2,25,0,161,1,125,13,116,17,124,13,116,18,131,2, + 144,1,115,56,116,19,100,11,124,1,155,2,100,12,157,3, + 131,1,130,1,124,13,83,0,41,13,78,41,2,114,59,0, + 0,0,114,13,0,0,0,114,5,0,0,0,114,0,0,0, + 0,114,86,0,0,0,90,5,110,101,118,101,114,90,6,97, + 108,119,97,121,115,114,99,0,0,0,114,94,0,0,0,114, + 95,0,0,0,122,22,98,121,116,101,99,111,100,101,32,105, + 115,32,115,116,97,108,101,32,102,111,114,32,122,16,99,111, + 109,112,105,108,101,100,32,109,111,100,117,108,101,32,122,21, + 32,105,115,32,110,111,116,32,97,32,99,111,100,101,32,111, + 98,106,101,99,116,41,20,114,21,0,0,0,90,13,95,99, + 108,97,115,115,105,102,121,95,112,121,99,114,75,0,0,0, + 218,4,95,105,109,112,90,21,99,104,101,99,107,95,104,97, + 115,104,95,98,97,115,101,100,95,112,121,99,115,218,15,95, + 103,101,116,95,112,121,99,95,115,111,117,114,99,101,218,11, + 115,111,117,114,99,101,95,104,97,115,104,90,17,95,82,65, + 87,95,77,65,71,73,67,95,78,85,77,66,69,82,90,18, + 95,98,111,111,115,116,114,97,112,95,101,120,116,101,114,110, + 97,108,90,18,95,118,97,108,105,100,97,116,101,95,104,97, + 115,104,95,112,121,99,218,29,95,103,101,116,95,109,116,105, + 109,101,95,97,110,100,95,115,105,122,101,95,111,102,95,115, + 111,117,114,99,101,114,147,0,0,0,114,2,0,0,0,114, + 76,0,0,0,114,77,0,0,0,218,7,109,97,114,115,104, + 97,108,90,5,108,111,97,100,115,114,15,0,0,0,218,10, + 95,99,111,100,101,95,116,121,112,101,218,9,84,121,112,101, + 69,114,114,111,114,41,14,114,32,0,0,0,114,53,0,0, + 0,114,63,0,0,0,114,38,0,0,0,114,126,0,0,0, + 90,11,101,120,99,95,100,101,116,97,105,108,115,114,129,0, + 0,0,90,10,104,97,115,104,95,98,97,115,101,100,90,12, + 99,104,101,99,107,95,115,111,117,114,99,101,90,12,115,111, + 117,114,99,101,95,98,121,116,101,115,114,150,0,0,0,90, + 12,115,111,117,114,99,101,95,109,116,105,109,101,90,11,115, + 111,117,114,99,101,95,115,105,122,101,114,46,0,0,0,114, + 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,15, + 95,117,110,109,97,114,115,104,97,108,95,99,111,100,101,75, + 2,0,0,115,88,0,0,0,0,2,2,1,2,254,6,5, + 2,1,18,1,14,1,8,2,12,1,4,1,12,1,10,1, + 2,255,2,1,8,255,2,2,10,1,8,1,4,1,4,1, + 2,254,4,5,2,1,4,1,2,0,2,0,2,0,2,255, + 8,2,14,1,10,3,8,255,6,3,6,3,22,1,18,255, + 4,2,4,1,8,255,4,2,4,2,18,1,12,1,16,1, + 114,155,0,0,0,99,1,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,4,0,0,0,67,0,0,0,115,28, + 0,0,0,124,0,160,0,100,1,100,2,161,2,125,0,124, + 0,160,0,100,3,100,2,161,2,125,0,124,0,83,0,41, + 4,78,115,2,0,0,0,13,10,243,1,0,0,0,10,243, + 1,0,0,0,13,41,1,114,19,0,0,0,41,1,218,6, + 115,111,117,114,99,101,114,9,0,0,0,114,9,0,0,0, + 114,10,0,0,0,218,23,95,110,111,114,109,97,108,105,122, + 101,95,108,105,110,101,95,101,110,100,105,110,103,115,126,2, + 0,0,115,6,0,0,0,0,1,12,1,12,1,114,159,0, + 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,6,0,0,0,67,0,0,0,115,24,0,0,0, + 116,0,124,1,131,1,125,1,116,1,124,1,124,0,100,1, + 100,2,100,3,141,4,83,0,41,4,78,114,74,0,0,0, + 84,41,1,90,12,100,111,110,116,95,105,110,104,101,114,105, + 116,41,2,114,159,0,0,0,218,7,99,111,109,112,105,108, + 101,41,2,114,53,0,0,0,114,158,0,0,0,114,9,0, + 0,0,114,9,0,0,0,114,10,0,0,0,218,15,95,99, + 111,109,112,105,108,101,95,115,111,117,114,99,101,133,2,0, + 0,115,4,0,0,0,0,1,8,1,114,161,0,0,0,99, + 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 11,0,0,0,67,0,0,0,115,68,0,0,0,116,0,160, + 1,124,0,100,1,63,0,100,2,23,0,124,0,100,3,63, + 0,100,4,64,0,124,0,100,5,64,0,124,1,100,6,63, + 0,124,1,100,3,63,0,100,7,64,0,124,1,100,5,64, + 0,100,8,20,0,100,9,100,9,100,9,102,9,161,1,83, + 0,41,10,78,233,9,0,0,0,105,188,7,0,0,233,5, + 0,0,0,233,15,0,0,0,233,31,0,0,0,233,11,0, + 0,0,233,63,0,0,0,114,86,0,0,0,114,14,0,0, + 0,41,2,114,131,0,0,0,90,6,109,107,116,105,109,101, + 41,2,218,1,100,114,138,0,0,0,114,9,0,0,0,114, + 9,0,0,0,114,10,0,0,0,218,14,95,112,97,114,115, + 101,95,100,111,115,116,105,109,101,139,2,0,0,115,22,0, + 0,0,0,1,4,1,10,1,10,1,6,1,6,1,10,1, + 10,1,2,0,2,0,2,249,114,169,0,0,0,99,2,0, + 0,0,0,0,0,0,0,0,0,0,6,0,0,0,10,0, + 0,0,67,0,0,0,115,116,0,0,0,122,82,124,1,100, + 1,100,0,133,2,25,0,100,2,107,6,115,22,116,0,130, + 1,124,1,100,0,100,1,133,2,25,0,125,1,124,0,106, + 1,124,1,25,0,125,2,124,2,100,3,25,0,125,3,124, + 2,100,4,25,0,125,4,124,2,100,5,25,0,125,5,116, + 2,124,4,124,3,131,2,124,5,102,2,87,0,83,0,4, + 0,116,3,116,4,116,5,102,3,107,10,114,110,1,0,1, + 0,1,0,89,0,100,6,83,0,88,0,100,0,83,0,41, + 7,78,114,14,0,0,0,169,2,218,1,99,218,1,111,114, + 163,0,0,0,233,6,0,0,0,233,3,0,0,0,41,2, + 114,0,0,0,0,114,0,0,0,0,41,6,218,14,65,115, + 115,101,114,116,105,111,110,69,114,114,111,114,114,28,0,0, + 0,114,169,0,0,0,114,26,0,0,0,218,10,73,110,100, + 101,120,69,114,114,111,114,114,154,0,0,0,41,6,114,32, + 0,0,0,114,13,0,0,0,114,54,0,0,0,114,131,0, + 0,0,114,132,0,0,0,90,17,117,110,99,111,109,112,114, + 101,115,115,101,100,95,115,105,122,101,114,9,0,0,0,114, + 9,0,0,0,114,10,0,0,0,114,151,0,0,0,152,2, + 0,0,115,20,0,0,0,0,1,2,2,20,1,12,1,10, + 3,8,1,8,1,8,1,16,1,20,1,114,151,0,0,0, + 99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,8,0,0,0,67,0,0,0,115,86,0,0,0,124,1, + 100,1,100,0,133,2,25,0,100,2,107,6,115,20,116,0, + 130,1,124,1,100,0,100,1,133,2,25,0,125,1,122,14, + 124,0,106,1,124,1,25,0,125,2,87,0,110,22,4,0, + 116,2,107,10,114,68,1,0,1,0,1,0,89,0,100,0, + 83,0,88,0,116,3,124,0,106,4,124,2,131,2,83,0, + 100,0,83,0,41,3,78,114,14,0,0,0,114,170,0,0, + 0,41,5,114,175,0,0,0,114,28,0,0,0,114,26,0, + 0,0,114,52,0,0,0,114,29,0,0,0,41,3,114,32, + 0,0,0,114,13,0,0,0,114,54,0,0,0,114,9,0, + 0,0,114,9,0,0,0,114,10,0,0,0,114,149,0,0, + 0,171,2,0,0,115,14,0,0,0,0,2,20,1,12,2, + 2,1,14,1,14,1,8,2,114,149,0,0,0,99,2,0, + 0,0,0,0,0,0,0,0,0,0,11,0,0,0,9,0, + 0,0,67,0,0,0,115,198,0,0,0,116,0,124,0,124, + 1,131,2,125,2,116,1,68,0,93,160,92,3,125,3,125, + 4,125,5,124,2,124,3,23,0,125,6,116,2,106,3,100, + 1,124,0,106,4,116,5,124,6,100,2,100,3,141,5,1, + 0,122,14,124,0,106,6,124,6,25,0,125,7,87,0,110, + 20,4,0,116,7,107,10,114,88,1,0,1,0,1,0,89, + 0,113,14,88,0,124,7,100,4,25,0,125,8,116,8,124, + 0,106,4,124,7,131,2,125,9,124,4,114,132,116,9,124, + 0,124,8,124,6,124,1,124,9,131,5,125,10,110,10,116, + 10,124,8,124,9,131,2,125,10,124,10,100,0,107,8,114, + 152,113,14,124,7,100,4,25,0,125,8,124,10,124,5,124, + 8,102,3,2,0,1,0,83,0,113,14,116,11,100,5,124, + 1,155,2,157,2,124,1,100,6,141,2,130,1,100,0,83, + 0,41,7,78,122,13,116,114,121,105,110,103,32,123,125,123, + 125,123,125,114,86,0,0,0,41,1,90,9,118,101,114,98, + 111,115,105,116,121,114,0,0,0,0,114,57,0,0,0,114, + 58,0,0,0,41,12,114,36,0,0,0,114,89,0,0,0, + 114,76,0,0,0,114,77,0,0,0,114,29,0,0,0,114, + 20,0,0,0,114,28,0,0,0,114,26,0,0,0,114,52, + 0,0,0,114,155,0,0,0,114,161,0,0,0,114,3,0, + 0,0,41,11,114,32,0,0,0,114,38,0,0,0,114,13, + 0,0,0,114,90,0,0,0,114,91,0,0,0,114,47,0, + 0,0,114,63,0,0,0,114,54,0,0,0,114,40,0,0, + 0,114,126,0,0,0,114,46,0,0,0,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,114,44,0,0,0,186, + 2,0,0,115,36,0,0,0,0,1,10,1,14,1,8,1, + 22,1,2,1,14,1,14,1,6,2,8,1,12,1,4,1, + 18,2,10,1,8,3,2,1,8,1,16,2,114,44,0,0, + 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,64,0,0,0,115,60,0,0,0,101, + 0,90,1,100,0,90,2,100,1,90,3,100,2,90,4,100, + 3,100,4,132,0,90,5,100,5,100,6,132,0,90,6,100, + 7,100,8,132,0,90,7,100,9,100,10,132,0,90,8,100, + 11,100,12,132,0,90,9,100,13,83,0,41,14,114,80,0, + 0,0,122,165,80,114,105,118,97,116,101,32,99,108,97,115, + 115,32,117,115,101,100,32,116,111,32,115,117,112,112,111,114, + 116,32,90,105,112,73,109,112,111,114,116,46,103,101,116,95, + 114,101,115,111,117,114,99,101,95,114,101,97,100,101,114,40, + 41,46,10,10,32,32,32,32,84,104,105,115,32,99,108,97, + 115,115,32,105,115,32,97,108,108,111,119,101,100,32,116,111, + 32,114,101,102,101,114,101,110,99,101,32,97,108,108,32,116, + 104,101,32,105,110,110,97,114,100,115,32,97,110,100,32,112, + 114,105,118,97,116,101,32,112,97,114,116,115,32,111,102,10, + 32,32,32,32,116,104,101,32,122,105,112,105,109,112,111,114, + 116,101,114,46,10,32,32,32,32,70,99,3,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,2,0,0,0,67, + 0,0,0,115,16,0,0,0,124,1,124,0,95,0,124,2, + 124,0,95,1,100,0,83,0,114,88,0,0,0,41,2,114, + 4,0,0,0,114,38,0,0,0,41,3,114,32,0,0,0, + 114,4,0,0,0,114,38,0,0,0,114,9,0,0,0,114, + 9,0,0,0,114,10,0,0,0,114,34,0,0,0,220,2, + 0,0,115,4,0,0,0,0,1,6,1,122,33,95,90,105, + 112,73,109,112,111,114,116,82,101,115,111,117,114,99,101,82, + 101,97,100,101,114,46,95,95,105,110,105,116,95,95,99,2, + 0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,8, + 0,0,0,67,0,0,0,115,92,0,0,0,124,0,106,0, + 160,1,100,1,100,2,161,2,125,2,124,2,155,0,100,2, + 124,1,155,0,157,3,125,3,100,3,100,4,108,2,109,3, + 125,4,1,0,122,18,124,4,124,0,106,4,160,5,124,3, + 161,1,131,1,87,0,83,0,4,0,116,6,107,10,114,86, + 1,0,1,0,1,0,116,7,124,3,131,1,130,1,89,0, + 110,2,88,0,100,0,83,0,41,5,78,114,85,0,0,0, + 114,109,0,0,0,114,0,0,0,0,41,1,218,7,66,121, + 116,101,115,73,79,41,8,114,38,0,0,0,114,19,0,0, + 0,90,2,105,111,114,177,0,0,0,114,4,0,0,0,114, + 55,0,0,0,114,22,0,0,0,218,17,70,105,108,101,78, + 111,116,70,111,117,110,100,69,114,114,111,114,41,5,114,32, + 0,0,0,218,8,114,101,115,111,117,114,99,101,218,16,102, + 117,108,108,110,97,109,101,95,97,115,95,112,97,116,104,114, + 13,0,0,0,114,177,0,0,0,114,9,0,0,0,114,9, + 0,0,0,114,10,0,0,0,218,13,111,112,101,110,95,114, + 101,115,111,117,114,99,101,224,2,0,0,115,14,0,0,0, + 0,1,14,1,14,1,12,1,2,1,18,1,14,1,122,38, + 95,90,105,112,73,109,112,111,114,116,82,101,115,111,117,114, + 99,101,82,101,97,100,101,114,46,111,112,101,110,95,114,101, + 115,111,117,114,99,101,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, + 8,0,0,0,116,0,130,1,100,0,83,0,114,88,0,0, + 0,41,1,114,178,0,0,0,41,2,114,32,0,0,0,114, + 179,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, + 0,0,0,218,13,114,101,115,111,117,114,99,101,95,112,97, + 116,104,233,2,0,0,115,2,0,0,0,0,4,122,38,95, + 90,105,112,73,109,112,111,114,116,82,101,115,111,117,114,99, + 101,82,101,97,100,101,114,46,114,101,115,111,117,114,99,101, + 95,112,97,116,104,99,2,0,0,0,0,0,0,0,0,0, + 0,0,4,0,0,0,8,0,0,0,67,0,0,0,115,72, + 0,0,0,124,0,106,0,160,1,100,1,100,2,161,2,125, + 2,124,2,155,0,100,2,124,1,155,0,157,3,125,3,122, + 16,124,0,106,2,160,3,124,3,161,1,1,0,87,0,110, + 22,4,0,116,4,107,10,114,66,1,0,1,0,1,0,89, + 0,100,3,83,0,88,0,100,4,83,0,41,5,78,114,85, + 0,0,0,114,109,0,0,0,70,84,41,5,114,38,0,0, + 0,114,19,0,0,0,114,4,0,0,0,114,55,0,0,0, + 114,22,0,0,0,41,4,114,32,0,0,0,114,59,0,0, + 0,114,180,0,0,0,114,13,0,0,0,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,218,11,105,115,95,114, + 101,115,111,117,114,99,101,239,2,0,0,115,14,0,0,0, + 0,3,14,1,14,1,2,1,16,1,14,1,8,1,122,36, + 95,90,105,112,73,109,112,111,114,116,82,101,115,111,117,114, + 99,101,82,101,97,100,101,114,46,105,115,95,114,101,115,111, + 117,114,99,101,99,1,0,0,0,0,0,0,0,0,0,0, + 0,9,0,0,0,9,0,0,0,99,0,0,0,115,186,0, + 0,0,100,1,100,2,108,0,109,1,125,1,1,0,124,1, + 124,0,106,2,160,3,124,0,106,4,161,1,131,1,125,2, + 124,2,160,5,124,0,106,2,106,6,161,1,125,3,124,3, + 106,7,100,3,107,2,115,58,116,8,130,1,124,3,106,9, + 125,4,116,10,131,0,125,5,124,0,106,2,106,11,68,0, + 93,102,125,6,122,18,124,1,124,6,131,1,160,5,124,4, + 161,1,125,7,87,0,110,24,4,0,116,12,107,10,114,124, + 1,0,1,0,1,0,89,0,113,78,89,0,110,2,88,0, + 124,7,106,9,106,7,125,8,116,13,124,8,131,1,100,1, + 107,2,114,156,124,7,106,7,86,0,1,0,113,78,124,8, + 124,5,107,7,114,78,124,5,160,14,124,8,161,1,1,0, + 124,8,86,0,1,0,113,78,100,0,83,0,41,4,78,114, + 0,0,0,0,41,1,218,4,80,97,116,104,114,60,0,0, + 0,41,15,90,7,112,97,116,104,108,105,98,114,184,0,0, + 0,114,4,0,0,0,114,56,0,0,0,114,38,0,0,0, + 90,11,114,101,108,97,116,105,118,101,95,116,111,114,29,0, + 0,0,114,59,0,0,0,114,175,0,0,0,90,6,112,97, + 114,101,110,116,218,3,115,101,116,114,28,0,0,0,114,23, + 0,0,0,114,51,0,0,0,218,3,97,100,100,41,9,114, + 32,0,0,0,114,184,0,0,0,90,13,102,117,108,108,110, + 97,109,101,95,112,97,116,104,90,13,114,101,108,97,116,105, + 118,101,95,112,97,116,104,90,12,112,97,99,107,97,103,101, + 95,112,97,116,104,90,12,115,117,98,100,105,114,115,95,115, + 101,101,110,218,8,102,105,108,101,110,97,109,101,90,8,114, + 101,108,97,116,105,118,101,90,11,112,97,114,101,110,116,95, + 110,97,109,101,114,9,0,0,0,114,9,0,0,0,114,10, + 0,0,0,218,8,99,111,110,116,101,110,116,115,250,2,0, + 0,115,34,0,0,0,0,8,12,1,18,1,14,3,14,1, + 6,1,6,1,12,1,2,1,18,1,14,1,10,5,8,1, + 12,1,10,1,8,1,10,1,122,33,95,90,105,112,73,109, + 112,111,114,116,82,101,115,111,117,114,99,101,82,101,97,100, + 101,114,46,99,111,110,116,101,110,116,115,78,41,10,114,6, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,84,0, + 0,0,114,81,0,0,0,114,34,0,0,0,114,181,0,0, + 0,114,182,0,0,0,114,183,0,0,0,114,188,0,0,0, + 114,9,0,0,0,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,114,80,0,0,0,212,2,0,0,115,14,0, + 0,0,8,1,4,5,4,2,8,4,8,9,8,6,8,11, + 114,80,0,0,0,41,45,114,84,0,0,0,90,26,95,102, + 114,111,122,101,110,95,105,109,112,111,114,116,108,105,98,95, + 101,120,116,101,114,110,97,108,114,21,0,0,0,114,1,0, + 0,0,114,2,0,0,0,90,17,95,102,114,111,122,101,110, + 95,105,109,112,111,114,116,108,105,98,114,76,0,0,0,114, + 148,0,0,0,114,110,0,0,0,114,152,0,0,0,114,67, + 0,0,0,114,131,0,0,0,90,7,95,95,97,108,108,95, + 95,114,20,0,0,0,90,15,112,97,116,104,95,115,101,112, + 97,114,97,116,111,114,115,114,18,0,0,0,114,75,0,0, + 0,114,3,0,0,0,114,25,0,0,0,218,4,116,121,112, + 101,114,70,0,0,0,114,113,0,0,0,114,115,0,0,0, + 114,117,0,0,0,114,4,0,0,0,114,89,0,0,0,114, + 36,0,0,0,114,37,0,0,0,114,35,0,0,0,114,27, + 0,0,0,114,122,0,0,0,114,142,0,0,0,114,144,0, + 0,0,114,52,0,0,0,114,147,0,0,0,114,155,0,0, + 0,218,8,95,95,99,111,100,101,95,95,114,153,0,0,0, + 114,159,0,0,0,114,161,0,0,0,114,169,0,0,0,114, + 151,0,0,0,114,149,0,0,0,114,44,0,0,0,114,80, + 0,0,0,114,9,0,0,0,114,9,0,0,0,114,9,0, + 0,0,114,10,0,0,0,218,8,60,109,111,100,117,108,101, + 62,1,0,0,0,115,88,0,0,0,4,16,8,1,16,1, + 8,1,8,1,8,1,8,1,8,1,8,2,8,3,6,1, + 14,3,16,4,4,2,8,2,4,1,4,1,4,2,14,127, + 0,127,0,1,12,1,12,1,2,1,2,252,4,9,8,4, + 8,9,8,31,8,126,2,254,2,29,4,5,8,21,8,46, + 8,10,8,46,10,5,8,7,8,6,8,13,8,19,8,15, + 8,26, }; diff --git a/Python/peephole.c b/Python/peephole.c index 1ce3535626e9..6f3e2ed88b2b 100644 --- a/Python/peephole.c +++ b/Python/peephole.c @@ -250,12 +250,16 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, lnotab = (unsigned char*)PyBytes_AS_STRING(lnotab_obj); tabsiz = PyBytes_GET_SIZE(lnotab_obj); assert(tabsiz == 0 || Py_REFCNT(lnotab_obj) == 1); - if (memchr(lnotab, 255, tabsiz) != NULL) { - /* 255 value are used for multibyte bytecode instructions */ - goto exitUnchanged; + + /* Don't optimize if lnotab contains instruction pointer delta larger + than +255 (encoded as multiple bytes), just to keep the peephole optimizer + simple. The optimizer leaves line number deltas unchanged. */ + + for (j = 0; j < tabsiz; j += 2) { + if (lnotab[j] == 255) { + goto exitUnchanged; + } } - /* Note: -128 and 127 special values for line number delta are ok, - the peephole optimizer doesn't modify line numbers. */ assert(PyBytes_Check(code)); Py_ssize_t codesize = PyBytes_GET_SIZE(code); From webhook-mailer at python.org Thu Jun 13 14:36:05 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 13 Jun 2019 18:36:05 -0000 Subject: [Python-checkins] bpo-37213: Handle negative line deltas correctly in the peephole optimizer (GH-13969) Message-ID: https://github.com/python/cpython/commit/5282b3b1d2e0bdf13899b1616aea20a6e3c4e13e commit: 5282b3b1d2e0bdf13899b1616aea20a6e3c4e13e branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-13T11:35:40-07:00 summary: bpo-37213: Handle negative line deltas correctly in the peephole optimizer (GH-13969) The peephole optimizer was not optimizing correctly bytecode after negative deltas were introduced. This is due to the fact that some special values (255) were being searched for in both instruction pointer delta and line number deltas. (cherry picked from commit 3498c642f4e83f3d8e2214654c0fa8e0d51cebe5) Co-authored-by: Pablo Galindo files: A Misc/NEWS.d/next/Core and Builtins/2019-06-11-11-15-19.bpo-37213.UPii5K.rst M Lib/test/test_peepholer.py M Python/importlib.h M Python/importlib_external.h M Python/importlib_zipimport.h M Python/peephole.c diff --git a/Lib/test/test_peepholer.py b/Lib/test/test_peepholer.py index 794d104d5919..860ceeb003e7 100644 --- a/Lib/test/test_peepholer.py +++ b/Lib/test/test_peepholer.py @@ -1,5 +1,7 @@ import dis import unittest +import types +import textwrap from test.bytecode_helper import BytecodeTestCase @@ -18,6 +20,27 @@ def count_instr_recursively(f, opname): class TestTranforms(BytecodeTestCase): + def check_jump_targets(self, code): + instructions = list(dis.get_instructions(code)) + targets = {instr.offset: instr for instr in instructions} + for instr in instructions: + if 'JUMP_' not in instr.opname: + continue + tgt = targets[instr.argval] + # jump to unconditional jump + if tgt.opname in ('JUMP_ABSOLUTE', 'JUMP_FORWARD'): + self.fail(f'{instr.opname} at {instr.offset} ' + f'jumps to {tgt.opname} at {tgt.offset}') + # unconditional jump to RETURN_VALUE + if (instr.opname in ('JUMP_ABSOLUTE', 'JUMP_FORWARD') and + tgt.opname == 'RETURN_VALUE'): + self.fail(f'{instr.opname} at {instr.offset} ' + f'jumps to {tgt.opname} at {tgt.offset}') + # JUMP_IF_*_OR_POP jump to conditional jump + if '_OR_POP' in instr.opname and 'JUMP_IF_' in tgt.opname: + self.fail(f'{instr.opname} at {instr.offset} ' + f'jumps to {tgt.opname} at {tgt.offset}') + def test_unot(self): # UNARY_NOT POP_JUMP_IF_FALSE --> POP_JUMP_IF_TRUE' def unot(x): @@ -259,13 +282,69 @@ def f(x): def test_elim_jump_to_return(self): # JUMP_FORWARD to RETURN --> RETURN def f(cond, true_value, false_value): - return true_value if cond else false_value + # Intentionally use two-line expression to test issue37213. + return (true_value if cond + else false_value) + self.check_jump_targets(f) self.assertNotInBytecode(f, 'JUMP_FORWARD') self.assertNotInBytecode(f, 'JUMP_ABSOLUTE') returns = [instr for instr in dis.get_instructions(f) if instr.opname == 'RETURN_VALUE'] self.assertEqual(len(returns), 2) + def test_elim_jump_to_uncond_jump(self): + # POP_JUMP_IF_FALSE to JUMP_FORWARD --> POP_JUMP_IF_FALSE to non-jump + def f(): + if a: + # Intentionally use two-line expression to test issue37213. + if (c + or d): + foo() + else: + baz() + self.check_jump_targets(f) + + def test_elim_jump_to_uncond_jump2(self): + # POP_JUMP_IF_FALSE to JUMP_ABSOLUTE --> POP_JUMP_IF_FALSE to non-jump + def f(): + while a: + # Intentionally use two-line expression to test issue37213. + if (c + or d): + a = foo() + self.check_jump_targets(f) + + def test_elim_jump_to_uncond_jump3(self): + # Intentionally use two-line expressions to test issue37213. + # JUMP_IF_FALSE_OR_POP to JUMP_IF_FALSE_OR_POP --> JUMP_IF_FALSE_OR_POP to non-jump + def f(a, b, c): + return ((a and b) + and c) + self.check_jump_targets(f) + self.assertEqual(count_instr_recursively(f, 'JUMP_IF_FALSE_OR_POP'), 2) + # JUMP_IF_TRUE_OR_POP to JUMP_IF_TRUE_OR_POP --> JUMP_IF_TRUE_OR_POP to non-jump + def f(a, b, c): + return ((a or b) + or c) + self.check_jump_targets(f) + self.assertEqual(count_instr_recursively(f, 'JUMP_IF_TRUE_OR_POP'), 2) + # JUMP_IF_FALSE_OR_POP to JUMP_IF_TRUE_OR_POP --> POP_JUMP_IF_FALSE to non-jump + def f(a, b, c): + return ((a and b) + or c) + self.check_jump_targets(f) + self.assertNotInBytecode(f, 'JUMP_IF_FALSE_OR_POP') + self.assertInBytecode(f, 'JUMP_IF_TRUE_OR_POP') + self.assertInBytecode(f, 'POP_JUMP_IF_FALSE') + # JUMP_IF_TRUE_OR_POP to JUMP_IF_FALSE_OR_POP --> POP_JUMP_IF_TRUE to non-jump + def f(a, b, c): + return ((a or b) + and c) + self.check_jump_targets(f) + self.assertNotInBytecode(f, 'JUMP_IF_TRUE_OR_POP') + self.assertInBytecode(f, 'JUMP_IF_FALSE_OR_POP') + self.assertInBytecode(f, 'POP_JUMP_IF_TRUE') + def test_elim_jump_after_return1(self): # Eliminate dead code: jumps immediately after returns can't be reached def f(cond1, cond2): diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-06-11-11-15-19.bpo-37213.UPii5K.rst b/Misc/NEWS.d/next/Core and Builtins/2019-06-11-11-15-19.bpo-37213.UPii5K.rst new file mode 100644 index 000000000000..b949883da9c2 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-06-11-11-15-19.bpo-37213.UPii5K.rst @@ -0,0 +1,2 @@ +Handle correctly negative line offsets in the peephole optimizer. Patch by +Pablo Galindo. diff --git a/Python/importlib.h b/Python/importlib.h index 5bd1d179e2f0..a285a31e2065 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -670,1121 +670,1120 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 1,18,1,10,1,8,1,4,255,6,2,122,19,77,111,100, 117,108,101,83,112,101,99,46,95,95,114,101,112,114,95,95, 99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,8,0,0,0,67,0,0,0,115,114,0,0,0,124,0, - 106,0,125,2,122,76,124,0,106,1,124,1,106,1,107,2, + 0,8,0,0,0,67,0,0,0,115,106,0,0,0,124,0, + 106,0,125,2,122,72,124,0,106,1,124,1,106,1,107,2, 111,76,124,0,106,2,124,1,106,2,107,2,111,76,124,0, 106,3,124,1,106,3,107,2,111,76,124,2,124,1,106,0, 107,2,111,76,124,0,106,4,124,1,106,4,107,2,111,76, - 124,0,106,5,124,1,106,5,107,2,87,0,83,0,87,0, - 110,26,4,0,116,6,107,10,114,108,1,0,1,0,1,0, - 89,0,100,1,83,0,89,0,110,2,88,0,100,0,83,0, - 114,116,0,0,0,41,7,114,117,0,0,0,114,17,0,0, - 0,114,109,0,0,0,114,113,0,0,0,218,6,99,97,99, - 104,101,100,218,12,104,97,115,95,108,111,99,97,116,105,111, - 110,114,106,0,0,0,41,3,114,30,0,0,0,90,5,111, - 116,104,101,114,90,4,115,109,115,108,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,218,6,95,95,101,113,95, - 95,108,1,0,0,115,30,0,0,0,0,1,6,1,2,1, - 12,1,10,255,2,2,10,254,2,3,8,253,2,4,10,252, - 2,5,10,251,8,6,14,1,122,17,77,111,100,117,108,101, - 83,112,101,99,46,95,95,101,113,95,95,99,1,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0, - 67,0,0,0,115,58,0,0,0,124,0,106,0,100,0,107, - 8,114,52,124,0,106,1,100,0,107,9,114,52,124,0,106, - 2,114,52,116,3,100,0,107,8,114,38,116,4,130,1,116, - 3,160,5,124,0,106,1,161,1,124,0,95,0,124,0,106, - 0,83,0,114,13,0,0,0,41,6,114,119,0,0,0,114, - 113,0,0,0,114,118,0,0,0,218,19,95,98,111,111,116, - 115,116,114,97,112,95,101,120,116,101,114,110,97,108,218,19, - 78,111,116,73,109,112,108,101,109,101,110,116,101,100,69,114, - 114,111,114,90,11,95,103,101,116,95,99,97,99,104,101,100, - 114,47,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,114,123,0,0,0,120,1,0,0,115,12,0, - 0,0,0,2,10,1,16,1,8,1,4,1,14,1,122,17, - 77,111,100,117,108,101,83,112,101,99,46,99,97,99,104,101, - 100,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,2,0,0,0,67,0,0,0,115,10,0,0,0,124, - 1,124,0,95,0,100,0,83,0,114,13,0,0,0,41,1, - 114,119,0,0,0,41,2,114,30,0,0,0,114,123,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,123,0,0,0,129,1,0,0,115,2,0,0,0,0,2, - 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,3,0,0,0,67,0,0,0,115,36,0,0,0,124,0, - 106,0,100,1,107,8,114,26,124,0,106,1,160,2,100,2, - 161,1,100,3,25,0,83,0,124,0,106,1,83,0,100,1, - 83,0,41,4,122,32,84,104,101,32,110,97,109,101,32,111, - 102,32,116,104,101,32,109,111,100,117,108,101,39,115,32,112, - 97,114,101,110,116,46,78,218,1,46,114,22,0,0,0,41, - 3,114,117,0,0,0,114,17,0,0,0,218,10,114,112,97, - 114,116,105,116,105,111,110,114,47,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,218,6,112,97,114, - 101,110,116,133,1,0,0,115,6,0,0,0,0,3,10,1, - 16,2,122,17,77,111,100,117,108,101,83,112,101,99,46,112, - 97,114,101,110,116,99,1,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,1,0,0,0,67,0,0,0,115,6, - 0,0,0,124,0,106,0,83,0,114,13,0,0,0,41,1, - 114,118,0,0,0,114,47,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,124,0,0,0,141,1, - 0,0,115,2,0,0,0,0,2,122,23,77,111,100,117,108, - 101,83,112,101,99,46,104,97,115,95,108,111,99,97,116,105, - 111,110,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,2,0,0,0,67,0,0,0,115,14,0,0,0, - 116,0,124,1,131,1,124,0,95,1,100,0,83,0,114,13, - 0,0,0,41,2,218,4,98,111,111,108,114,118,0,0,0, - 41,2,114,30,0,0,0,218,5,118,97,108,117,101,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,124,0, - 0,0,145,1,0,0,115,2,0,0,0,0,2,41,12,114, - 1,0,0,0,114,0,0,0,0,114,2,0,0,0,114,3, - 0,0,0,114,31,0,0,0,114,48,0,0,0,114,125,0, - 0,0,218,8,112,114,111,112,101,114,116,121,114,123,0,0, - 0,218,6,115,101,116,116,101,114,114,130,0,0,0,114,124, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,112,0,0,0,49,1,0,0, - 115,32,0,0,0,8,1,4,36,4,1,2,255,12,12,8, - 10,8,12,2,1,10,8,4,1,10,3,2,1,10,7,2, - 1,10,3,4,1,114,112,0,0,0,169,2,114,113,0,0, - 0,114,115,0,0,0,99,2,0,0,0,0,0,0,0,2, - 0,0,0,6,0,0,0,8,0,0,0,67,0,0,0,115, - 154,0,0,0,116,0,124,1,100,1,131,2,114,74,116,1, - 100,2,107,8,114,22,116,2,130,1,116,1,106,3,125,4, - 124,3,100,2,107,8,114,48,124,4,124,0,124,1,100,3, - 141,2,83,0,124,3,114,56,103,0,110,2,100,2,125,5, - 124,4,124,0,124,1,124,5,100,4,141,3,83,0,124,3, - 100,2,107,8,114,138,116,0,124,1,100,5,131,2,114,134, - 122,14,124,1,160,4,124,0,161,1,125,3,87,0,110,24, - 4,0,116,5,107,10,114,130,1,0,1,0,1,0,100,2, - 125,3,89,0,110,2,88,0,110,4,100,6,125,3,116,6, - 124,0,124,1,124,2,124,3,100,7,141,4,83,0,41,8, - 122,53,82,101,116,117,114,110,32,97,32,109,111,100,117,108, - 101,32,115,112,101,99,32,98,97,115,101,100,32,111,110,32, - 118,97,114,105,111,117,115,32,108,111,97,100,101,114,32,109, - 101,116,104,111,100,115,46,90,12,103,101,116,95,102,105,108, - 101,110,97,109,101,78,41,1,114,109,0,0,0,41,2,114, - 109,0,0,0,114,117,0,0,0,114,115,0,0,0,70,114, - 135,0,0,0,41,7,114,4,0,0,0,114,126,0,0,0, - 114,127,0,0,0,218,23,115,112,101,99,95,102,114,111,109, - 95,102,105,108,101,95,108,111,99,97,116,105,111,110,114,115, - 0,0,0,114,79,0,0,0,114,112,0,0,0,41,6,114, - 17,0,0,0,114,109,0,0,0,114,113,0,0,0,114,115, - 0,0,0,114,136,0,0,0,90,6,115,101,97,114,99,104, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 91,0,0,0,150,1,0,0,115,36,0,0,0,0,2,10, - 1,8,1,4,1,6,2,8,1,12,1,12,1,6,1,2, - 255,6,3,8,1,10,1,2,1,14,1,14,1,12,3,4, - 2,114,91,0,0,0,99,3,0,0,0,0,0,0,0,0, - 0,0,0,8,0,0,0,8,0,0,0,67,0,0,0,115, - 56,1,0,0,122,10,124,0,106,0,125,3,87,0,110,20, - 4,0,116,1,107,10,114,30,1,0,1,0,1,0,89,0, - 110,14,88,0,124,3,100,0,107,9,114,44,124,3,83,0, - 124,0,106,2,125,4,124,1,100,0,107,8,114,90,122,10, - 124,0,106,3,125,1,87,0,110,20,4,0,116,1,107,10, - 114,88,1,0,1,0,1,0,89,0,110,2,88,0,122,10, - 124,0,106,4,125,5,87,0,110,24,4,0,116,1,107,10, - 114,124,1,0,1,0,1,0,100,0,125,5,89,0,110,2, - 88,0,124,2,100,0,107,8,114,184,124,5,100,0,107,8, - 114,180,122,10,124,1,106,5,125,2,87,0,113,184,4,0, - 116,1,107,10,114,176,1,0,1,0,1,0,100,0,125,2, - 89,0,113,184,88,0,110,4,124,5,125,2,122,10,124,0, - 106,6,125,6,87,0,110,24,4,0,116,1,107,10,114,218, - 1,0,1,0,1,0,100,0,125,6,89,0,110,2,88,0, - 122,14,116,7,124,0,106,8,131,1,125,7,87,0,110,26, - 4,0,116,1,107,10,144,1,114,4,1,0,1,0,1,0, - 100,0,125,7,89,0,110,2,88,0,116,9,124,4,124,1, - 124,2,100,1,141,3,125,3,124,5,100,0,107,8,144,1, - 114,34,100,2,110,2,100,3,124,3,95,10,124,6,124,3, - 95,11,124,7,124,3,95,12,124,3,83,0,41,4,78,169, - 1,114,113,0,0,0,70,84,41,13,114,105,0,0,0,114, - 106,0,0,0,114,1,0,0,0,114,98,0,0,0,114,108, - 0,0,0,218,7,95,79,82,73,71,73,78,218,10,95,95, - 99,97,99,104,101,100,95,95,218,4,108,105,115,116,218,8, - 95,95,112,97,116,104,95,95,114,112,0,0,0,114,118,0, - 0,0,114,123,0,0,0,114,117,0,0,0,41,8,114,96, - 0,0,0,114,109,0,0,0,114,113,0,0,0,114,95,0, - 0,0,114,17,0,0,0,90,8,108,111,99,97,116,105,111, - 110,114,123,0,0,0,114,117,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,218,17,95,115,112,101, - 99,95,102,114,111,109,95,109,111,100,117,108,101,176,1,0, - 0,115,72,0,0,0,0,2,2,1,10,1,14,1,6,2, - 8,1,4,2,6,1,8,1,2,1,10,1,14,2,6,1, - 2,1,10,1,14,1,10,1,8,1,8,1,2,1,10,1, - 14,1,12,2,4,1,2,1,10,1,14,1,10,1,2,1, - 14,1,16,1,10,2,14,1,20,1,6,1,6,1,114,142, - 0,0,0,70,169,1,218,8,111,118,101,114,114,105,100,101, - 99,2,0,0,0,0,0,0,0,1,0,0,0,5,0,0, - 0,8,0,0,0,67,0,0,0,115,226,1,0,0,124,2, - 115,20,116,0,124,1,100,1,100,0,131,3,100,0,107,8, - 114,54,122,12,124,0,106,1,124,1,95,2,87,0,110,20, - 4,0,116,3,107,10,114,52,1,0,1,0,1,0,89,0, - 110,2,88,0,124,2,115,74,116,0,124,1,100,2,100,0, - 131,3,100,0,107,8,114,178,124,0,106,4,125,3,124,3, - 100,0,107,8,114,146,124,0,106,5,100,0,107,9,114,146, - 116,6,100,0,107,8,114,110,116,7,130,1,116,6,106,8, - 125,4,124,4,160,9,124,4,161,1,125,3,124,0,106,5, - 124,3,95,10,124,3,124,0,95,4,100,0,124,1,95,11, - 122,10,124,3,124,1,95,12,87,0,110,20,4,0,116,3, - 107,10,114,176,1,0,1,0,1,0,89,0,110,2,88,0, - 124,2,115,198,116,0,124,1,100,3,100,0,131,3,100,0, - 107,8,114,232,122,12,124,0,106,13,124,1,95,14,87,0, - 110,20,4,0,116,3,107,10,114,230,1,0,1,0,1,0, - 89,0,110,2,88,0,122,10,124,0,124,1,95,15,87,0, - 110,22,4,0,116,3,107,10,144,1,114,8,1,0,1,0, - 1,0,89,0,110,2,88,0,124,2,144,1,115,34,116,0, - 124,1,100,4,100,0,131,3,100,0,107,8,144,1,114,82, - 124,0,106,5,100,0,107,9,144,1,114,82,122,12,124,0, - 106,5,124,1,95,16,87,0,110,22,4,0,116,3,107,10, - 144,1,114,80,1,0,1,0,1,0,89,0,110,2,88,0, - 124,0,106,17,144,1,114,222,124,2,144,1,115,114,116,0, - 124,1,100,5,100,0,131,3,100,0,107,8,144,1,114,150, - 122,12,124,0,106,18,124,1,95,11,87,0,110,22,4,0, - 116,3,107,10,144,1,114,148,1,0,1,0,1,0,89,0, - 110,2,88,0,124,2,144,1,115,174,116,0,124,1,100,6, - 100,0,131,3,100,0,107,8,144,1,114,222,124,0,106,19, - 100,0,107,9,144,1,114,222,122,12,124,0,106,19,124,1, - 95,20,87,0,110,22,4,0,116,3,107,10,144,1,114,220, - 1,0,1,0,1,0,89,0,110,2,88,0,124,1,83,0, - 41,7,78,114,1,0,0,0,114,98,0,0,0,218,11,95, - 95,112,97,99,107,97,103,101,95,95,114,141,0,0,0,114, - 108,0,0,0,114,139,0,0,0,41,21,114,6,0,0,0, - 114,17,0,0,0,114,1,0,0,0,114,106,0,0,0,114, - 109,0,0,0,114,117,0,0,0,114,126,0,0,0,114,127, - 0,0,0,218,16,95,78,97,109,101,115,112,97,99,101,76, - 111,97,100,101,114,218,7,95,95,110,101,119,95,95,90,5, - 95,112,97,116,104,114,108,0,0,0,114,98,0,0,0,114, - 130,0,0,0,114,145,0,0,0,114,105,0,0,0,114,141, - 0,0,0,114,124,0,0,0,114,113,0,0,0,114,123,0, - 0,0,114,139,0,0,0,41,5,114,95,0,0,0,114,96, - 0,0,0,114,144,0,0,0,114,109,0,0,0,114,146,0, + 124,0,106,5,124,1,106,5,107,2,87,0,83,0,4,0, + 116,6,107,10,114,100,1,0,1,0,1,0,89,0,100,1, + 83,0,88,0,100,0,83,0,114,116,0,0,0,41,7,114, + 117,0,0,0,114,17,0,0,0,114,109,0,0,0,114,113, + 0,0,0,218,6,99,97,99,104,101,100,218,12,104,97,115, + 95,108,111,99,97,116,105,111,110,114,106,0,0,0,41,3, + 114,30,0,0,0,90,5,111,116,104,101,114,90,4,115,109, + 115,108,114,10,0,0,0,114,10,0,0,0,114,11,0,0, + 0,218,6,95,95,101,113,95,95,108,1,0,0,115,30,0, + 0,0,0,1,6,1,2,1,12,1,10,255,2,2,10,254, + 2,3,8,253,2,4,10,252,2,5,10,251,4,6,14,1, + 122,17,77,111,100,117,108,101,83,112,101,99,46,95,95,101, + 113,95,95,99,1,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,0,3,0,0,0,67,0,0,0,115,58,0,0, + 0,124,0,106,0,100,0,107,8,114,52,124,0,106,1,100, + 0,107,9,114,52,124,0,106,2,114,52,116,3,100,0,107, + 8,114,38,116,4,130,1,116,3,160,5,124,0,106,1,161, + 1,124,0,95,0,124,0,106,0,83,0,114,13,0,0,0, + 41,6,114,119,0,0,0,114,113,0,0,0,114,118,0,0, + 0,218,19,95,98,111,111,116,115,116,114,97,112,95,101,120, + 116,101,114,110,97,108,218,19,78,111,116,73,109,112,108,101, + 109,101,110,116,101,100,69,114,114,111,114,90,11,95,103,101, + 116,95,99,97,99,104,101,100,114,47,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,114,123,0,0, + 0,120,1,0,0,115,12,0,0,0,0,2,10,1,16,1, + 8,1,4,1,14,1,122,17,77,111,100,117,108,101,83,112, + 101,99,46,99,97,99,104,101,100,99,2,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,2,0,0,0,67,0, + 0,0,115,10,0,0,0,124,1,124,0,95,0,100,0,83, + 0,114,13,0,0,0,41,1,114,119,0,0,0,41,2,114, + 30,0,0,0,114,123,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,123,0,0,0,129,1,0, + 0,115,2,0,0,0,0,2,99,1,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, + 0,115,36,0,0,0,124,0,106,0,100,1,107,8,114,26, + 124,0,106,1,160,2,100,2,161,1,100,3,25,0,83,0, + 124,0,106,1,83,0,100,1,83,0,41,4,122,32,84,104, + 101,32,110,97,109,101,32,111,102,32,116,104,101,32,109,111, + 100,117,108,101,39,115,32,112,97,114,101,110,116,46,78,218, + 1,46,114,22,0,0,0,41,3,114,117,0,0,0,114,17, + 0,0,0,218,10,114,112,97,114,116,105,116,105,111,110,114, + 47,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,218,6,112,97,114,101,110,116,133,1,0,0,115, + 6,0,0,0,0,3,10,1,16,2,122,17,77,111,100,117, + 108,101,83,112,101,99,46,112,97,114,101,110,116,99,1,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0, + 0,0,67,0,0,0,115,6,0,0,0,124,0,106,0,83, + 0,114,13,0,0,0,41,1,114,118,0,0,0,114,47,0, 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,218,18,95,105,110,105,116,95,109,111,100,117,108,101,95, - 97,116,116,114,115,221,1,0,0,115,96,0,0,0,0,4, - 20,1,2,1,12,1,14,1,6,2,20,1,6,1,8,2, - 10,1,8,1,4,1,6,2,10,1,8,1,6,11,6,1, - 2,1,10,1,14,1,6,2,20,1,2,1,12,1,14,1, - 6,2,2,1,10,1,16,1,6,2,24,1,12,1,2,1, - 12,1,16,1,6,2,8,1,24,1,2,1,12,1,16,1, - 6,2,24,1,12,1,2,1,12,1,16,1,6,1,114,148, - 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,3,0,0,0,67,0,0,0,115,82,0,0, - 0,100,1,125,1,116,0,124,0,106,1,100,2,131,2,114, - 30,124,0,106,1,160,2,124,0,161,1,125,1,110,20,116, - 0,124,0,106,1,100,3,131,2,114,50,116,3,100,4,131, - 1,130,1,124,1,100,1,107,8,114,68,116,4,124,0,106, - 5,131,1,125,1,116,6,124,0,124,1,131,2,1,0,124, - 1,83,0,41,5,122,43,67,114,101,97,116,101,32,97,32, - 109,111,100,117,108,101,32,98,97,115,101,100,32,111,110,32, - 116,104,101,32,112,114,111,118,105,100,101,100,32,115,112,101, - 99,46,78,218,13,99,114,101,97,116,101,95,109,111,100,117, - 108,101,218,11,101,120,101,99,95,109,111,100,117,108,101,122, - 66,108,111,97,100,101,114,115,32,116,104,97,116,32,100,101, - 102,105,110,101,32,101,120,101,99,95,109,111,100,117,108,101, - 40,41,32,109,117,115,116,32,97,108,115,111,32,100,101,102, - 105,110,101,32,99,114,101,97,116,101,95,109,111,100,117,108, - 101,40,41,41,7,114,4,0,0,0,114,109,0,0,0,114, - 149,0,0,0,114,79,0,0,0,114,18,0,0,0,114,17, - 0,0,0,114,148,0,0,0,169,2,114,95,0,0,0,114, - 96,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,218,16,109,111,100,117,108,101,95,102,114,111,109, - 95,115,112,101,99,37,2,0,0,115,18,0,0,0,0,3, - 4,1,12,3,14,1,12,1,8,2,8,1,10,1,10,1, - 114,152,0,0,0,99,1,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,4,0,0,0,67,0,0,0,115,106, - 0,0,0,124,0,106,0,100,1,107,8,114,14,100,2,110, - 4,124,0,106,0,125,1,124,0,106,1,100,1,107,8,114, - 66,124,0,106,2,100,1,107,8,114,50,100,3,160,3,124, - 1,161,1,83,0,100,4,160,3,124,1,124,0,106,2,161, - 2,83,0,110,36,124,0,106,4,114,86,100,5,160,3,124, - 1,124,0,106,1,161,2,83,0,100,6,160,3,124,0,106, - 0,124,0,106,1,161,2,83,0,100,1,83,0,41,7,122, - 38,82,101,116,117,114,110,32,116,104,101,32,114,101,112,114, - 32,116,111,32,117,115,101,32,102,111,114,32,116,104,101,32, - 109,111,100,117,108,101,46,78,114,100,0,0,0,114,101,0, - 0,0,114,102,0,0,0,114,103,0,0,0,250,18,60,109, - 111,100,117,108,101,32,123,33,114,125,32,40,123,125,41,62, - 41,5,114,17,0,0,0,114,113,0,0,0,114,109,0,0, - 0,114,45,0,0,0,114,124,0,0,0,41,2,114,95,0, - 0,0,114,17,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,107,0,0,0,54,2,0,0,115, - 16,0,0,0,0,3,20,1,10,1,10,1,10,2,16,2, - 6,1,14,2,114,107,0,0,0,99,2,0,0,0,0,0, - 0,0,0,0,0,0,4,0,0,0,10,0,0,0,67,0, - 0,0,115,204,0,0,0,124,0,106,0,125,2,116,1,124, - 2,131,1,143,180,1,0,116,2,106,3,160,4,124,2,161, - 1,124,1,107,9,114,54,100,1,160,5,124,2,161,1,125, - 3,116,6,124,3,124,2,100,2,141,2,130,1,122,106,124, - 0,106,7,100,3,107,8,114,106,124,0,106,8,100,3,107, - 8,114,90,116,6,100,4,124,0,106,0,100,2,141,2,130, - 1,116,9,124,0,124,1,100,5,100,6,141,3,1,0,110, - 52,116,9,124,0,124,1,100,5,100,6,141,3,1,0,116, - 10,124,0,106,7,100,7,131,2,115,146,124,0,106,7,160, - 11,124,2,161,1,1,0,110,12,124,0,106,7,160,12,124, - 1,161,1,1,0,87,0,53,0,116,2,106,3,160,13,124, - 0,106,0,161,1,125,1,124,1,116,2,106,3,124,0,106, - 0,60,0,88,0,87,0,53,0,81,0,82,0,88,0,124, - 1,83,0,41,8,122,70,69,120,101,99,117,116,101,32,116, - 104,101,32,115,112,101,99,39,115,32,115,112,101,99,105,102, - 105,101,100,32,109,111,100,117,108,101,32,105,110,32,97,110, - 32,101,120,105,115,116,105,110,103,32,109,111,100,117,108,101, - 39,115,32,110,97,109,101,115,112,97,99,101,46,122,30,109, - 111,100,117,108,101,32,123,33,114,125,32,110,111,116,32,105, - 110,32,115,121,115,46,109,111,100,117,108,101,115,114,16,0, - 0,0,78,250,14,109,105,115,115,105,110,103,32,108,111,97, - 100,101,114,84,114,143,0,0,0,114,150,0,0,0,41,14, - 114,17,0,0,0,114,50,0,0,0,114,15,0,0,0,114, - 92,0,0,0,114,34,0,0,0,114,45,0,0,0,114,79, - 0,0,0,114,109,0,0,0,114,117,0,0,0,114,148,0, - 0,0,114,4,0,0,0,218,11,108,111,97,100,95,109,111, - 100,117,108,101,114,150,0,0,0,218,3,112,111,112,41,4, - 114,95,0,0,0,114,96,0,0,0,114,17,0,0,0,218, - 3,109,115,103,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,93,0,0,0,71,2,0,0,115,34,0,0, - 0,0,2,6,1,10,1,16,1,10,1,12,1,2,1,10, - 1,10,1,14,2,16,2,14,1,12,4,14,2,16,4,14, - 1,24,1,114,93,0,0,0,99,1,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,8,0,0,0,67,0,0, - 0,115,26,1,0,0,122,18,124,0,106,0,160,1,124,0, - 106,2,161,1,1,0,87,0,110,52,1,0,1,0,1,0, - 124,0,106,2,116,3,106,4,107,6,114,64,116,3,106,4, - 160,5,124,0,106,2,161,1,125,1,124,1,116,3,106,4, - 124,0,106,2,60,0,130,0,89,0,110,2,88,0,116,3, - 106,4,160,5,124,0,106,2,161,1,125,1,124,1,116,3, - 106,4,124,0,106,2,60,0,116,6,124,1,100,1,100,0, - 131,3,100,0,107,8,114,148,122,12,124,0,106,0,124,1, - 95,7,87,0,110,20,4,0,116,8,107,10,114,146,1,0, - 1,0,1,0,89,0,110,2,88,0,116,6,124,1,100,2, - 100,0,131,3,100,0,107,8,114,226,122,40,124,1,106,9, - 124,1,95,10,116,11,124,1,100,3,131,2,115,202,124,0, - 106,2,160,12,100,4,161,1,100,5,25,0,124,1,95,10, - 87,0,110,20,4,0,116,8,107,10,114,224,1,0,1,0, - 1,0,89,0,110,2,88,0,116,6,124,1,100,6,100,0, - 131,3,100,0,107,8,144,1,114,22,122,10,124,0,124,1, - 95,13,87,0,110,22,4,0,116,8,107,10,144,1,114,20, - 1,0,1,0,1,0,89,0,110,2,88,0,124,1,83,0, - 41,7,78,114,98,0,0,0,114,145,0,0,0,114,141,0, - 0,0,114,128,0,0,0,114,22,0,0,0,114,105,0,0, - 0,41,14,114,109,0,0,0,114,155,0,0,0,114,17,0, - 0,0,114,15,0,0,0,114,92,0,0,0,114,156,0,0, - 0,114,6,0,0,0,114,98,0,0,0,114,106,0,0,0, - 114,1,0,0,0,114,145,0,0,0,114,4,0,0,0,114, - 129,0,0,0,114,105,0,0,0,114,151,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,218,25,95, - 108,111,97,100,95,98,97,99,107,119,97,114,100,95,99,111, - 109,112,97,116,105,98,108,101,101,2,0,0,115,54,0,0, - 0,0,4,2,1,18,1,6,1,12,1,14,1,12,1,8, - 3,14,1,12,1,16,1,2,1,12,1,14,1,6,1,16, - 1,2,4,8,1,10,1,22,1,14,1,6,1,18,1,2, - 1,10,1,16,1,6,1,114,158,0,0,0,99,1,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,11,0,0, - 0,67,0,0,0,115,220,0,0,0,124,0,106,0,100,0, - 107,9,114,30,116,1,124,0,106,0,100,1,131,2,115,30, - 116,2,124,0,131,1,83,0,116,3,124,0,131,1,125,1, - 100,2,124,0,95,4,122,162,124,1,116,5,106,6,124,0, - 106,7,60,0,122,52,124,0,106,0,100,0,107,8,114,96, - 124,0,106,8,100,0,107,8,114,108,116,9,100,3,124,0, - 106,7,100,4,141,2,130,1,110,12,124,0,106,0,160,10, - 124,1,161,1,1,0,87,0,110,50,1,0,1,0,1,0, - 122,14,116,5,106,6,124,0,106,7,61,0,87,0,110,20, - 4,0,116,11,107,10,114,152,1,0,1,0,1,0,89,0, - 110,2,88,0,130,0,89,0,110,2,88,0,116,5,106,6, - 160,12,124,0,106,7,161,1,125,1,124,1,116,5,106,6, - 124,0,106,7,60,0,116,13,100,5,124,0,106,7,124,0, - 106,0,131,3,1,0,87,0,53,0,100,6,124,0,95,4, - 88,0,124,1,83,0,41,7,78,114,150,0,0,0,84,114, - 154,0,0,0,114,16,0,0,0,122,18,105,109,112,111,114, - 116,32,123,33,114,125,32,35,32,123,33,114,125,70,41,14, - 114,109,0,0,0,114,4,0,0,0,114,158,0,0,0,114, - 152,0,0,0,90,13,95,105,110,105,116,105,97,108,105,122, - 105,110,103,114,15,0,0,0,114,92,0,0,0,114,17,0, - 0,0,114,117,0,0,0,114,79,0,0,0,114,150,0,0, - 0,114,63,0,0,0,114,156,0,0,0,114,76,0,0,0, - 114,151,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,218,14,95,108,111,97,100,95,117,110,108,111, - 99,107,101,100,138,2,0,0,115,46,0,0,0,0,2,10, - 2,12,1,8,2,8,5,6,1,2,1,12,1,2,1,10, - 1,10,1,16,3,16,1,6,1,2,1,14,1,14,1,6, - 1,8,5,14,1,12,1,20,2,8,2,114,159,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,10,0,0,0,67,0,0,0,115,42,0,0,0,116,0, - 124,0,106,1,131,1,143,22,1,0,116,2,124,0,131,1, - 87,0,2,0,53,0,81,0,82,0,163,0,83,0,81,0, - 82,0,88,0,100,1,83,0,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,50, - 0,0,0,114,17,0,0,0,114,159,0,0,0,41,1,114, - 95,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,94,0,0,0,180,2,0,0,115,4,0,0, - 0,0,9,12,1,114,94,0,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,64, - 0,0,0,115,136,0,0,0,101,0,90,1,100,0,90,2, - 100,1,90,3,101,4,100,2,100,3,132,0,131,1,90,5, - 101,6,100,19,100,5,100,6,132,1,131,1,90,7,101,6, - 100,20,100,7,100,8,132,1,131,1,90,8,101,6,100,9, - 100,10,132,0,131,1,90,9,101,6,100,11,100,12,132,0, - 131,1,90,10,101,6,101,11,100,13,100,14,132,0,131,1, - 131,1,90,12,101,6,101,11,100,15,100,16,132,0,131,1, - 131,1,90,13,101,6,101,11,100,17,100,18,132,0,131,1, - 131,1,90,14,101,6,101,15,131,1,90,16,100,4,83,0, - 41,21,218,15,66,117,105,108,116,105,110,73,109,112,111,114, - 116,101,114,122,144,77,101,116,97,32,112,97,116,104,32,105, - 109,112,111,114,116,32,102,111,114,32,98,117,105,108,116,45, - 105,110,32,109,111,100,117,108,101,115,46,10,10,32,32,32, - 32,65,108,108,32,109,101,116,104,111,100,115,32,97,114,101, - 32,101,105,116,104,101,114,32,99,108,97,115,115,32,111,114, - 32,115,116,97,116,105,99,32,109,101,116,104,111,100,115,32, - 116,111,32,97,118,111,105,100,32,116,104,101,32,110,101,101, - 100,32,116,111,10,32,32,32,32,105,110,115,116,97,110,116, - 105,97,116,101,32,116,104,101,32,99,108,97,115,115,46,10, - 10,32,32,32,32,99,1,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,3,0,0,0,67,0,0,0,115,12, - 0,0,0,100,1,160,0,124,0,106,1,161,1,83,0,41, - 2,250,115,82,101,116,117,114,110,32,114,101,112,114,32,102, - 111,114,32,116,104,101,32,109,111,100,117,108,101,46,10,10, - 32,32,32,32,32,32,32,32,84,104,101,32,109,101,116,104, - 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, - 46,32,32,84,104,101,32,105,109,112,111,114,116,32,109,97, - 99,104,105,110,101,114,121,32,100,111,101,115,32,116,104,101, - 32,106,111,98,32,105,116,115,101,108,102,46,10,10,32,32, - 32,32,32,32,32,32,122,24,60,109,111,100,117,108,101,32, - 123,33,114,125,32,40,98,117,105,108,116,45,105,110,41,62, - 41,2,114,45,0,0,0,114,1,0,0,0,41,1,114,96, + 0,114,124,0,0,0,141,1,0,0,115,2,0,0,0,0, + 2,122,23,77,111,100,117,108,101,83,112,101,99,46,104,97, + 115,95,108,111,99,97,116,105,111,110,99,2,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,67, + 0,0,0,115,14,0,0,0,116,0,124,1,131,1,124,0, + 95,1,100,0,83,0,114,13,0,0,0,41,2,218,4,98, + 111,111,108,114,118,0,0,0,41,2,114,30,0,0,0,218, + 5,118,97,108,117,101,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,124,0,0,0,145,1,0,0,115,2, + 0,0,0,0,2,41,12,114,1,0,0,0,114,0,0,0, + 0,114,2,0,0,0,114,3,0,0,0,114,31,0,0,0, + 114,48,0,0,0,114,125,0,0,0,218,8,112,114,111,112, + 101,114,116,121,114,123,0,0,0,218,6,115,101,116,116,101, + 114,114,130,0,0,0,114,124,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, + 112,0,0,0,49,1,0,0,115,32,0,0,0,8,1,4, + 36,4,1,2,255,12,12,8,10,8,12,2,1,10,8,4, + 1,10,3,2,1,10,7,2,1,10,3,4,1,114,112,0, + 0,0,169,2,114,113,0,0,0,114,115,0,0,0,99,2, + 0,0,0,0,0,0,0,2,0,0,0,6,0,0,0,8, + 0,0,0,67,0,0,0,115,154,0,0,0,116,0,124,1, + 100,1,131,2,114,74,116,1,100,2,107,8,114,22,116,2, + 130,1,116,1,106,3,125,4,124,3,100,2,107,8,114,48, + 124,4,124,0,124,1,100,3,141,2,83,0,124,3,114,56, + 103,0,110,2,100,2,125,5,124,4,124,0,124,1,124,5, + 100,4,141,3,83,0,124,3,100,2,107,8,114,138,116,0, + 124,1,100,5,131,2,114,134,122,14,124,1,160,4,124,0, + 161,1,125,3,87,0,113,138,4,0,116,5,107,10,114,130, + 1,0,1,0,1,0,100,2,125,3,89,0,113,138,88,0, + 110,4,100,6,125,3,116,6,124,0,124,1,124,2,124,3, + 100,7,141,4,83,0,41,8,122,53,82,101,116,117,114,110, + 32,97,32,109,111,100,117,108,101,32,115,112,101,99,32,98, + 97,115,101,100,32,111,110,32,118,97,114,105,111,117,115,32, + 108,111,97,100,101,114,32,109,101,116,104,111,100,115,46,90, + 12,103,101,116,95,102,105,108,101,110,97,109,101,78,41,1, + 114,109,0,0,0,41,2,114,109,0,0,0,114,117,0,0, + 0,114,115,0,0,0,70,114,135,0,0,0,41,7,114,4, + 0,0,0,114,126,0,0,0,114,127,0,0,0,218,23,115, + 112,101,99,95,102,114,111,109,95,102,105,108,101,95,108,111, + 99,97,116,105,111,110,114,115,0,0,0,114,79,0,0,0, + 114,112,0,0,0,41,6,114,17,0,0,0,114,109,0,0, + 0,114,113,0,0,0,114,115,0,0,0,114,136,0,0,0, + 90,6,115,101,97,114,99,104,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,91,0,0,0,150,1,0,0, + 115,36,0,0,0,0,2,10,1,8,1,4,1,6,2,8, + 1,12,1,12,1,6,1,2,255,6,3,8,1,10,1,2, + 1,14,1,14,1,12,3,4,2,114,91,0,0,0,99,3, + 0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,8, + 0,0,0,67,0,0,0,115,56,1,0,0,122,10,124,0, + 106,0,125,3,87,0,110,20,4,0,116,1,107,10,114,30, + 1,0,1,0,1,0,89,0,110,14,88,0,124,3,100,0, + 107,9,114,44,124,3,83,0,124,0,106,2,125,4,124,1, + 100,0,107,8,114,90,122,10,124,0,106,3,125,1,87,0, + 110,20,4,0,116,1,107,10,114,88,1,0,1,0,1,0, + 89,0,110,2,88,0,122,10,124,0,106,4,125,5,87,0, + 110,24,4,0,116,1,107,10,114,124,1,0,1,0,1,0, + 100,0,125,5,89,0,110,2,88,0,124,2,100,0,107,8, + 114,184,124,5,100,0,107,8,114,180,122,10,124,1,106,5, + 125,2,87,0,113,184,4,0,116,1,107,10,114,176,1,0, + 1,0,1,0,100,0,125,2,89,0,113,184,88,0,110,4, + 124,5,125,2,122,10,124,0,106,6,125,6,87,0,110,24, + 4,0,116,1,107,10,114,218,1,0,1,0,1,0,100,0, + 125,6,89,0,110,2,88,0,122,14,116,7,124,0,106,8, + 131,1,125,7,87,0,110,26,4,0,116,1,107,10,144,1, + 114,4,1,0,1,0,1,0,100,0,125,7,89,0,110,2, + 88,0,116,9,124,4,124,1,124,2,100,1,141,3,125,3, + 124,5,100,0,107,8,144,1,114,34,100,2,110,2,100,3, + 124,3,95,10,124,6,124,3,95,11,124,7,124,3,95,12, + 124,3,83,0,41,4,78,169,1,114,113,0,0,0,70,84, + 41,13,114,105,0,0,0,114,106,0,0,0,114,1,0,0, + 0,114,98,0,0,0,114,108,0,0,0,218,7,95,79,82, + 73,71,73,78,218,10,95,95,99,97,99,104,101,100,95,95, + 218,4,108,105,115,116,218,8,95,95,112,97,116,104,95,95, + 114,112,0,0,0,114,118,0,0,0,114,123,0,0,0,114, + 117,0,0,0,41,8,114,96,0,0,0,114,109,0,0,0, + 114,113,0,0,0,114,95,0,0,0,114,17,0,0,0,90, + 8,108,111,99,97,116,105,111,110,114,123,0,0,0,114,117, 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,114,99,0,0,0,204,2,0,0,115,2,0,0,0, - 0,7,122,27,66,117,105,108,116,105,110,73,109,112,111,114, - 116,101,114,46,109,111,100,117,108,101,95,114,101,112,114,78, - 99,4,0,0,0,0,0,0,0,0,0,0,0,4,0,0, - 0,5,0,0,0,67,0,0,0,115,44,0,0,0,124,2, - 100,0,107,9,114,12,100,0,83,0,116,0,160,1,124,1, - 161,1,114,36,116,2,124,1,124,0,100,1,100,2,141,3, - 83,0,100,0,83,0,100,0,83,0,41,3,78,122,8,98, - 117,105,108,116,45,105,110,114,137,0,0,0,41,3,114,57, - 0,0,0,90,10,105,115,95,98,117,105,108,116,105,110,114, - 91,0,0,0,169,4,218,3,99,108,115,114,81,0,0,0, - 218,4,112,97,116,104,218,6,116,97,114,103,101,116,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,218,9,102, - 105,110,100,95,115,112,101,99,213,2,0,0,115,10,0,0, - 0,0,2,8,1,4,1,10,1,14,2,122,25,66,117,105, - 108,116,105,110,73,109,112,111,114,116,101,114,46,102,105,110, - 100,95,115,112,101,99,99,3,0,0,0,0,0,0,0,0, - 0,0,0,4,0,0,0,4,0,0,0,67,0,0,0,115, - 30,0,0,0,124,0,160,0,124,1,124,2,161,2,125,3, - 124,3,100,1,107,9,114,26,124,3,106,1,83,0,100,1, - 83,0,41,2,122,175,70,105,110,100,32,116,104,101,32,98, - 117,105,108,116,45,105,110,32,109,111,100,117,108,101,46,10, - 10,32,32,32,32,32,32,32,32,73,102,32,39,112,97,116, - 104,39,32,105,115,32,101,118,101,114,32,115,112,101,99,105, - 102,105,101,100,32,116,104,101,110,32,116,104,101,32,115,101, - 97,114,99,104,32,105,115,32,99,111,110,115,105,100,101,114, - 101,100,32,97,32,102,97,105,108,117,114,101,46,10,10,32, - 32,32,32,32,32,32,32,84,104,105,115,32,109,101,116,104, - 111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100, - 46,32,32,85,115,101,32,102,105,110,100,95,115,112,101,99, - 40,41,32,105,110,115,116,101,97,100,46,10,10,32,32,32, - 32,32,32,32,32,78,41,2,114,166,0,0,0,114,109,0, - 0,0,41,4,114,163,0,0,0,114,81,0,0,0,114,164, - 0,0,0,114,95,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,11,102,105,110,100,95,109,111, - 100,117,108,101,222,2,0,0,115,4,0,0,0,0,9,12, - 1,122,27,66,117,105,108,116,105,110,73,109,112,111,114,116, - 101,114,46,102,105,110,100,95,109,111,100,117,108,101,99,2, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,4, - 0,0,0,67,0,0,0,115,46,0,0,0,124,1,106,0, - 116,1,106,2,107,7,114,34,116,3,100,1,160,4,124,1, - 106,0,161,1,124,1,106,0,100,2,141,2,130,1,116,5, - 116,6,106,7,124,1,131,2,83,0,41,3,122,24,67,114, - 101,97,116,101,32,97,32,98,117,105,108,116,45,105,110,32, - 109,111,100,117,108,101,114,77,0,0,0,114,16,0,0,0, - 41,8,114,17,0,0,0,114,15,0,0,0,114,78,0,0, - 0,114,79,0,0,0,114,45,0,0,0,114,67,0,0,0, - 114,57,0,0,0,90,14,99,114,101,97,116,101,95,98,117, - 105,108,116,105,110,41,2,114,30,0,0,0,114,95,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,149,0,0,0,234,2,0,0,115,10,0,0,0,0,3, - 12,1,12,1,4,255,6,2,122,29,66,117,105,108,116,105, - 110,73,109,112,111,114,116,101,114,46,99,114,101,97,116,101, + 0,0,218,17,95,115,112,101,99,95,102,114,111,109,95,109, + 111,100,117,108,101,176,1,0,0,115,72,0,0,0,0,2, + 2,1,10,1,14,1,6,2,8,1,4,2,6,1,8,1, + 2,1,10,1,14,2,6,1,2,1,10,1,14,1,10,1, + 8,1,8,1,2,1,10,1,14,1,12,2,4,1,2,1, + 10,1,14,1,10,1,2,1,14,1,16,1,10,2,14,1, + 20,1,6,1,6,1,114,142,0,0,0,70,169,1,218,8, + 111,118,101,114,114,105,100,101,99,2,0,0,0,0,0,0, + 0,1,0,0,0,5,0,0,0,8,0,0,0,67,0,0, + 0,115,226,1,0,0,124,2,115,20,116,0,124,1,100,1, + 100,0,131,3,100,0,107,8,114,54,122,12,124,0,106,1, + 124,1,95,2,87,0,110,20,4,0,116,3,107,10,114,52, + 1,0,1,0,1,0,89,0,110,2,88,0,124,2,115,74, + 116,0,124,1,100,2,100,0,131,3,100,0,107,8,114,178, + 124,0,106,4,125,3,124,3,100,0,107,8,114,146,124,0, + 106,5,100,0,107,9,114,146,116,6,100,0,107,8,114,110, + 116,7,130,1,116,6,106,8,125,4,124,4,160,9,124,4, + 161,1,125,3,124,0,106,5,124,3,95,10,124,3,124,0, + 95,4,100,0,124,1,95,11,122,10,124,3,124,1,95,12, + 87,0,110,20,4,0,116,3,107,10,114,176,1,0,1,0, + 1,0,89,0,110,2,88,0,124,2,115,198,116,0,124,1, + 100,3,100,0,131,3,100,0,107,8,114,232,122,12,124,0, + 106,13,124,1,95,14,87,0,110,20,4,0,116,3,107,10, + 114,230,1,0,1,0,1,0,89,0,110,2,88,0,122,10, + 124,0,124,1,95,15,87,0,110,22,4,0,116,3,107,10, + 144,1,114,8,1,0,1,0,1,0,89,0,110,2,88,0, + 124,2,144,1,115,34,116,0,124,1,100,4,100,0,131,3, + 100,0,107,8,144,1,114,82,124,0,106,5,100,0,107,9, + 144,1,114,82,122,12,124,0,106,5,124,1,95,16,87,0, + 110,22,4,0,116,3,107,10,144,1,114,80,1,0,1,0, + 1,0,89,0,110,2,88,0,124,0,106,17,144,1,114,222, + 124,2,144,1,115,114,116,0,124,1,100,5,100,0,131,3, + 100,0,107,8,144,1,114,150,122,12,124,0,106,18,124,1, + 95,11,87,0,110,22,4,0,116,3,107,10,144,1,114,148, + 1,0,1,0,1,0,89,0,110,2,88,0,124,2,144,1, + 115,174,116,0,124,1,100,6,100,0,131,3,100,0,107,8, + 144,1,114,222,124,0,106,19,100,0,107,9,144,1,114,222, + 122,12,124,0,106,19,124,1,95,20,87,0,110,22,4,0, + 116,3,107,10,144,1,114,220,1,0,1,0,1,0,89,0, + 110,2,88,0,124,1,83,0,41,7,78,114,1,0,0,0, + 114,98,0,0,0,218,11,95,95,112,97,99,107,97,103,101, + 95,95,114,141,0,0,0,114,108,0,0,0,114,139,0,0, + 0,41,21,114,6,0,0,0,114,17,0,0,0,114,1,0, + 0,0,114,106,0,0,0,114,109,0,0,0,114,117,0,0, + 0,114,126,0,0,0,114,127,0,0,0,218,16,95,78,97, + 109,101,115,112,97,99,101,76,111,97,100,101,114,218,7,95, + 95,110,101,119,95,95,90,5,95,112,97,116,104,114,108,0, + 0,0,114,98,0,0,0,114,130,0,0,0,114,145,0,0, + 0,114,105,0,0,0,114,141,0,0,0,114,124,0,0,0, + 114,113,0,0,0,114,123,0,0,0,114,139,0,0,0,41, + 5,114,95,0,0,0,114,96,0,0,0,114,144,0,0,0, + 114,109,0,0,0,114,146,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,218,18,95,105,110,105,116, + 95,109,111,100,117,108,101,95,97,116,116,114,115,221,1,0, + 0,115,96,0,0,0,0,4,20,1,2,1,12,1,14,1, + 6,2,20,1,6,1,8,2,10,1,8,1,4,1,6,2, + 10,1,8,1,6,11,6,1,2,1,10,1,14,1,6,2, + 20,1,2,1,12,1,14,1,6,2,2,1,10,1,16,1, + 6,2,24,1,12,1,2,1,12,1,16,1,6,2,8,1, + 24,1,2,1,12,1,16,1,6,2,24,1,12,1,2,1, + 12,1,16,1,6,1,114,148,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, + 67,0,0,0,115,82,0,0,0,100,1,125,1,116,0,124, + 0,106,1,100,2,131,2,114,30,124,0,106,1,160,2,124, + 0,161,1,125,1,110,20,116,0,124,0,106,1,100,3,131, + 2,114,50,116,3,100,4,131,1,130,1,124,1,100,1,107, + 8,114,68,116,4,124,0,106,5,131,1,125,1,116,6,124, + 0,124,1,131,2,1,0,124,1,83,0,41,5,122,43,67, + 114,101,97,116,101,32,97,32,109,111,100,117,108,101,32,98, + 97,115,101,100,32,111,110,32,116,104,101,32,112,114,111,118, + 105,100,101,100,32,115,112,101,99,46,78,218,13,99,114,101, + 97,116,101,95,109,111,100,117,108,101,218,11,101,120,101,99, + 95,109,111,100,117,108,101,122,66,108,111,97,100,101,114,115, + 32,116,104,97,116,32,100,101,102,105,110,101,32,101,120,101, + 99,95,109,111,100,117,108,101,40,41,32,109,117,115,116,32, + 97,108,115,111,32,100,101,102,105,110,101,32,99,114,101,97, + 116,101,95,109,111,100,117,108,101,40,41,41,7,114,4,0, + 0,0,114,109,0,0,0,114,149,0,0,0,114,79,0,0, + 0,114,18,0,0,0,114,17,0,0,0,114,148,0,0,0, + 169,2,114,95,0,0,0,114,96,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,218,16,109,111,100, + 117,108,101,95,102,114,111,109,95,115,112,101,99,37,2,0, + 0,115,18,0,0,0,0,3,4,1,12,3,14,1,12,1, + 8,2,8,1,10,1,10,1,114,152,0,0,0,99,1,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,4,0, + 0,0,67,0,0,0,115,106,0,0,0,124,0,106,0,100, + 1,107,8,114,14,100,2,110,4,124,0,106,0,125,1,124, + 0,106,1,100,1,107,8,114,66,124,0,106,2,100,1,107, + 8,114,50,100,3,160,3,124,1,161,1,83,0,100,4,160, + 3,124,1,124,0,106,2,161,2,83,0,110,36,124,0,106, + 4,114,86,100,5,160,3,124,1,124,0,106,1,161,2,83, + 0,100,6,160,3,124,0,106,0,124,0,106,1,161,2,83, + 0,100,1,83,0,41,7,122,38,82,101,116,117,114,110,32, + 116,104,101,32,114,101,112,114,32,116,111,32,117,115,101,32, + 102,111,114,32,116,104,101,32,109,111,100,117,108,101,46,78, + 114,100,0,0,0,114,101,0,0,0,114,102,0,0,0,114, + 103,0,0,0,250,18,60,109,111,100,117,108,101,32,123,33, + 114,125,32,40,123,125,41,62,41,5,114,17,0,0,0,114, + 113,0,0,0,114,109,0,0,0,114,45,0,0,0,114,124, + 0,0,0,41,2,114,95,0,0,0,114,17,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,107, + 0,0,0,54,2,0,0,115,16,0,0,0,0,3,20,1, + 10,1,10,1,10,2,16,2,6,1,14,2,114,107,0,0, + 0,99,2,0,0,0,0,0,0,0,0,0,0,0,4,0, + 0,0,10,0,0,0,67,0,0,0,115,204,0,0,0,124, + 0,106,0,125,2,116,1,124,2,131,1,143,180,1,0,116, + 2,106,3,160,4,124,2,161,1,124,1,107,9,114,54,100, + 1,160,5,124,2,161,1,125,3,116,6,124,3,124,2,100, + 2,141,2,130,1,122,106,124,0,106,7,100,3,107,8,114, + 106,124,0,106,8,100,3,107,8,114,90,116,6,100,4,124, + 0,106,0,100,2,141,2,130,1,116,9,124,0,124,1,100, + 5,100,6,141,3,1,0,110,52,116,9,124,0,124,1,100, + 5,100,6,141,3,1,0,116,10,124,0,106,7,100,7,131, + 2,115,146,124,0,106,7,160,11,124,2,161,1,1,0,110, + 12,124,0,106,7,160,12,124,1,161,1,1,0,87,0,53, + 0,116,2,106,3,160,13,124,0,106,0,161,1,125,1,124, + 1,116,2,106,3,124,0,106,0,60,0,88,0,87,0,53, + 0,81,0,82,0,88,0,124,1,83,0,41,8,122,70,69, + 120,101,99,117,116,101,32,116,104,101,32,115,112,101,99,39, + 115,32,115,112,101,99,105,102,105,101,100,32,109,111,100,117, + 108,101,32,105,110,32,97,110,32,101,120,105,115,116,105,110, + 103,32,109,111,100,117,108,101,39,115,32,110,97,109,101,115, + 112,97,99,101,46,122,30,109,111,100,117,108,101,32,123,33, + 114,125,32,110,111,116,32,105,110,32,115,121,115,46,109,111, + 100,117,108,101,115,114,16,0,0,0,78,250,14,109,105,115, + 115,105,110,103,32,108,111,97,100,101,114,84,114,143,0,0, + 0,114,150,0,0,0,41,14,114,17,0,0,0,114,50,0, + 0,0,114,15,0,0,0,114,92,0,0,0,114,34,0,0, + 0,114,45,0,0,0,114,79,0,0,0,114,109,0,0,0, + 114,117,0,0,0,114,148,0,0,0,114,4,0,0,0,218, + 11,108,111,97,100,95,109,111,100,117,108,101,114,150,0,0, + 0,218,3,112,111,112,41,4,114,95,0,0,0,114,96,0, + 0,0,114,17,0,0,0,218,3,109,115,103,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,93,0,0,0, + 71,2,0,0,115,34,0,0,0,0,2,6,1,10,1,16, + 1,10,1,12,1,2,1,10,1,10,1,14,2,16,2,14, + 1,12,4,14,2,16,4,14,1,24,1,114,93,0,0,0, + 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,8,0,0,0,67,0,0,0,115,26,1,0,0,122,18, + 124,0,106,0,160,1,124,0,106,2,161,1,1,0,87,0, + 110,52,1,0,1,0,1,0,124,0,106,2,116,3,106,4, + 107,6,114,64,116,3,106,4,160,5,124,0,106,2,161,1, + 125,1,124,1,116,3,106,4,124,0,106,2,60,0,130,0, + 89,0,110,2,88,0,116,3,106,4,160,5,124,0,106,2, + 161,1,125,1,124,1,116,3,106,4,124,0,106,2,60,0, + 116,6,124,1,100,1,100,0,131,3,100,0,107,8,114,148, + 122,12,124,0,106,0,124,1,95,7,87,0,110,20,4,0, + 116,8,107,10,114,146,1,0,1,0,1,0,89,0,110,2, + 88,0,116,6,124,1,100,2,100,0,131,3,100,0,107,8, + 114,226,122,40,124,1,106,9,124,1,95,10,116,11,124,1, + 100,3,131,2,115,202,124,0,106,2,160,12,100,4,161,1, + 100,5,25,0,124,1,95,10,87,0,110,20,4,0,116,8, + 107,10,114,224,1,0,1,0,1,0,89,0,110,2,88,0, + 116,6,124,1,100,6,100,0,131,3,100,0,107,8,144,1, + 114,22,122,10,124,0,124,1,95,13,87,0,110,22,4,0, + 116,8,107,10,144,1,114,20,1,0,1,0,1,0,89,0, + 110,2,88,0,124,1,83,0,41,7,78,114,98,0,0,0, + 114,145,0,0,0,114,141,0,0,0,114,128,0,0,0,114, + 22,0,0,0,114,105,0,0,0,41,14,114,109,0,0,0, + 114,155,0,0,0,114,17,0,0,0,114,15,0,0,0,114, + 92,0,0,0,114,156,0,0,0,114,6,0,0,0,114,98, + 0,0,0,114,106,0,0,0,114,1,0,0,0,114,145,0, + 0,0,114,4,0,0,0,114,129,0,0,0,114,105,0,0, + 0,114,151,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,218,25,95,108,111,97,100,95,98,97,99, + 107,119,97,114,100,95,99,111,109,112,97,116,105,98,108,101, + 101,2,0,0,115,54,0,0,0,0,4,2,1,18,1,6, + 1,12,1,14,1,12,1,8,3,14,1,12,1,16,1,2, + 1,12,1,14,1,6,1,16,1,2,4,8,1,10,1,22, + 1,14,1,6,1,18,1,2,1,10,1,16,1,6,1,114, + 158,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,11,0,0,0,67,0,0,0,115,220,0, + 0,0,124,0,106,0,100,0,107,9,114,30,116,1,124,0, + 106,0,100,1,131,2,115,30,116,2,124,0,131,1,83,0, + 116,3,124,0,131,1,125,1,100,2,124,0,95,4,122,162, + 124,1,116,5,106,6,124,0,106,7,60,0,122,52,124,0, + 106,0,100,0,107,8,114,96,124,0,106,8,100,0,107,8, + 114,108,116,9,100,3,124,0,106,7,100,4,141,2,130,1, + 110,12,124,0,106,0,160,10,124,1,161,1,1,0,87,0, + 110,50,1,0,1,0,1,0,122,14,116,5,106,6,124,0, + 106,7,61,0,87,0,110,20,4,0,116,11,107,10,114,152, + 1,0,1,0,1,0,89,0,110,2,88,0,130,0,89,0, + 110,2,88,0,116,5,106,6,160,12,124,0,106,7,161,1, + 125,1,124,1,116,5,106,6,124,0,106,7,60,0,116,13, + 100,5,124,0,106,7,124,0,106,0,131,3,1,0,87,0, + 53,0,100,6,124,0,95,4,88,0,124,1,83,0,41,7, + 78,114,150,0,0,0,84,114,154,0,0,0,114,16,0,0, + 0,122,18,105,109,112,111,114,116,32,123,33,114,125,32,35, + 32,123,33,114,125,70,41,14,114,109,0,0,0,114,4,0, + 0,0,114,158,0,0,0,114,152,0,0,0,90,13,95,105, + 110,105,116,105,97,108,105,122,105,110,103,114,15,0,0,0, + 114,92,0,0,0,114,17,0,0,0,114,117,0,0,0,114, + 79,0,0,0,114,150,0,0,0,114,63,0,0,0,114,156, + 0,0,0,114,76,0,0,0,114,151,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,218,14,95,108, + 111,97,100,95,117,110,108,111,99,107,101,100,138,2,0,0, + 115,46,0,0,0,0,2,10,2,12,1,8,2,8,5,6, + 1,2,1,12,1,2,1,10,1,10,1,16,3,16,1,6, + 1,2,1,14,1,14,1,6,1,8,5,14,1,12,1,20, + 2,8,2,114,159,0,0,0,99,1,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,10,0,0,0,67,0,0, + 0,115,42,0,0,0,116,0,124,0,106,1,131,1,143,22, + 1,0,116,2,124,0,131,1,87,0,2,0,53,0,81,0, + 82,0,163,0,83,0,81,0,82,0,88,0,100,1,83,0, + 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,50,0,0,0,114,17,0,0,0, + 114,159,0,0,0,41,1,114,95,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,94,0,0,0, + 180,2,0,0,115,4,0,0,0,0,9,12,1,114,94,0, + 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,4,0,0,0,64,0,0,0,115,136,0,0,0, + 101,0,90,1,100,0,90,2,100,1,90,3,101,4,100,2, + 100,3,132,0,131,1,90,5,101,6,100,19,100,5,100,6, + 132,1,131,1,90,7,101,6,100,20,100,7,100,8,132,1, + 131,1,90,8,101,6,100,9,100,10,132,0,131,1,90,9, + 101,6,100,11,100,12,132,0,131,1,90,10,101,6,101,11, + 100,13,100,14,132,0,131,1,131,1,90,12,101,6,101,11, + 100,15,100,16,132,0,131,1,131,1,90,13,101,6,101,11, + 100,17,100,18,132,0,131,1,131,1,90,14,101,6,101,15, + 131,1,90,16,100,4,83,0,41,21,218,15,66,117,105,108, + 116,105,110,73,109,112,111,114,116,101,114,122,144,77,101,116, + 97,32,112,97,116,104,32,105,109,112,111,114,116,32,102,111, + 114,32,98,117,105,108,116,45,105,110,32,109,111,100,117,108, + 101,115,46,10,10,32,32,32,32,65,108,108,32,109,101,116, + 104,111,100,115,32,97,114,101,32,101,105,116,104,101,114,32, + 99,108,97,115,115,32,111,114,32,115,116,97,116,105,99,32, + 109,101,116,104,111,100,115,32,116,111,32,97,118,111,105,100, + 32,116,104,101,32,110,101,101,100,32,116,111,10,32,32,32, + 32,105,110,115,116,97,110,116,105,97,116,101,32,116,104,101, + 32,99,108,97,115,115,46,10,10,32,32,32,32,99,1,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0, + 0,0,67,0,0,0,115,12,0,0,0,100,1,160,0,124, + 0,106,1,161,1,83,0,41,2,250,115,82,101,116,117,114, + 110,32,114,101,112,114,32,102,111,114,32,116,104,101,32,109, + 111,100,117,108,101,46,10,10,32,32,32,32,32,32,32,32, + 84,104,101,32,109,101,116,104,111,100,32,105,115,32,100,101, + 112,114,101,99,97,116,101,100,46,32,32,84,104,101,32,105, + 109,112,111,114,116,32,109,97,99,104,105,110,101,114,121,32, + 100,111,101,115,32,116,104,101,32,106,111,98,32,105,116,115, + 101,108,102,46,10,10,32,32,32,32,32,32,32,32,122,24, + 60,109,111,100,117,108,101,32,123,33,114,125,32,40,98,117, + 105,108,116,45,105,110,41,62,41,2,114,45,0,0,0,114, + 1,0,0,0,41,1,114,96,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,99,0,0,0,204, + 2,0,0,115,2,0,0,0,0,7,122,27,66,117,105,108, + 116,105,110,73,109,112,111,114,116,101,114,46,109,111,100,117, + 108,101,95,114,101,112,114,78,99,4,0,0,0,0,0,0, + 0,0,0,0,0,4,0,0,0,5,0,0,0,67,0,0, + 0,115,44,0,0,0,124,2,100,0,107,9,114,12,100,0, + 83,0,116,0,160,1,124,1,161,1,114,36,116,2,124,1, + 124,0,100,1,100,2,141,3,83,0,100,0,83,0,100,0, + 83,0,41,3,78,122,8,98,117,105,108,116,45,105,110,114, + 137,0,0,0,41,3,114,57,0,0,0,90,10,105,115,95, + 98,117,105,108,116,105,110,114,91,0,0,0,169,4,218,3, + 99,108,115,114,81,0,0,0,218,4,112,97,116,104,218,6, + 116,97,114,103,101,116,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,218,9,102,105,110,100,95,115,112,101,99, + 213,2,0,0,115,10,0,0,0,0,2,8,1,4,1,10, + 1,14,2,122,25,66,117,105,108,116,105,110,73,109,112,111, + 114,116,101,114,46,102,105,110,100,95,115,112,101,99,99,3, + 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4, + 0,0,0,67,0,0,0,115,30,0,0,0,124,0,160,0, + 124,1,124,2,161,2,125,3,124,3,100,1,107,9,114,26, + 124,3,106,1,83,0,100,1,83,0,41,2,122,175,70,105, + 110,100,32,116,104,101,32,98,117,105,108,116,45,105,110,32, + 109,111,100,117,108,101,46,10,10,32,32,32,32,32,32,32, + 32,73,102,32,39,112,97,116,104,39,32,105,115,32,101,118, + 101,114,32,115,112,101,99,105,102,105,101,100,32,116,104,101, + 110,32,116,104,101,32,115,101,97,114,99,104,32,105,115,32, + 99,111,110,115,105,100,101,114,101,100,32,97,32,102,97,105, + 108,117,114,101,46,10,10,32,32,32,32,32,32,32,32,84, + 104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,101, + 112,114,101,99,97,116,101,100,46,32,32,85,115,101,32,102, + 105,110,100,95,115,112,101,99,40,41,32,105,110,115,116,101, + 97,100,46,10,10,32,32,32,32,32,32,32,32,78,41,2, + 114,166,0,0,0,114,109,0,0,0,41,4,114,163,0,0, + 0,114,81,0,0,0,114,164,0,0,0,114,95,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, + 11,102,105,110,100,95,109,111,100,117,108,101,222,2,0,0, + 115,4,0,0,0,0,9,12,1,122,27,66,117,105,108,116, + 105,110,73,109,112,111,114,116,101,114,46,102,105,110,100,95, + 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,4,0,0,0,67,0,0,0,115, + 46,0,0,0,124,1,106,0,116,1,106,2,107,7,114,34, + 116,3,100,1,160,4,124,1,106,0,161,1,124,1,106,0, + 100,2,141,2,130,1,116,5,116,6,106,7,124,1,131,2, + 83,0,41,3,122,24,67,114,101,97,116,101,32,97,32,98, + 117,105,108,116,45,105,110,32,109,111,100,117,108,101,114,77, + 0,0,0,114,16,0,0,0,41,8,114,17,0,0,0,114, + 15,0,0,0,114,78,0,0,0,114,79,0,0,0,114,45, + 0,0,0,114,67,0,0,0,114,57,0,0,0,90,14,99, + 114,101,97,116,101,95,98,117,105,108,116,105,110,41,2,114, + 30,0,0,0,114,95,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,149,0,0,0,234,2,0, + 0,115,10,0,0,0,0,3,12,1,12,1,4,255,6,2, + 122,29,66,117,105,108,116,105,110,73,109,112,111,114,116,101, + 114,46,99,114,101,97,116,101,95,109,111,100,117,108,101,99, + 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 3,0,0,0,67,0,0,0,115,16,0,0,0,116,0,116, + 1,106,2,124,1,131,2,1,0,100,1,83,0,41,2,122, + 22,69,120,101,99,32,97,32,98,117,105,108,116,45,105,110, + 32,109,111,100,117,108,101,78,41,3,114,67,0,0,0,114, + 57,0,0,0,90,12,101,120,101,99,95,98,117,105,108,116, + 105,110,41,2,114,30,0,0,0,114,96,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,114,150,0, + 0,0,242,2,0,0,115,2,0,0,0,0,3,122,27,66, + 117,105,108,116,105,110,73,109,112,111,114,116,101,114,46,101, + 120,101,99,95,109,111,100,117,108,101,99,2,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, + 0,0,0,115,4,0,0,0,100,1,83,0,41,2,122,57, + 82,101,116,117,114,110,32,78,111,110,101,32,97,115,32,98, + 117,105,108,116,45,105,110,32,109,111,100,117,108,101,115,32, + 100,111,32,110,111,116,32,104,97,118,101,32,99,111,100,101, + 32,111,98,106,101,99,116,115,46,78,114,10,0,0,0,169, + 2,114,163,0,0,0,114,81,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,218,8,103,101,116,95, + 99,111,100,101,247,2,0,0,115,2,0,0,0,0,4,122, + 24,66,117,105,108,116,105,110,73,109,112,111,114,116,101,114, + 46,103,101,116,95,99,111,100,101,99,2,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,1,0,0,0,67,0, + 0,0,115,4,0,0,0,100,1,83,0,41,2,122,56,82, + 101,116,117,114,110,32,78,111,110,101,32,97,115,32,98,117, + 105,108,116,45,105,110,32,109,111,100,117,108,101,115,32,100, + 111,32,110,111,116,32,104,97,118,101,32,115,111,117,114,99, + 101,32,99,111,100,101,46,78,114,10,0,0,0,114,168,0, + 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, + 0,218,10,103,101,116,95,115,111,117,114,99,101,253,2,0, + 0,115,2,0,0,0,0,4,122,26,66,117,105,108,116,105, + 110,73,109,112,111,114,116,101,114,46,103,101,116,95,115,111, + 117,114,99,101,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, + 0,0,100,1,83,0,41,2,122,52,82,101,116,117,114,110, + 32,70,97,108,115,101,32,97,115,32,98,117,105,108,116,45, + 105,110,32,109,111,100,117,108,101,115,32,97,114,101,32,110, + 101,118,101,114,32,112,97,99,107,97,103,101,115,46,70,114, + 10,0,0,0,114,168,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,115,0,0,0,3,3,0, + 0,115,2,0,0,0,0,4,122,26,66,117,105,108,116,105, + 110,73,109,112,111,114,116,101,114,46,105,115,95,112,97,99, + 107,97,103,101,41,2,78,78,41,1,78,41,17,114,1,0, + 0,0,114,0,0,0,0,114,2,0,0,0,114,3,0,0, + 0,218,12,115,116,97,116,105,99,109,101,116,104,111,100,114, + 99,0,0,0,218,11,99,108,97,115,115,109,101,116,104,111, + 100,114,166,0,0,0,114,167,0,0,0,114,149,0,0,0, + 114,150,0,0,0,114,86,0,0,0,114,169,0,0,0,114, + 170,0,0,0,114,115,0,0,0,114,97,0,0,0,114,155, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,160,0,0,0,195,2,0,0, + 115,42,0,0,0,8,2,4,7,2,1,10,8,2,1,12, + 8,2,1,12,11,2,1,10,7,2,1,10,4,2,1,2, + 1,12,4,2,1,2,1,12,4,2,1,2,1,12,4,114, + 160,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,4,0,0,0,64,0,0,0,115,144,0, + 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2, + 90,4,101,5,100,3,100,4,132,0,131,1,90,6,101,7, + 100,22,100,6,100,7,132,1,131,1,90,8,101,7,100,23, + 100,8,100,9,132,1,131,1,90,9,101,7,100,10,100,11, + 132,0,131,1,90,10,101,5,100,12,100,13,132,0,131,1, + 90,11,101,7,100,14,100,15,132,0,131,1,90,12,101,7, + 101,13,100,16,100,17,132,0,131,1,131,1,90,14,101,7, + 101,13,100,18,100,19,132,0,131,1,131,1,90,15,101,7, + 101,13,100,20,100,21,132,0,131,1,131,1,90,16,100,5, + 83,0,41,24,218,14,70,114,111,122,101,110,73,109,112,111, + 114,116,101,114,122,142,77,101,116,97,32,112,97,116,104,32, + 105,109,112,111,114,116,32,102,111,114,32,102,114,111,122,101, + 110,32,109,111,100,117,108,101,115,46,10,10,32,32,32,32, + 65,108,108,32,109,101,116,104,111,100,115,32,97,114,101,32, + 101,105,116,104,101,114,32,99,108,97,115,115,32,111,114,32, + 115,116,97,116,105,99,32,109,101,116,104,111,100,115,32,116, + 111,32,97,118,111,105,100,32,116,104,101,32,110,101,101,100, + 32,116,111,10,32,32,32,32,105,110,115,116,97,110,116,105, + 97,116,101,32,116,104,101,32,99,108,97,115,115,46,10,10, + 32,32,32,32,90,6,102,114,111,122,101,110,99,1,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0, + 0,67,0,0,0,115,16,0,0,0,100,1,160,0,124,0, + 106,1,116,2,106,3,161,2,83,0,41,2,114,161,0,0, + 0,114,153,0,0,0,41,4,114,45,0,0,0,114,1,0, + 0,0,114,173,0,0,0,114,138,0,0,0,41,1,218,1, + 109,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 114,99,0,0,0,23,3,0,0,115,2,0,0,0,0,7, + 122,26,70,114,111,122,101,110,73,109,112,111,114,116,101,114, + 46,109,111,100,117,108,101,95,114,101,112,114,78,99,4,0, + 0,0,0,0,0,0,0,0,0,0,4,0,0,0,5,0, + 0,0,67,0,0,0,115,34,0,0,0,116,0,160,1,124, + 1,161,1,114,26,116,2,124,1,124,0,124,0,106,3,100, + 1,141,3,83,0,100,0,83,0,100,0,83,0,41,2,78, + 114,137,0,0,0,41,4,114,57,0,0,0,114,88,0,0, + 0,114,91,0,0,0,114,138,0,0,0,114,162,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, + 166,0,0,0,32,3,0,0,115,6,0,0,0,0,2,10, + 1,16,2,122,24,70,114,111,122,101,110,73,109,112,111,114, + 116,101,114,46,102,105,110,100,95,115,112,101,99,99,3,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0, + 0,0,67,0,0,0,115,18,0,0,0,116,0,160,1,124, + 1,161,1,114,14,124,0,83,0,100,1,83,0,41,2,122, + 93,70,105,110,100,32,97,32,102,114,111,122,101,110,32,109, + 111,100,117,108,101,46,10,10,32,32,32,32,32,32,32,32, + 84,104,105,115,32,109,101,116,104,111,100,32,105,115,32,100, + 101,112,114,101,99,97,116,101,100,46,32,32,85,115,101,32, + 102,105,110,100,95,115,112,101,99,40,41,32,105,110,115,116, + 101,97,100,46,10,10,32,32,32,32,32,32,32,32,78,41, + 2,114,57,0,0,0,114,88,0,0,0,41,3,114,163,0, + 0,0,114,81,0,0,0,114,164,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,167,0,0,0, + 39,3,0,0,115,2,0,0,0,0,7,122,26,70,114,111, + 122,101,110,73,109,112,111,114,116,101,114,46,102,105,110,100, + 95,109,111,100,117,108,101,99,2,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,0, + 115,4,0,0,0,100,1,83,0,41,2,122,42,85,115,101, + 32,100,101,102,97,117,108,116,32,115,101,109,97,110,116,105, + 99,115,32,102,111,114,32,109,111,100,117,108,101,32,99,114, + 101,97,116,105,111,110,46,78,114,10,0,0,0,41,2,114, + 163,0,0,0,114,95,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,149,0,0,0,48,3,0, + 0,115,2,0,0,0,0,2,122,28,70,114,111,122,101,110, + 73,109,112,111,114,116,101,114,46,99,114,101,97,116,101,95, + 109,111,100,117,108,101,99,1,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,4,0,0,0,67,0,0,0,115, + 64,0,0,0,124,0,106,0,106,1,125,1,116,2,160,3, + 124,1,161,1,115,36,116,4,100,1,160,5,124,1,161,1, + 124,1,100,2,141,2,130,1,116,6,116,2,106,7,124,1, + 131,2,125,2,116,8,124,2,124,0,106,9,131,2,1,0, + 100,0,83,0,114,87,0,0,0,41,10,114,105,0,0,0, + 114,17,0,0,0,114,57,0,0,0,114,88,0,0,0,114, + 79,0,0,0,114,45,0,0,0,114,67,0,0,0,218,17, + 103,101,116,95,102,114,111,122,101,110,95,111,98,106,101,99, + 116,218,4,101,120,101,99,114,7,0,0,0,41,3,114,96, + 0,0,0,114,17,0,0,0,218,4,99,111,100,101,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,114,150,0, + 0,0,52,3,0,0,115,14,0,0,0,0,2,8,1,10, + 1,10,1,2,255,6,2,12,1,122,26,70,114,111,122,101, + 110,73,109,112,111,114,116,101,114,46,101,120,101,99,95,109, + 111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,10, + 0,0,0,116,0,124,0,124,1,131,2,83,0,41,1,122, + 95,76,111,97,100,32,97,32,102,114,111,122,101,110,32,109, + 111,100,117,108,101,46,10,10,32,32,32,32,32,32,32,32, + 84,104,105,115,32,109,101,116,104,111,100,32,105,115,32,100, + 101,112,114,101,99,97,116,101,100,46,32,32,85,115,101,32, + 101,120,101,99,95,109,111,100,117,108,101,40,41,32,105,110, + 115,116,101,97,100,46,10,10,32,32,32,32,32,32,32,32, + 41,1,114,97,0,0,0,114,168,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,155,0,0,0, + 61,3,0,0,115,2,0,0,0,0,7,122,26,70,114,111, + 122,101,110,73,109,112,111,114,116,101,114,46,108,111,97,100, 95,109,111,100,117,108,101,99,2,0,0,0,0,0,0,0, 0,0,0,0,2,0,0,0,3,0,0,0,67,0,0,0, - 115,16,0,0,0,116,0,116,1,106,2,124,1,131,2,1, - 0,100,1,83,0,41,2,122,22,69,120,101,99,32,97,32, - 98,117,105,108,116,45,105,110,32,109,111,100,117,108,101,78, - 41,3,114,67,0,0,0,114,57,0,0,0,90,12,101,120, - 101,99,95,98,117,105,108,116,105,110,41,2,114,30,0,0, - 0,114,96,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,150,0,0,0,242,2,0,0,115,2, - 0,0,0,0,3,122,27,66,117,105,108,116,105,110,73,109, - 112,111,114,116,101,114,46,101,120,101,99,95,109,111,100,117, - 108,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0, - 100,1,83,0,41,2,122,57,82,101,116,117,114,110,32,78, - 111,110,101,32,97,115,32,98,117,105,108,116,45,105,110,32, - 109,111,100,117,108,101,115,32,100,111,32,110,111,116,32,104, - 97,118,101,32,99,111,100,101,32,111,98,106,101,99,116,115, - 46,78,114,10,0,0,0,169,2,114,163,0,0,0,114,81, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,8,103,101,116,95,99,111,100,101,247,2,0,0, - 115,2,0,0,0,0,4,122,24,66,117,105,108,116,105,110, - 73,109,112,111,114,116,101,114,46,103,101,116,95,99,111,100, - 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, - 1,83,0,41,2,122,56,82,101,116,117,114,110,32,78,111, - 110,101,32,97,115,32,98,117,105,108,116,45,105,110,32,109, - 111,100,117,108,101,115,32,100,111,32,110,111,116,32,104,97, - 118,101,32,115,111,117,114,99,101,32,99,111,100,101,46,78, - 114,10,0,0,0,114,168,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,218,10,103,101,116,95,115, - 111,117,114,99,101,253,2,0,0,115,2,0,0,0,0,4, - 122,26,66,117,105,108,116,105,110,73,109,112,111,114,116,101, - 114,46,103,101,116,95,115,111,117,114,99,101,99,2,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0, - 0,67,0,0,0,115,4,0,0,0,100,1,83,0,41,2, - 122,52,82,101,116,117,114,110,32,70,97,108,115,101,32,97, - 115,32,98,117,105,108,116,45,105,110,32,109,111,100,117,108, - 101,115,32,97,114,101,32,110,101,118,101,114,32,112,97,99, - 107,97,103,101,115,46,70,114,10,0,0,0,114,168,0,0, + 115,10,0,0,0,116,0,160,1,124,1,161,1,83,0,41, + 1,122,45,82,101,116,117,114,110,32,116,104,101,32,99,111, + 100,101,32,111,98,106,101,99,116,32,102,111,114,32,116,104, + 101,32,102,114,111,122,101,110,32,109,111,100,117,108,101,46, + 41,2,114,57,0,0,0,114,175,0,0,0,114,168,0,0, 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,115,0,0,0,3,3,0,0,115,2,0,0,0,0,4, - 122,26,66,117,105,108,116,105,110,73,109,112,111,114,116,101, - 114,46,105,115,95,112,97,99,107,97,103,101,41,2,78,78, - 41,1,78,41,17,114,1,0,0,0,114,0,0,0,0,114, - 2,0,0,0,114,3,0,0,0,218,12,115,116,97,116,105, - 99,109,101,116,104,111,100,114,99,0,0,0,218,11,99,108, - 97,115,115,109,101,116,104,111,100,114,166,0,0,0,114,167, - 0,0,0,114,149,0,0,0,114,150,0,0,0,114,86,0, - 0,0,114,169,0,0,0,114,170,0,0,0,114,115,0,0, - 0,114,97,0,0,0,114,155,0,0,0,114,10,0,0,0, + 114,169,0,0,0,70,3,0,0,115,2,0,0,0,0,4, + 122,23,70,114,111,122,101,110,73,109,112,111,114,116,101,114, + 46,103,101,116,95,99,111,100,101,99,2,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,1,0,0,0,67,0, + 0,0,115,4,0,0,0,100,1,83,0,41,2,122,54,82, + 101,116,117,114,110,32,78,111,110,101,32,97,115,32,102,114, + 111,122,101,110,32,109,111,100,117,108,101,115,32,100,111,32, + 110,111,116,32,104,97,118,101,32,115,111,117,114,99,101,32, + 99,111,100,101,46,78,114,10,0,0,0,114,168,0,0,0, 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 160,0,0,0,195,2,0,0,115,42,0,0,0,8,2,4, - 7,2,1,10,8,2,1,12,8,2,1,12,11,2,1,10, - 7,2,1,10,4,2,1,2,1,12,4,2,1,2,1,12, - 4,2,1,2,1,12,4,114,160,0,0,0,99,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0, - 0,64,0,0,0,115,144,0,0,0,101,0,90,1,100,0, - 90,2,100,1,90,3,100,2,90,4,101,5,100,3,100,4, - 132,0,131,1,90,6,101,7,100,22,100,6,100,7,132,1, - 131,1,90,8,101,7,100,23,100,8,100,9,132,1,131,1, - 90,9,101,7,100,10,100,11,132,0,131,1,90,10,101,5, - 100,12,100,13,132,0,131,1,90,11,101,7,100,14,100,15, - 132,0,131,1,90,12,101,7,101,13,100,16,100,17,132,0, - 131,1,131,1,90,14,101,7,101,13,100,18,100,19,132,0, - 131,1,131,1,90,15,101,7,101,13,100,20,100,21,132,0, - 131,1,131,1,90,16,100,5,83,0,41,24,218,14,70,114, - 111,122,101,110,73,109,112,111,114,116,101,114,122,142,77,101, - 116,97,32,112,97,116,104,32,105,109,112,111,114,116,32,102, - 111,114,32,102,114,111,122,101,110,32,109,111,100,117,108,101, - 115,46,10,10,32,32,32,32,65,108,108,32,109,101,116,104, - 111,100,115,32,97,114,101,32,101,105,116,104,101,114,32,99, - 108,97,115,115,32,111,114,32,115,116,97,116,105,99,32,109, - 101,116,104,111,100,115,32,116,111,32,97,118,111,105,100,32, - 116,104,101,32,110,101,101,100,32,116,111,10,32,32,32,32, - 105,110,115,116,97,110,116,105,97,116,101,32,116,104,101,32, - 99,108,97,115,115,46,10,10,32,32,32,32,90,6,102,114, - 111,122,101,110,99,1,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,4,0,0,0,67,0,0,0,115,16,0, - 0,0,100,1,160,0,124,0,106,1,116,2,106,3,161,2, - 83,0,41,2,114,161,0,0,0,114,153,0,0,0,41,4, - 114,45,0,0,0,114,1,0,0,0,114,173,0,0,0,114, - 138,0,0,0,41,1,218,1,109,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,99,0,0,0,23,3,0, - 0,115,2,0,0,0,0,7,122,26,70,114,111,122,101,110, - 73,109,112,111,114,116,101,114,46,109,111,100,117,108,101,95, - 114,101,112,114,78,99,4,0,0,0,0,0,0,0,0,0, - 0,0,4,0,0,0,5,0,0,0,67,0,0,0,115,34, - 0,0,0,116,0,160,1,124,1,161,1,114,26,116,2,124, - 1,124,0,124,0,106,3,100,1,141,3,83,0,100,0,83, - 0,100,0,83,0,41,2,78,114,137,0,0,0,41,4,114, - 57,0,0,0,114,88,0,0,0,114,91,0,0,0,114,138, - 0,0,0,114,162,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,166,0,0,0,32,3,0,0, - 115,6,0,0,0,0,2,10,1,16,2,122,24,70,114,111, - 122,101,110,73,109,112,111,114,116,101,114,46,102,105,110,100, - 95,115,112,101,99,99,3,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,3,0,0,0,67,0,0,0,115,18, - 0,0,0,116,0,160,1,124,1,161,1,114,14,124,0,83, - 0,100,1,83,0,41,2,122,93,70,105,110,100,32,97,32, - 102,114,111,122,101,110,32,109,111,100,117,108,101,46,10,10, - 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, - 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, - 100,46,32,32,85,115,101,32,102,105,110,100,95,115,112,101, - 99,40,41,32,105,110,115,116,101,97,100,46,10,10,32,32, - 32,32,32,32,32,32,78,41,2,114,57,0,0,0,114,88, - 0,0,0,41,3,114,163,0,0,0,114,81,0,0,0,114, - 164,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,167,0,0,0,39,3,0,0,115,2,0,0, - 0,0,7,122,26,70,114,111,122,101,110,73,109,112,111,114, - 116,101,114,46,102,105,110,100,95,109,111,100,117,108,101,99, - 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 1,0,0,0,67,0,0,0,115,4,0,0,0,100,1,83, - 0,41,2,122,42,85,115,101,32,100,101,102,97,117,108,116, - 32,115,101,109,97,110,116,105,99,115,32,102,111,114,32,109, - 111,100,117,108,101,32,99,114,101,97,116,105,111,110,46,78, - 114,10,0,0,0,41,2,114,163,0,0,0,114,95,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,149,0,0,0,48,3,0,0,115,2,0,0,0,0,2, - 122,28,70,114,111,122,101,110,73,109,112,111,114,116,101,114, - 46,99,114,101,97,116,101,95,109,111,100,117,108,101,99,1, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,4, - 0,0,0,67,0,0,0,115,64,0,0,0,124,0,106,0, - 106,1,125,1,116,2,160,3,124,1,161,1,115,36,116,4, - 100,1,160,5,124,1,161,1,124,1,100,2,141,2,130,1, - 116,6,116,2,106,7,124,1,131,2,125,2,116,8,124,2, - 124,0,106,9,131,2,1,0,100,0,83,0,114,87,0,0, - 0,41,10,114,105,0,0,0,114,17,0,0,0,114,57,0, - 0,0,114,88,0,0,0,114,79,0,0,0,114,45,0,0, - 0,114,67,0,0,0,218,17,103,101,116,95,102,114,111,122, - 101,110,95,111,98,106,101,99,116,218,4,101,120,101,99,114, - 7,0,0,0,41,3,114,96,0,0,0,114,17,0,0,0, - 218,4,99,111,100,101,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,150,0,0,0,52,3,0,0,115,14, - 0,0,0,0,2,8,1,10,1,10,1,2,255,6,2,12, - 1,122,26,70,114,111,122,101,110,73,109,112,111,114,116,101, - 114,46,101,120,101,99,95,109,111,100,117,108,101,99,2,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0, - 0,0,67,0,0,0,115,10,0,0,0,116,0,124,0,124, - 1,131,2,83,0,41,1,122,95,76,111,97,100,32,97,32, - 102,114,111,122,101,110,32,109,111,100,117,108,101,46,10,10, - 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, - 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, - 100,46,32,32,85,115,101,32,101,120,101,99,95,109,111,100, - 117,108,101,40,41,32,105,110,115,116,101,97,100,46,10,10, - 32,32,32,32,32,32,32,32,41,1,114,97,0,0,0,114, - 168,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,155,0,0,0,61,3,0,0,115,2,0,0, - 0,0,7,122,26,70,114,111,122,101,110,73,109,112,111,114, - 116,101,114,46,108,111,97,100,95,109,111,100,117,108,101,99, - 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 3,0,0,0,67,0,0,0,115,10,0,0,0,116,0,160, - 1,124,1,161,1,83,0,41,1,122,45,82,101,116,117,114, - 110,32,116,104,101,32,99,111,100,101,32,111,98,106,101,99, - 116,32,102,111,114,32,116,104,101,32,102,114,111,122,101,110, - 32,109,111,100,117,108,101,46,41,2,114,57,0,0,0,114, - 175,0,0,0,114,168,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,169,0,0,0,70,3,0, - 0,115,2,0,0,0,0,4,122,23,70,114,111,122,101,110, - 73,109,112,111,114,116,101,114,46,103,101,116,95,99,111,100, - 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, - 1,83,0,41,2,122,54,82,101,116,117,114,110,32,78,111, - 110,101,32,97,115,32,102,114,111,122,101,110,32,109,111,100, - 117,108,101,115,32,100,111,32,110,111,116,32,104,97,118,101, - 32,115,111,117,114,99,101,32,99,111,100,101,46,78,114,10, - 0,0,0,114,168,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,170,0,0,0,76,3,0,0, - 115,2,0,0,0,0,4,122,25,70,114,111,122,101,110,73, - 109,112,111,114,116,101,114,46,103,101,116,95,115,111,117,114, - 99,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,3,0,0,0,67,0,0,0,115,10,0,0,0, - 116,0,160,1,124,1,161,1,83,0,41,1,122,46,82,101, - 116,117,114,110,32,84,114,117,101,32,105,102,32,116,104,101, - 32,102,114,111,122,101,110,32,109,111,100,117,108,101,32,105, - 115,32,97,32,112,97,99,107,97,103,101,46,41,2,114,57, - 0,0,0,90,17,105,115,95,102,114,111,122,101,110,95,112, - 97,99,107,97,103,101,114,168,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,115,0,0,0,82, - 3,0,0,115,2,0,0,0,0,4,122,25,70,114,111,122, - 101,110,73,109,112,111,114,116,101,114,46,105,115,95,112,97, - 99,107,97,103,101,41,2,78,78,41,1,78,41,17,114,1, - 0,0,0,114,0,0,0,0,114,2,0,0,0,114,3,0, - 0,0,114,138,0,0,0,114,171,0,0,0,114,99,0,0, - 0,114,172,0,0,0,114,166,0,0,0,114,167,0,0,0, - 114,149,0,0,0,114,150,0,0,0,114,155,0,0,0,114, - 90,0,0,0,114,169,0,0,0,114,170,0,0,0,114,115, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,173,0,0,0,12,3,0,0, - 115,46,0,0,0,8,2,4,7,4,2,2,1,10,8,2, - 1,12,6,2,1,12,8,2,1,10,3,2,1,10,8,2, - 1,10,8,2,1,2,1,12,4,2,1,2,1,12,4,2, - 1,2,1,114,173,0,0,0,99,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,64,0,0, - 0,115,32,0,0,0,101,0,90,1,100,0,90,2,100,1, - 90,3,100,2,100,3,132,0,90,4,100,4,100,5,132,0, - 90,5,100,6,83,0,41,7,218,18,95,73,109,112,111,114, - 116,76,111,99,107,67,111,110,116,101,120,116,122,36,67,111, - 110,116,101,120,116,32,109,97,110,97,103,101,114,32,102,111, - 114,32,116,104,101,32,105,109,112,111,114,116,32,108,111,99, - 107,46,99,1,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,2,0,0,0,67,0,0,0,115,12,0,0,0, - 116,0,160,1,161,0,1,0,100,1,83,0,41,2,122,24, - 65,99,113,117,105,114,101,32,116,104,101,32,105,109,112,111, - 114,116,32,108,111,99,107,46,78,41,2,114,57,0,0,0, - 114,58,0,0,0,114,47,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,54,0,0,0,95,3, - 0,0,115,2,0,0,0,0,2,122,28,95,73,109,112,111, - 114,116,76,111,99,107,67,111,110,116,101,120,116,46,95,95, - 101,110,116,101,114,95,95,99,4,0,0,0,0,0,0,0, - 0,0,0,0,4,0,0,0,2,0,0,0,67,0,0,0, - 115,12,0,0,0,116,0,160,1,161,0,1,0,100,1,83, - 0,41,2,122,60,82,101,108,101,97,115,101,32,116,104,101, - 32,105,109,112,111,114,116,32,108,111,99,107,32,114,101,103, - 97,114,100,108,101,115,115,32,111,102,32,97,110,121,32,114, - 97,105,115,101,100,32,101,120,99,101,112,116,105,111,110,115, - 46,78,41,2,114,57,0,0,0,114,60,0,0,0,41,4, - 114,30,0,0,0,218,8,101,120,99,95,116,121,112,101,218, - 9,101,120,99,95,118,97,108,117,101,218,13,101,120,99,95, - 116,114,97,99,101,98,97,99,107,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,56,0,0,0,99,3,0, - 0,115,2,0,0,0,0,2,122,27,95,73,109,112,111,114, - 116,76,111,99,107,67,111,110,116,101,120,116,46,95,95,101, - 120,105,116,95,95,78,41,6,114,1,0,0,0,114,0,0, - 0,0,114,2,0,0,0,114,3,0,0,0,114,54,0,0, - 0,114,56,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,178,0,0,0,91, - 3,0,0,115,6,0,0,0,8,2,4,2,8,4,114,178, - 0,0,0,99,3,0,0,0,0,0,0,0,0,0,0,0, - 5,0,0,0,5,0,0,0,67,0,0,0,115,64,0,0, - 0,124,1,160,0,100,1,124,2,100,2,24,0,161,2,125, - 3,116,1,124,3,131,1,124,2,107,0,114,36,116,2,100, - 3,131,1,130,1,124,3,100,4,25,0,125,4,124,0,114, - 60,100,5,160,3,124,4,124,0,161,2,83,0,124,4,83, - 0,41,6,122,50,82,101,115,111,108,118,101,32,97,32,114, - 101,108,97,116,105,118,101,32,109,111,100,117,108,101,32,110, - 97,109,101,32,116,111,32,97,110,32,97,98,115,111,108,117, - 116,101,32,111,110,101,46,114,128,0,0,0,114,37,0,0, - 0,122,50,97,116,116,101,109,112,116,101,100,32,114,101,108, - 97,116,105,118,101,32,105,109,112,111,114,116,32,98,101,121, - 111,110,100,32,116,111,112,45,108,101,118,101,108,32,112,97, - 99,107,97,103,101,114,22,0,0,0,250,5,123,125,46,123, - 125,41,4,218,6,114,115,112,108,105,116,218,3,108,101,110, - 218,10,86,97,108,117,101,69,114,114,111,114,114,45,0,0, - 0,41,5,114,17,0,0,0,218,7,112,97,99,107,97,103, - 101,218,5,108,101,118,101,108,90,4,98,105,116,115,90,4, - 98,97,115,101,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,218,13,95,114,101,115,111,108,118,101,95,110,97, - 109,101,104,3,0,0,115,10,0,0,0,0,2,16,1,12, - 1,8,1,8,1,114,188,0,0,0,99,3,0,0,0,0, - 0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,67, - 0,0,0,115,34,0,0,0,124,0,160,0,124,1,124,2, - 161,2,125,3,124,3,100,0,107,8,114,24,100,0,83,0, - 116,1,124,1,124,3,131,2,83,0,114,13,0,0,0,41, - 2,114,167,0,0,0,114,91,0,0,0,41,4,218,6,102, - 105,110,100,101,114,114,17,0,0,0,114,164,0,0,0,114, - 109,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,218,17,95,102,105,110,100,95,115,112,101,99,95, - 108,101,103,97,99,121,113,3,0,0,115,8,0,0,0,0, - 3,12,1,8,1,4,1,114,190,0,0,0,99,3,0,0, - 0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,0, - 0,67,0,0,0,115,12,1,0,0,116,0,106,1,125,3, - 124,3,100,1,107,8,114,22,116,2,100,2,131,1,130,1, - 124,3,115,38,116,3,160,4,100,3,116,5,161,2,1,0, - 124,0,116,0,106,6,107,6,125,4,124,3,68,0,93,210, - 125,5,116,7,131,0,143,84,1,0,122,10,124,5,106,8, - 125,6,87,0,110,54,4,0,116,9,107,10,114,128,1,0, - 1,0,1,0,116,10,124,5,124,0,124,1,131,3,125,7, - 124,7,100,1,107,8,114,124,89,0,87,0,53,0,81,0, - 82,0,163,0,113,52,89,0,110,14,88,0,124,6,124,0, - 124,1,124,2,131,3,125,7,87,0,53,0,81,0,82,0, - 88,0,124,7,100,1,107,9,114,52,124,4,144,0,115,254, - 124,0,116,0,106,6,107,6,144,0,114,254,116,0,106,6, - 124,0,25,0,125,8,122,10,124,8,106,11,125,9,87,0, - 110,28,4,0,116,9,107,10,114,226,1,0,1,0,1,0, - 124,7,6,0,89,0,2,0,1,0,83,0,88,0,124,9, - 100,1,107,8,114,244,124,7,2,0,1,0,83,0,124,9, - 2,0,1,0,83,0,113,52,124,7,2,0,1,0,83,0, - 113,52,100,1,83,0,41,4,122,21,70,105,110,100,32,97, - 32,109,111,100,117,108,101,39,115,32,115,112,101,99,46,78, - 122,53,115,121,115,46,109,101,116,97,95,112,97,116,104,32, - 105,115,32,78,111,110,101,44,32,80,121,116,104,111,110,32, - 105,115,32,108,105,107,101,108,121,32,115,104,117,116,116,105, - 110,103,32,100,111,119,110,122,22,115,121,115,46,109,101,116, - 97,95,112,97,116,104,32,105,115,32,101,109,112,116,121,41, - 12,114,15,0,0,0,218,9,109,101,116,97,95,112,97,116, - 104,114,79,0,0,0,218,9,95,119,97,114,110,105,110,103, - 115,218,4,119,97,114,110,218,13,73,109,112,111,114,116,87, - 97,114,110,105,110,103,114,92,0,0,0,114,178,0,0,0, - 114,166,0,0,0,114,106,0,0,0,114,190,0,0,0,114, - 105,0,0,0,41,10,114,17,0,0,0,114,164,0,0,0, - 114,165,0,0,0,114,191,0,0,0,90,9,105,115,95,114, - 101,108,111,97,100,114,189,0,0,0,114,166,0,0,0,114, - 95,0,0,0,114,96,0,0,0,114,105,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,218,10,95, - 102,105,110,100,95,115,112,101,99,122,3,0,0,115,54,0, - 0,0,0,2,6,1,8,2,8,3,4,1,12,5,10,1, - 8,1,8,1,2,1,10,1,14,1,12,1,8,1,20,2, - 22,1,8,2,18,1,10,1,2,1,10,1,14,4,14,2, - 8,1,8,2,10,2,10,2,114,195,0,0,0,99,3,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,5,0, - 0,0,67,0,0,0,115,108,0,0,0,116,0,124,0,116, - 1,131,2,115,28,116,2,100,1,160,3,116,4,124,0,131, - 1,161,1,131,1,130,1,124,2,100,2,107,0,114,44,116, - 5,100,3,131,1,130,1,124,2,100,2,107,4,114,84,116, - 0,124,1,116,1,131,2,115,72,116,2,100,4,131,1,130, - 1,110,12,124,1,115,84,116,6,100,5,131,1,130,1,124, - 0,115,104,124,2,100,2,107,2,114,104,116,5,100,6,131, - 1,130,1,100,7,83,0,41,8,122,28,86,101,114,105,102, - 121,32,97,114,103,117,109,101,110,116,115,32,97,114,101,32, - 34,115,97,110,101,34,46,122,31,109,111,100,117,108,101,32, - 110,97,109,101,32,109,117,115,116,32,98,101,32,115,116,114, - 44,32,110,111,116,32,123,125,114,22,0,0,0,122,18,108, - 101,118,101,108,32,109,117,115,116,32,98,101,32,62,61,32, - 48,122,31,95,95,112,97,99,107,97,103,101,95,95,32,110, - 111,116,32,115,101,116,32,116,111,32,97,32,115,116,114,105, - 110,103,122,54,97,116,116,101,109,112,116,101,100,32,114,101, - 108,97,116,105,118,101,32,105,109,112,111,114,116,32,119,105, - 116,104,32,110,111,32,107,110,111,119,110,32,112,97,114,101, - 110,116,32,112,97,99,107,97,103,101,122,17,69,109,112,116, - 121,32,109,111,100,117,108,101,32,110,97,109,101,78,41,7, - 218,10,105,115,105,110,115,116,97,110,99,101,218,3,115,116, - 114,218,9,84,121,112,101,69,114,114,111,114,114,45,0,0, - 0,114,14,0,0,0,114,185,0,0,0,114,79,0,0,0, - 169,3,114,17,0,0,0,114,186,0,0,0,114,187,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 218,13,95,115,97,110,105,116,121,95,99,104,101,99,107,169, - 3,0,0,115,22,0,0,0,0,2,10,1,18,1,8,1, - 8,1,8,1,10,1,10,1,4,1,8,2,12,1,114,200, - 0,0,0,122,16,78,111,32,109,111,100,117,108,101,32,110, - 97,109,101,100,32,122,4,123,33,114,125,99,2,0,0,0, - 0,0,0,0,0,0,0,0,8,0,0,0,8,0,0,0, - 67,0,0,0,115,220,0,0,0,100,0,125,2,124,0,160, - 0,100,1,161,1,100,2,25,0,125,3,124,3,114,134,124, - 3,116,1,106,2,107,7,114,42,116,3,124,1,124,3,131, - 2,1,0,124,0,116,1,106,2,107,6,114,62,116,1,106, - 2,124,0,25,0,83,0,116,1,106,2,124,3,25,0,125, - 4,122,10,124,4,106,4,125,2,87,0,110,50,4,0,116, - 5,107,10,114,132,1,0,1,0,1,0,116,6,100,3,23, - 0,160,7,124,0,124,3,161,2,125,5,116,8,124,5,124, - 0,100,4,141,2,100,0,130,2,89,0,110,2,88,0,116, - 9,124,0,124,2,131,2,125,6,124,6,100,0,107,8,114, - 172,116,8,116,6,160,7,124,0,161,1,124,0,100,4,141, - 2,130,1,110,8,116,10,124,6,131,1,125,7,124,3,114, - 216,116,1,106,2,124,3,25,0,125,4,116,11,124,4,124, - 0,160,0,100,1,161,1,100,5,25,0,124,7,131,3,1, - 0,124,7,83,0,41,6,78,114,128,0,0,0,114,22,0, - 0,0,122,23,59,32,123,33,114,125,32,105,115,32,110,111, - 116,32,97,32,112,97,99,107,97,103,101,114,16,0,0,0, - 233,2,0,0,0,41,12,114,129,0,0,0,114,15,0,0, - 0,114,92,0,0,0,114,67,0,0,0,114,141,0,0,0, - 114,106,0,0,0,218,8,95,69,82,82,95,77,83,71,114, - 45,0,0,0,218,19,77,111,100,117,108,101,78,111,116,70, - 111,117,110,100,69,114,114,111,114,114,195,0,0,0,114,159, - 0,0,0,114,5,0,0,0,41,8,114,17,0,0,0,218, - 7,105,109,112,111,114,116,95,114,164,0,0,0,114,130,0, - 0,0,90,13,112,97,114,101,110,116,95,109,111,100,117,108, - 101,114,157,0,0,0,114,95,0,0,0,114,96,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, - 23,95,102,105,110,100,95,97,110,100,95,108,111,97,100,95, - 117,110,108,111,99,107,101,100,188,3,0,0,115,42,0,0, - 0,0,1,4,1,14,1,4,1,10,1,10,2,10,1,10, - 1,10,1,2,1,10,1,14,1,16,1,20,1,10,1,8, - 1,20,2,8,1,4,2,10,1,22,1,114,205,0,0,0, - 99,2,0,0,0,0,0,0,0,0,0,0,0,4,0,0, - 0,10,0,0,0,67,0,0,0,115,106,0,0,0,116,0, - 124,0,131,1,143,50,1,0,116,1,106,2,160,3,124,0, - 116,4,161,2,125,2,124,2,116,4,107,8,114,54,116,5, - 124,0,124,1,131,2,87,0,2,0,53,0,81,0,82,0, - 163,0,83,0,87,0,53,0,81,0,82,0,88,0,124,2, - 100,1,107,8,114,94,100,2,160,6,124,0,161,1,125,3, - 116,7,124,3,124,0,100,3,141,2,130,1,116,8,124,0, - 131,1,1,0,124,2,83,0,41,4,122,25,70,105,110,100, - 32,97,110,100,32,108,111,97,100,32,116,104,101,32,109,111, - 100,117,108,101,46,78,122,40,105,109,112,111,114,116,32,111, - 102,32,123,125,32,104,97,108,116,101,100,59,32,78,111,110, - 101,32,105,110,32,115,121,115,46,109,111,100,117,108,101,115, - 114,16,0,0,0,41,9,114,50,0,0,0,114,15,0,0, - 0,114,92,0,0,0,114,34,0,0,0,218,14,95,78,69, - 69,68,83,95,76,79,65,68,73,78,71,114,205,0,0,0, - 114,45,0,0,0,114,203,0,0,0,114,65,0,0,0,41, - 4,114,17,0,0,0,114,204,0,0,0,114,96,0,0,0, - 114,75,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,218,14,95,102,105,110,100,95,97,110,100,95, - 108,111,97,100,218,3,0,0,115,22,0,0,0,0,2,10, - 1,14,1,8,1,32,2,8,1,4,1,2,255,4,2,12, - 2,8,1,114,207,0,0,0,114,22,0,0,0,99,3,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,4,0, - 0,0,67,0,0,0,115,42,0,0,0,116,0,124,0,124, - 1,124,2,131,3,1,0,124,2,100,1,107,4,114,32,116, - 1,124,0,124,1,124,2,131,3,125,0,116,2,124,0,116, - 3,131,2,83,0,41,2,97,50,1,0,0,73,109,112,111, - 114,116,32,97,110,100,32,114,101,116,117,114,110,32,116,104, - 101,32,109,111,100,117,108,101,32,98,97,115,101,100,32,111, - 110,32,105,116,115,32,110,97,109,101,44,32,116,104,101,32, - 112,97,99,107,97,103,101,32,116,104,101,32,99,97,108,108, - 32,105,115,10,32,32,32,32,98,101,105,110,103,32,109,97, - 100,101,32,102,114,111,109,44,32,97,110,100,32,116,104,101, - 32,108,101,118,101,108,32,97,100,106,117,115,116,109,101,110, - 116,46,10,10,32,32,32,32,84,104,105,115,32,102,117,110, - 99,116,105,111,110,32,114,101,112,114,101,115,101,110,116,115, - 32,116,104,101,32,103,114,101,97,116,101,115,116,32,99,111, - 109,109,111,110,32,100,101,110,111,109,105,110,97,116,111,114, - 32,111,102,32,102,117,110,99,116,105,111,110,97,108,105,116, - 121,10,32,32,32,32,98,101,116,119,101,101,110,32,105,109, - 112,111,114,116,95,109,111,100,117,108,101,32,97,110,100,32, - 95,95,105,109,112,111,114,116,95,95,46,32,84,104,105,115, - 32,105,110,99,108,117,100,101,115,32,115,101,116,116,105,110, - 103,32,95,95,112,97,99,107,97,103,101,95,95,32,105,102, - 10,32,32,32,32,116,104,101,32,108,111,97,100,101,114,32, - 100,105,100,32,110,111,116,46,10,10,32,32,32,32,114,22, - 0,0,0,41,4,114,200,0,0,0,114,188,0,0,0,114, - 207,0,0,0,218,11,95,103,99,100,95,105,109,112,111,114, - 116,114,199,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,208,0,0,0,234,3,0,0,115,8, - 0,0,0,0,9,12,1,8,1,12,1,114,208,0,0,0, - 169,1,218,9,114,101,99,117,114,115,105,118,101,99,3,0, - 0,0,0,0,0,0,1,0,0,0,8,0,0,0,11,0, - 0,0,67,0,0,0,115,226,0,0,0,124,1,68,0,93, - 216,125,4,116,0,124,4,116,1,131,2,115,66,124,3,114, - 34,124,0,106,2,100,1,23,0,125,5,110,4,100,2,125, - 5,116,3,100,3,124,5,155,0,100,4,116,4,124,4,131, - 1,106,2,155,0,157,4,131,1,130,1,110,154,124,4,100, - 5,107,2,114,108,124,3,115,106,116,5,124,0,100,6,131, - 2,114,106,116,6,124,0,124,0,106,7,124,2,100,7,100, - 8,141,4,1,0,110,112,116,5,124,0,124,4,131,2,115, - 220,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,110,72,4, - 0,116,10,107,10,114,218,1,0,125,7,1,0,122,42,124, - 7,106,11,124,6,107,2,114,200,116,12,106,13,160,14,124, - 6,116,15,161,2,100,10,107,9,114,200,87,0,89,0,162, - 8,113,4,130,0,87,0,53,0,100,10,125,7,126,7,88, - 0,89,0,110,2,88,0,113,4,124,0,83,0,41,11,122, - 238,70,105,103,117,114,101,32,111,117,116,32,119,104,97,116, - 32,95,95,105,109,112,111,114,116,95,95,32,115,104,111,117, - 108,100,32,114,101,116,117,114,110,46,10,10,32,32,32,32, - 84,104,101,32,105,109,112,111,114,116,95,32,112,97,114,97, - 109,101,116,101,114,32,105,115,32,97,32,99,97,108,108,97, - 98,108,101,32,119,104,105,99,104,32,116,97,107,101,115,32, - 116,104,101,32,110,97,109,101,32,111,102,32,109,111,100,117, - 108,101,32,116,111,10,32,32,32,32,105,109,112,111,114,116, - 46,32,73,116,32,105,115,32,114,101,113,117,105,114,101,100, - 32,116,111,32,100,101,99,111,117,112,108,101,32,116,104,101, - 32,102,117,110,99,116,105,111,110,32,102,114,111,109,32,97, - 115,115,117,109,105,110,103,32,105,109,112,111,114,116,108,105, - 98,39,115,10,32,32,32,32,105,109,112,111,114,116,32,105, - 109,112,108,101,109,101,110,116,97,116,105,111,110,32,105,115, - 32,100,101,115,105,114,101,100,46,10,10,32,32,32,32,122, - 8,46,95,95,97,108,108,95,95,122,13,96,96,102,114,111, - 109,32,108,105,115,116,39,39,122,8,73,116,101,109,32,105, - 110,32,122,18,32,109,117,115,116,32,98,101,32,115,116,114, - 44,32,110,111,116,32,250,1,42,218,7,95,95,97,108,108, - 95,95,84,114,209,0,0,0,114,182,0,0,0,78,41,16, - 114,196,0,0,0,114,197,0,0,0,114,1,0,0,0,114, - 198,0,0,0,114,14,0,0,0,114,4,0,0,0,218,16, - 95,104,97,110,100,108,101,95,102,114,111,109,108,105,115,116, - 114,212,0,0,0,114,45,0,0,0,114,67,0,0,0,114, - 203,0,0,0,114,17,0,0,0,114,15,0,0,0,114,92, - 0,0,0,114,34,0,0,0,114,206,0,0,0,41,8,114, - 96,0,0,0,218,8,102,114,111,109,108,105,115,116,114,204, - 0,0,0,114,210,0,0,0,218,1,120,90,5,119,104,101, - 114,101,90,9,102,114,111,109,95,110,97,109,101,90,3,101, - 120,99,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,213,0,0,0,249,3,0,0,115,44,0,0,0,0, - 10,8,1,10,1,4,1,12,2,4,1,28,2,8,1,14, - 1,10,1,2,255,8,2,10,1,14,1,2,1,14,1,16, - 4,10,1,16,255,2,2,8,1,22,1,114,213,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,6,0,0,0,67,0,0,0,115,146,0,0,0,124,0, - 160,0,100,1,161,1,125,1,124,0,160,0,100,2,161,1, - 125,2,124,1,100,3,107,9,114,82,124,2,100,3,107,9, - 114,78,124,1,124,2,106,1,107,3,114,78,116,2,106,3, - 100,4,124,1,155,2,100,5,124,2,106,1,155,2,100,6, - 157,5,116,4,100,7,100,8,141,3,1,0,124,1,83,0, - 124,2,100,3,107,9,114,96,124,2,106,1,83,0,116,2, - 106,3,100,9,116,4,100,7,100,8,141,3,1,0,124,0, - 100,10,25,0,125,1,100,11,124,0,107,7,114,142,124,1, - 160,5,100,12,161,1,100,13,25,0,125,1,124,1,83,0, - 41,14,122,167,67,97,108,99,117,108,97,116,101,32,119,104, - 97,116,32,95,95,112,97,99,107,97,103,101,95,95,32,115, - 104,111,117,108,100,32,98,101,46,10,10,32,32,32,32,95, - 95,112,97,99,107,97,103,101,95,95,32,105,115,32,110,111, - 116,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32, - 98,101,32,100,101,102,105,110,101,100,32,111,114,32,99,111, - 117,108,100,32,98,101,32,115,101,116,32,116,111,32,78,111, - 110,101,10,32,32,32,32,116,111,32,114,101,112,114,101,115, - 101,110,116,32,116,104,97,116,32,105,116,115,32,112,114,111, - 112,101,114,32,118,97,108,117,101,32,105,115,32,117,110,107, - 110,111,119,110,46,10,10,32,32,32,32,114,145,0,0,0, - 114,105,0,0,0,78,122,32,95,95,112,97,99,107,97,103, - 101,95,95,32,33,61,32,95,95,115,112,101,99,95,95,46, - 112,97,114,101,110,116,32,40,122,4,32,33,61,32,250,1, - 41,233,3,0,0,0,41,1,90,10,115,116,97,99,107,108, - 101,118,101,108,122,89,99,97,110,39,116,32,114,101,115,111, - 108,118,101,32,112,97,99,107,97,103,101,32,102,114,111,109, - 32,95,95,115,112,101,99,95,95,32,111,114,32,95,95,112, - 97,99,107,97,103,101,95,95,44,32,102,97,108,108,105,110, - 103,32,98,97,99,107,32,111,110,32,95,95,110,97,109,101, - 95,95,32,97,110,100,32,95,95,112,97,116,104,95,95,114, - 1,0,0,0,114,141,0,0,0,114,128,0,0,0,114,22, - 0,0,0,41,6,114,34,0,0,0,114,130,0,0,0,114, - 192,0,0,0,114,193,0,0,0,114,194,0,0,0,114,129, - 0,0,0,41,3,218,7,103,108,111,98,97,108,115,114,186, - 0,0,0,114,95,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,17,95,99,97,108,99,95,95, - 95,112,97,99,107,97,103,101,95,95,30,4,0,0,115,38, - 0,0,0,0,7,10,1,10,1,8,1,18,1,22,2,2, - 0,2,254,6,3,4,1,8,1,6,2,6,2,2,0,2, - 254,6,3,8,1,8,1,14,1,114,219,0,0,0,114,10, - 0,0,0,99,5,0,0,0,0,0,0,0,0,0,0,0, - 9,0,0,0,5,0,0,0,67,0,0,0,115,180,0,0, - 0,124,4,100,1,107,2,114,18,116,0,124,0,131,1,125, - 5,110,36,124,1,100,2,107,9,114,30,124,1,110,2,105, - 0,125,6,116,1,124,6,131,1,125,7,116,0,124,0,124, - 7,124,4,131,3,125,5,124,3,115,150,124,4,100,1,107, - 2,114,84,116,0,124,0,160,2,100,3,161,1,100,1,25, - 0,131,1,83,0,124,0,115,92,124,5,83,0,116,3,124, - 0,131,1,116,3,124,0,160,2,100,3,161,1,100,1,25, - 0,131,1,24,0,125,8,116,4,106,5,124,5,106,6,100, - 2,116,3,124,5,106,6,131,1,124,8,24,0,133,2,25, - 0,25,0,83,0,110,26,116,7,124,5,100,4,131,2,114, - 172,116,8,124,5,124,3,116,0,131,3,83,0,124,5,83, - 0,100,2,83,0,41,5,97,215,1,0,0,73,109,112,111, - 114,116,32,97,32,109,111,100,117,108,101,46,10,10,32,32, - 32,32,84,104,101,32,39,103,108,111,98,97,108,115,39,32, - 97,114,103,117,109,101,110,116,32,105,115,32,117,115,101,100, - 32,116,111,32,105,110,102,101,114,32,119,104,101,114,101,32, - 116,104,101,32,105,109,112,111,114,116,32,105,115,32,111,99, - 99,117,114,114,105,110,103,32,102,114,111,109,10,32,32,32, - 32,116,111,32,104,97,110,100,108,101,32,114,101,108,97,116, - 105,118,101,32,105,109,112,111,114,116,115,46,32,84,104,101, - 32,39,108,111,99,97,108,115,39,32,97,114,103,117,109,101, - 110,116,32,105,115,32,105,103,110,111,114,101,100,46,32,84, - 104,101,10,32,32,32,32,39,102,114,111,109,108,105,115,116, - 39,32,97,114,103,117,109,101,110,116,32,115,112,101,99,105, - 102,105,101,115,32,119,104,97,116,32,115,104,111,117,108,100, - 32,101,120,105,115,116,32,97,115,32,97,116,116,114,105,98, - 117,116,101,115,32,111,110,32,116,104,101,32,109,111,100,117, - 108,101,10,32,32,32,32,98,101,105,110,103,32,105,109,112, - 111,114,116,101,100,32,40,101,46,103,46,32,96,96,102,114, - 111,109,32,109,111,100,117,108,101,32,105,109,112,111,114,116, - 32,60,102,114,111,109,108,105,115,116,62,96,96,41,46,32, - 32,84,104,101,32,39,108,101,118,101,108,39,10,32,32,32, - 32,97,114,103,117,109,101,110,116,32,114,101,112,114,101,115, - 101,110,116,115,32,116,104,101,32,112,97,99,107,97,103,101, - 32,108,111,99,97,116,105,111,110,32,116,111,32,105,109,112, - 111,114,116,32,102,114,111,109,32,105,110,32,97,32,114,101, - 108,97,116,105,118,101,10,32,32,32,32,105,109,112,111,114, - 116,32,40,101,46,103,46,32,96,96,102,114,111,109,32,46, - 46,112,107,103,32,105,109,112,111,114,116,32,109,111,100,96, - 96,32,119,111,117,108,100,32,104,97,118,101,32,97,32,39, - 108,101,118,101,108,39,32,111,102,32,50,41,46,10,10,32, - 32,32,32,114,22,0,0,0,78,114,128,0,0,0,114,141, - 0,0,0,41,9,114,208,0,0,0,114,219,0,0,0,218, - 9,112,97,114,116,105,116,105,111,110,114,184,0,0,0,114, - 15,0,0,0,114,92,0,0,0,114,1,0,0,0,114,4, - 0,0,0,114,213,0,0,0,41,9,114,17,0,0,0,114, - 218,0,0,0,218,6,108,111,99,97,108,115,114,214,0,0, - 0,114,187,0,0,0,114,96,0,0,0,90,8,103,108,111, - 98,97,108,115,95,114,186,0,0,0,90,7,99,117,116,95, - 111,102,102,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,10,95,95,105,109,112,111,114,116,95,95,57,4, - 0,0,115,30,0,0,0,0,11,8,1,10,2,16,1,8, - 1,12,1,4,3,8,1,18,1,4,1,4,4,26,3,32, - 1,10,1,12,2,114,222,0,0,0,99,1,0,0,0,0, + 170,0,0,0,76,3,0,0,115,2,0,0,0,0,4,122, + 25,70,114,111,122,101,110,73,109,112,111,114,116,101,114,46, + 103,101,116,95,115,111,117,114,99,101,99,2,0,0,0,0, 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,67, - 0,0,0,115,38,0,0,0,116,0,160,1,124,0,161,1, - 125,1,124,1,100,0,107,8,114,30,116,2,100,1,124,0, - 23,0,131,1,130,1,116,3,124,1,131,1,83,0,41,2, - 78,122,25,110,111,32,98,117,105,108,116,45,105,110,32,109, - 111,100,117,108,101,32,110,97,109,101,100,32,41,4,114,160, - 0,0,0,114,166,0,0,0,114,79,0,0,0,114,159,0, - 0,0,41,2,114,17,0,0,0,114,95,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,218,18,95, - 98,117,105,108,116,105,110,95,102,114,111,109,95,110,97,109, - 101,94,4,0,0,115,8,0,0,0,0,1,10,1,8,1, - 12,1,114,223,0,0,0,99,2,0,0,0,0,0,0,0, - 0,0,0,0,10,0,0,0,5,0,0,0,67,0,0,0, - 115,166,0,0,0,124,1,97,0,124,0,97,1,116,2,116, - 1,131,1,125,2,116,1,106,3,160,4,161,0,68,0,93, - 72,92,2,125,3,125,4,116,5,124,4,124,2,131,2,114, - 26,124,3,116,1,106,6,107,6,114,60,116,7,125,5,110, - 18,116,0,160,8,124,3,161,1,114,26,116,9,125,5,110, - 2,113,26,116,10,124,4,124,5,131,2,125,6,116,11,124, - 6,124,4,131,2,1,0,113,26,116,1,106,3,116,12,25, - 0,125,7,100,1,68,0,93,46,125,8,124,8,116,1,106, - 3,107,7,114,138,116,13,124,8,131,1,125,9,110,10,116, - 1,106,3,124,8,25,0,125,9,116,14,124,7,124,8,124, - 9,131,3,1,0,113,114,100,2,83,0,41,3,122,250,83, - 101,116,117,112,32,105,109,112,111,114,116,108,105,98,32,98, - 121,32,105,109,112,111,114,116,105,110,103,32,110,101,101,100, - 101,100,32,98,117,105,108,116,45,105,110,32,109,111,100,117, - 108,101,115,32,97,110,100,32,105,110,106,101,99,116,105,110, - 103,32,116,104,101,109,10,32,32,32,32,105,110,116,111,32, - 116,104,101,32,103,108,111,98,97,108,32,110,97,109,101,115, - 112,97,99,101,46,10,10,32,32,32,32,65,115,32,115,121, - 115,32,105,115,32,110,101,101,100,101,100,32,102,111,114,32, - 115,121,115,46,109,111,100,117,108,101,115,32,97,99,99,101, - 115,115,32,97,110,100,32,95,105,109,112,32,105,115,32,110, - 101,101,100,101,100,32,116,111,32,108,111,97,100,32,98,117, - 105,108,116,45,105,110,10,32,32,32,32,109,111,100,117,108, - 101,115,44,32,116,104,111,115,101,32,116,119,111,32,109,111, - 100,117,108,101,115,32,109,117,115,116,32,98,101,32,101,120, - 112,108,105,99,105,116,108,121,32,112,97,115,115,101,100,32, - 105,110,46,10,10,32,32,32,32,41,3,114,23,0,0,0, - 114,192,0,0,0,114,64,0,0,0,78,41,15,114,57,0, - 0,0,114,15,0,0,0,114,14,0,0,0,114,92,0,0, - 0,218,5,105,116,101,109,115,114,196,0,0,0,114,78,0, - 0,0,114,160,0,0,0,114,88,0,0,0,114,173,0,0, - 0,114,142,0,0,0,114,148,0,0,0,114,1,0,0,0, - 114,223,0,0,0,114,5,0,0,0,41,10,218,10,115,121, - 115,95,109,111,100,117,108,101,218,11,95,105,109,112,95,109, - 111,100,117,108,101,90,11,109,111,100,117,108,101,95,116,121, - 112,101,114,17,0,0,0,114,96,0,0,0,114,109,0,0, - 0,114,95,0,0,0,90,11,115,101,108,102,95,109,111,100, - 117,108,101,90,12,98,117,105,108,116,105,110,95,110,97,109, - 101,90,14,98,117,105,108,116,105,110,95,109,111,100,117,108, - 101,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 218,6,95,115,101,116,117,112,101,4,0,0,115,36,0,0, - 0,0,9,4,1,4,3,8,1,18,1,10,1,10,1,6, - 1,10,1,6,2,2,1,10,1,12,3,10,1,8,1,10, - 1,10,2,10,1,114,227,0,0,0,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,67, - 0,0,0,115,38,0,0,0,116,0,124,0,124,1,131,2, - 1,0,116,1,106,2,160,3,116,4,161,1,1,0,116,1, - 106,2,160,3,116,5,161,1,1,0,100,1,83,0,41,2, - 122,48,73,110,115,116,97,108,108,32,105,109,112,111,114,116, - 101,114,115,32,102,111,114,32,98,117,105,108,116,105,110,32, - 97,110,100,32,102,114,111,122,101,110,32,109,111,100,117,108, - 101,115,78,41,6,114,227,0,0,0,114,15,0,0,0,114, - 191,0,0,0,114,120,0,0,0,114,160,0,0,0,114,173, - 0,0,0,41,2,114,225,0,0,0,114,226,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,8, - 95,105,110,115,116,97,108,108,136,4,0,0,115,6,0,0, - 0,0,2,10,2,12,1,114,228,0,0,0,99,0,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0, - 0,67,0,0,0,115,32,0,0,0,100,1,100,2,108,0, - 125,0,124,0,97,1,124,0,160,2,116,3,106,4,116,5, - 25,0,161,1,1,0,100,2,83,0,41,3,122,57,73,110, - 115,116,97,108,108,32,105,109,112,111,114,116,101,114,115,32, - 116,104,97,116,32,114,101,113,117,105,114,101,32,101,120,116, - 101,114,110,97,108,32,102,105,108,101,115,121,115,116,101,109, - 32,97,99,99,101,115,115,114,22,0,0,0,78,41,6,218, - 26,95,102,114,111,122,101,110,95,105,109,112,111,114,116,108, - 105,98,95,101,120,116,101,114,110,97,108,114,126,0,0,0, - 114,228,0,0,0,114,15,0,0,0,114,92,0,0,0,114, - 1,0,0,0,41,1,114,229,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,218,27,95,105,110,115, - 116,97,108,108,95,101,120,116,101,114,110,97,108,95,105,109, - 112,111,114,116,101,114,115,144,4,0,0,115,6,0,0,0, - 0,3,8,1,4,1,114,230,0,0,0,41,2,78,78,41, - 1,78,41,2,78,114,22,0,0,0,41,4,78,78,114,10, - 0,0,0,114,22,0,0,0,41,50,114,3,0,0,0,114, - 126,0,0,0,114,12,0,0,0,114,18,0,0,0,114,59, - 0,0,0,114,33,0,0,0,114,42,0,0,0,114,19,0, - 0,0,114,20,0,0,0,114,49,0,0,0,114,50,0,0, - 0,114,53,0,0,0,114,65,0,0,0,114,67,0,0,0, - 114,76,0,0,0,114,86,0,0,0,114,90,0,0,0,114, - 97,0,0,0,114,111,0,0,0,114,112,0,0,0,114,91, - 0,0,0,114,142,0,0,0,114,148,0,0,0,114,152,0, - 0,0,114,107,0,0,0,114,93,0,0,0,114,158,0,0, - 0,114,159,0,0,0,114,94,0,0,0,114,160,0,0,0, - 114,173,0,0,0,114,178,0,0,0,114,188,0,0,0,114, - 190,0,0,0,114,195,0,0,0,114,200,0,0,0,90,15, - 95,69,82,82,95,77,83,71,95,80,82,69,70,73,88,114, - 202,0,0,0,114,205,0,0,0,218,6,111,98,106,101,99, - 116,114,206,0,0,0,114,207,0,0,0,114,208,0,0,0, - 114,213,0,0,0,114,219,0,0,0,114,222,0,0,0,114, - 223,0,0,0,114,227,0,0,0,114,228,0,0,0,114,230, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,8,60,109,111,100,117,108,101, - 62,1,0,0,0,115,94,0,0,0,4,24,4,2,8,8, - 8,8,4,2,4,3,16,4,14,68,14,21,14,16,8,37, - 8,17,8,11,14,8,8,11,8,12,8,16,8,36,14,101, - 16,26,10,45,14,72,8,17,8,17,8,30,8,37,8,42, - 8,15,14,73,14,79,14,13,8,9,8,9,10,47,8,16, - 4,1,8,2,8,27,6,3,8,16,10,15,14,37,8,27, - 10,37,8,7,8,35,8,8, + 0,0,0,115,10,0,0,0,116,0,160,1,124,1,161,1, + 83,0,41,1,122,46,82,101,116,117,114,110,32,84,114,117, + 101,32,105,102,32,116,104,101,32,102,114,111,122,101,110,32, + 109,111,100,117,108,101,32,105,115,32,97,32,112,97,99,107, + 97,103,101,46,41,2,114,57,0,0,0,90,17,105,115,95, + 102,114,111,122,101,110,95,112,97,99,107,97,103,101,114,168, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,114,115,0,0,0,82,3,0,0,115,2,0,0,0, + 0,4,122,25,70,114,111,122,101,110,73,109,112,111,114,116, + 101,114,46,105,115,95,112,97,99,107,97,103,101,41,2,78, + 78,41,1,78,41,17,114,1,0,0,0,114,0,0,0,0, + 114,2,0,0,0,114,3,0,0,0,114,138,0,0,0,114, + 171,0,0,0,114,99,0,0,0,114,172,0,0,0,114,166, + 0,0,0,114,167,0,0,0,114,149,0,0,0,114,150,0, + 0,0,114,155,0,0,0,114,90,0,0,0,114,169,0,0, + 0,114,170,0,0,0,114,115,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, + 173,0,0,0,12,3,0,0,115,46,0,0,0,8,2,4, + 7,4,2,2,1,10,8,2,1,12,6,2,1,12,8,2, + 1,10,3,2,1,10,8,2,1,10,8,2,1,2,1,12, + 4,2,1,2,1,12,4,2,1,2,1,114,173,0,0,0, + 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,64,0,0,0,115,32,0,0,0,101,0, + 90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,0, + 90,4,100,4,100,5,132,0,90,5,100,6,83,0,41,7, + 218,18,95,73,109,112,111,114,116,76,111,99,107,67,111,110, + 116,101,120,116,122,36,67,111,110,116,101,120,116,32,109,97, + 110,97,103,101,114,32,102,111,114,32,116,104,101,32,105,109, + 112,111,114,116,32,108,111,99,107,46,99,1,0,0,0,0, + 0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,67, + 0,0,0,115,12,0,0,0,116,0,160,1,161,0,1,0, + 100,1,83,0,41,2,122,24,65,99,113,117,105,114,101,32, + 116,104,101,32,105,109,112,111,114,116,32,108,111,99,107,46, + 78,41,2,114,57,0,0,0,114,58,0,0,0,114,47,0, + 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, + 0,114,54,0,0,0,95,3,0,0,115,2,0,0,0,0, + 2,122,28,95,73,109,112,111,114,116,76,111,99,107,67,111, + 110,116,101,120,116,46,95,95,101,110,116,101,114,95,95,99, + 4,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, + 2,0,0,0,67,0,0,0,115,12,0,0,0,116,0,160, + 1,161,0,1,0,100,1,83,0,41,2,122,60,82,101,108, + 101,97,115,101,32,116,104,101,32,105,109,112,111,114,116,32, + 108,111,99,107,32,114,101,103,97,114,100,108,101,115,115,32, + 111,102,32,97,110,121,32,114,97,105,115,101,100,32,101,120, + 99,101,112,116,105,111,110,115,46,78,41,2,114,57,0,0, + 0,114,60,0,0,0,41,4,114,30,0,0,0,218,8,101, + 120,99,95,116,121,112,101,218,9,101,120,99,95,118,97,108, + 117,101,218,13,101,120,99,95,116,114,97,99,101,98,97,99, + 107,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 114,56,0,0,0,99,3,0,0,115,2,0,0,0,0,2, + 122,27,95,73,109,112,111,114,116,76,111,99,107,67,111,110, + 116,101,120,116,46,95,95,101,120,105,116,95,95,78,41,6, + 114,1,0,0,0,114,0,0,0,0,114,2,0,0,0,114, + 3,0,0,0,114,54,0,0,0,114,56,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,114,178,0,0,0,91,3,0,0,115,6,0,0,0, + 8,2,4,2,8,4,114,178,0,0,0,99,3,0,0,0, + 0,0,0,0,0,0,0,0,5,0,0,0,5,0,0,0, + 67,0,0,0,115,64,0,0,0,124,1,160,0,100,1,124, + 2,100,2,24,0,161,2,125,3,116,1,124,3,131,1,124, + 2,107,0,114,36,116,2,100,3,131,1,130,1,124,3,100, + 4,25,0,125,4,124,0,114,60,100,5,160,3,124,4,124, + 0,161,2,83,0,124,4,83,0,41,6,122,50,82,101,115, + 111,108,118,101,32,97,32,114,101,108,97,116,105,118,101,32, + 109,111,100,117,108,101,32,110,97,109,101,32,116,111,32,97, + 110,32,97,98,115,111,108,117,116,101,32,111,110,101,46,114, + 128,0,0,0,114,37,0,0,0,122,50,97,116,116,101,109, + 112,116,101,100,32,114,101,108,97,116,105,118,101,32,105,109, + 112,111,114,116,32,98,101,121,111,110,100,32,116,111,112,45, + 108,101,118,101,108,32,112,97,99,107,97,103,101,114,22,0, + 0,0,250,5,123,125,46,123,125,41,4,218,6,114,115,112, + 108,105,116,218,3,108,101,110,218,10,86,97,108,117,101,69, + 114,114,111,114,114,45,0,0,0,41,5,114,17,0,0,0, + 218,7,112,97,99,107,97,103,101,218,5,108,101,118,101,108, + 90,4,98,105,116,115,90,4,98,97,115,101,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,218,13,95,114,101, + 115,111,108,118,101,95,110,97,109,101,104,3,0,0,115,10, + 0,0,0,0,2,16,1,12,1,8,1,8,1,114,188,0, + 0,0,99,3,0,0,0,0,0,0,0,0,0,0,0,4, + 0,0,0,4,0,0,0,67,0,0,0,115,34,0,0,0, + 124,0,160,0,124,1,124,2,161,2,125,3,124,3,100,0, + 107,8,114,24,100,0,83,0,116,1,124,1,124,3,131,2, + 83,0,114,13,0,0,0,41,2,114,167,0,0,0,114,91, + 0,0,0,41,4,218,6,102,105,110,100,101,114,114,17,0, + 0,0,114,164,0,0,0,114,109,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,218,17,95,102,105, + 110,100,95,115,112,101,99,95,108,101,103,97,99,121,113,3, + 0,0,115,8,0,0,0,0,3,12,1,8,1,4,1,114, + 190,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0, + 0,10,0,0,0,10,0,0,0,67,0,0,0,115,12,1, + 0,0,116,0,106,1,125,3,124,3,100,1,107,8,114,22, + 116,2,100,2,131,1,130,1,124,3,115,38,116,3,160,4, + 100,3,116,5,161,2,1,0,124,0,116,0,106,6,107,6, + 125,4,124,3,68,0,93,210,125,5,116,7,131,0,143,84, + 1,0,122,10,124,5,106,8,125,6,87,0,110,54,4,0, + 116,9,107,10,114,128,1,0,1,0,1,0,116,10,124,5, + 124,0,124,1,131,3,125,7,124,7,100,1,107,8,114,124, + 89,0,87,0,53,0,81,0,82,0,163,0,113,52,89,0, + 110,14,88,0,124,6,124,0,124,1,124,2,131,3,125,7, + 87,0,53,0,81,0,82,0,88,0,124,7,100,1,107,9, + 114,52,124,4,144,0,115,254,124,0,116,0,106,6,107,6, + 144,0,114,254,116,0,106,6,124,0,25,0,125,8,122,10, + 124,8,106,11,125,9,87,0,110,28,4,0,116,9,107,10, + 114,226,1,0,1,0,1,0,124,7,6,0,89,0,2,0, + 1,0,83,0,88,0,124,9,100,1,107,8,114,244,124,7, + 2,0,1,0,83,0,124,9,2,0,1,0,83,0,113,52, + 124,7,2,0,1,0,83,0,113,52,100,1,83,0,41,4, + 122,21,70,105,110,100,32,97,32,109,111,100,117,108,101,39, + 115,32,115,112,101,99,46,78,122,53,115,121,115,46,109,101, + 116,97,95,112,97,116,104,32,105,115,32,78,111,110,101,44, + 32,80,121,116,104,111,110,32,105,115,32,108,105,107,101,108, + 121,32,115,104,117,116,116,105,110,103,32,100,111,119,110,122, + 22,115,121,115,46,109,101,116,97,95,112,97,116,104,32,105, + 115,32,101,109,112,116,121,41,12,114,15,0,0,0,218,9, + 109,101,116,97,95,112,97,116,104,114,79,0,0,0,218,9, + 95,119,97,114,110,105,110,103,115,218,4,119,97,114,110,218, + 13,73,109,112,111,114,116,87,97,114,110,105,110,103,114,92, + 0,0,0,114,178,0,0,0,114,166,0,0,0,114,106,0, + 0,0,114,190,0,0,0,114,105,0,0,0,41,10,114,17, + 0,0,0,114,164,0,0,0,114,165,0,0,0,114,191,0, + 0,0,90,9,105,115,95,114,101,108,111,97,100,114,189,0, + 0,0,114,166,0,0,0,114,95,0,0,0,114,96,0,0, + 0,114,105,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,218,10,95,102,105,110,100,95,115,112,101, + 99,122,3,0,0,115,54,0,0,0,0,2,6,1,8,2, + 8,3,4,1,12,5,10,1,8,1,8,1,2,1,10,1, + 14,1,12,1,8,1,20,2,22,1,8,2,18,1,10,1, + 2,1,10,1,14,4,14,2,8,1,8,2,10,2,10,2, + 114,195,0,0,0,99,3,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,5,0,0,0,67,0,0,0,115,108, + 0,0,0,116,0,124,0,116,1,131,2,115,28,116,2,100, + 1,160,3,116,4,124,0,131,1,161,1,131,1,130,1,124, + 2,100,2,107,0,114,44,116,5,100,3,131,1,130,1,124, + 2,100,2,107,4,114,84,116,0,124,1,116,1,131,2,115, + 72,116,2,100,4,131,1,130,1,110,12,124,1,115,84,116, + 6,100,5,131,1,130,1,124,0,115,104,124,2,100,2,107, + 2,114,104,116,5,100,6,131,1,130,1,100,7,83,0,41, + 8,122,28,86,101,114,105,102,121,32,97,114,103,117,109,101, + 110,116,115,32,97,114,101,32,34,115,97,110,101,34,46,122, + 31,109,111,100,117,108,101,32,110,97,109,101,32,109,117,115, + 116,32,98,101,32,115,116,114,44,32,110,111,116,32,123,125, + 114,22,0,0,0,122,18,108,101,118,101,108,32,109,117,115, + 116,32,98,101,32,62,61,32,48,122,31,95,95,112,97,99, + 107,97,103,101,95,95,32,110,111,116,32,115,101,116,32,116, + 111,32,97,32,115,116,114,105,110,103,122,54,97,116,116,101, + 109,112,116,101,100,32,114,101,108,97,116,105,118,101,32,105, + 109,112,111,114,116,32,119,105,116,104,32,110,111,32,107,110, + 111,119,110,32,112,97,114,101,110,116,32,112,97,99,107,97, + 103,101,122,17,69,109,112,116,121,32,109,111,100,117,108,101, + 32,110,97,109,101,78,41,7,218,10,105,115,105,110,115,116, + 97,110,99,101,218,3,115,116,114,218,9,84,121,112,101,69, + 114,114,111,114,114,45,0,0,0,114,14,0,0,0,114,185, + 0,0,0,114,79,0,0,0,169,3,114,17,0,0,0,114, + 186,0,0,0,114,187,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,218,13,95,115,97,110,105,116, + 121,95,99,104,101,99,107,169,3,0,0,115,22,0,0,0, + 0,2,10,1,18,1,8,1,8,1,8,1,10,1,10,1, + 4,1,8,2,12,1,114,200,0,0,0,122,16,78,111,32, + 109,111,100,117,108,101,32,110,97,109,101,100,32,122,4,123, + 33,114,125,99,2,0,0,0,0,0,0,0,0,0,0,0, + 8,0,0,0,8,0,0,0,67,0,0,0,115,220,0,0, + 0,100,0,125,2,124,0,160,0,100,1,161,1,100,2,25, + 0,125,3,124,3,114,134,124,3,116,1,106,2,107,7,114, + 42,116,3,124,1,124,3,131,2,1,0,124,0,116,1,106, + 2,107,6,114,62,116,1,106,2,124,0,25,0,83,0,116, + 1,106,2,124,3,25,0,125,4,122,10,124,4,106,4,125, + 2,87,0,110,50,4,0,116,5,107,10,114,132,1,0,1, + 0,1,0,116,6,100,3,23,0,160,7,124,0,124,3,161, + 2,125,5,116,8,124,5,124,0,100,4,141,2,100,0,130, + 2,89,0,110,2,88,0,116,9,124,0,124,2,131,2,125, + 6,124,6,100,0,107,8,114,172,116,8,116,6,160,7,124, + 0,161,1,124,0,100,4,141,2,130,1,110,8,116,10,124, + 6,131,1,125,7,124,3,114,216,116,1,106,2,124,3,25, + 0,125,4,116,11,124,4,124,0,160,0,100,1,161,1,100, + 5,25,0,124,7,131,3,1,0,124,7,83,0,41,6,78, + 114,128,0,0,0,114,22,0,0,0,122,23,59,32,123,33, + 114,125,32,105,115,32,110,111,116,32,97,32,112,97,99,107, + 97,103,101,114,16,0,0,0,233,2,0,0,0,41,12,114, + 129,0,0,0,114,15,0,0,0,114,92,0,0,0,114,67, + 0,0,0,114,141,0,0,0,114,106,0,0,0,218,8,95, + 69,82,82,95,77,83,71,114,45,0,0,0,218,19,77,111, + 100,117,108,101,78,111,116,70,111,117,110,100,69,114,114,111, + 114,114,195,0,0,0,114,159,0,0,0,114,5,0,0,0, + 41,8,114,17,0,0,0,218,7,105,109,112,111,114,116,95, + 114,164,0,0,0,114,130,0,0,0,90,13,112,97,114,101, + 110,116,95,109,111,100,117,108,101,114,157,0,0,0,114,95, + 0,0,0,114,96,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,218,23,95,102,105,110,100,95,97, + 110,100,95,108,111,97,100,95,117,110,108,111,99,107,101,100, + 188,3,0,0,115,42,0,0,0,0,1,4,1,14,1,4, + 1,10,1,10,2,10,1,10,1,10,1,2,1,10,1,14, + 1,16,1,20,1,10,1,8,1,20,2,8,1,4,2,10, + 1,22,1,114,205,0,0,0,99,2,0,0,0,0,0,0, + 0,0,0,0,0,4,0,0,0,10,0,0,0,67,0,0, + 0,115,106,0,0,0,116,0,124,0,131,1,143,50,1,0, + 116,1,106,2,160,3,124,0,116,4,161,2,125,2,124,2, + 116,4,107,8,114,54,116,5,124,0,124,1,131,2,87,0, + 2,0,53,0,81,0,82,0,163,0,83,0,87,0,53,0, + 81,0,82,0,88,0,124,2,100,1,107,8,114,94,100,2, + 160,6,124,0,161,1,125,3,116,7,124,3,124,0,100,3, + 141,2,130,1,116,8,124,0,131,1,1,0,124,2,83,0, + 41,4,122,25,70,105,110,100,32,97,110,100,32,108,111,97, + 100,32,116,104,101,32,109,111,100,117,108,101,46,78,122,40, + 105,109,112,111,114,116,32,111,102,32,123,125,32,104,97,108, + 116,101,100,59,32,78,111,110,101,32,105,110,32,115,121,115, + 46,109,111,100,117,108,101,115,114,16,0,0,0,41,9,114, + 50,0,0,0,114,15,0,0,0,114,92,0,0,0,114,34, + 0,0,0,218,14,95,78,69,69,68,83,95,76,79,65,68, + 73,78,71,114,205,0,0,0,114,45,0,0,0,114,203,0, + 0,0,114,65,0,0,0,41,4,114,17,0,0,0,114,204, + 0,0,0,114,96,0,0,0,114,75,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,218,14,95,102, + 105,110,100,95,97,110,100,95,108,111,97,100,218,3,0,0, + 115,22,0,0,0,0,2,10,1,14,1,8,1,32,2,8, + 1,4,1,2,255,4,2,12,2,8,1,114,207,0,0,0, + 114,22,0,0,0,99,3,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,4,0,0,0,67,0,0,0,115,42, + 0,0,0,116,0,124,0,124,1,124,2,131,3,1,0,124, + 2,100,1,107,4,114,32,116,1,124,0,124,1,124,2,131, + 3,125,0,116,2,124,0,116,3,131,2,83,0,41,2,97, + 50,1,0,0,73,109,112,111,114,116,32,97,110,100,32,114, + 101,116,117,114,110,32,116,104,101,32,109,111,100,117,108,101, + 32,98,97,115,101,100,32,111,110,32,105,116,115,32,110,97, + 109,101,44,32,116,104,101,32,112,97,99,107,97,103,101,32, + 116,104,101,32,99,97,108,108,32,105,115,10,32,32,32,32, + 98,101,105,110,103,32,109,97,100,101,32,102,114,111,109,44, + 32,97,110,100,32,116,104,101,32,108,101,118,101,108,32,97, + 100,106,117,115,116,109,101,110,116,46,10,10,32,32,32,32, + 84,104,105,115,32,102,117,110,99,116,105,111,110,32,114,101, + 112,114,101,115,101,110,116,115,32,116,104,101,32,103,114,101, + 97,116,101,115,116,32,99,111,109,109,111,110,32,100,101,110, + 111,109,105,110,97,116,111,114,32,111,102,32,102,117,110,99, + 116,105,111,110,97,108,105,116,121,10,32,32,32,32,98,101, + 116,119,101,101,110,32,105,109,112,111,114,116,95,109,111,100, + 117,108,101,32,97,110,100,32,95,95,105,109,112,111,114,116, + 95,95,46,32,84,104,105,115,32,105,110,99,108,117,100,101, + 115,32,115,101,116,116,105,110,103,32,95,95,112,97,99,107, + 97,103,101,95,95,32,105,102,10,32,32,32,32,116,104,101, + 32,108,111,97,100,101,114,32,100,105,100,32,110,111,116,46, + 10,10,32,32,32,32,114,22,0,0,0,41,4,114,200,0, + 0,0,114,188,0,0,0,114,207,0,0,0,218,11,95,103, + 99,100,95,105,109,112,111,114,116,114,199,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,114,208,0, + 0,0,234,3,0,0,115,8,0,0,0,0,9,12,1,8, + 1,12,1,114,208,0,0,0,169,1,218,9,114,101,99,117, + 114,115,105,118,101,99,3,0,0,0,0,0,0,0,1,0, + 0,0,8,0,0,0,11,0,0,0,67,0,0,0,115,226, + 0,0,0,124,1,68,0,93,216,125,4,116,0,124,4,116, + 1,131,2,115,66,124,3,114,34,124,0,106,2,100,1,23, + 0,125,5,110,4,100,2,125,5,116,3,100,3,124,5,155, + 0,100,4,116,4,124,4,131,1,106,2,155,0,157,4,131, + 1,130,1,113,4,124,4,100,5,107,2,114,108,124,3,115, + 220,116,5,124,0,100,6,131,2,114,220,116,6,124,0,124, + 0,106,7,124,2,100,7,100,8,141,4,1,0,113,4,116, + 5,124,0,124,4,131,2,115,4,100,9,160,8,124,0,106, + 2,124,4,161,2,125,6,122,14,116,9,124,2,124,6,131, + 2,1,0,87,0,113,4,4,0,116,10,107,10,114,218,1, + 0,125,7,1,0,122,42,124,7,106,11,124,6,107,2,114, + 200,116,12,106,13,160,14,124,6,116,15,161,2,100,10,107, + 9,114,200,87,0,89,0,162,8,113,4,130,0,87,0,53, + 0,100,10,125,7,126,7,88,0,89,0,113,4,88,0,113, + 4,124,0,83,0,41,11,122,238,70,105,103,117,114,101,32, + 111,117,116,32,119,104,97,116,32,95,95,105,109,112,111,114, + 116,95,95,32,115,104,111,117,108,100,32,114,101,116,117,114, + 110,46,10,10,32,32,32,32,84,104,101,32,105,109,112,111, + 114,116,95,32,112,97,114,97,109,101,116,101,114,32,105,115, + 32,97,32,99,97,108,108,97,98,108,101,32,119,104,105,99, + 104,32,116,97,107,101,115,32,116,104,101,32,110,97,109,101, + 32,111,102,32,109,111,100,117,108,101,32,116,111,10,32,32, + 32,32,105,109,112,111,114,116,46,32,73,116,32,105,115,32, + 114,101,113,117,105,114,101,100,32,116,111,32,100,101,99,111, + 117,112,108,101,32,116,104,101,32,102,117,110,99,116,105,111, + 110,32,102,114,111,109,32,97,115,115,117,109,105,110,103,32, + 105,109,112,111,114,116,108,105,98,39,115,10,32,32,32,32, + 105,109,112,111,114,116,32,105,109,112,108,101,109,101,110,116, + 97,116,105,111,110,32,105,115,32,100,101,115,105,114,101,100, + 46,10,10,32,32,32,32,122,8,46,95,95,97,108,108,95, + 95,122,13,96,96,102,114,111,109,32,108,105,115,116,39,39, + 122,8,73,116,101,109,32,105,110,32,122,18,32,109,117,115, + 116,32,98,101,32,115,116,114,44,32,110,111,116,32,250,1, + 42,218,7,95,95,97,108,108,95,95,84,114,209,0,0,0, + 114,182,0,0,0,78,41,16,114,196,0,0,0,114,197,0, + 0,0,114,1,0,0,0,114,198,0,0,0,114,14,0,0, + 0,114,4,0,0,0,218,16,95,104,97,110,100,108,101,95, + 102,114,111,109,108,105,115,116,114,212,0,0,0,114,45,0, + 0,0,114,67,0,0,0,114,203,0,0,0,114,17,0,0, + 0,114,15,0,0,0,114,92,0,0,0,114,34,0,0,0, + 114,206,0,0,0,41,8,114,96,0,0,0,218,8,102,114, + 111,109,108,105,115,116,114,204,0,0,0,114,210,0,0,0, + 218,1,120,90,5,119,104,101,114,101,90,9,102,114,111,109, + 95,110,97,109,101,90,3,101,120,99,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,213,0,0,0,249,3, + 0,0,115,44,0,0,0,0,10,8,1,10,1,4,1,12, + 2,4,1,28,2,8,1,14,1,10,1,2,255,8,2,10, + 1,14,1,2,1,14,1,16,4,10,1,16,255,2,2,8, + 1,22,1,114,213,0,0,0,99,1,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,6,0,0,0,67,0,0, + 0,115,146,0,0,0,124,0,160,0,100,1,161,1,125,1, + 124,0,160,0,100,2,161,1,125,2,124,1,100,3,107,9, + 114,82,124,2,100,3,107,9,114,78,124,1,124,2,106,1, + 107,3,114,78,116,2,106,3,100,4,124,1,155,2,100,5, + 124,2,106,1,155,2,100,6,157,5,116,4,100,7,100,8, + 141,3,1,0,124,1,83,0,124,2,100,3,107,9,114,96, + 124,2,106,1,83,0,116,2,106,3,100,9,116,4,100,7, + 100,8,141,3,1,0,124,0,100,10,25,0,125,1,100,11, + 124,0,107,7,114,142,124,1,160,5,100,12,161,1,100,13, + 25,0,125,1,124,1,83,0,41,14,122,167,67,97,108,99, + 117,108,97,116,101,32,119,104,97,116,32,95,95,112,97,99, + 107,97,103,101,95,95,32,115,104,111,117,108,100,32,98,101, + 46,10,10,32,32,32,32,95,95,112,97,99,107,97,103,101, + 95,95,32,105,115,32,110,111,116,32,103,117,97,114,97,110, + 116,101,101,100,32,116,111,32,98,101,32,100,101,102,105,110, + 101,100,32,111,114,32,99,111,117,108,100,32,98,101,32,115, + 101,116,32,116,111,32,78,111,110,101,10,32,32,32,32,116, + 111,32,114,101,112,114,101,115,101,110,116,32,116,104,97,116, + 32,105,116,115,32,112,114,111,112,101,114,32,118,97,108,117, + 101,32,105,115,32,117,110,107,110,111,119,110,46,10,10,32, + 32,32,32,114,145,0,0,0,114,105,0,0,0,78,122,32, + 95,95,112,97,99,107,97,103,101,95,95,32,33,61,32,95, + 95,115,112,101,99,95,95,46,112,97,114,101,110,116,32,40, + 122,4,32,33,61,32,250,1,41,233,3,0,0,0,41,1, + 90,10,115,116,97,99,107,108,101,118,101,108,122,89,99,97, + 110,39,116,32,114,101,115,111,108,118,101,32,112,97,99,107, + 97,103,101,32,102,114,111,109,32,95,95,115,112,101,99,95, + 95,32,111,114,32,95,95,112,97,99,107,97,103,101,95,95, + 44,32,102,97,108,108,105,110,103,32,98,97,99,107,32,111, + 110,32,95,95,110,97,109,101,95,95,32,97,110,100,32,95, + 95,112,97,116,104,95,95,114,1,0,0,0,114,141,0,0, + 0,114,128,0,0,0,114,22,0,0,0,41,6,114,34,0, + 0,0,114,130,0,0,0,114,192,0,0,0,114,193,0,0, + 0,114,194,0,0,0,114,129,0,0,0,41,3,218,7,103, + 108,111,98,97,108,115,114,186,0,0,0,114,95,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, + 17,95,99,97,108,99,95,95,95,112,97,99,107,97,103,101, + 95,95,30,4,0,0,115,38,0,0,0,0,7,10,1,10, + 1,8,1,18,1,22,2,2,0,2,254,6,3,4,1,8, + 1,6,2,6,2,2,0,2,254,6,3,8,1,8,1,14, + 1,114,219,0,0,0,114,10,0,0,0,99,5,0,0,0, + 0,0,0,0,0,0,0,0,9,0,0,0,5,0,0,0, + 67,0,0,0,115,180,0,0,0,124,4,100,1,107,2,114, + 18,116,0,124,0,131,1,125,5,110,36,124,1,100,2,107, + 9,114,30,124,1,110,2,105,0,125,6,116,1,124,6,131, + 1,125,7,116,0,124,0,124,7,124,4,131,3,125,5,124, + 3,115,150,124,4,100,1,107,2,114,84,116,0,124,0,160, + 2,100,3,161,1,100,1,25,0,131,1,83,0,124,0,115, + 92,124,5,83,0,116,3,124,0,131,1,116,3,124,0,160, + 2,100,3,161,1,100,1,25,0,131,1,24,0,125,8,116, + 4,106,5,124,5,106,6,100,2,116,3,124,5,106,6,131, + 1,124,8,24,0,133,2,25,0,25,0,83,0,110,26,116, + 7,124,5,100,4,131,2,114,172,116,8,124,5,124,3,116, + 0,131,3,83,0,124,5,83,0,100,2,83,0,41,5,97, + 215,1,0,0,73,109,112,111,114,116,32,97,32,109,111,100, + 117,108,101,46,10,10,32,32,32,32,84,104,101,32,39,103, + 108,111,98,97,108,115,39,32,97,114,103,117,109,101,110,116, + 32,105,115,32,117,115,101,100,32,116,111,32,105,110,102,101, + 114,32,119,104,101,114,101,32,116,104,101,32,105,109,112,111, + 114,116,32,105,115,32,111,99,99,117,114,114,105,110,103,32, + 102,114,111,109,10,32,32,32,32,116,111,32,104,97,110,100, + 108,101,32,114,101,108,97,116,105,118,101,32,105,109,112,111, + 114,116,115,46,32,84,104,101,32,39,108,111,99,97,108,115, + 39,32,97,114,103,117,109,101,110,116,32,105,115,32,105,103, + 110,111,114,101,100,46,32,84,104,101,10,32,32,32,32,39, + 102,114,111,109,108,105,115,116,39,32,97,114,103,117,109,101, + 110,116,32,115,112,101,99,105,102,105,101,115,32,119,104,97, + 116,32,115,104,111,117,108,100,32,101,120,105,115,116,32,97, + 115,32,97,116,116,114,105,98,117,116,101,115,32,111,110,32, + 116,104,101,32,109,111,100,117,108,101,10,32,32,32,32,98, + 101,105,110,103,32,105,109,112,111,114,116,101,100,32,40,101, + 46,103,46,32,96,96,102,114,111,109,32,109,111,100,117,108, + 101,32,105,109,112,111,114,116,32,60,102,114,111,109,108,105, + 115,116,62,96,96,41,46,32,32,84,104,101,32,39,108,101, + 118,101,108,39,10,32,32,32,32,97,114,103,117,109,101,110, + 116,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101, + 32,112,97,99,107,97,103,101,32,108,111,99,97,116,105,111, + 110,32,116,111,32,105,109,112,111,114,116,32,102,114,111,109, + 32,105,110,32,97,32,114,101,108,97,116,105,118,101,10,32, + 32,32,32,105,109,112,111,114,116,32,40,101,46,103,46,32, + 96,96,102,114,111,109,32,46,46,112,107,103,32,105,109,112, + 111,114,116,32,109,111,100,96,96,32,119,111,117,108,100,32, + 104,97,118,101,32,97,32,39,108,101,118,101,108,39,32,111, + 102,32,50,41,46,10,10,32,32,32,32,114,22,0,0,0, + 78,114,128,0,0,0,114,141,0,0,0,41,9,114,208,0, + 0,0,114,219,0,0,0,218,9,112,97,114,116,105,116,105, + 111,110,114,184,0,0,0,114,15,0,0,0,114,92,0,0, + 0,114,1,0,0,0,114,4,0,0,0,114,213,0,0,0, + 41,9,114,17,0,0,0,114,218,0,0,0,218,6,108,111, + 99,97,108,115,114,214,0,0,0,114,187,0,0,0,114,96, + 0,0,0,90,8,103,108,111,98,97,108,115,95,114,186,0, + 0,0,90,7,99,117,116,95,111,102,102,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,218,10,95,95,105,109, + 112,111,114,116,95,95,57,4,0,0,115,30,0,0,0,0, + 11,8,1,10,2,16,1,8,1,12,1,4,3,8,1,18, + 1,4,1,4,4,26,3,32,1,10,1,12,2,114,222,0, + 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,3,0,0,0,67,0,0,0,115,38,0,0,0, + 116,0,160,1,124,0,161,1,125,1,124,1,100,0,107,8, + 114,30,116,2,100,1,124,0,23,0,131,1,130,1,116,3, + 124,1,131,1,83,0,41,2,78,122,25,110,111,32,98,117, + 105,108,116,45,105,110,32,109,111,100,117,108,101,32,110,97, + 109,101,100,32,41,4,114,160,0,0,0,114,166,0,0,0, + 114,79,0,0,0,114,159,0,0,0,41,2,114,17,0,0, + 0,114,95,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,218,18,95,98,117,105,108,116,105,110,95, + 102,114,111,109,95,110,97,109,101,94,4,0,0,115,8,0, + 0,0,0,1,10,1,8,1,12,1,114,223,0,0,0,99, + 2,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0, + 5,0,0,0,67,0,0,0,115,166,0,0,0,124,1,97, + 0,124,0,97,1,116,2,116,1,131,1,125,2,116,1,106, + 3,160,4,161,0,68,0,93,72,92,2,125,3,125,4,116, + 5,124,4,124,2,131,2,114,26,124,3,116,1,106,6,107, + 6,114,60,116,7,125,5,110,18,116,0,160,8,124,3,161, + 1,114,26,116,9,125,5,110,2,113,26,116,10,124,4,124, + 5,131,2,125,6,116,11,124,6,124,4,131,2,1,0,113, + 26,116,1,106,3,116,12,25,0,125,7,100,1,68,0,93, + 46,125,8,124,8,116,1,106,3,107,7,114,138,116,13,124, + 8,131,1,125,9,110,10,116,1,106,3,124,8,25,0,125, + 9,116,14,124,7,124,8,124,9,131,3,1,0,113,114,100, + 2,83,0,41,3,122,250,83,101,116,117,112,32,105,109,112, + 111,114,116,108,105,98,32,98,121,32,105,109,112,111,114,116, + 105,110,103,32,110,101,101,100,101,100,32,98,117,105,108,116, + 45,105,110,32,109,111,100,117,108,101,115,32,97,110,100,32, + 105,110,106,101,99,116,105,110,103,32,116,104,101,109,10,32, + 32,32,32,105,110,116,111,32,116,104,101,32,103,108,111,98, + 97,108,32,110,97,109,101,115,112,97,99,101,46,10,10,32, + 32,32,32,65,115,32,115,121,115,32,105,115,32,110,101,101, + 100,101,100,32,102,111,114,32,115,121,115,46,109,111,100,117, + 108,101,115,32,97,99,99,101,115,115,32,97,110,100,32,95, + 105,109,112,32,105,115,32,110,101,101,100,101,100,32,116,111, + 32,108,111,97,100,32,98,117,105,108,116,45,105,110,10,32, + 32,32,32,109,111,100,117,108,101,115,44,32,116,104,111,115, + 101,32,116,119,111,32,109,111,100,117,108,101,115,32,109,117, + 115,116,32,98,101,32,101,120,112,108,105,99,105,116,108,121, + 32,112,97,115,115,101,100,32,105,110,46,10,10,32,32,32, + 32,41,3,114,23,0,0,0,114,192,0,0,0,114,64,0, + 0,0,78,41,15,114,57,0,0,0,114,15,0,0,0,114, + 14,0,0,0,114,92,0,0,0,218,5,105,116,101,109,115, + 114,196,0,0,0,114,78,0,0,0,114,160,0,0,0,114, + 88,0,0,0,114,173,0,0,0,114,142,0,0,0,114,148, + 0,0,0,114,1,0,0,0,114,223,0,0,0,114,5,0, + 0,0,41,10,218,10,115,121,115,95,109,111,100,117,108,101, + 218,11,95,105,109,112,95,109,111,100,117,108,101,90,11,109, + 111,100,117,108,101,95,116,121,112,101,114,17,0,0,0,114, + 96,0,0,0,114,109,0,0,0,114,95,0,0,0,90,11, + 115,101,108,102,95,109,111,100,117,108,101,90,12,98,117,105, + 108,116,105,110,95,110,97,109,101,90,14,98,117,105,108,116, + 105,110,95,109,111,100,117,108,101,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,218,6,95,115,101,116,117,112, + 101,4,0,0,115,36,0,0,0,0,9,4,1,4,3,8, + 1,18,1,10,1,10,1,6,1,10,1,6,2,2,1,10, + 1,12,3,10,1,8,1,10,1,10,2,10,1,114,227,0, + 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,3,0,0,0,67,0,0,0,115,38,0,0,0, + 116,0,124,0,124,1,131,2,1,0,116,1,106,2,160,3, + 116,4,161,1,1,0,116,1,106,2,160,3,116,5,161,1, + 1,0,100,1,83,0,41,2,122,48,73,110,115,116,97,108, + 108,32,105,109,112,111,114,116,101,114,115,32,102,111,114,32, + 98,117,105,108,116,105,110,32,97,110,100,32,102,114,111,122, + 101,110,32,109,111,100,117,108,101,115,78,41,6,114,227,0, + 0,0,114,15,0,0,0,114,191,0,0,0,114,120,0,0, + 0,114,160,0,0,0,114,173,0,0,0,41,2,114,225,0, + 0,0,114,226,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,8,95,105,110,115,116,97,108,108, + 136,4,0,0,115,6,0,0,0,0,2,10,2,12,1,114, + 228,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,4,0,0,0,67,0,0,0,115,32,0, + 0,0,100,1,100,2,108,0,125,0,124,0,97,1,124,0, + 160,2,116,3,106,4,116,5,25,0,161,1,1,0,100,2, + 83,0,41,3,122,57,73,110,115,116,97,108,108,32,105,109, + 112,111,114,116,101,114,115,32,116,104,97,116,32,114,101,113, + 117,105,114,101,32,101,120,116,101,114,110,97,108,32,102,105, + 108,101,115,121,115,116,101,109,32,97,99,99,101,115,115,114, + 22,0,0,0,78,41,6,218,26,95,102,114,111,122,101,110, + 95,105,109,112,111,114,116,108,105,98,95,101,120,116,101,114, + 110,97,108,114,126,0,0,0,114,228,0,0,0,114,15,0, + 0,0,114,92,0,0,0,114,1,0,0,0,41,1,114,229, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,218,27,95,105,110,115,116,97,108,108,95,101,120,116, + 101,114,110,97,108,95,105,109,112,111,114,116,101,114,115,144, + 4,0,0,115,6,0,0,0,0,3,8,1,4,1,114,230, + 0,0,0,41,2,78,78,41,1,78,41,2,78,114,22,0, + 0,0,41,4,78,78,114,10,0,0,0,114,22,0,0,0, + 41,50,114,3,0,0,0,114,126,0,0,0,114,12,0,0, + 0,114,18,0,0,0,114,59,0,0,0,114,33,0,0,0, + 114,42,0,0,0,114,19,0,0,0,114,20,0,0,0,114, + 49,0,0,0,114,50,0,0,0,114,53,0,0,0,114,65, + 0,0,0,114,67,0,0,0,114,76,0,0,0,114,86,0, + 0,0,114,90,0,0,0,114,97,0,0,0,114,111,0,0, + 0,114,112,0,0,0,114,91,0,0,0,114,142,0,0,0, + 114,148,0,0,0,114,152,0,0,0,114,107,0,0,0,114, + 93,0,0,0,114,158,0,0,0,114,159,0,0,0,114,94, + 0,0,0,114,160,0,0,0,114,173,0,0,0,114,178,0, + 0,0,114,188,0,0,0,114,190,0,0,0,114,195,0,0, + 0,114,200,0,0,0,90,15,95,69,82,82,95,77,83,71, + 95,80,82,69,70,73,88,114,202,0,0,0,114,205,0,0, + 0,218,6,111,98,106,101,99,116,114,206,0,0,0,114,207, + 0,0,0,114,208,0,0,0,114,213,0,0,0,114,219,0, + 0,0,114,222,0,0,0,114,223,0,0,0,114,227,0,0, + 0,114,228,0,0,0,114,230,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, + 8,60,109,111,100,117,108,101,62,1,0,0,0,115,94,0, + 0,0,4,24,4,2,8,8,8,8,4,2,4,3,16,4, + 14,68,14,21,14,16,8,37,8,17,8,11,14,8,8,11, + 8,12,8,16,8,36,14,101,16,26,10,45,14,72,8,17, + 8,17,8,30,8,37,8,42,8,15,14,73,14,79,14,13, + 8,9,8,9,10,47,8,16,4,1,8,2,8,27,6,3, + 8,16,10,15,14,37,8,27,10,37,8,7,8,35,8,8, }; diff --git a/Python/importlib_external.h b/Python/importlib_external.h index e724560d67a1..9b86fe6b72a9 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -1,1003 +1,1001 @@ /* Auto-generated by Programs/_freeze_importlib.c */ const unsigned char _Py_M__importlib_bootstrap_external[] = { 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,5,0,0,0,64,0,0,0,115,52,2,0,0,100,0, + 0,5,0,0,0,64,0,0,0,115,32,2,0,0,100,0, 90,0,100,1,90,1,100,2,90,2,101,2,101,1,23,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,132,0,90,8,100,13,100,14,132,0, 90,9,100,15,100,16,132,0,90,10,100,17,100,18,132,0, 90,11,100,19,100,20,132,0,90,12,100,21,100,22,132,0, - 90,13,100,23,100,24,132,0,90,14,100,25,102,1,100,26, - 100,27,132,1,90,15,101,16,101,15,106,17,131,1,90,18, - 100,28,160,19,100,29,100,30,161,2,100,31,23,0,90,20, - 101,21,160,22,101,20,100,30,161,2,90,23,100,32,90,24, - 100,33,90,25,100,34,103,1,90,26,100,35,103,1,90,27, - 101,27,4,0,90,28,90,29,100,36,102,1,100,36,100,37, - 156,1,100,38,100,39,132,3,90,30,100,40,100,41,132,0, - 90,31,100,42,100,43,132,0,90,32,100,44,100,45,132,0, - 90,33,100,46,100,47,132,0,90,34,100,48,100,49,132,0, - 90,35,100,50,100,51,132,0,90,36,100,52,100,53,132,0, - 90,37,100,54,100,55,132,0,90,38,100,56,100,57,132,0, - 90,39,100,36,100,36,100,36,102,3,100,58,100,59,132,1, - 90,40,100,60,100,60,102,2,100,61,100,62,132,1,90,41, - 100,63,102,1,100,64,100,65,132,1,90,42,100,66,100,67, - 132,0,90,43,101,44,131,0,90,45,100,36,102,1,100,36, - 101,45,100,68,156,2,100,69,100,70,132,3,90,46,71,0, - 100,71,100,72,132,0,100,72,131,2,90,47,71,0,100,73, - 100,74,132,0,100,74,131,2,90,48,71,0,100,75,100,76, - 132,0,100,76,101,48,131,3,90,49,71,0,100,77,100,78, - 132,0,100,78,131,2,90,50,71,0,100,79,100,80,132,0, - 100,80,101,50,101,49,131,4,90,51,71,0,100,81,100,82, - 132,0,100,82,101,50,101,48,131,4,90,52,103,0,90,53, - 71,0,100,83,100,84,132,0,100,84,101,50,101,48,131,4, - 90,54,71,0,100,85,100,86,132,0,100,86,131,2,90,55, - 71,0,100,87,100,88,132,0,100,88,131,2,90,56,71,0, - 100,89,100,90,132,0,100,90,131,2,90,57,71,0,100,91, - 100,92,132,0,100,92,131,2,90,58,100,36,102,1,100,93, - 100,94,132,1,90,59,100,95,100,96,132,0,90,60,100,97, - 100,98,132,0,90,61,100,99,100,100,132,0,90,62,100,36, - 83,0,41,101,97,94,1,0,0,67,111,114,101,32,105,109, - 112,108,101,109,101,110,116,97,116,105,111,110,32,111,102,32, - 112,97,116,104,45,98,97,115,101,100,32,105,109,112,111,114, - 116,46,10,10,84,104,105,115,32,109,111,100,117,108,101,32, - 105,115,32,78,79,84,32,109,101,97,110,116,32,116,111,32, - 98,101,32,100,105,114,101,99,116,108,121,32,105,109,112,111, - 114,116,101,100,33,32,73,116,32,104,97,115,32,98,101,101, - 110,32,100,101,115,105,103,110,101,100,32,115,117,99,104,10, - 116,104,97,116,32,105,116,32,99,97,110,32,98,101,32,98, - 111,111,116,115,116,114,97,112,112,101,100,32,105,110,116,111, - 32,80,121,116,104,111,110,32,97,115,32,116,104,101,32,105, - 109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,102, - 32,105,109,112,111,114,116,46,32,65,115,10,115,117,99,104, - 32,105,116,32,114,101,113,117,105,114,101,115,32,116,104,101, - 32,105,110,106,101,99,116,105,111,110,32,111,102,32,115,112, - 101,99,105,102,105,99,32,109,111,100,117,108,101,115,32,97, - 110,100,32,97,116,116,114,105,98,117,116,101,115,32,105,110, - 32,111,114,100,101,114,32,116,111,10,119,111,114,107,46,32, - 79,110,101,32,115,104,111,117,108,100,32,117,115,101,32,105, - 109,112,111,114,116,108,105,98,32,97,115,32,116,104,101,32, - 112,117,98,108,105,99,45,102,97,99,105,110,103,32,118,101, - 114,115,105,111,110,32,111,102,32,116,104,105,115,32,109,111, - 100,117,108,101,46,10,10,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,3,0,0,0,115,60,0,0,0,116,0, - 106,1,160,2,116,3,161,1,114,48,116,0,106,1,160,2, - 116,4,161,1,114,30,100,1,137,0,110,4,100,2,137,0, - 135,0,102,1,100,3,100,4,132,8,125,0,110,8,100,5, - 100,4,132,0,125,0,124,0,83,0,41,6,78,90,12,80, - 89,84,72,79,78,67,65,83,69,79,75,115,12,0,0,0, - 80,89,84,72,79,78,67,65,83,69,79,75,99,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,19,0,0,0,115,10,0,0,0,136,0,116,0,106,1, - 107,6,83,0,41,1,250,53,84,114,117,101,32,105,102,32, - 102,105,108,101,110,97,109,101,115,32,109,117,115,116,32,98, - 101,32,99,104,101,99,107,101,100,32,99,97,115,101,45,105, - 110,115,101,110,115,105,116,105,118,101,108,121,46,41,2,218, - 3,95,111,115,90,7,101,110,118,105,114,111,110,169,0,169, - 1,218,3,107,101,121,114,3,0,0,0,250,38,60,102,114, - 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95, - 98,111,111,116,115,116,114,97,112,95,101,120,116,101,114,110, - 97,108,62,218,11,95,114,101,108,97,120,95,99,97,115,101, - 36,0,0,0,115,2,0,0,0,0,2,122,37,95,109,97, - 107,101,95,114,101,108,97,120,95,99,97,115,101,46,60,108, - 111,99,97,108,115,62,46,95,114,101,108,97,120,95,99,97, - 115,101,99,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,83,0,0,0,115,4,0,0,0, - 100,1,83,0,41,2,114,1,0,0,0,70,114,3,0,0, - 0,114,3,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,7,0,0,0,40,0,0,0,115,2, - 0,0,0,0,2,41,5,218,3,115,121,115,218,8,112,108, - 97,116,102,111,114,109,218,10,115,116,97,114,116,115,119,105, - 116,104,218,27,95,67,65,83,69,95,73,78,83,69,78,83, - 73,84,73,86,69,95,80,76,65,84,70,79,82,77,83,218, - 35,95,67,65,83,69,95,73,78,83,69,78,83,73,84,73, - 86,69,95,80,76,65,84,70,79,82,77,83,95,83,84,82, - 95,75,69,89,41,1,114,7,0,0,0,114,3,0,0,0, - 114,4,0,0,0,114,6,0,0,0,218,16,95,109,97,107, - 101,95,114,101,108,97,120,95,99,97,115,101,29,0,0,0, - 115,14,0,0,0,0,1,12,1,12,1,6,2,4,2,14, - 4,8,3,114,13,0,0,0,99,1,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,4,0,0,0,67,0,0, - 0,115,20,0,0,0,116,0,124,0,131,1,100,1,64,0, - 160,1,100,2,100,3,161,2,83,0,41,4,122,42,67,111, - 110,118,101,114,116,32,97,32,51,50,45,98,105,116,32,105, - 110,116,101,103,101,114,32,116,111,32,108,105,116,116,108,101, - 45,101,110,100,105,97,110,46,236,3,0,0,0,255,127,255, - 127,3,0,233,4,0,0,0,218,6,108,105,116,116,108,101, - 41,2,218,3,105,110,116,218,8,116,111,95,98,121,116,101, - 115,41,1,218,1,120,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,12,95,112,97,99,107,95,117,105,110, - 116,51,50,46,0,0,0,115,2,0,0,0,0,2,114,20, - 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,4,0,0,0,67,0,0,0,115,28,0,0, - 0,116,0,124,0,131,1,100,1,107,2,115,16,116,1,130, - 1,116,2,160,3,124,0,100,2,161,2,83,0,41,3,122, - 47,67,111,110,118,101,114,116,32,52,32,98,121,116,101,115, - 32,105,110,32,108,105,116,116,108,101,45,101,110,100,105,97, - 110,32,116,111,32,97,110,32,105,110,116,101,103,101,114,46, - 114,15,0,0,0,114,16,0,0,0,169,4,218,3,108,101, - 110,218,14,65,115,115,101,114,116,105,111,110,69,114,114,111, - 114,114,17,0,0,0,218,10,102,114,111,109,95,98,121,116, - 101,115,169,1,218,4,100,97,116,97,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,14,95,117,110,112,97, - 99,107,95,117,105,110,116,51,50,51,0,0,0,115,4,0, - 0,0,0,2,16,1,114,27,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0, - 67,0,0,0,115,28,0,0,0,116,0,124,0,131,1,100, - 1,107,2,115,16,116,1,130,1,116,2,160,3,124,0,100, - 2,161,2,83,0,41,3,122,47,67,111,110,118,101,114,116, - 32,50,32,98,121,116,101,115,32,105,110,32,108,105,116,116, - 108,101,45,101,110,100,105,97,110,32,116,111,32,97,110,32, - 105,110,116,101,103,101,114,46,233,2,0,0,0,114,16,0, - 0,0,114,21,0,0,0,114,25,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,218,14,95,117,110, - 112,97,99,107,95,117,105,110,116,49,54,56,0,0,0,115, - 4,0,0,0,0,2,16,1,114,29,0,0,0,99,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0, - 0,0,71,0,0,0,115,20,0,0,0,116,0,160,1,100, - 1,100,2,132,0,124,0,68,0,131,1,161,1,83,0,41, - 3,122,31,82,101,112,108,97,99,101,109,101,110,116,32,102, - 111,114,32,111,115,46,112,97,116,104,46,106,111,105,110,40, - 41,46,99,1,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,5,0,0,0,83,0,0,0,115,26,0,0,0, - 103,0,124,0,93,18,125,1,124,1,114,22,124,1,160,0, - 116,1,161,1,145,2,113,4,83,0,114,3,0,0,0,41, - 2,218,6,114,115,116,114,105,112,218,15,112,97,116,104,95, - 115,101,112,97,114,97,116,111,114,115,41,2,218,2,46,48, - 218,4,112,97,114,116,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,10,60,108,105,115,116,99,111,109,112, - 62,64,0,0,0,115,6,0,0,0,6,1,2,0,4,255, - 122,30,95,112,97,116,104,95,106,111,105,110,46,60,108,111, - 99,97,108,115,62,46,60,108,105,115,116,99,111,109,112,62, - 41,2,218,8,112,97,116,104,95,115,101,112,218,4,106,111, - 105,110,41,1,218,10,112,97,116,104,95,112,97,114,116,115, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, - 10,95,112,97,116,104,95,106,111,105,110,62,0,0,0,115, - 6,0,0,0,0,2,10,1,2,255,114,38,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, - 5,0,0,0,67,0,0,0,115,96,0,0,0,116,0,116, - 1,131,1,100,1,107,2,114,36,124,0,160,2,116,3,161, - 1,92,3,125,1,125,2,125,3,124,1,124,3,102,2,83, - 0,116,4,124,0,131,1,68,0,93,42,125,4,124,4,116, - 1,107,6,114,44,124,0,106,5,124,4,100,1,100,2,141, - 2,92,2,125,1,125,3,124,1,124,3,102,2,2,0,1, - 0,83,0,113,44,100,3,124,0,102,2,83,0,41,4,122, - 32,82,101,112,108,97,99,101,109,101,110,116,32,102,111,114, - 32,111,115,46,112,97,116,104,46,115,112,108,105,116,40,41, - 46,233,1,0,0,0,41,1,90,8,109,97,120,115,112,108, - 105,116,218,0,41,6,114,22,0,0,0,114,31,0,0,0, - 218,10,114,112,97,114,116,105,116,105,111,110,114,35,0,0, - 0,218,8,114,101,118,101,114,115,101,100,218,6,114,115,112, - 108,105,116,41,5,218,4,112,97,116,104,90,5,102,114,111, - 110,116,218,1,95,218,4,116,97,105,108,114,19,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, - 11,95,112,97,116,104,95,115,112,108,105,116,68,0,0,0, - 115,16,0,0,0,0,2,12,1,16,1,8,1,12,1,8, - 1,18,1,14,1,114,47,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,67, - 0,0,0,115,10,0,0,0,116,0,160,1,124,0,161,1, - 83,0,41,1,122,126,83,116,97,116,32,116,104,101,32,112, - 97,116,104,46,10,10,32,32,32,32,77,97,100,101,32,97, - 32,115,101,112,97,114,97,116,101,32,102,117,110,99,116,105, - 111,110,32,116,111,32,109,97,107,101,32,105,116,32,101,97, - 115,105,101,114,32,116,111,32,111,118,101,114,114,105,100,101, - 32,105,110,32,101,120,112,101,114,105,109,101,110,116,115,10, - 32,32,32,32,40,101,46,103,46,32,99,97,99,104,101,32, - 115,116,97,116,32,114,101,115,117,108,116,115,41,46,10,10, - 32,32,32,32,41,2,114,2,0,0,0,90,4,115,116,97, - 116,169,1,114,44,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,218,10,95,112,97,116,104,95,115, - 116,97,116,80,0,0,0,115,2,0,0,0,0,7,114,49, - 0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,8,0,0,0,67,0,0,0,115,50,0,0, - 0,122,12,116,0,124,0,131,1,125,2,87,0,110,22,4, - 0,116,1,107,10,114,34,1,0,1,0,1,0,89,0,100, - 1,83,0,88,0,124,2,106,2,100,2,64,0,124,1,107, - 2,83,0,41,3,122,49,84,101,115,116,32,119,104,101,116, - 104,101,114,32,116,104,101,32,112,97,116,104,32,105,115,32, - 116,104,101,32,115,112,101,99,105,102,105,101,100,32,109,111, - 100,101,32,116,121,112,101,46,70,105,0,240,0,0,41,3, - 114,49,0,0,0,218,7,79,83,69,114,114,111,114,218,7, - 115,116,95,109,111,100,101,41,3,114,44,0,0,0,218,4, - 109,111,100,101,90,9,115,116,97,116,95,105,110,102,111,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,18, - 95,112,97,116,104,95,105,115,95,109,111,100,101,95,116,121, - 112,101,90,0,0,0,115,10,0,0,0,0,2,2,1,12, - 1,14,1,8,1,114,53,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,67, - 0,0,0,115,10,0,0,0,116,0,124,0,100,1,131,2, - 83,0,41,2,122,31,82,101,112,108,97,99,101,109,101,110, - 116,32,102,111,114,32,111,115,46,112,97,116,104,46,105,115, - 102,105,108,101,46,105,0,128,0,0,41,1,114,53,0,0, - 0,114,48,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,12,95,112,97,116,104,95,105,115,102, - 105,108,101,99,0,0,0,115,2,0,0,0,0,2,114,54, - 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,3,0,0,0,67,0,0,0,115,22,0,0, - 0,124,0,115,12,116,0,160,1,161,0,125,0,116,2,124, - 0,100,1,131,2,83,0,41,2,122,30,82,101,112,108,97, - 99,101,109,101,110,116,32,102,111,114,32,111,115,46,112,97, - 116,104,46,105,115,100,105,114,46,105,0,64,0,0,41,3, - 114,2,0,0,0,218,6,103,101,116,99,119,100,114,53,0, - 0,0,114,48,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,218,11,95,112,97,116,104,95,105,115, - 100,105,114,104,0,0,0,115,6,0,0,0,0,2,4,1, - 8,1,114,56,0,0,0,99,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,0, - 115,26,0,0,0,124,0,160,0,116,1,161,1,112,24,124, - 0,100,1,100,2,133,2,25,0,116,2,107,6,83,0,41, - 3,122,142,82,101,112,108,97,99,101,109,101,110,116,32,102, - 111,114,32,111,115,46,112,97,116,104,46,105,115,97,98,115, - 46,10,10,32,32,32,32,67,111,110,115,105,100,101,114,115, - 32,97,32,87,105,110,100,111,119,115,32,100,114,105,118,101, - 45,114,101,108,97,116,105,118,101,32,112,97,116,104,32,40, - 110,111,32,100,114,105,118,101,44,32,98,117,116,32,115,116, - 97,114,116,115,32,119,105,116,104,32,115,108,97,115,104,41, - 32,116,111,10,32,32,32,32,115,116,105,108,108,32,98,101, - 32,34,97,98,115,111,108,117,116,101,34,46,10,32,32,32, - 32,114,39,0,0,0,233,3,0,0,0,41,3,114,10,0, - 0,0,114,31,0,0,0,218,20,95,112,97,116,104,115,101, - 112,115,95,119,105,116,104,95,99,111,108,111,110,114,48,0, + 90,13,100,23,100,24,132,0,90,14,100,101,100,26,100,27, + 132,1,90,15,101,16,101,15,106,17,131,1,90,18,100,28, + 160,19,100,29,100,30,161,2,100,31,23,0,90,20,101,21, + 160,22,101,20,100,30,161,2,90,23,100,32,90,24,100,33, + 90,25,100,34,103,1,90,26,100,35,103,1,90,27,101,27, + 4,0,90,28,90,29,100,102,100,36,100,37,156,1,100,38, + 100,39,132,3,90,30,100,40,100,41,132,0,90,31,100,42, + 100,43,132,0,90,32,100,44,100,45,132,0,90,33,100,46, + 100,47,132,0,90,34,100,48,100,49,132,0,90,35,100,50, + 100,51,132,0,90,36,100,52,100,53,132,0,90,37,100,54, + 100,55,132,0,90,38,100,56,100,57,132,0,90,39,100,103, + 100,58,100,59,132,1,90,40,100,104,100,61,100,62,132,1, + 90,41,100,105,100,64,100,65,132,1,90,42,100,66,100,67, + 132,0,90,43,101,44,131,0,90,45,100,106,100,36,101,45, + 100,68,156,2,100,69,100,70,132,3,90,46,71,0,100,71, + 100,72,132,0,100,72,131,2,90,47,71,0,100,73,100,74, + 132,0,100,74,131,2,90,48,71,0,100,75,100,76,132,0, + 100,76,101,48,131,3,90,49,71,0,100,77,100,78,132,0, + 100,78,131,2,90,50,71,0,100,79,100,80,132,0,100,80, + 101,50,101,49,131,4,90,51,71,0,100,81,100,82,132,0, + 100,82,101,50,101,48,131,4,90,52,103,0,90,53,71,0, + 100,83,100,84,132,0,100,84,101,50,101,48,131,4,90,54, + 71,0,100,85,100,86,132,0,100,86,131,2,90,55,71,0, + 100,87,100,88,132,0,100,88,131,2,90,56,71,0,100,89, + 100,90,132,0,100,90,131,2,90,57,71,0,100,91,100,92, + 132,0,100,92,131,2,90,58,100,107,100,93,100,94,132,1, + 90,59,100,95,100,96,132,0,90,60,100,97,100,98,132,0, + 90,61,100,99,100,100,132,0,90,62,100,36,83,0,41,108, + 97,94,1,0,0,67,111,114,101,32,105,109,112,108,101,109, + 101,110,116,97,116,105,111,110,32,111,102,32,112,97,116,104, + 45,98,97,115,101,100,32,105,109,112,111,114,116,46,10,10, + 84,104,105,115,32,109,111,100,117,108,101,32,105,115,32,78, + 79,84,32,109,101,97,110,116,32,116,111,32,98,101,32,100, + 105,114,101,99,116,108,121,32,105,109,112,111,114,116,101,100, + 33,32,73,116,32,104,97,115,32,98,101,101,110,32,100,101, + 115,105,103,110,101,100,32,115,117,99,104,10,116,104,97,116, + 32,105,116,32,99,97,110,32,98,101,32,98,111,111,116,115, + 116,114,97,112,112,101,100,32,105,110,116,111,32,80,121,116, + 104,111,110,32,97,115,32,116,104,101,32,105,109,112,108,101, + 109,101,110,116,97,116,105,111,110,32,111,102,32,105,109,112, + 111,114,116,46,32,65,115,10,115,117,99,104,32,105,116,32, + 114,101,113,117,105,114,101,115,32,116,104,101,32,105,110,106, + 101,99,116,105,111,110,32,111,102,32,115,112,101,99,105,102, + 105,99,32,109,111,100,117,108,101,115,32,97,110,100,32,97, + 116,116,114,105,98,117,116,101,115,32,105,110,32,111,114,100, + 101,114,32,116,111,10,119,111,114,107,46,32,79,110,101,32, + 115,104,111,117,108,100,32,117,115,101,32,105,109,112,111,114, + 116,108,105,98,32,97,115,32,116,104,101,32,112,117,98,108, + 105,99,45,102,97,99,105,110,103,32,118,101,114,115,105,111, + 110,32,111,102,32,116,104,105,115,32,109,111,100,117,108,101, + 46,10,10,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,3,0,0,0,115,60,0,0,0,116,0,106,1,160,2, + 116,3,161,1,114,48,116,0,106,1,160,2,116,4,161,1, + 114,30,100,1,137,0,110,4,100,2,137,0,135,0,102,1, + 100,3,100,4,132,8,125,0,110,8,100,5,100,4,132,0, + 125,0,124,0,83,0,41,6,78,90,12,80,89,84,72,79, + 78,67,65,83,69,79,75,115,12,0,0,0,80,89,84,72, + 79,78,67,65,83,69,79,75,99,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,19,0,0, + 0,115,10,0,0,0,136,0,116,0,106,1,107,6,83,0, + 41,1,250,53,84,114,117,101,32,105,102,32,102,105,108,101, + 110,97,109,101,115,32,109,117,115,116,32,98,101,32,99,104, + 101,99,107,101,100,32,99,97,115,101,45,105,110,115,101,110, + 115,105,116,105,118,101,108,121,46,41,2,218,3,95,111,115, + 90,7,101,110,118,105,114,111,110,169,0,169,1,218,3,107, + 101,121,114,3,0,0,0,250,38,60,102,114,111,122,101,110, + 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, + 115,116,114,97,112,95,101,120,116,101,114,110,97,108,62,218, + 11,95,114,101,108,97,120,95,99,97,115,101,36,0,0,0, + 115,2,0,0,0,0,2,122,37,95,109,97,107,101,95,114, + 101,108,97,120,95,99,97,115,101,46,60,108,111,99,97,108, + 115,62,46,95,114,101,108,97,120,95,99,97,115,101,99,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,83,0,0,0,115,4,0,0,0,100,1,83,0, + 41,2,114,1,0,0,0,70,114,3,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,114,7,0,0,0,40,0,0,0,115,2,0,0,0,0, + 2,41,5,218,3,115,121,115,218,8,112,108,97,116,102,111, + 114,109,218,10,115,116,97,114,116,115,119,105,116,104,218,27, + 95,67,65,83,69,95,73,78,83,69,78,83,73,84,73,86, + 69,95,80,76,65,84,70,79,82,77,83,218,35,95,67,65, + 83,69,95,73,78,83,69,78,83,73,84,73,86,69,95,80, + 76,65,84,70,79,82,77,83,95,83,84,82,95,75,69,89, + 41,1,114,7,0,0,0,114,3,0,0,0,114,4,0,0, + 0,114,6,0,0,0,218,16,95,109,97,107,101,95,114,101, + 108,97,120,95,99,97,115,101,29,0,0,0,115,14,0,0, + 0,0,1,12,1,12,1,6,2,4,2,14,4,8,3,114, + 13,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,4,0,0,0,67,0,0,0,115,20,0, + 0,0,116,0,124,0,131,1,100,1,64,0,160,1,100,2, + 100,3,161,2,83,0,41,4,122,42,67,111,110,118,101,114, + 116,32,97,32,51,50,45,98,105,116,32,105,110,116,101,103, + 101,114,32,116,111,32,108,105,116,116,108,101,45,101,110,100, + 105,97,110,46,236,3,0,0,0,255,127,255,127,3,0,233, + 4,0,0,0,218,6,108,105,116,116,108,101,41,2,218,3, + 105,110,116,218,8,116,111,95,98,121,116,101,115,41,1,218, + 1,120,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,218,12,95,112,97,99,107,95,117,105,110,116,51,50,46, + 0,0,0,115,2,0,0,0,0,2,114,20,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, + 4,0,0,0,67,0,0,0,115,28,0,0,0,116,0,124, + 0,131,1,100,1,107,2,115,16,116,1,130,1,116,2,160, + 3,124,0,100,2,161,2,83,0,41,3,122,47,67,111,110, + 118,101,114,116,32,52,32,98,121,116,101,115,32,105,110,32, + 108,105,116,116,108,101,45,101,110,100,105,97,110,32,116,111, + 32,97,110,32,105,110,116,101,103,101,114,46,114,15,0,0, + 0,114,16,0,0,0,169,4,218,3,108,101,110,218,14,65, + 115,115,101,114,116,105,111,110,69,114,114,111,114,114,17,0, + 0,0,218,10,102,114,111,109,95,98,121,116,101,115,169,1, + 218,4,100,97,116,97,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,218,14,95,117,110,112,97,99,107,95,117, + 105,110,116,51,50,51,0,0,0,115,4,0,0,0,0,2, + 16,1,114,27,0,0,0,99,1,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,4,0,0,0,67,0,0,0, + 115,28,0,0,0,116,0,124,0,131,1,100,1,107,2,115, + 16,116,1,130,1,116,2,160,3,124,0,100,2,161,2,83, + 0,41,3,122,47,67,111,110,118,101,114,116,32,50,32,98, + 121,116,101,115,32,105,110,32,108,105,116,116,108,101,45,101, + 110,100,105,97,110,32,116,111,32,97,110,32,105,110,116,101, + 103,101,114,46,233,2,0,0,0,114,16,0,0,0,114,21, + 0,0,0,114,25,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,218,14,95,117,110,112,97,99,107, + 95,117,105,110,116,49,54,56,0,0,0,115,4,0,0,0, + 0,2,16,1,114,29,0,0,0,99,0,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,4,0,0,0,71,0, + 0,0,115,20,0,0,0,116,0,160,1,100,1,100,2,132, + 0,124,0,68,0,131,1,161,1,83,0,41,3,122,31,82, + 101,112,108,97,99,101,109,101,110,116,32,102,111,114,32,111, + 115,46,112,97,116,104,46,106,111,105,110,40,41,46,99,1, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,5, + 0,0,0,83,0,0,0,115,26,0,0,0,103,0,124,0, + 93,18,125,1,124,1,114,4,124,1,160,0,116,1,161,1, + 145,2,113,4,83,0,114,3,0,0,0,41,2,218,6,114, + 115,116,114,105,112,218,15,112,97,116,104,95,115,101,112,97, + 114,97,116,111,114,115,41,2,218,2,46,48,218,4,112,97, + 114,116,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,218,10,60,108,105,115,116,99,111,109,112,62,64,0,0, + 0,115,6,0,0,0,6,1,2,0,4,255,122,30,95,112, + 97,116,104,95,106,111,105,110,46,60,108,111,99,97,108,115, + 62,46,60,108,105,115,116,99,111,109,112,62,41,2,218,8, + 112,97,116,104,95,115,101,112,218,4,106,111,105,110,41,1, + 218,10,112,97,116,104,95,112,97,114,116,115,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,218,10,95,112,97, + 116,104,95,106,111,105,110,62,0,0,0,115,6,0,0,0, + 0,2,10,1,2,255,114,38,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,5,0,0,0,5,0,0,0, + 67,0,0,0,115,96,0,0,0,116,0,116,1,131,1,100, + 1,107,2,114,36,124,0,160,2,116,3,161,1,92,3,125, + 1,125,2,125,3,124,1,124,3,102,2,83,0,116,4,124, + 0,131,1,68,0,93,42,125,4,124,4,116,1,107,6,114, + 44,124,0,106,5,124,4,100,1,100,2,141,2,92,2,125, + 1,125,3,124,1,124,3,102,2,2,0,1,0,83,0,113, + 44,100,3,124,0,102,2,83,0,41,4,122,32,82,101,112, + 108,97,99,101,109,101,110,116,32,102,111,114,32,111,115,46, + 112,97,116,104,46,115,112,108,105,116,40,41,46,233,1,0, + 0,0,41,1,90,8,109,97,120,115,112,108,105,116,218,0, + 41,6,114,22,0,0,0,114,31,0,0,0,218,10,114,112, + 97,114,116,105,116,105,111,110,114,35,0,0,0,218,8,114, + 101,118,101,114,115,101,100,218,6,114,115,112,108,105,116,41, + 5,218,4,112,97,116,104,90,5,102,114,111,110,116,218,1, + 95,218,4,116,97,105,108,114,19,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,218,11,95,112,97, + 116,104,95,115,112,108,105,116,68,0,0,0,115,16,0,0, + 0,0,2,12,1,16,1,8,1,12,1,8,1,18,1,14, + 1,114,47,0,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, + 10,0,0,0,116,0,160,1,124,0,161,1,83,0,41,1, + 122,126,83,116,97,116,32,116,104,101,32,112,97,116,104,46, + 10,10,32,32,32,32,77,97,100,101,32,97,32,115,101,112, + 97,114,97,116,101,32,102,117,110,99,116,105,111,110,32,116, + 111,32,109,97,107,101,32,105,116,32,101,97,115,105,101,114, + 32,116,111,32,111,118,101,114,114,105,100,101,32,105,110,32, + 101,120,112,101,114,105,109,101,110,116,115,10,32,32,32,32, + 40,101,46,103,46,32,99,97,99,104,101,32,115,116,97,116, + 32,114,101,115,117,108,116,115,41,46,10,10,32,32,32,32, + 41,2,114,2,0,0,0,90,4,115,116,97,116,169,1,114, + 44,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,218,10,95,112,97,116,104,95,115,116,97,116,80, + 0,0,0,115,2,0,0,0,0,7,114,49,0,0,0,99, + 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 8,0,0,0,67,0,0,0,115,50,0,0,0,122,12,116, + 0,124,0,131,1,125,2,87,0,110,22,4,0,116,1,107, + 10,114,34,1,0,1,0,1,0,89,0,100,1,83,0,88, + 0,124,2,106,2,100,2,64,0,124,1,107,2,83,0,41, + 3,122,49,84,101,115,116,32,119,104,101,116,104,101,114,32, + 116,104,101,32,112,97,116,104,32,105,115,32,116,104,101,32, + 115,112,101,99,105,102,105,101,100,32,109,111,100,101,32,116, + 121,112,101,46,70,105,0,240,0,0,41,3,114,49,0,0, + 0,218,7,79,83,69,114,114,111,114,218,7,115,116,95,109, + 111,100,101,41,3,114,44,0,0,0,218,4,109,111,100,101, + 90,9,115,116,97,116,95,105,110,102,111,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,218,18,95,112,97,116, + 104,95,105,115,95,109,111,100,101,95,116,121,112,101,90,0, + 0,0,115,10,0,0,0,0,2,2,1,12,1,14,1,8, + 1,114,53,0,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, + 10,0,0,0,116,0,124,0,100,1,131,2,83,0,41,2, + 122,31,82,101,112,108,97,99,101,109,101,110,116,32,102,111, + 114,32,111,115,46,112,97,116,104,46,105,115,102,105,108,101, + 46,105,0,128,0,0,41,1,114,53,0,0,0,114,48,0, 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,11,95,112,97,116,104,95,105,115,97,98,115,111,0, - 0,0,115,2,0,0,0,0,6,114,59,0,0,0,233,182, - 1,0,0,99,3,0,0,0,0,0,0,0,0,0,0,0, - 6,0,0,0,11,0,0,0,67,0,0,0,115,162,0,0, - 0,100,1,160,0,124,0,116,1,124,0,131,1,161,2,125, - 3,116,2,160,3,124,3,116,2,106,4,116,2,106,5,66, - 0,116,2,106,6,66,0,124,2,100,2,64,0,161,3,125, - 4,122,50,116,7,160,8,124,4,100,3,161,2,143,16,125, - 5,124,5,160,9,124,1,161,1,1,0,87,0,53,0,81, - 0,82,0,88,0,116,2,160,10,124,3,124,0,161,2,1, - 0,87,0,110,58,4,0,116,11,107,10,114,156,1,0,1, - 0,1,0,122,14,116,2,160,12,124,3,161,1,1,0,87, - 0,110,20,4,0,116,11,107,10,114,148,1,0,1,0,1, - 0,89,0,110,2,88,0,130,0,89,0,110,2,88,0,100, - 4,83,0,41,5,122,162,66,101,115,116,45,101,102,102,111, - 114,116,32,102,117,110,99,116,105,111,110,32,116,111,32,119, - 114,105,116,101,32,100,97,116,97,32,116,111,32,97,32,112, - 97,116,104,32,97,116,111,109,105,99,97,108,108,121,46,10, - 32,32,32,32,66,101,32,112,114,101,112,97,114,101,100,32, - 116,111,32,104,97,110,100,108,101,32,97,32,70,105,108,101, - 69,120,105,115,116,115,69,114,114,111,114,32,105,102,32,99, - 111,110,99,117,114,114,101,110,116,32,119,114,105,116,105,110, - 103,32,111,102,32,116,104,101,10,32,32,32,32,116,101,109, - 112,111,114,97,114,121,32,102,105,108,101,32,105,115,32,97, - 116,116,101,109,112,116,101,100,46,250,5,123,125,46,123,125, - 114,60,0,0,0,90,2,119,98,78,41,13,218,6,102,111, - 114,109,97,116,218,2,105,100,114,2,0,0,0,90,4,111, - 112,101,110,90,6,79,95,69,88,67,76,90,7,79,95,67, - 82,69,65,84,90,8,79,95,87,82,79,78,76,89,218,3, - 95,105,111,218,6,70,105,108,101,73,79,218,5,119,114,105, - 116,101,218,7,114,101,112,108,97,99,101,114,50,0,0,0, - 90,6,117,110,108,105,110,107,41,6,114,44,0,0,0,114, - 26,0,0,0,114,52,0,0,0,90,8,112,97,116,104,95, - 116,109,112,90,2,102,100,218,4,102,105,108,101,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,13,95,119, - 114,105,116,101,95,97,116,111,109,105,99,120,0,0,0,115, - 30,0,0,0,0,5,16,1,6,1,16,0,6,255,4,2, - 2,3,14,1,20,1,16,1,14,1,2,1,14,1,14,1, - 6,1,114,69,0,0,0,105,82,13,0,0,114,28,0,0, - 0,114,16,0,0,0,115,2,0,0,0,13,10,90,11,95, - 95,112,121,99,97,99,104,101,95,95,122,4,111,112,116,45, - 122,3,46,112,121,122,4,46,112,121,99,78,41,1,218,12, - 111,112,116,105,109,105,122,97,116,105,111,110,99,2,0,0, - 0,0,0,0,0,1,0,0,0,12,0,0,0,5,0,0, - 0,67,0,0,0,115,88,1,0,0,124,1,100,1,107,9, - 114,52,116,0,160,1,100,2,116,2,161,2,1,0,124,2, - 100,1,107,9,114,40,100,3,125,3,116,3,124,3,131,1, - 130,1,124,1,114,48,100,4,110,2,100,5,125,2,116,4, - 160,5,124,0,161,1,125,0,116,6,124,0,131,1,92,2, - 125,4,125,5,124,5,160,7,100,6,161,1,92,3,125,6, - 125,7,125,8,116,8,106,9,106,10,125,9,124,9,100,1, - 107,8,114,114,116,11,100,7,131,1,130,1,100,4,160,12, - 124,6,114,126,124,6,110,2,124,8,124,7,124,9,103,3, - 161,1,125,10,124,2,100,1,107,8,114,172,116,8,106,13, - 106,14,100,8,107,2,114,164,100,4,125,2,110,8,116,8, - 106,13,106,14,125,2,116,15,124,2,131,1,125,2,124,2, - 100,4,107,3,114,224,124,2,160,16,161,0,115,210,116,17, - 100,9,160,18,124,2,161,1,131,1,130,1,100,10,160,18, - 124,10,116,19,124,2,161,3,125,10,124,10,116,20,100,8, - 25,0,23,0,125,11,116,8,106,21,100,1,107,9,144,1, - 114,76,116,22,124,4,131,1,144,1,115,16,116,23,116,4, - 160,24,161,0,124,4,131,2,125,4,124,4,100,5,25,0, - 100,11,107,2,144,1,114,56,124,4,100,8,25,0,116,25, - 107,7,144,1,114,56,124,4,100,12,100,1,133,2,25,0, - 125,4,116,23,116,8,106,21,124,4,160,26,116,25,161,1, - 124,11,131,3,83,0,116,23,124,4,116,27,124,11,131,3, - 83,0,41,13,97,254,2,0,0,71,105,118,101,110,32,116, - 104,101,32,112,97,116,104,32,116,111,32,97,32,46,112,121, - 32,102,105,108,101,44,32,114,101,116,117,114,110,32,116,104, - 101,32,112,97,116,104,32,116,111,32,105,116,115,32,46,112, - 121,99,32,102,105,108,101,46,10,10,32,32,32,32,84,104, - 101,32,46,112,121,32,102,105,108,101,32,100,111,101,115,32, - 110,111,116,32,110,101,101,100,32,116,111,32,101,120,105,115, - 116,59,32,116,104,105,115,32,115,105,109,112,108,121,32,114, - 101,116,117,114,110,115,32,116,104,101,32,112,97,116,104,32, - 116,111,32,116,104,101,10,32,32,32,32,46,112,121,99,32, - 102,105,108,101,32,99,97,108,99,117,108,97,116,101,100,32, - 97,115,32,105,102,32,116,104,101,32,46,112,121,32,102,105, - 108,101,32,119,101,114,101,32,105,109,112,111,114,116,101,100, - 46,10,10,32,32,32,32,84,104,101,32,39,111,112,116,105, - 109,105,122,97,116,105,111,110,39,32,112,97,114,97,109,101, - 116,101,114,32,99,111,110,116,114,111,108,115,32,116,104,101, - 32,112,114,101,115,117,109,101,100,32,111,112,116,105,109,105, - 122,97,116,105,111,110,32,108,101,118,101,108,32,111,102,10, - 32,32,32,32,116,104,101,32,98,121,116,101,99,111,100,101, - 32,102,105,108,101,46,32,73,102,32,39,111,112,116,105,109, - 105,122,97,116,105,111,110,39,32,105,115,32,110,111,116,32, - 78,111,110,101,44,32,116,104,101,32,115,116,114,105,110,103, - 32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,10, - 32,32,32,32,111,102,32,116,104,101,32,97,114,103,117,109, - 101,110,116,32,105,115,32,116,97,107,101,110,32,97,110,100, - 32,118,101,114,105,102,105,101,100,32,116,111,32,98,101,32, - 97,108,112,104,97,110,117,109,101,114,105,99,32,40,101,108, - 115,101,32,86,97,108,117,101,69,114,114,111,114,10,32,32, - 32,32,105,115,32,114,97,105,115,101,100,41,46,10,10,32, - 32,32,32,84,104,101,32,100,101,98,117,103,95,111,118,101, - 114,114,105,100,101,32,112,97,114,97,109,101,116,101,114,32, - 105,115,32,100,101,112,114,101,99,97,116,101,100,46,32,73, - 102,32,100,101,98,117,103,95,111,118,101,114,114,105,100,101, - 32,105,115,32,110,111,116,32,78,111,110,101,44,10,32,32, - 32,32,97,32,84,114,117,101,32,118,97,108,117,101,32,105, - 115,32,116,104,101,32,115,97,109,101,32,97,115,32,115,101, + 0,218,12,95,112,97,116,104,95,105,115,102,105,108,101,99, + 0,0,0,115,2,0,0,0,0,2,114,54,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, + 3,0,0,0,67,0,0,0,115,22,0,0,0,124,0,115, + 12,116,0,160,1,161,0,125,0,116,2,124,0,100,1,131, + 2,83,0,41,2,122,30,82,101,112,108,97,99,101,109,101, + 110,116,32,102,111,114,32,111,115,46,112,97,116,104,46,105, + 115,100,105,114,46,105,0,64,0,0,41,3,114,2,0,0, + 0,218,6,103,101,116,99,119,100,114,53,0,0,0,114,48, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,218,11,95,112,97,116,104,95,105,115,100,105,114,104, + 0,0,0,115,6,0,0,0,0,2,4,1,8,1,114,56, + 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,0,3,0,0,0,67,0,0,0,115,26,0,0, + 0,124,0,160,0,116,1,161,1,112,24,124,0,100,1,100, + 2,133,2,25,0,116,2,107,6,83,0,41,3,122,142,82, + 101,112,108,97,99,101,109,101,110,116,32,102,111,114,32,111, + 115,46,112,97,116,104,46,105,115,97,98,115,46,10,10,32, + 32,32,32,67,111,110,115,105,100,101,114,115,32,97,32,87, + 105,110,100,111,119,115,32,100,114,105,118,101,45,114,101,108, + 97,116,105,118,101,32,112,97,116,104,32,40,110,111,32,100, + 114,105,118,101,44,32,98,117,116,32,115,116,97,114,116,115, + 32,119,105,116,104,32,115,108,97,115,104,41,32,116,111,10, + 32,32,32,32,115,116,105,108,108,32,98,101,32,34,97,98, + 115,111,108,117,116,101,34,46,10,32,32,32,32,114,39,0, + 0,0,233,3,0,0,0,41,3,114,10,0,0,0,114,31, + 0,0,0,218,20,95,112,97,116,104,115,101,112,115,95,119, + 105,116,104,95,99,111,108,111,110,114,48,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,218,11,95, + 112,97,116,104,95,105,115,97,98,115,111,0,0,0,115,2, + 0,0,0,0,6,114,59,0,0,0,233,182,1,0,0,99, + 3,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0, + 11,0,0,0,67,0,0,0,115,162,0,0,0,100,1,160, + 0,124,0,116,1,124,0,131,1,161,2,125,3,116,2,160, + 3,124,3,116,2,106,4,116,2,106,5,66,0,116,2,106, + 6,66,0,124,2,100,2,64,0,161,3,125,4,122,50,116, + 7,160,8,124,4,100,3,161,2,143,16,125,5,124,5,160, + 9,124,1,161,1,1,0,87,0,53,0,81,0,82,0,88, + 0,116,2,160,10,124,3,124,0,161,2,1,0,87,0,110, + 58,4,0,116,11,107,10,114,156,1,0,1,0,1,0,122, + 14,116,2,160,12,124,3,161,1,1,0,87,0,110,20,4, + 0,116,11,107,10,114,148,1,0,1,0,1,0,89,0,110, + 2,88,0,130,0,89,0,110,2,88,0,100,4,83,0,41, + 5,122,162,66,101,115,116,45,101,102,102,111,114,116,32,102, + 117,110,99,116,105,111,110,32,116,111,32,119,114,105,116,101, + 32,100,97,116,97,32,116,111,32,97,32,112,97,116,104,32, + 97,116,111,109,105,99,97,108,108,121,46,10,32,32,32,32, + 66,101,32,112,114,101,112,97,114,101,100,32,116,111,32,104, + 97,110,100,108,101,32,97,32,70,105,108,101,69,120,105,115, + 116,115,69,114,114,111,114,32,105,102,32,99,111,110,99,117, + 114,114,101,110,116,32,119,114,105,116,105,110,103,32,111,102, + 32,116,104,101,10,32,32,32,32,116,101,109,112,111,114,97, + 114,121,32,102,105,108,101,32,105,115,32,97,116,116,101,109, + 112,116,101,100,46,250,5,123,125,46,123,125,114,60,0,0, + 0,90,2,119,98,78,41,13,218,6,102,111,114,109,97,116, + 218,2,105,100,114,2,0,0,0,90,4,111,112,101,110,90, + 6,79,95,69,88,67,76,90,7,79,95,67,82,69,65,84, + 90,8,79,95,87,82,79,78,76,89,218,3,95,105,111,218, + 6,70,105,108,101,73,79,218,5,119,114,105,116,101,218,7, + 114,101,112,108,97,99,101,114,50,0,0,0,90,6,117,110, + 108,105,110,107,41,6,114,44,0,0,0,114,26,0,0,0, + 114,52,0,0,0,90,8,112,97,116,104,95,116,109,112,90, + 2,102,100,218,4,102,105,108,101,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,13,95,119,114,105,116,101, + 95,97,116,111,109,105,99,120,0,0,0,115,30,0,0,0, + 0,5,16,1,6,1,16,0,6,255,4,2,2,3,14,1, + 20,1,16,1,14,1,2,1,14,1,14,1,6,1,114,69, + 0,0,0,105,82,13,0,0,114,28,0,0,0,114,16,0, + 0,0,115,2,0,0,0,13,10,90,11,95,95,112,121,99, + 97,99,104,101,95,95,122,4,111,112,116,45,122,3,46,112, + 121,122,4,46,112,121,99,78,41,1,218,12,111,112,116,105, + 109,105,122,97,116,105,111,110,99,2,0,0,0,0,0,0, + 0,1,0,0,0,12,0,0,0,5,0,0,0,67,0,0, + 0,115,88,1,0,0,124,1,100,1,107,9,114,52,116,0, + 160,1,100,2,116,2,161,2,1,0,124,2,100,1,107,9, + 114,40,100,3,125,3,116,3,124,3,131,1,130,1,124,1, + 114,48,100,4,110,2,100,5,125,2,116,4,160,5,124,0, + 161,1,125,0,116,6,124,0,131,1,92,2,125,4,125,5, + 124,5,160,7,100,6,161,1,92,3,125,6,125,7,125,8, + 116,8,106,9,106,10,125,9,124,9,100,1,107,8,114,114, + 116,11,100,7,131,1,130,1,100,4,160,12,124,6,114,126, + 124,6,110,2,124,8,124,7,124,9,103,3,161,1,125,10, + 124,2,100,1,107,8,114,172,116,8,106,13,106,14,100,8, + 107,2,114,164,100,4,125,2,110,8,116,8,106,13,106,14, + 125,2,116,15,124,2,131,1,125,2,124,2,100,4,107,3, + 114,224,124,2,160,16,161,0,115,210,116,17,100,9,160,18, + 124,2,161,1,131,1,130,1,100,10,160,18,124,10,116,19, + 124,2,161,3,125,10,124,10,116,20,100,8,25,0,23,0, + 125,11,116,8,106,21,100,1,107,9,144,1,114,76,116,22, + 124,4,131,1,144,1,115,16,116,23,116,4,160,24,161,0, + 124,4,131,2,125,4,124,4,100,5,25,0,100,11,107,2, + 144,1,114,56,124,4,100,8,25,0,116,25,107,7,144,1, + 114,56,124,4,100,12,100,1,133,2,25,0,125,4,116,23, + 116,8,106,21,124,4,160,26,116,25,161,1,124,11,131,3, + 83,0,116,23,124,4,116,27,124,11,131,3,83,0,41,13, + 97,254,2,0,0,71,105,118,101,110,32,116,104,101,32,112, + 97,116,104,32,116,111,32,97,32,46,112,121,32,102,105,108, + 101,44,32,114,101,116,117,114,110,32,116,104,101,32,112,97, + 116,104,32,116,111,32,105,116,115,32,46,112,121,99,32,102, + 105,108,101,46,10,10,32,32,32,32,84,104,101,32,46,112, + 121,32,102,105,108,101,32,100,111,101,115,32,110,111,116,32, + 110,101,101,100,32,116,111,32,101,120,105,115,116,59,32,116, + 104,105,115,32,115,105,109,112,108,121,32,114,101,116,117,114, + 110,115,32,116,104,101,32,112,97,116,104,32,116,111,32,116, + 104,101,10,32,32,32,32,46,112,121,99,32,102,105,108,101, + 32,99,97,108,99,117,108,97,116,101,100,32,97,115,32,105, + 102,32,116,104,101,32,46,112,121,32,102,105,108,101,32,119, + 101,114,101,32,105,109,112,111,114,116,101,100,46,10,10,32, + 32,32,32,84,104,101,32,39,111,112,116,105,109,105,122,97, + 116,105,111,110,39,32,112,97,114,97,109,101,116,101,114,32, + 99,111,110,116,114,111,108,115,32,116,104,101,32,112,114,101, + 115,117,109,101,100,32,111,112,116,105,109,105,122,97,116,105, + 111,110,32,108,101,118,101,108,32,111,102,10,32,32,32,32, + 116,104,101,32,98,121,116,101,99,111,100,101,32,102,105,108, + 101,46,32,73,102,32,39,111,112,116,105,109,105,122,97,116, + 105,111,110,39,32,105,115,32,110,111,116,32,78,111,110,101, + 44,32,116,104,101,32,115,116,114,105,110,103,32,114,101,112, + 114,101,115,101,110,116,97,116,105,111,110,10,32,32,32,32, + 111,102,32,116,104,101,32,97,114,103,117,109,101,110,116,32, + 105,115,32,116,97,107,101,110,32,97,110,100,32,118,101,114, + 105,102,105,101,100,32,116,111,32,98,101,32,97,108,112,104, + 97,110,117,109,101,114,105,99,32,40,101,108,115,101,32,86, + 97,108,117,101,69,114,114,111,114,10,32,32,32,32,105,115, + 32,114,97,105,115,101,100,41,46,10,10,32,32,32,32,84, + 104,101,32,100,101,98,117,103,95,111,118,101,114,114,105,100, + 101,32,112,97,114,97,109,101,116,101,114,32,105,115,32,100, + 101,112,114,101,99,97,116,101,100,46,32,73,102,32,100,101, + 98,117,103,95,111,118,101,114,114,105,100,101,32,105,115,32, + 110,111,116,32,78,111,110,101,44,10,32,32,32,32,97,32, + 84,114,117,101,32,118,97,108,117,101,32,105,115,32,116,104, + 101,32,115,97,109,101,32,97,115,32,115,101,116,116,105,110, + 103,32,39,111,112,116,105,109,105,122,97,116,105,111,110,39, + 32,116,111,32,116,104,101,32,101,109,112,116,121,32,115,116, + 114,105,110,103,10,32,32,32,32,119,104,105,108,101,32,97, + 32,70,97,108,115,101,32,118,97,108,117,101,32,105,115,32, + 101,113,117,105,118,97,108,101,110,116,32,116,111,32,115,101, 116,116,105,110,103,32,39,111,112,116,105,109,105,122,97,116, - 105,111,110,39,32,116,111,32,116,104,101,32,101,109,112,116, - 121,32,115,116,114,105,110,103,10,32,32,32,32,119,104,105, - 108,101,32,97,32,70,97,108,115,101,32,118,97,108,117,101, - 32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116, - 111,32,115,101,116,116,105,110,103,32,39,111,112,116,105,109, - 105,122,97,116,105,111,110,39,32,116,111,32,39,49,39,46, - 10,10,32,32,32,32,73,102,32,115,121,115,46,105,109,112, - 108,101,109,101,110,116,97,116,105,111,110,46,99,97,99,104, - 101,95,116,97,103,32,105,115,32,78,111,110,101,32,116,104, - 101,110,32,78,111,116,73,109,112,108,101,109,101,110,116,101, - 100,69,114,114,111,114,32,105,115,32,114,97,105,115,101,100, - 46,10,10,32,32,32,32,78,122,70,116,104,101,32,100,101, - 98,117,103,95,111,118,101,114,114,105,100,101,32,112,97,114, - 97,109,101,116,101,114,32,105,115,32,100,101,112,114,101,99, - 97,116,101,100,59,32,117,115,101,32,39,111,112,116,105,109, - 105,122,97,116,105,111,110,39,32,105,110,115,116,101,97,100, - 122,50,100,101,98,117,103,95,111,118,101,114,114,105,100,101, - 32,111,114,32,111,112,116,105,109,105,122,97,116,105,111,110, - 32,109,117,115,116,32,98,101,32,115,101,116,32,116,111,32, - 78,111,110,101,114,40,0,0,0,114,39,0,0,0,218,1, - 46,250,36,115,121,115,46,105,109,112,108,101,109,101,110,116, - 97,116,105,111,110,46,99,97,99,104,101,95,116,97,103,32, - 105,115,32,78,111,110,101,233,0,0,0,0,122,24,123,33, - 114,125,32,105,115,32,110,111,116,32,97,108,112,104,97,110, - 117,109,101,114,105,99,122,7,123,125,46,123,125,123,125,250, - 1,58,114,28,0,0,0,41,28,218,9,95,119,97,114,110, - 105,110,103,115,218,4,119,97,114,110,218,18,68,101,112,114, - 101,99,97,116,105,111,110,87,97,114,110,105,110,103,218,9, - 84,121,112,101,69,114,114,111,114,114,2,0,0,0,218,6, - 102,115,112,97,116,104,114,47,0,0,0,114,41,0,0,0, - 114,8,0,0,0,218,14,105,109,112,108,101,109,101,110,116, - 97,116,105,111,110,218,9,99,97,99,104,101,95,116,97,103, - 218,19,78,111,116,73,109,112,108,101,109,101,110,116,101,100, - 69,114,114,111,114,114,36,0,0,0,218,5,102,108,97,103, - 115,218,8,111,112,116,105,109,105,122,101,218,3,115,116,114, - 218,7,105,115,97,108,110,117,109,218,10,86,97,108,117,101, - 69,114,114,111,114,114,62,0,0,0,218,4,95,79,80,84, - 218,17,66,89,84,69,67,79,68,69,95,83,85,70,70,73, - 88,69,83,218,14,112,121,99,97,99,104,101,95,112,114,101, - 102,105,120,114,59,0,0,0,114,38,0,0,0,114,55,0, - 0,0,114,31,0,0,0,218,6,108,115,116,114,105,112,218, - 8,95,80,89,67,65,67,72,69,41,12,114,44,0,0,0, - 90,14,100,101,98,117,103,95,111,118,101,114,114,105,100,101, - 114,70,0,0,0,218,7,109,101,115,115,97,103,101,218,4, - 104,101,97,100,114,46,0,0,0,90,4,98,97,115,101,218, - 3,115,101,112,218,4,114,101,115,116,90,3,116,97,103,90, - 15,97,108,109,111,115,116,95,102,105,108,101,110,97,109,101, - 218,8,102,105,108,101,110,97,109,101,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,17,99,97,99,104,101, - 95,102,114,111,109,95,115,111,117,114,99,101,33,1,0,0, - 115,72,0,0,0,0,18,8,1,6,1,2,255,4,2,8, - 1,4,1,8,1,12,1,10,1,12,1,16,1,8,1,8, - 1,8,1,24,1,8,1,12,1,6,2,8,1,8,1,8, - 1,8,1,14,1,14,1,12,1,12,9,10,1,14,5,28, - 1,12,4,2,1,4,1,8,1,2,253,4,5,114,98,0, - 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,10, - 0,0,0,5,0,0,0,67,0,0,0,115,46,1,0,0, - 116,0,106,1,106,2,100,1,107,8,114,20,116,3,100,2, - 131,1,130,1,116,4,160,5,124,0,161,1,125,0,116,6, - 124,0,131,1,92,2,125,1,125,2,100,3,125,3,116,0, - 106,7,100,1,107,9,114,102,116,0,106,7,160,8,116,9, - 161,1,125,4,124,1,160,10,124,4,116,11,23,0,161,1, - 114,102,124,1,116,12,124,4,131,1,100,1,133,2,25,0, - 125,1,100,4,125,3,124,3,115,144,116,6,124,1,131,1, - 92,2,125,1,125,5,124,5,116,13,107,3,114,144,116,14, - 116,13,155,0,100,5,124,0,155,2,157,3,131,1,130,1, - 124,2,160,15,100,6,161,1,125,6,124,6,100,7,107,7, - 114,178,116,14,100,8,124,2,155,2,157,2,131,1,130,1, - 110,92,124,6,100,9,107,2,144,1,114,14,124,2,160,16, - 100,6,100,10,161,2,100,11,25,0,125,7,124,7,160,10, - 116,17,161,1,115,228,116,14,100,12,116,17,155,2,157,2, - 131,1,130,1,124,7,116,12,116,17,131,1,100,1,133,2, - 25,0,125,8,124,8,160,18,161,0,144,1,115,14,116,14, - 100,13,124,7,155,2,100,14,157,3,131,1,130,1,124,2, - 160,19,100,6,161,1,100,15,25,0,125,9,116,20,124,1, - 124,9,116,21,100,15,25,0,23,0,131,2,83,0,41,16, - 97,110,1,0,0,71,105,118,101,110,32,116,104,101,32,112, - 97,116,104,32,116,111,32,97,32,46,112,121,99,46,32,102, - 105,108,101,44,32,114,101,116,117,114,110,32,116,104,101,32, - 112,97,116,104,32,116,111,32,105,116,115,32,46,112,121,32, - 102,105,108,101,46,10,10,32,32,32,32,84,104,101,32,46, - 112,121,99,32,102,105,108,101,32,100,111,101,115,32,110,111, - 116,32,110,101,101,100,32,116,111,32,101,120,105,115,116,59, - 32,116,104,105,115,32,115,105,109,112,108,121,32,114,101,116, - 117,114,110,115,32,116,104,101,32,112,97,116,104,32,116,111, - 10,32,32,32,32,116,104,101,32,46,112,121,32,102,105,108, - 101,32,99,97,108,99,117,108,97,116,101,100,32,116,111,32, - 99,111,114,114,101,115,112,111,110,100,32,116,111,32,116,104, - 101,32,46,112,121,99,32,102,105,108,101,46,32,32,73,102, - 32,112,97,116,104,32,100,111,101,115,10,32,32,32,32,110, - 111,116,32,99,111,110,102,111,114,109,32,116,111,32,80,69, - 80,32,51,49,52,55,47,52,56,56,32,102,111,114,109,97, - 116,44,32,86,97,108,117,101,69,114,114,111,114,32,119,105, - 108,108,32,98,101,32,114,97,105,115,101,100,46,32,73,102, - 10,32,32,32,32,115,121,115,46,105,109,112,108,101,109,101, + 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,114,72,0,0,0,70,84,122,31,32,110,111, - 116,32,98,111,116,116,111,109,45,108,101,118,101,108,32,100, - 105,114,101,99,116,111,114,121,32,105,110,32,114,71,0,0, - 0,62,2,0,0,0,114,28,0,0,0,114,57,0,0,0, - 122,29,101,120,112,101,99,116,101,100,32,111,110,108,121,32, - 50,32,111,114,32,51,32,100,111,116,115,32,105,110,32,114, - 57,0,0,0,114,28,0,0,0,233,254,255,255,255,122,53, - 111,112,116,105,109,105,122,97,116,105,111,110,32,112,111,114, - 116,105,111,110,32,111,102,32,102,105,108,101,110,97,109,101, - 32,100,111,101,115,32,110,111,116,32,115,116,97,114,116,32, - 119,105,116,104,32,122,19,111,112,116,105,109,105,122,97,116, - 105,111,110,32,108,101,118,101,108,32,122,29,32,105,115,32, - 110,111,116,32,97,110,32,97,108,112,104,97,110,117,109,101, - 114,105,99,32,118,97,108,117,101,114,73,0,0,0,41,22, - 114,8,0,0,0,114,80,0,0,0,114,81,0,0,0,114, - 82,0,0,0,114,2,0,0,0,114,79,0,0,0,114,47, - 0,0,0,114,90,0,0,0,114,30,0,0,0,114,31,0, - 0,0,114,10,0,0,0,114,35,0,0,0,114,22,0,0, - 0,114,92,0,0,0,114,87,0,0,0,218,5,99,111,117, - 110,116,114,43,0,0,0,114,88,0,0,0,114,86,0,0, - 0,218,9,112,97,114,116,105,116,105,111,110,114,38,0,0, - 0,218,15,83,79,85,82,67,69,95,83,85,70,70,73,88, - 69,83,41,10,114,44,0,0,0,114,94,0,0,0,90,16, - 112,121,99,97,99,104,101,95,102,105,108,101,110,97,109,101, - 90,23,102,111,117,110,100,95,105,110,95,112,121,99,97,99, - 104,101,95,112,114,101,102,105,120,90,13,115,116,114,105,112, - 112,101,100,95,112,97,116,104,90,7,112,121,99,97,99,104, - 101,90,9,100,111,116,95,99,111,117,110,116,114,70,0,0, - 0,90,9,111,112,116,95,108,101,118,101,108,90,13,98,97, - 115,101,95,102,105,108,101,110,97,109,101,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,17,115,111,117,114, - 99,101,95,102,114,111,109,95,99,97,99,104,101,104,1,0, - 0,115,52,0,0,0,0,9,12,1,8,1,10,1,12,1, - 4,1,10,1,12,1,14,1,16,1,4,1,4,1,12,1, - 8,1,18,2,10,1,8,1,16,1,10,1,16,1,10,1, - 14,2,16,1,10,1,16,2,14,1,114,103,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, - 9,0,0,0,67,0,0,0,115,126,0,0,0,116,0,124, - 0,131,1,100,1,107,2,114,16,100,2,83,0,124,0,160, - 1,100,3,161,1,92,3,125,1,125,2,125,3,124,1,114, - 56,124,3,160,2,161,0,100,4,100,5,133,2,25,0,100, - 6,107,3,114,60,124,0,83,0,122,12,116,3,124,0,131, - 1,125,4,87,0,110,36,4,0,116,4,116,5,102,2,107, - 10,114,108,1,0,1,0,1,0,124,0,100,2,100,5,133, - 2,25,0,125,4,89,0,110,2,88,0,116,6,124,4,131, - 1,114,122,124,4,83,0,124,0,83,0,41,7,122,188,67, - 111,110,118,101,114,116,32,97,32,98,121,116,101,99,111,100, - 101,32,102,105,108,101,32,112,97,116,104,32,116,111,32,97, - 32,115,111,117,114,99,101,32,112,97,116,104,32,40,105,102, - 32,112,111,115,115,105,98,108,101,41,46,10,10,32,32,32, - 32,84,104,105,115,32,102,117,110,99,116,105,111,110,32,101, - 120,105,115,116,115,32,112,117,114,101,108,121,32,102,111,114, - 32,98,97,99,107,119,97,114,100,115,45,99,111,109,112,97, - 116,105,98,105,108,105,116,121,32,102,111,114,10,32,32,32, - 32,80,121,73,109,112,111,114,116,95,69,120,101,99,67,111, - 100,101,77,111,100,117,108,101,87,105,116,104,70,105,108,101, - 110,97,109,101,115,40,41,32,105,110,32,116,104,101,32,67, - 32,65,80,73,46,10,10,32,32,32,32,114,73,0,0,0, - 78,114,71,0,0,0,233,253,255,255,255,233,255,255,255,255, - 90,2,112,121,41,7,114,22,0,0,0,114,41,0,0,0, - 218,5,108,111,119,101,114,114,103,0,0,0,114,82,0,0, - 0,114,87,0,0,0,114,54,0,0,0,41,5,218,13,98, - 121,116,101,99,111,100,101,95,112,97,116,104,114,96,0,0, - 0,114,45,0,0,0,90,9,101,120,116,101,110,115,105,111, - 110,218,11,115,111,117,114,99,101,95,112,97,116,104,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,218,15,95, - 103,101,116,95,115,111,117,114,99,101,102,105,108,101,144,1, - 0,0,115,20,0,0,0,0,7,12,1,4,1,16,1,24, - 1,4,1,2,1,12,1,18,1,18,1,114,109,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,8,0,0,0,67,0,0,0,115,74,0,0,0,124,0, - 160,0,116,1,116,2,131,1,161,1,114,48,122,10,116,3, - 124,0,131,1,87,0,83,0,4,0,116,4,107,10,114,44, - 1,0,1,0,1,0,89,0,113,70,88,0,110,22,124,0, - 160,0,116,1,116,5,131,1,161,1,114,66,124,0,83,0, - 100,0,83,0,100,0,83,0,169,1,78,41,6,218,8,101, - 110,100,115,119,105,116,104,218,5,116,117,112,108,101,114,102, - 0,0,0,114,98,0,0,0,114,82,0,0,0,114,89,0, - 0,0,41,1,114,97,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,11,95,103,101,116,95,99, - 97,99,104,101,100,163,1,0,0,115,16,0,0,0,0,1, - 14,1,2,1,10,1,14,1,8,1,14,1,4,2,114,113, - 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,8,0,0,0,67,0,0,0,115,52,0,0, - 0,122,14,116,0,124,0,131,1,106,1,125,1,87,0,110, - 24,4,0,116,2,107,10,114,38,1,0,1,0,1,0,100, - 1,125,1,89,0,110,2,88,0,124,1,100,2,79,0,125, - 1,124,1,83,0,41,3,122,51,67,97,108,99,117,108,97, - 116,101,32,116,104,101,32,109,111,100,101,32,112,101,114,109, - 105,115,115,105,111,110,115,32,102,111,114,32,97,32,98,121, - 116,101,99,111,100,101,32,102,105,108,101,46,114,60,0,0, - 0,233,128,0,0,0,41,3,114,49,0,0,0,114,51,0, - 0,0,114,50,0,0,0,41,2,114,44,0,0,0,114,52, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,218,10,95,99,97,108,99,95,109,111,100,101,175,1, - 0,0,115,12,0,0,0,0,2,2,1,14,1,14,1,10, - 3,8,1,114,115,0,0,0,99,1,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,8,0,0,0,3,0,0, - 0,115,68,0,0,0,100,6,135,0,102,1,100,2,100,3, - 132,9,125,1,122,10,116,0,106,1,125,2,87,0,110,28, - 4,0,116,2,107,10,114,52,1,0,1,0,1,0,100,4, - 100,5,132,0,125,2,89,0,110,2,88,0,124,2,124,1, - 136,0,131,2,1,0,124,1,83,0,41,7,122,252,68,101, - 99,111,114,97,116,111,114,32,116,111,32,118,101,114,105,102, - 121,32,116,104,97,116,32,116,104,101,32,109,111,100,117,108, - 101,32,98,101,105,110,103,32,114,101,113,117,101,115,116,101, - 100,32,109,97,116,99,104,101,115,32,116,104,101,32,111,110, - 101,32,116,104,101,10,32,32,32,32,108,111,97,100,101,114, - 32,99,97,110,32,104,97,110,100,108,101,46,10,10,32,32, - 32,32,84,104,101,32,102,105,114,115,116,32,97,114,103,117, - 109,101,110,116,32,40,115,101,108,102,41,32,109,117,115,116, - 32,100,101,102,105,110,101,32,95,110,97,109,101,32,119,104, - 105,99,104,32,116,104,101,32,115,101,99,111,110,100,32,97, - 114,103,117,109,101,110,116,32,105,115,10,32,32,32,32,99, - 111,109,112,97,114,101,100,32,97,103,97,105,110,115,116,46, - 32,73,102,32,116,104,101,32,99,111,109,112,97,114,105,115, - 111,110,32,102,97,105,108,115,32,116,104,101,110,32,73,109, - 112,111,114,116,69,114,114,111,114,32,105,115,32,114,97,105, - 115,101,100,46,10,10,32,32,32,32,78,99,2,0,0,0, - 0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0, - 31,0,0,0,115,66,0,0,0,124,1,100,0,107,8,114, - 16,124,0,106,0,125,1,110,32,124,0,106,0,124,1,107, - 3,114,48,116,1,100,1,124,0,106,0,124,1,102,2,22, - 0,124,1,100,2,141,2,130,1,136,0,124,0,124,1,102, - 2,124,2,158,2,124,3,142,1,83,0,41,3,78,122,30, - 108,111,97,100,101,114,32,102,111,114,32,37,115,32,99,97, - 110,110,111,116,32,104,97,110,100,108,101,32,37,115,169,1, - 218,4,110,97,109,101,41,2,114,117,0,0,0,218,11,73, - 109,112,111,114,116,69,114,114,111,114,41,4,218,4,115,101, - 108,102,114,117,0,0,0,218,4,97,114,103,115,90,6,107, - 119,97,114,103,115,169,1,218,6,109,101,116,104,111,100,114, - 3,0,0,0,114,6,0,0,0,218,19,95,99,104,101,99, - 107,95,110,97,109,101,95,119,114,97,112,112,101,114,195,1, - 0,0,115,18,0,0,0,0,1,8,1,8,1,10,1,4, - 1,8,255,2,1,2,255,6,2,122,40,95,99,104,101,99, - 107,95,110,97,109,101,46,60,108,111,99,97,108,115,62,46, - 95,99,104,101,99,107,95,110,97,109,101,95,119,114,97,112, - 112,101,114,99,2,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,7,0,0,0,83,0,0,0,115,56,0,0, - 0,100,1,68,0,93,32,125,2,116,0,124,1,124,2,131, - 2,114,4,116,1,124,0,124,2,116,2,124,1,124,2,131, - 2,131,3,1,0,113,4,124,0,106,3,160,4,124,1,106, - 3,161,1,1,0,100,0,83,0,41,2,78,41,4,218,10, - 95,95,109,111,100,117,108,101,95,95,218,8,95,95,110,97, - 109,101,95,95,218,12,95,95,113,117,97,108,110,97,109,101, - 95,95,218,7,95,95,100,111,99,95,95,41,5,218,7,104, - 97,115,97,116,116,114,218,7,115,101,116,97,116,116,114,218, - 7,103,101,116,97,116,116,114,218,8,95,95,100,105,99,116, - 95,95,218,6,117,112,100,97,116,101,41,3,90,3,110,101, - 119,90,3,111,108,100,114,67,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,5,95,119,114,97, - 112,206,1,0,0,115,8,0,0,0,0,1,8,1,10,1, - 20,1,122,26,95,99,104,101,99,107,95,110,97,109,101,46, - 60,108,111,99,97,108,115,62,46,95,119,114,97,112,41,1, - 78,41,3,218,10,95,98,111,111,116,115,116,114,97,112,114, - 133,0,0,0,218,9,78,97,109,101,69,114,114,111,114,41, - 3,114,122,0,0,0,114,123,0,0,0,114,133,0,0,0, - 114,3,0,0,0,114,121,0,0,0,114,6,0,0,0,218, - 11,95,99,104,101,99,107,95,110,97,109,101,187,1,0,0, - 115,14,0,0,0,0,8,14,7,2,1,10,1,14,2,14, - 5,10,1,114,136,0,0,0,99,2,0,0,0,0,0,0, - 0,0,0,0,0,5,0,0,0,6,0,0,0,67,0,0, - 0,115,60,0,0,0,124,0,160,0,124,1,161,1,92,2, - 125,2,125,3,124,2,100,1,107,8,114,56,116,1,124,3, - 131,1,114,56,100,2,125,4,116,2,160,3,124,4,160,4, - 124,3,100,3,25,0,161,1,116,5,161,2,1,0,124,2, - 83,0,41,4,122,155,84,114,121,32,116,111,32,102,105,110, - 100,32,97,32,108,111,97,100,101,114,32,102,111,114,32,116, - 104,101,32,115,112,101,99,105,102,105,101,100,32,109,111,100, - 117,108,101,32,98,121,32,100,101,108,101,103,97,116,105,110, - 103,32,116,111,10,32,32,32,32,115,101,108,102,46,102,105, - 110,100,95,108,111,97,100,101,114,40,41,46,10,10,32,32, - 32,32,84,104,105,115,32,109,101,116,104,111,100,32,105,115, - 32,100,101,112,114,101,99,97,116,101,100,32,105,110,32,102, - 97,118,111,114,32,111,102,32,102,105,110,100,101,114,46,102, - 105,110,100,95,115,112,101,99,40,41,46,10,10,32,32,32, - 32,78,122,44,78,111,116,32,105,109,112,111,114,116,105,110, - 103,32,100,105,114,101,99,116,111,114,121,32,123,125,58,32, - 109,105,115,115,105,110,103,32,95,95,105,110,105,116,95,95, - 114,73,0,0,0,41,6,218,11,102,105,110,100,95,108,111, - 97,100,101,114,114,22,0,0,0,114,75,0,0,0,114,76, - 0,0,0,114,62,0,0,0,218,13,73,109,112,111,114,116, - 87,97,114,110,105,110,103,41,5,114,119,0,0,0,218,8, - 102,117,108,108,110,97,109,101,218,6,108,111,97,100,101,114, - 218,8,112,111,114,116,105,111,110,115,218,3,109,115,103,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,17, - 95,102,105,110,100,95,109,111,100,117,108,101,95,115,104,105, - 109,215,1,0,0,115,10,0,0,0,0,10,14,1,16,1, - 4,1,22,1,114,143,0,0,0,99,3,0,0,0,0,0, - 0,0,0,0,0,0,6,0,0,0,4,0,0,0,67,0, - 0,0,115,158,0,0,0,124,0,100,1,100,2,133,2,25, - 0,125,3,124,3,116,0,107,3,114,60,100,3,124,1,155, - 2,100,4,124,3,155,2,157,4,125,4,116,1,160,2,100, - 5,124,4,161,2,1,0,116,3,124,4,102,1,124,2,142, - 1,130,1,116,4,124,0,131,1,100,6,107,0,114,102,100, - 7,124,1,155,2,157,2,125,4,116,1,160,2,100,5,124, - 4,161,2,1,0,116,5,124,4,131,1,130,1,116,6,124, - 0,100,2,100,8,133,2,25,0,131,1,125,5,124,5,100, - 9,64,0,114,154,100,10,124,5,155,2,100,11,124,1,155, - 2,157,4,125,4,116,3,124,4,102,1,124,2,142,1,130, - 1,124,5,83,0,41,12,97,84,2,0,0,80,101,114,102, - 111,114,109,32,98,97,115,105,99,32,118,97,108,105,100,105, - 116,121,32,99,104,101,99,107,105,110,103,32,111,102,32,97, - 32,112,121,99,32,104,101,97,100,101,114,32,97,110,100,32, - 114,101,116,117,114,110,32,116,104,101,32,102,108,97,103,115, - 32,102,105,101,108,100,44,10,32,32,32,32,119,104,105,99, - 104,32,100,101,116,101,114,109,105,110,101,115,32,104,111,119, - 32,116,104,101,32,112,121,99,32,115,104,111,117,108,100,32, - 98,101,32,102,117,114,116,104,101,114,32,118,97,108,105,100, - 97,116,101,100,32,97,103,97,105,110,115,116,32,116,104,101, - 32,115,111,117,114,99,101,46,10,10,32,32,32,32,42,100, + 32,32,32,78,122,70,116,104,101,32,100,101,98,117,103,95, + 111,118,101,114,114,105,100,101,32,112,97,114,97,109,101,116, + 101,114,32,105,115,32,100,101,112,114,101,99,97,116,101,100, + 59,32,117,115,101,32,39,111,112,116,105,109,105,122,97,116, + 105,111,110,39,32,105,110,115,116,101,97,100,122,50,100,101, + 98,117,103,95,111,118,101,114,114,105,100,101,32,111,114,32, + 111,112,116,105,109,105,122,97,116,105,111,110,32,109,117,115, + 116,32,98,101,32,115,101,116,32,116,111,32,78,111,110,101, + 114,40,0,0,0,114,39,0,0,0,218,1,46,250,36,115, + 121,115,46,105,109,112,108,101,109,101,110,116,97,116,105,111, + 110,46,99,97,99,104,101,95,116,97,103,32,105,115,32,78, + 111,110,101,233,0,0,0,0,122,24,123,33,114,125,32,105, + 115,32,110,111,116,32,97,108,112,104,97,110,117,109,101,114, + 105,99,122,7,123,125,46,123,125,123,125,250,1,58,114,28, + 0,0,0,41,28,218,9,95,119,97,114,110,105,110,103,115, + 218,4,119,97,114,110,218,18,68,101,112,114,101,99,97,116, + 105,111,110,87,97,114,110,105,110,103,218,9,84,121,112,101, + 69,114,114,111,114,114,2,0,0,0,218,6,102,115,112,97, + 116,104,114,47,0,0,0,114,41,0,0,0,114,8,0,0, + 0,218,14,105,109,112,108,101,109,101,110,116,97,116,105,111, + 110,218,9,99,97,99,104,101,95,116,97,103,218,19,78,111, + 116,73,109,112,108,101,109,101,110,116,101,100,69,114,114,111, + 114,114,36,0,0,0,218,5,102,108,97,103,115,218,8,111, + 112,116,105,109,105,122,101,218,3,115,116,114,218,7,105,115, + 97,108,110,117,109,218,10,86,97,108,117,101,69,114,114,111, + 114,114,62,0,0,0,218,4,95,79,80,84,218,17,66,89, + 84,69,67,79,68,69,95,83,85,70,70,73,88,69,83,218, + 14,112,121,99,97,99,104,101,95,112,114,101,102,105,120,114, + 59,0,0,0,114,38,0,0,0,114,55,0,0,0,114,31, + 0,0,0,218,6,108,115,116,114,105,112,218,8,95,80,89, + 67,65,67,72,69,41,12,114,44,0,0,0,90,14,100,101, + 98,117,103,95,111,118,101,114,114,105,100,101,114,70,0,0, + 0,218,7,109,101,115,115,97,103,101,218,4,104,101,97,100, + 114,46,0,0,0,90,4,98,97,115,101,218,3,115,101,112, + 218,4,114,101,115,116,90,3,116,97,103,90,15,97,108,109, + 111,115,116,95,102,105,108,101,110,97,109,101,218,8,102,105, + 108,101,110,97,109,101,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,218,17,99,97,99,104,101,95,102,114,111, + 109,95,115,111,117,114,99,101,33,1,0,0,115,72,0,0, + 0,0,18,8,1,6,1,2,255,4,2,8,1,4,1,8, + 1,12,1,10,1,12,1,16,1,8,1,8,1,8,1,24, + 1,8,1,12,1,6,2,8,1,8,1,8,1,8,1,14, + 1,14,1,12,1,12,9,10,1,14,5,28,1,12,4,2, + 1,4,1,8,1,2,253,4,5,114,98,0,0,0,99,1, + 0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,5, + 0,0,0,67,0,0,0,115,46,1,0,0,116,0,106,1, + 106,2,100,1,107,8,114,20,116,3,100,2,131,1,130,1, + 116,4,160,5,124,0,161,1,125,0,116,6,124,0,131,1, + 92,2,125,1,125,2,100,3,125,3,116,0,106,7,100,1, + 107,9,114,102,116,0,106,7,160,8,116,9,161,1,125,4, + 124,1,160,10,124,4,116,11,23,0,161,1,114,102,124,1, + 116,12,124,4,131,1,100,1,133,2,25,0,125,1,100,4, + 125,3,124,3,115,144,116,6,124,1,131,1,92,2,125,1, + 125,5,124,5,116,13,107,3,114,144,116,14,116,13,155,0, + 100,5,124,0,155,2,157,3,131,1,130,1,124,2,160,15, + 100,6,161,1,125,6,124,6,100,7,107,7,114,178,116,14, + 100,8,124,2,155,2,157,2,131,1,130,1,110,92,124,6, + 100,9,107,2,144,1,114,14,124,2,160,16,100,6,100,10, + 161,2,100,11,25,0,125,7,124,7,160,10,116,17,161,1, + 115,228,116,14,100,12,116,17,155,2,157,2,131,1,130,1, + 124,7,116,12,116,17,131,1,100,1,133,2,25,0,125,8, + 124,8,160,18,161,0,144,1,115,14,116,14,100,13,124,7, + 155,2,100,14,157,3,131,1,130,1,124,2,160,19,100,6, + 161,1,100,15,25,0,125,9,116,20,124,1,124,9,116,21, + 100,15,25,0,23,0,131,2,83,0,41,16,97,110,1,0, + 0,71,105,118,101,110,32,116,104,101,32,112,97,116,104,32, + 116,111,32,97,32,46,112,121,99,46,32,102,105,108,101,44, + 32,114,101,116,117,114,110,32,116,104,101,32,112,97,116,104, + 32,116,111,32,105,116,115,32,46,112,121,32,102,105,108,101, + 46,10,10,32,32,32,32,84,104,101,32,46,112,121,99,32, + 102,105,108,101,32,100,111,101,115,32,110,111,116,32,110,101, + 101,100,32,116,111,32,101,120,105,115,116,59,32,116,104,105, + 115,32,115,105,109,112,108,121,32,114,101,116,117,114,110,115, + 32,116,104,101,32,112,97,116,104,32,116,111,10,32,32,32, + 32,116,104,101,32,46,112,121,32,102,105,108,101,32,99,97, + 108,99,117,108,97,116,101,100,32,116,111,32,99,111,114,114, + 101,115,112,111,110,100,32,116,111,32,116,104,101,32,46,112, + 121,99,32,102,105,108,101,46,32,32,73,102,32,112,97,116, + 104,32,100,111,101,115,10,32,32,32,32,110,111,116,32,99, + 111,110,102,111,114,109,32,116,111,32,80,69,80,32,51,49, + 52,55,47,52,56,56,32,102,111,114,109,97,116,44,32,86, + 97,108,117,101,69,114,114,111,114,32,119,105,108,108,32,98, + 101,32,114,97,105,115,101,100,46,32,73,102,10,32,32,32, + 32,115,121,115,46,105,109,112,108,101,109,101,110,116,97,116, + 105,111,110,46,99,97,99,104,101,95,116,97,103,32,105,115, + 32,78,111,110,101,32,116,104,101,110,32,78,111,116,73,109, + 112,108,101,109,101,110,116,101,100,69,114,114,111,114,32,105, + 115,32,114,97,105,115,101,100,46,10,10,32,32,32,32,78, + 114,72,0,0,0,70,84,122,31,32,110,111,116,32,98,111, + 116,116,111,109,45,108,101,118,101,108,32,100,105,114,101,99, + 116,111,114,121,32,105,110,32,114,71,0,0,0,62,2,0, + 0,0,114,28,0,0,0,114,57,0,0,0,122,29,101,120, + 112,101,99,116,101,100,32,111,110,108,121,32,50,32,111,114, + 32,51,32,100,111,116,115,32,105,110,32,114,57,0,0,0, + 114,28,0,0,0,233,254,255,255,255,122,53,111,112,116,105, + 109,105,122,97,116,105,111,110,32,112,111,114,116,105,111,110, + 32,111,102,32,102,105,108,101,110,97,109,101,32,100,111,101, + 115,32,110,111,116,32,115,116,97,114,116,32,119,105,116,104, + 32,122,19,111,112,116,105,109,105,122,97,116,105,111,110,32, + 108,101,118,101,108,32,122,29,32,105,115,32,110,111,116,32, + 97,110,32,97,108,112,104,97,110,117,109,101,114,105,99,32, + 118,97,108,117,101,114,73,0,0,0,41,22,114,8,0,0, + 0,114,80,0,0,0,114,81,0,0,0,114,82,0,0,0, + 114,2,0,0,0,114,79,0,0,0,114,47,0,0,0,114, + 90,0,0,0,114,30,0,0,0,114,31,0,0,0,114,10, + 0,0,0,114,35,0,0,0,114,22,0,0,0,114,92,0, + 0,0,114,87,0,0,0,218,5,99,111,117,110,116,114,43, + 0,0,0,114,88,0,0,0,114,86,0,0,0,218,9,112, + 97,114,116,105,116,105,111,110,114,38,0,0,0,218,15,83, + 79,85,82,67,69,95,83,85,70,70,73,88,69,83,41,10, + 114,44,0,0,0,114,94,0,0,0,90,16,112,121,99,97, + 99,104,101,95,102,105,108,101,110,97,109,101,90,23,102,111, + 117,110,100,95,105,110,95,112,121,99,97,99,104,101,95,112, + 114,101,102,105,120,90,13,115,116,114,105,112,112,101,100,95, + 112,97,116,104,90,7,112,121,99,97,99,104,101,90,9,100, + 111,116,95,99,111,117,110,116,114,70,0,0,0,90,9,111, + 112,116,95,108,101,118,101,108,90,13,98,97,115,101,95,102, + 105,108,101,110,97,109,101,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,218,17,115,111,117,114,99,101,95,102, + 114,111,109,95,99,97,99,104,101,104,1,0,0,115,52,0, + 0,0,0,9,12,1,8,1,10,1,12,1,4,1,10,1, + 12,1,14,1,16,1,4,1,4,1,12,1,8,1,18,2, + 10,1,8,1,16,1,10,1,16,1,10,1,14,2,16,1, + 10,1,16,2,14,1,114,103,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,5,0,0,0,9,0,0,0, + 67,0,0,0,115,126,0,0,0,116,0,124,0,131,1,100, + 1,107,2,114,16,100,2,83,0,124,0,160,1,100,3,161, + 1,92,3,125,1,125,2,125,3,124,1,114,56,124,3,160, + 2,161,0,100,4,100,5,133,2,25,0,100,6,107,3,114, + 60,124,0,83,0,122,12,116,3,124,0,131,1,125,4,87, + 0,110,36,4,0,116,4,116,5,102,2,107,10,114,108,1, + 0,1,0,1,0,124,0,100,2,100,5,133,2,25,0,125, + 4,89,0,110,2,88,0,116,6,124,4,131,1,114,122,124, + 4,83,0,124,0,83,0,41,7,122,188,67,111,110,118,101, + 114,116,32,97,32,98,121,116,101,99,111,100,101,32,102,105, + 108,101,32,112,97,116,104,32,116,111,32,97,32,115,111,117, + 114,99,101,32,112,97,116,104,32,40,105,102,32,112,111,115, + 115,105,98,108,101,41,46,10,10,32,32,32,32,84,104,105, + 115,32,102,117,110,99,116,105,111,110,32,101,120,105,115,116, + 115,32,112,117,114,101,108,121,32,102,111,114,32,98,97,99, + 107,119,97,114,100,115,45,99,111,109,112,97,116,105,98,105, + 108,105,116,121,32,102,111,114,10,32,32,32,32,80,121,73, + 109,112,111,114,116,95,69,120,101,99,67,111,100,101,77,111, + 100,117,108,101,87,105,116,104,70,105,108,101,110,97,109,101, + 115,40,41,32,105,110,32,116,104,101,32,67,32,65,80,73, + 46,10,10,32,32,32,32,114,73,0,0,0,78,114,71,0, + 0,0,233,253,255,255,255,233,255,255,255,255,90,2,112,121, + 41,7,114,22,0,0,0,114,41,0,0,0,218,5,108,111, + 119,101,114,114,103,0,0,0,114,82,0,0,0,114,87,0, + 0,0,114,54,0,0,0,41,5,218,13,98,121,116,101,99, + 111,100,101,95,112,97,116,104,114,96,0,0,0,114,45,0, + 0,0,90,9,101,120,116,101,110,115,105,111,110,218,11,115, + 111,117,114,99,101,95,112,97,116,104,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,218,15,95,103,101,116,95, + 115,111,117,114,99,101,102,105,108,101,144,1,0,0,115,20, + 0,0,0,0,7,12,1,4,1,16,1,24,1,4,1,2, + 1,12,1,18,1,18,1,114,109,0,0,0,99,1,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0, + 0,67,0,0,0,115,74,0,0,0,124,0,160,0,116,1, + 116,2,131,1,161,1,114,48,122,10,116,3,124,0,131,1, + 87,0,83,0,4,0,116,4,107,10,114,44,1,0,1,0, + 1,0,89,0,113,70,88,0,110,22,124,0,160,0,116,1, + 116,5,131,1,161,1,114,66,124,0,83,0,100,0,83,0, + 100,0,83,0,169,1,78,41,6,218,8,101,110,100,115,119, + 105,116,104,218,5,116,117,112,108,101,114,102,0,0,0,114, + 98,0,0,0,114,82,0,0,0,114,89,0,0,0,41,1, + 114,97,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,218,11,95,103,101,116,95,99,97,99,104,101, + 100,163,1,0,0,115,16,0,0,0,0,1,14,1,2,1, + 10,1,14,1,8,1,14,1,4,2,114,113,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 8,0,0,0,67,0,0,0,115,52,0,0,0,122,14,116, + 0,124,0,131,1,106,1,125,1,87,0,110,24,4,0,116, + 2,107,10,114,38,1,0,1,0,1,0,100,1,125,1,89, + 0,110,2,88,0,124,1,100,2,79,0,125,1,124,1,83, + 0,41,3,122,51,67,97,108,99,117,108,97,116,101,32,116, + 104,101,32,109,111,100,101,32,112,101,114,109,105,115,115,105, + 111,110,115,32,102,111,114,32,97,32,98,121,116,101,99,111, + 100,101,32,102,105,108,101,46,114,60,0,0,0,233,128,0, + 0,0,41,3,114,49,0,0,0,114,51,0,0,0,114,50, + 0,0,0,41,2,114,44,0,0,0,114,52,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,10, + 95,99,97,108,99,95,109,111,100,101,175,1,0,0,115,12, + 0,0,0,0,2,2,1,14,1,14,1,10,3,8,1,114, + 115,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,8,0,0,0,3,0,0,0,115,68,0, + 0,0,100,6,135,0,102,1,100,2,100,3,132,9,125,1, + 122,10,116,0,106,1,125,2,87,0,110,28,4,0,116,2, + 107,10,114,52,1,0,1,0,1,0,100,4,100,5,132,0, + 125,2,89,0,110,2,88,0,124,2,124,1,136,0,131,2, + 1,0,124,1,83,0,41,7,122,252,68,101,99,111,114,97, + 116,111,114,32,116,111,32,118,101,114,105,102,121,32,116,104, + 97,116,32,116,104,101,32,109,111,100,117,108,101,32,98,101, + 105,110,103,32,114,101,113,117,101,115,116,101,100,32,109,97, + 116,99,104,101,115,32,116,104,101,32,111,110,101,32,116,104, + 101,10,32,32,32,32,108,111,97,100,101,114,32,99,97,110, + 32,104,97,110,100,108,101,46,10,10,32,32,32,32,84,104, + 101,32,102,105,114,115,116,32,97,114,103,117,109,101,110,116, + 32,40,115,101,108,102,41,32,109,117,115,116,32,100,101,102, + 105,110,101,32,95,110,97,109,101,32,119,104,105,99,104,32, + 116,104,101,32,115,101,99,111,110,100,32,97,114,103,117,109, + 101,110,116,32,105,115,10,32,32,32,32,99,111,109,112,97, + 114,101,100,32,97,103,97,105,110,115,116,46,32,73,102,32, + 116,104,101,32,99,111,109,112,97,114,105,115,111,110,32,102, + 97,105,108,115,32,116,104,101,110,32,73,109,112,111,114,116, + 69,114,114,111,114,32,105,115,32,114,97,105,115,101,100,46, + 10,10,32,32,32,32,78,99,2,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,4,0,0,0,31,0,0,0, + 115,66,0,0,0,124,1,100,0,107,8,114,16,124,0,106, + 0,125,1,110,32,124,0,106,0,124,1,107,3,114,48,116, + 1,100,1,124,0,106,0,124,1,102,2,22,0,124,1,100, + 2,141,2,130,1,136,0,124,0,124,1,102,2,124,2,158, + 2,124,3,142,1,83,0,41,3,78,122,30,108,111,97,100, + 101,114,32,102,111,114,32,37,115,32,99,97,110,110,111,116, + 32,104,97,110,100,108,101,32,37,115,169,1,218,4,110,97, + 109,101,41,2,114,117,0,0,0,218,11,73,109,112,111,114, + 116,69,114,114,111,114,41,4,218,4,115,101,108,102,114,117, + 0,0,0,218,4,97,114,103,115,90,6,107,119,97,114,103, + 115,169,1,218,6,109,101,116,104,111,100,114,3,0,0,0, + 114,6,0,0,0,218,19,95,99,104,101,99,107,95,110,97, + 109,101,95,119,114,97,112,112,101,114,195,1,0,0,115,18, + 0,0,0,0,1,8,1,8,1,10,1,4,1,8,255,2, + 1,2,255,6,2,122,40,95,99,104,101,99,107,95,110,97, + 109,101,46,60,108,111,99,97,108,115,62,46,95,99,104,101, + 99,107,95,110,97,109,101,95,119,114,97,112,112,101,114,99, + 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 7,0,0,0,83,0,0,0,115,56,0,0,0,100,1,68, + 0,93,32,125,2,116,0,124,1,124,2,131,2,114,4,116, + 1,124,0,124,2,116,2,124,1,124,2,131,2,131,3,1, + 0,113,4,124,0,106,3,160,4,124,1,106,3,161,1,1, + 0,100,0,83,0,41,2,78,41,4,218,10,95,95,109,111, + 100,117,108,101,95,95,218,8,95,95,110,97,109,101,95,95, + 218,12,95,95,113,117,97,108,110,97,109,101,95,95,218,7, + 95,95,100,111,99,95,95,41,5,218,7,104,97,115,97,116, + 116,114,218,7,115,101,116,97,116,116,114,218,7,103,101,116, + 97,116,116,114,218,8,95,95,100,105,99,116,95,95,218,6, + 117,112,100,97,116,101,41,3,90,3,110,101,119,90,3,111, + 108,100,114,67,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,218,5,95,119,114,97,112,206,1,0, + 0,115,8,0,0,0,0,1,8,1,10,1,20,1,122,26, + 95,99,104,101,99,107,95,110,97,109,101,46,60,108,111,99, + 97,108,115,62,46,95,119,114,97,112,41,1,78,41,3,218, + 10,95,98,111,111,116,115,116,114,97,112,114,133,0,0,0, + 218,9,78,97,109,101,69,114,114,111,114,41,3,114,122,0, + 0,0,114,123,0,0,0,114,133,0,0,0,114,3,0,0, + 0,114,121,0,0,0,114,6,0,0,0,218,11,95,99,104, + 101,99,107,95,110,97,109,101,187,1,0,0,115,14,0,0, + 0,0,8,14,7,2,1,10,1,14,2,14,5,10,1,114, + 136,0,0,0,99,2,0,0,0,0,0,0,0,0,0,0, + 0,5,0,0,0,6,0,0,0,67,0,0,0,115,60,0, + 0,0,124,0,160,0,124,1,161,1,92,2,125,2,125,3, + 124,2,100,1,107,8,114,56,116,1,124,3,131,1,114,56, + 100,2,125,4,116,2,160,3,124,4,160,4,124,3,100,3, + 25,0,161,1,116,5,161,2,1,0,124,2,83,0,41,4, + 122,155,84,114,121,32,116,111,32,102,105,110,100,32,97,32, + 108,111,97,100,101,114,32,102,111,114,32,116,104,101,32,115, + 112,101,99,105,102,105,101,100,32,109,111,100,117,108,101,32, + 98,121,32,100,101,108,101,103,97,116,105,110,103,32,116,111, + 10,32,32,32,32,115,101,108,102,46,102,105,110,100,95,108, + 111,97,100,101,114,40,41,46,10,10,32,32,32,32,84,104, + 105,115,32,109,101,116,104,111,100,32,105,115,32,100,101,112, + 114,101,99,97,116,101,100,32,105,110,32,102,97,118,111,114, + 32,111,102,32,102,105,110,100,101,114,46,102,105,110,100,95, + 115,112,101,99,40,41,46,10,10,32,32,32,32,78,122,44, + 78,111,116,32,105,109,112,111,114,116,105,110,103,32,100,105, + 114,101,99,116,111,114,121,32,123,125,58,32,109,105,115,115, + 105,110,103,32,95,95,105,110,105,116,95,95,114,73,0,0, + 0,41,6,218,11,102,105,110,100,95,108,111,97,100,101,114, + 114,22,0,0,0,114,75,0,0,0,114,76,0,0,0,114, + 62,0,0,0,218,13,73,109,112,111,114,116,87,97,114,110, + 105,110,103,41,5,114,119,0,0,0,218,8,102,117,108,108, + 110,97,109,101,218,6,108,111,97,100,101,114,218,8,112,111, + 114,116,105,111,110,115,218,3,109,115,103,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,218,17,95,102,105,110, + 100,95,109,111,100,117,108,101,95,115,104,105,109,215,1,0, + 0,115,10,0,0,0,0,10,14,1,16,1,4,1,22,1, + 114,143,0,0,0,99,3,0,0,0,0,0,0,0,0,0, + 0,0,6,0,0,0,4,0,0,0,67,0,0,0,115,158, + 0,0,0,124,0,100,1,100,2,133,2,25,0,125,3,124, + 3,116,0,107,3,114,60,100,3,124,1,155,2,100,4,124, + 3,155,2,157,4,125,4,116,1,160,2,100,5,124,4,161, + 2,1,0,116,3,124,4,102,1,124,2,142,1,130,1,116, + 4,124,0,131,1,100,6,107,0,114,102,100,7,124,1,155, + 2,157,2,125,4,116,1,160,2,100,5,124,4,161,2,1, + 0,116,5,124,4,131,1,130,1,116,6,124,0,100,2,100, + 8,133,2,25,0,131,1,125,5,124,5,100,9,64,0,114, + 154,100,10,124,5,155,2,100,11,124,1,155,2,157,4,125, + 4,116,3,124,4,102,1,124,2,142,1,130,1,124,5,83, + 0,41,12,97,84,2,0,0,80,101,114,102,111,114,109,32, + 98,97,115,105,99,32,118,97,108,105,100,105,116,121,32,99, + 104,101,99,107,105,110,103,32,111,102,32,97,32,112,121,99, + 32,104,101,97,100,101,114,32,97,110,100,32,114,101,116,117, + 114,110,32,116,104,101,32,102,108,97,103,115,32,102,105,101, + 108,100,44,10,32,32,32,32,119,104,105,99,104,32,100,101, + 116,101,114,109,105,110,101,115,32,104,111,119,32,116,104,101, + 32,112,121,99,32,115,104,111,117,108,100,32,98,101,32,102, + 117,114,116,104,101,114,32,118,97,108,105,100,97,116,101,100, + 32,97,103,97,105,110,115,116,32,116,104,101,32,115,111,117, + 114,99,101,46,10,10,32,32,32,32,42,100,97,116,97,42, + 32,105,115,32,116,104,101,32,99,111,110,116,101,110,116,115, + 32,111,102,32,116,104,101,32,112,121,99,32,102,105,108,101, + 46,32,40,79,110,108,121,32,116,104,101,32,102,105,114,115, + 116,32,49,54,32,98,121,116,101,115,32,97,114,101,10,32, + 32,32,32,114,101,113,117,105,114,101,100,44,32,116,104,111, + 117,103,104,46,41,10,10,32,32,32,32,42,110,97,109,101, + 42,32,105,115,32,116,104,101,32,110,97,109,101,32,111,102, + 32,116,104,101,32,109,111,100,117,108,101,32,98,101,105,110, + 103,32,105,109,112,111,114,116,101,100,46,32,73,116,32,105, + 115,32,117,115,101,100,32,102,111,114,32,108,111,103,103,105, + 110,103,46,10,10,32,32,32,32,42,101,120,99,95,100,101, + 116,97,105,108,115,42,32,105,115,32,97,32,100,105,99,116, + 105,111,110,97,114,121,32,112,97,115,115,101,100,32,116,111, + 32,73,109,112,111,114,116,69,114,114,111,114,32,105,102,32, + 105,116,32,114,97,105,115,101,100,32,102,111,114,10,32,32, + 32,32,105,109,112,114,111,118,101,100,32,100,101,98,117,103, + 103,105,110,103,46,10,10,32,32,32,32,73,109,112,111,114, + 116,69,114,114,111,114,32,105,115,32,114,97,105,115,101,100, + 32,119,104,101,110,32,116,104,101,32,109,97,103,105,99,32, + 110,117,109,98,101,114,32,105,115,32,105,110,99,111,114,114, + 101,99,116,32,111,114,32,119,104,101,110,32,116,104,101,32, + 102,108,97,103,115,10,32,32,32,32,102,105,101,108,100,32, + 105,115,32,105,110,118,97,108,105,100,46,32,69,79,70,69, + 114,114,111,114,32,105,115,32,114,97,105,115,101,100,32,119, + 104,101,110,32,116,104,101,32,100,97,116,97,32,105,115,32, + 102,111,117,110,100,32,116,111,32,98,101,32,116,114,117,110, + 99,97,116,101,100,46,10,10,32,32,32,32,78,114,15,0, + 0,0,122,20,98,97,100,32,109,97,103,105,99,32,110,117, + 109,98,101,114,32,105,110,32,122,2,58,32,250,2,123,125, + 233,16,0,0,0,122,40,114,101,97,99,104,101,100,32,69, + 79,70,32,119,104,105,108,101,32,114,101,97,100,105,110,103, + 32,112,121,99,32,104,101,97,100,101,114,32,111,102,32,233, + 8,0,0,0,233,252,255,255,255,122,14,105,110,118,97,108, + 105,100,32,102,108,97,103,115,32,122,4,32,105,110,32,41, + 7,218,12,77,65,71,73,67,95,78,85,77,66,69,82,114, + 134,0,0,0,218,16,95,118,101,114,98,111,115,101,95,109, + 101,115,115,97,103,101,114,118,0,0,0,114,22,0,0,0, + 218,8,69,79,70,69,114,114,111,114,114,27,0,0,0,41, + 6,114,26,0,0,0,114,117,0,0,0,218,11,101,120,99, + 95,100,101,116,97,105,108,115,90,5,109,97,103,105,99,114, + 93,0,0,0,114,83,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,13,95,99,108,97,115,115, + 105,102,121,95,112,121,99,232,1,0,0,115,28,0,0,0, + 0,16,12,1,8,1,16,1,12,1,12,1,12,1,10,1, + 12,1,8,1,16,2,8,1,16,1,12,1,114,152,0,0, + 0,99,5,0,0,0,0,0,0,0,0,0,0,0,6,0, + 0,0,4,0,0,0,67,0,0,0,115,112,0,0,0,116, + 0,124,0,100,1,100,2,133,2,25,0,131,1,124,1,100, + 3,64,0,107,3,114,58,100,4,124,3,155,2,157,2,125, + 5,116,1,160,2,100,5,124,5,161,2,1,0,116,3,124, + 5,102,1,124,4,142,1,130,1,124,2,100,6,107,9,114, + 108,116,0,124,0,100,2,100,7,133,2,25,0,131,1,124, + 2,100,3,64,0,107,3,114,108,116,3,100,4,124,3,155, + 2,157,2,102,1,124,4,142,1,130,1,100,6,83,0,41, + 8,97,7,2,0,0,86,97,108,105,100,97,116,101,32,97, + 32,112,121,99,32,97,103,97,105,110,115,116,32,116,104,101, + 32,115,111,117,114,99,101,32,108,97,115,116,45,109,111,100, + 105,102,105,101,100,32,116,105,109,101,46,10,10,32,32,32, + 32,42,100,97,116,97,42,32,105,115,32,116,104,101,32,99, + 111,110,116,101,110,116,115,32,111,102,32,116,104,101,32,112, + 121,99,32,102,105,108,101,46,32,40,79,110,108,121,32,116, + 104,101,32,102,105,114,115,116,32,49,54,32,98,121,116,101, + 115,32,97,114,101,10,32,32,32,32,114,101,113,117,105,114, + 101,100,46,41,10,10,32,32,32,32,42,115,111,117,114,99, + 101,95,109,116,105,109,101,42,32,105,115,32,116,104,101,32, + 108,97,115,116,32,109,111,100,105,102,105,101,100,32,116,105, + 109,101,115,116,97,109,112,32,111,102,32,116,104,101,32,115, + 111,117,114,99,101,32,102,105,108,101,46,10,10,32,32,32, + 32,42,115,111,117,114,99,101,95,115,105,122,101,42,32,105, + 115,32,78,111,110,101,32,111,114,32,116,104,101,32,115,105, + 122,101,32,111,102,32,116,104,101,32,115,111,117,114,99,101, + 32,102,105,108,101,32,105,110,32,98,121,116,101,115,46,10, + 10,32,32,32,32,42,110,97,109,101,42,32,105,115,32,116, + 104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,109, + 111,100,117,108,101,32,98,101,105,110,103,32,105,109,112,111, + 114,116,101,100,46,32,73,116,32,105,115,32,117,115,101,100, + 32,102,111,114,32,108,111,103,103,105,110,103,46,10,10,32, + 32,32,32,42,101,120,99,95,100,101,116,97,105,108,115,42, + 32,105,115,32,97,32,100,105,99,116,105,111,110,97,114,121, + 32,112,97,115,115,101,100,32,116,111,32,73,109,112,111,114, + 116,69,114,114,111,114,32,105,102,32,105,116,32,114,97,105, + 115,101,100,32,102,111,114,10,32,32,32,32,105,109,112,114, + 111,118,101,100,32,100,101,98,117,103,103,105,110,103,46,10, + 10,32,32,32,32,65,110,32,73,109,112,111,114,116,69,114, + 114,111,114,32,105,115,32,114,97,105,115,101,100,32,105,102, + 32,116,104,101,32,98,121,116,101,99,111,100,101,32,105,115, + 32,115,116,97,108,101,46,10,10,32,32,32,32,114,146,0, + 0,0,233,12,0,0,0,114,14,0,0,0,122,22,98,121, + 116,101,99,111,100,101,32,105,115,32,115,116,97,108,101,32, + 102,111,114,32,114,144,0,0,0,78,114,145,0,0,0,41, + 4,114,27,0,0,0,114,134,0,0,0,114,149,0,0,0, + 114,118,0,0,0,41,6,114,26,0,0,0,218,12,115,111, + 117,114,99,101,95,109,116,105,109,101,218,11,115,111,117,114, + 99,101,95,115,105,122,101,114,117,0,0,0,114,151,0,0, + 0,114,93,0,0,0,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,218,23,95,118,97,108,105,100,97,116,101, + 95,116,105,109,101,115,116,97,109,112,95,112,121,99,9,2, + 0,0,115,16,0,0,0,0,19,24,1,10,1,12,1,12, + 1,8,1,22,255,2,2,114,156,0,0,0,99,4,0,0, + 0,0,0,0,0,0,0,0,0,4,0,0,0,3,0,0, + 0,67,0,0,0,115,38,0,0,0,124,0,100,1,100,2, + 133,2,25,0,124,1,107,3,114,34,116,0,100,3,124,2, + 155,2,157,2,102,1,124,3,142,1,130,1,100,4,83,0, + 41,5,97,243,1,0,0,86,97,108,105,100,97,116,101,32, + 97,32,104,97,115,104,45,98,97,115,101,100,32,112,121,99, + 32,98,121,32,99,104,101,99,107,105,110,103,32,116,104,101, + 32,114,101,97,108,32,115,111,117,114,99,101,32,104,97,115, + 104,32,97,103,97,105,110,115,116,32,116,104,101,32,111,110, + 101,32,105,110,10,32,32,32,32,116,104,101,32,112,121,99, + 32,104,101,97,100,101,114,46,10,10,32,32,32,32,42,100, 97,116,97,42,32,105,115,32,116,104,101,32,99,111,110,116, 101,110,116,115,32,111,102,32,116,104,101,32,112,121,99,32, 102,105,108,101,46,32,40,79,110,108,121,32,116,104,101,32, 102,105,114,115,116,32,49,54,32,98,121,116,101,115,32,97, - 114,101,10,32,32,32,32,114,101,113,117,105,114,101,100,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,15,0,0,0,122,20,98,97,100,32,109,97,103,105, - 99,32,110,117,109,98,101,114,32,105,110,32,122,2,58,32, - 250,2,123,125,233,16,0,0,0,122,40,114,101,97,99,104, - 101,100,32,69,79,70,32,119,104,105,108,101,32,114,101,97, - 100,105,110,103,32,112,121,99,32,104,101,97,100,101,114,32, - 111,102,32,233,8,0,0,0,233,252,255,255,255,122,14,105, - 110,118,97,108,105,100,32,102,108,97,103,115,32,122,4,32, - 105,110,32,41,7,218,12,77,65,71,73,67,95,78,85,77, - 66,69,82,114,134,0,0,0,218,16,95,118,101,114,98,111, - 115,101,95,109,101,115,115,97,103,101,114,118,0,0,0,114, - 22,0,0,0,218,8,69,79,70,69,114,114,111,114,114,27, - 0,0,0,41,6,114,26,0,0,0,114,117,0,0,0,218, - 11,101,120,99,95,100,101,116,97,105,108,115,90,5,109,97, - 103,105,99,114,93,0,0,0,114,83,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,13,95,99, - 108,97,115,115,105,102,121,95,112,121,99,232,1,0,0,115, - 28,0,0,0,0,16,12,1,8,1,16,1,12,1,12,1, - 12,1,10,1,12,1,8,1,16,2,8,1,16,1,12,1, - 114,152,0,0,0,99,5,0,0,0,0,0,0,0,0,0, - 0,0,6,0,0,0,4,0,0,0,67,0,0,0,115,112, - 0,0,0,116,0,124,0,100,1,100,2,133,2,25,0,131, - 1,124,1,100,3,64,0,107,3,114,58,100,4,124,3,155, - 2,157,2,125,5,116,1,160,2,100,5,124,5,161,2,1, - 0,116,3,124,5,102,1,124,4,142,1,130,1,124,2,100, - 6,107,9,114,108,116,0,124,0,100,2,100,7,133,2,25, - 0,131,1,124,2,100,3,64,0,107,3,114,108,116,3,100, - 4,124,3,155,2,157,2,102,1,124,4,142,1,130,1,100, - 6,83,0,41,8,97,7,2,0,0,86,97,108,105,100,97, - 116,101,32,97,32,112,121,99,32,97,103,97,105,110,115,116, - 32,116,104,101,32,115,111,117,114,99,101,32,108,97,115,116, - 45,109,111,100,105,102,105,101,100,32,116,105,109,101,46,10, - 10,32,32,32,32,42,100,97,116,97,42,32,105,115,32,116, - 104,101,32,99,111,110,116,101,110,116,115,32,111,102,32,116, - 104,101,32,112,121,99,32,102,105,108,101,46,32,40,79,110, - 108,121,32,116,104,101,32,102,105,114,115,116,32,49,54,32, - 98,121,116,101,115,32,97,114,101,10,32,32,32,32,114,101, - 113,117,105,114,101,100,46,41,10,10,32,32,32,32,42,115, - 111,117,114,99,101,95,109,116,105,109,101,42,32,105,115,32, - 116,104,101,32,108,97,115,116,32,109,111,100,105,102,105,101, - 100,32,116,105,109,101,115,116,97,109,112,32,111,102,32,116, - 104,101,32,115,111,117,114,99,101,32,102,105,108,101,46,10, - 10,32,32,32,32,42,115,111,117,114,99,101,95,115,105,122, - 101,42,32,105,115,32,78,111,110,101,32,111,114,32,116,104, - 101,32,115,105,122,101,32,111,102,32,116,104,101,32,115,111, - 117,114,99,101,32,102,105,108,101,32,105,110,32,98,121,116, - 101,115,46,10,10,32,32,32,32,42,110,97,109,101,42,32, - 105,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116, - 104,101,32,109,111,100,117,108,101,32,98,101,105,110,103,32, - 105,109,112,111,114,116,101,100,46,32,73,116,32,105,115,32, - 117,115,101,100,32,102,111,114,32,108,111,103,103,105,110,103, - 46,10,10,32,32,32,32,42,101,120,99,95,100,101,116,97, - 105,108,115,42,32,105,115,32,97,32,100,105,99,116,105,111, - 110,97,114,121,32,112,97,115,115,101,100,32,116,111,32,73, - 109,112,111,114,116,69,114,114,111,114,32,105,102,32,105,116, - 32,114,97,105,115,101,100,32,102,111,114,10,32,32,32,32, - 105,109,112,114,111,118,101,100,32,100,101,98,117,103,103,105, - 110,103,46,10,10,32,32,32,32,65,110,32,73,109,112,111, - 114,116,69,114,114,111,114,32,105,115,32,114,97,105,115,101, - 100,32,105,102,32,116,104,101,32,98,121,116,101,99,111,100, - 101,32,105,115,32,115,116,97,108,101,46,10,10,32,32,32, - 32,114,146,0,0,0,233,12,0,0,0,114,14,0,0,0, - 122,22,98,121,116,101,99,111,100,101,32,105,115,32,115,116, - 97,108,101,32,102,111,114,32,114,144,0,0,0,78,114,145, - 0,0,0,41,4,114,27,0,0,0,114,134,0,0,0,114, - 149,0,0,0,114,118,0,0,0,41,6,114,26,0,0,0, - 218,12,115,111,117,114,99,101,95,109,116,105,109,101,218,11, - 115,111,117,114,99,101,95,115,105,122,101,114,117,0,0,0, - 114,151,0,0,0,114,93,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,23,95,118,97,108,105, - 100,97,116,101,95,116,105,109,101,115,116,97,109,112,95,112, - 121,99,9,2,0,0,115,16,0,0,0,0,19,24,1,10, - 1,12,1,12,1,8,1,22,255,2,2,114,156,0,0,0, - 99,4,0,0,0,0,0,0,0,0,0,0,0,4,0,0, - 0,3,0,0,0,67,0,0,0,115,38,0,0,0,124,0, - 100,1,100,2,133,2,25,0,124,1,107,3,114,34,116,0, - 100,3,124,2,155,2,157,2,102,1,124,3,142,1,130,1, - 100,4,83,0,41,5,97,243,1,0,0,86,97,108,105,100, - 97,116,101,32,97,32,104,97,115,104,45,98,97,115,101,100, - 32,112,121,99,32,98,121,32,99,104,101,99,107,105,110,103, - 32,116,104,101,32,114,101,97,108,32,115,111,117,114,99,101, - 32,104,97,115,104,32,97,103,97,105,110,115,116,32,116,104, - 101,32,111,110,101,32,105,110,10,32,32,32,32,116,104,101, - 32,112,121,99,32,104,101,97,100,101,114,46,10,10,32,32, - 32,32,42,100,97,116,97,42,32,105,115,32,116,104,101,32, - 99,111,110,116,101,110,116,115,32,111,102,32,116,104,101,32, - 112,121,99,32,102,105,108,101,46,32,40,79,110,108,121,32, - 116,104,101,32,102,105,114,115,116,32,49,54,32,98,121,116, - 101,115,32,97,114,101,10,32,32,32,32,114,101,113,117,105, - 114,101,100,46,41,10,10,32,32,32,32,42,115,111,117,114, - 99,101,95,104,97,115,104,42,32,105,115,32,116,104,101,32, - 105,109,112,111,114,116,108,105,98,46,117,116,105,108,46,115, - 111,117,114,99,101,95,104,97,115,104,40,41,32,111,102,32, - 116,104,101,32,115,111,117,114,99,101,32,102,105,108,101,46, - 10,10,32,32,32,32,42,110,97,109,101,42,32,105,115,32, - 116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32, - 109,111,100,117,108,101,32,98,101,105,110,103,32,105,109,112, - 111,114,116,101,100,46,32,73,116,32,105,115,32,117,115,101, - 100,32,102,111,114,32,108,111,103,103,105,110,103,46,10,10, - 32,32,32,32,42,101,120,99,95,100,101,116,97,105,108,115, - 42,32,105,115,32,97,32,100,105,99,116,105,111,110,97,114, - 121,32,112,97,115,115,101,100,32,116,111,32,73,109,112,111, - 114,116,69,114,114,111,114,32,105,102,32,105,116,32,114,97, - 105,115,101,100,32,102,111,114,10,32,32,32,32,105,109,112, - 114,111,118,101,100,32,100,101,98,117,103,103,105,110,103,46, - 10,10,32,32,32,32,65,110,32,73,109,112,111,114,116,69, - 114,114,111,114,32,105,115,32,114,97,105,115,101,100,32,105, - 102,32,116,104,101,32,98,121,116,101,99,111,100,101,32,105, - 115,32,115,116,97,108,101,46,10,10,32,32,32,32,114,146, - 0,0,0,114,145,0,0,0,122,46,104,97,115,104,32,105, - 110,32,98,121,116,101,99,111,100,101,32,100,111,101,115,110, - 39,116,32,109,97,116,99,104,32,104,97,115,104,32,111,102, - 32,115,111,117,114,99,101,32,78,41,1,114,118,0,0,0, - 41,4,114,26,0,0,0,218,11,115,111,117,114,99,101,95, - 104,97,115,104,114,117,0,0,0,114,151,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,218,18,95, - 118,97,108,105,100,97,116,101,95,104,97,115,104,95,112,121, - 99,37,2,0,0,115,12,0,0,0,0,17,16,1,2,1, - 8,255,2,2,2,254,114,158,0,0,0,99,4,0,0,0, - 0,0,0,0,0,0,0,0,5,0,0,0,5,0,0,0, - 67,0,0,0,115,82,0,0,0,116,0,160,1,124,0,161, - 1,125,4,116,2,124,4,116,3,131,2,114,58,116,4,160, - 5,100,1,124,2,161,2,1,0,124,3,100,2,107,9,114, - 52,116,6,160,7,124,4,124,3,161,2,1,0,124,4,83, - 0,110,20,116,8,100,3,160,9,124,2,161,1,124,1,124, - 2,100,4,141,3,130,1,100,2,83,0,41,5,122,35,67, - 111,109,112,105,108,101,32,98,121,116,101,99,111,100,101,32, - 97,115,32,102,111,117,110,100,32,105,110,32,97,32,112,121, - 99,46,122,21,99,111,100,101,32,111,98,106,101,99,116,32, - 102,114,111,109,32,123,33,114,125,78,122,23,78,111,110,45, - 99,111,100,101,32,111,98,106,101,99,116,32,105,110,32,123, - 33,114,125,169,2,114,117,0,0,0,114,44,0,0,0,41, - 10,218,7,109,97,114,115,104,97,108,90,5,108,111,97,100, - 115,218,10,105,115,105,110,115,116,97,110,99,101,218,10,95, - 99,111,100,101,95,116,121,112,101,114,134,0,0,0,114,149, - 0,0,0,218,4,95,105,109,112,90,16,95,102,105,120,95, - 99,111,95,102,105,108,101,110,97,109,101,114,118,0,0,0, - 114,62,0,0,0,41,5,114,26,0,0,0,114,117,0,0, - 0,114,107,0,0,0,114,108,0,0,0,218,4,99,111,100, - 101,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 218,17,95,99,111,109,112,105,108,101,95,98,121,116,101,99, - 111,100,101,61,2,0,0,115,20,0,0,0,0,2,10,1, - 10,1,12,1,8,1,12,1,6,2,10,1,2,0,2,255, - 114,165,0,0,0,114,73,0,0,0,99,3,0,0,0,0, - 0,0,0,0,0,0,0,4,0,0,0,5,0,0,0,67, - 0,0,0,115,70,0,0,0,116,0,116,1,131,1,125,3, - 124,3,160,2,116,3,100,1,131,1,161,1,1,0,124,3, - 160,2,116,3,124,1,131,1,161,1,1,0,124,3,160,2, - 116,3,124,2,131,1,161,1,1,0,124,3,160,2,116,4, - 160,5,124,0,161,1,161,1,1,0,124,3,83,0,41,2, - 122,43,80,114,111,100,117,99,101,32,116,104,101,32,100,97, - 116,97,32,102,111,114,32,97,32,116,105,109,101,115,116,97, - 109,112,45,98,97,115,101,100,32,112,121,99,46,114,73,0, - 0,0,41,6,218,9,98,121,116,101,97,114,114,97,121,114, - 148,0,0,0,218,6,101,120,116,101,110,100,114,20,0,0, - 0,114,160,0,0,0,218,5,100,117,109,112,115,41,4,114, - 164,0,0,0,218,5,109,116,105,109,101,114,155,0,0,0, - 114,26,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,218,22,95,99,111,100,101,95,116,111,95,116, - 105,109,101,115,116,97,109,112,95,112,121,99,74,2,0,0, - 115,12,0,0,0,0,2,8,1,14,1,14,1,14,1,16, - 1,114,170,0,0,0,84,99,3,0,0,0,0,0,0,0, + 114,101,10,32,32,32,32,114,101,113,117,105,114,101,100,46, + 41,10,10,32,32,32,32,42,115,111,117,114,99,101,95,104, + 97,115,104,42,32,105,115,32,116,104,101,32,105,109,112,111, + 114,116,108,105,98,46,117,116,105,108,46,115,111,117,114,99, + 101,95,104,97,115,104,40,41,32,111,102,32,116,104,101,32, + 115,111,117,114,99,101,32,102,105,108,101,46,10,10,32,32, + 32,32,42,110,97,109,101,42,32,105,115,32,116,104,101,32, + 110,97,109,101,32,111,102,32,116,104,101,32,109,111,100,117, + 108,101,32,98,101,105,110,103,32,105,109,112,111,114,116,101, + 100,46,32,73,116,32,105,115,32,117,115,101,100,32,102,111, + 114,32,108,111,103,103,105,110,103,46,10,10,32,32,32,32, + 42,101,120,99,95,100,101,116,97,105,108,115,42,32,105,115, + 32,97,32,100,105,99,116,105,111,110,97,114,121,32,112,97, + 115,115,101,100,32,116,111,32,73,109,112,111,114,116,69,114, + 114,111,114,32,105,102,32,105,116,32,114,97,105,115,101,100, + 32,102,111,114,10,32,32,32,32,105,109,112,114,111,118,101, + 100,32,100,101,98,117,103,103,105,110,103,46,10,10,32,32, + 32,32,65,110,32,73,109,112,111,114,116,69,114,114,111,114, + 32,105,115,32,114,97,105,115,101,100,32,105,102,32,116,104, + 101,32,98,121,116,101,99,111,100,101,32,105,115,32,115,116, + 97,108,101,46,10,10,32,32,32,32,114,146,0,0,0,114, + 145,0,0,0,122,46,104,97,115,104,32,105,110,32,98,121, + 116,101,99,111,100,101,32,100,111,101,115,110,39,116,32,109, + 97,116,99,104,32,104,97,115,104,32,111,102,32,115,111,117, + 114,99,101,32,78,41,1,114,118,0,0,0,41,4,114,26, + 0,0,0,218,11,115,111,117,114,99,101,95,104,97,115,104, + 114,117,0,0,0,114,151,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,218,18,95,118,97,108,105, + 100,97,116,101,95,104,97,115,104,95,112,121,99,37,2,0, + 0,115,12,0,0,0,0,17,16,1,2,1,8,255,2,2, + 2,254,114,158,0,0,0,99,4,0,0,0,0,0,0,0, 0,0,0,0,5,0,0,0,5,0,0,0,67,0,0,0, - 115,80,0,0,0,116,0,116,1,131,1,125,3,100,1,124, - 2,100,1,62,0,66,0,125,4,124,3,160,2,116,3,124, - 4,131,1,161,1,1,0,116,4,124,1,131,1,100,2,107, - 2,115,50,116,5,130,1,124,3,160,2,124,1,161,1,1, - 0,124,3,160,2,116,6,160,7,124,0,161,1,161,1,1, - 0,124,3,83,0,41,3,122,38,80,114,111,100,117,99,101, - 32,116,104,101,32,100,97,116,97,32,102,111,114,32,97,32, - 104,97,115,104,45,98,97,115,101,100,32,112,121,99,46,114, - 39,0,0,0,114,146,0,0,0,41,8,114,166,0,0,0, - 114,148,0,0,0,114,167,0,0,0,114,20,0,0,0,114, - 22,0,0,0,114,23,0,0,0,114,160,0,0,0,114,168, - 0,0,0,41,5,114,164,0,0,0,114,157,0,0,0,90, - 7,99,104,101,99,107,101,100,114,26,0,0,0,114,83,0, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,17,95,99,111,100,101,95,116,111,95,104,97,115,104, - 95,112,121,99,84,2,0,0,115,14,0,0,0,0,2,8, - 1,12,1,14,1,16,1,10,1,16,1,114,171,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,5,0,0, - 0,6,0,0,0,67,0,0,0,115,62,0,0,0,100,1, - 100,2,108,0,125,1,116,1,160,2,124,0,161,1,106,3, - 125,2,124,1,160,4,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,73,0,0,0,78,84, - 41,7,218,8,116,111,107,101,110,105,122,101,114,64,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,172,0,0,0,90,21,115, - 111,117,114,99,101,95,98,121,116,101,115,95,114,101,97,100, - 108,105,110,101,218,8,101,110,99,111,100,105,110,103,90,15, - 110,101,119,108,105,110,101,95,100,101,99,111,100,101,114,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,13, - 100,101,99,111,100,101,95,115,111,117,114,99,101,95,2,0, - 0,115,10,0,0,0,0,5,8,1,12,1,10,1,12,1, - 114,176,0,0,0,169,2,114,140,0,0,0,218,26,115,117, - 98,109,111,100,117,108,101,95,115,101,97,114,99,104,95,108, - 111,99,97,116,105,111,110,115,99,2,0,0,0,0,0,0, - 0,2,0,0,0,9,0,0,0,8,0,0,0,67,0,0, - 0,115,16,1,0,0,124,1,100,1,107,8,114,60,100,2, - 125,1,116,0,124,2,100,3,131,2,114,70,122,14,124,2, - 160,1,124,0,161,1,125,1,87,0,113,70,4,0,116,2, - 107,10,114,56,1,0,1,0,1,0,89,0,113,70,88,0, - 110,10,116,3,160,4,124,1,161,1,125,1,116,5,106,6, - 124,0,124,2,124,1,100,4,141,3,125,4,100,5,124,4, - 95,7,124,2,100,1,107,8,114,154,116,8,131,0,68,0, - 93,42,92,2,125,5,125,6,124,1,160,9,116,10,124,6, - 131,1,161,1,114,106,124,5,124,0,124,1,131,2,125,2, - 124,2,124,4,95,11,1,0,113,154,113,106,100,1,83,0, - 124,3,116,12,107,8,114,220,116,0,124,2,100,6,131,2, - 114,226,122,14,124,2,160,13,124,0,161,1,125,7,87,0, - 110,20,4,0,116,2,107,10,114,206,1,0,1,0,1,0, - 89,0,113,226,88,0,124,7,114,226,103,0,124,4,95,14, - 110,6,124,3,124,4,95,14,124,4,106,14,103,0,107,2, - 144,1,114,12,124,1,144,1,114,12,116,15,124,1,131,1, - 100,7,25,0,125,8,124,4,106,14,160,16,124,8,161,1, - 1,0,124,4,83,0,41,8,97,61,1,0,0,82,101,116, - 117,114,110,32,97,32,109,111,100,117,108,101,32,115,112,101, - 99,32,98,97,115,101,100,32,111,110,32,97,32,102,105,108, - 101,32,108,111,99,97,116,105,111,110,46,10,10,32,32,32, - 32,84,111,32,105,110,100,105,99,97,116,101,32,116,104,97, - 116,32,116,104,101,32,109,111,100,117,108,101,32,105,115,32, - 97,32,112,97,99,107,97,103,101,44,32,115,101,116,10,32, - 32,32,32,115,117,98,109,111,100,117,108,101,95,115,101,97, - 114,99,104,95,108,111,99,97,116,105,111,110,115,32,116,111, - 32,97,32,108,105,115,116,32,111,102,32,100,105,114,101,99, - 116,111,114,121,32,112,97,116,104,115,46,32,32,65,110,10, - 32,32,32,32,101,109,112,116,121,32,108,105,115,116,32,105, - 115,32,115,117,102,102,105,99,105,101,110,116,44,32,116,104, - 111,117,103,104,32,105,116,115,32,110,111,116,32,111,116,104, - 101,114,119,105,115,101,32,117,115,101,102,117,108,32,116,111, - 32,116,104,101,10,32,32,32,32,105,109,112,111,114,116,32, - 115,121,115,116,101,109,46,10,10,32,32,32,32,84,104,101, - 32,108,111,97,100,101,114,32,109,117,115,116,32,116,97,107, - 101,32,97,32,115,112,101,99,32,97,115,32,105,116,115,32, - 111,110,108,121,32,95,95,105,110,105,116,95,95,40,41,32, - 97,114,103,46,10,10,32,32,32,32,78,122,9,60,117,110, - 107,110,111,119,110,62,218,12,103,101,116,95,102,105,108,101, - 110,97,109,101,169,1,218,6,111,114,105,103,105,110,84,218, - 10,105,115,95,112,97,99,107,97,103,101,114,73,0,0,0, - 41,17,114,128,0,0,0,114,179,0,0,0,114,118,0,0, - 0,114,2,0,0,0,114,79,0,0,0,114,134,0,0,0, - 218,10,77,111,100,117,108,101,83,112,101,99,90,13,95,115, - 101,116,95,102,105,108,101,97,116,116,114,218,27,95,103,101, - 116,95,115,117,112,112,111,114,116,101,100,95,102,105,108,101, - 95,108,111,97,100,101,114,115,114,111,0,0,0,114,112,0, - 0,0,114,140,0,0,0,218,9,95,80,79,80,85,76,65, - 84,69,114,182,0,0,0,114,178,0,0,0,114,47,0,0, - 0,218,6,97,112,112,101,110,100,41,9,114,117,0,0,0, - 90,8,108,111,99,97,116,105,111,110,114,140,0,0,0,114, - 178,0,0,0,218,4,115,112,101,99,218,12,108,111,97,100, - 101,114,95,99,108,97,115,115,218,8,115,117,102,102,105,120, - 101,115,114,182,0,0,0,90,7,100,105,114,110,97,109,101, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, - 23,115,112,101,99,95,102,114,111,109,95,102,105,108,101,95, - 108,111,99,97,116,105,111,110,112,2,0,0,115,62,0,0, - 0,0,12,8,4,4,1,10,2,2,1,14,1,14,1,8, - 2,10,8,16,1,6,3,8,1,14,1,14,1,10,1,6, - 1,6,2,4,3,8,2,10,1,2,1,14,1,14,1,6, - 2,4,1,8,2,6,1,12,1,6,1,12,1,12,2,114, - 190,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,4,0,0,0,64,0,0,0,115,86,0, - 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2, - 90,4,100,3,90,5,100,4,90,6,101,7,100,5,100,6, - 132,0,131,1,90,8,101,7,100,7,100,8,132,0,131,1, - 90,9,101,7,100,9,100,9,102,2,100,10,100,11,132,1, - 131,1,90,10,101,7,100,9,102,1,100,12,100,13,132,1, - 131,1,90,11,100,9,83,0,41,14,218,21,87,105,110,100, - 111,119,115,82,101,103,105,115,116,114,121,70,105,110,100,101, - 114,122,62,77,101,116,97,32,112,97,116,104,32,102,105,110, - 100,101,114,32,102,111,114,32,109,111,100,117,108,101,115,32, - 100,101,99,108,97,114,101,100,32,105,110,32,116,104,101,32, - 87,105,110,100,111,119,115,32,114,101,103,105,115,116,114,121, - 46,122,59,83,111,102,116,119,97,114,101,92,80,121,116,104, - 111,110,92,80,121,116,104,111,110,67,111,114,101,92,123,115, - 121,115,95,118,101,114,115,105,111,110,125,92,77,111,100,117, - 108,101,115,92,123,102,117,108,108,110,97,109,101,125,122,65, - 83,111,102,116,119,97,114,101,92,80,121,116,104,111,110,92, - 80,121,116,104,111,110,67,111,114,101,92,123,115,121,115,95, - 118,101,114,115,105,111,110,125,92,77,111,100,117,108,101,115, - 92,123,102,117,108,108,110,97,109,101,125,92,68,101,98,117, - 103,70,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,8,0,0,0,67,0,0,0,115,56,0,0,0, - 122,16,116,0,160,1,116,0,106,2,124,1,161,2,87,0, - 83,0,4,0,116,3,107,10,114,50,1,0,1,0,1,0, - 116,0,160,1,116,0,106,4,124,1,161,2,6,0,89,0, - 83,0,88,0,100,0,83,0,114,110,0,0,0,41,5,218, - 7,95,119,105,110,114,101,103,90,7,79,112,101,110,75,101, - 121,90,17,72,75,69,89,95,67,85,82,82,69,78,84,95, - 85,83,69,82,114,50,0,0,0,90,18,72,75,69,89,95, - 76,79,67,65,76,95,77,65,67,72,73,78,69,41,2,218, - 3,99,108,115,114,5,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,14,95,111,112,101,110,95, - 114,101,103,105,115,116,114,121,192,2,0,0,115,8,0,0, - 0,0,2,2,1,16,1,14,1,122,36,87,105,110,100,111, - 119,115,82,101,103,105,115,116,114,121,70,105,110,100,101,114, - 46,95,111,112,101,110,95,114,101,103,105,115,116,114,121,99, - 2,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0, - 9,0,0,0,67,0,0,0,115,118,0,0,0,124,0,106, - 0,114,14,124,0,106,1,125,2,110,6,124,0,106,2,125, - 2,124,2,106,3,124,1,100,1,116,4,106,5,100,0,100, - 2,133,2,25,0,22,0,100,3,141,2,125,3,122,38,124, - 0,160,6,124,3,161,1,143,18,125,4,116,7,160,8,124, - 4,100,4,161,2,125,5,87,0,53,0,81,0,82,0,88, - 0,87,0,110,26,4,0,116,9,107,10,114,112,1,0,1, - 0,1,0,89,0,100,0,83,0,89,0,110,2,88,0,124, + 115,80,0,0,0,116,0,160,1,124,0,161,1,125,4,116, + 2,124,4,116,3,131,2,114,56,116,4,160,5,100,1,124, + 2,161,2,1,0,124,3,100,2,107,9,114,52,116,6,160, + 7,124,4,124,3,161,2,1,0,124,4,83,0,116,8,100, + 3,160,9,124,2,161,1,124,1,124,2,100,4,141,3,130, + 1,100,2,83,0,41,5,122,35,67,111,109,112,105,108,101, + 32,98,121,116,101,99,111,100,101,32,97,115,32,102,111,117, + 110,100,32,105,110,32,97,32,112,121,99,46,122,21,99,111, + 100,101,32,111,98,106,101,99,116,32,102,114,111,109,32,123, + 33,114,125,78,122,23,78,111,110,45,99,111,100,101,32,111, + 98,106,101,99,116,32,105,110,32,123,33,114,125,169,2,114, + 117,0,0,0,114,44,0,0,0,41,10,218,7,109,97,114, + 115,104,97,108,90,5,108,111,97,100,115,218,10,105,115,105, + 110,115,116,97,110,99,101,218,10,95,99,111,100,101,95,116, + 121,112,101,114,134,0,0,0,114,149,0,0,0,218,4,95, + 105,109,112,90,16,95,102,105,120,95,99,111,95,102,105,108, + 101,110,97,109,101,114,118,0,0,0,114,62,0,0,0,41, + 5,114,26,0,0,0,114,117,0,0,0,114,107,0,0,0, + 114,108,0,0,0,218,4,99,111,100,101,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,218,17,95,99,111,109, + 112,105,108,101,95,98,121,116,101,99,111,100,101,61,2,0, + 0,115,20,0,0,0,0,2,10,1,10,1,12,1,8,1, + 12,1,4,2,10,1,2,0,2,255,114,165,0,0,0,114, + 73,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0, + 0,4,0,0,0,5,0,0,0,67,0,0,0,115,70,0, + 0,0,116,0,116,1,131,1,125,3,124,3,160,2,116,3, + 100,1,131,1,161,1,1,0,124,3,160,2,116,3,124,1, + 131,1,161,1,1,0,124,3,160,2,116,3,124,2,131,1, + 161,1,1,0,124,3,160,2,116,4,160,5,124,0,161,1, + 161,1,1,0,124,3,83,0,41,2,122,43,80,114,111,100, + 117,99,101,32,116,104,101,32,100,97,116,97,32,102,111,114, + 32,97,32,116,105,109,101,115,116,97,109,112,45,98,97,115, + 101,100,32,112,121,99,46,114,73,0,0,0,41,6,218,9, + 98,121,116,101,97,114,114,97,121,114,148,0,0,0,218,6, + 101,120,116,101,110,100,114,20,0,0,0,114,160,0,0,0, + 218,5,100,117,109,112,115,41,4,114,164,0,0,0,218,5, + 109,116,105,109,101,114,155,0,0,0,114,26,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,22, + 95,99,111,100,101,95,116,111,95,116,105,109,101,115,116,97, + 109,112,95,112,121,99,74,2,0,0,115,12,0,0,0,0, + 2,8,1,14,1,14,1,14,1,16,1,114,170,0,0,0, + 84,99,3,0,0,0,0,0,0,0,0,0,0,0,5,0, + 0,0,5,0,0,0,67,0,0,0,115,80,0,0,0,116, + 0,116,1,131,1,125,3,100,1,124,2,100,1,62,0,66, + 0,125,4,124,3,160,2,116,3,124,4,131,1,161,1,1, + 0,116,4,124,1,131,1,100,2,107,2,115,50,116,5,130, + 1,124,3,160,2,124,1,161,1,1,0,124,3,160,2,116, + 6,160,7,124,0,161,1,161,1,1,0,124,3,83,0,41, + 3,122,38,80,114,111,100,117,99,101,32,116,104,101,32,100, + 97,116,97,32,102,111,114,32,97,32,104,97,115,104,45,98, + 97,115,101,100,32,112,121,99,46,114,39,0,0,0,114,146, + 0,0,0,41,8,114,166,0,0,0,114,148,0,0,0,114, + 167,0,0,0,114,20,0,0,0,114,22,0,0,0,114,23, + 0,0,0,114,160,0,0,0,114,168,0,0,0,41,5,114, + 164,0,0,0,114,157,0,0,0,90,7,99,104,101,99,107, + 101,100,114,26,0,0,0,114,83,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,218,17,95,99,111, + 100,101,95,116,111,95,104,97,115,104,95,112,121,99,84,2, + 0,0,115,14,0,0,0,0,2,8,1,12,1,14,1,16, + 1,10,1,16,1,114,171,0,0,0,99,1,0,0,0,0, + 0,0,0,0,0,0,0,5,0,0,0,6,0,0,0,67, + 0,0,0,115,62,0,0,0,100,1,100,2,108,0,125,1, + 116,1,160,2,124,0,161,1,106,3,125,2,124,1,160,4, + 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,73,0,0,0,78,84,41,7,218,8,116,111, + 107,101,110,105,122,101,114,64,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,172,0,0,0,90,21,115,111,117,114,99,101,95, + 98,121,116,101,115,95,114,101,97,100,108,105,110,101,218,8, + 101,110,99,111,100,105,110,103,90,15,110,101,119,108,105,110, + 101,95,100,101,99,111,100,101,114,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,13,100,101,99,111,100,101, + 95,115,111,117,114,99,101,95,2,0,0,115,10,0,0,0, + 0,5,8,1,12,1,10,1,12,1,114,176,0,0,0,169, + 2,114,140,0,0,0,218,26,115,117,98,109,111,100,117,108, + 101,95,115,101,97,114,99,104,95,108,111,99,97,116,105,111, + 110,115,99,2,0,0,0,0,0,0,0,2,0,0,0,9, + 0,0,0,8,0,0,0,67,0,0,0,115,16,1,0,0, + 124,1,100,1,107,8,114,60,100,2,125,1,116,0,124,2, + 100,3,131,2,114,70,122,14,124,2,160,1,124,0,161,1, + 125,1,87,0,113,70,4,0,116,2,107,10,114,56,1,0, + 1,0,1,0,89,0,113,70,88,0,110,10,116,3,160,4, + 124,1,161,1,125,1,116,5,106,6,124,0,124,2,124,1, + 100,4,141,3,125,4,100,5,124,4,95,7,124,2,100,1, + 107,8,114,154,116,8,131,0,68,0,93,42,92,2,125,5, + 125,6,124,1,160,9,116,10,124,6,131,1,161,1,114,106, + 124,5,124,0,124,1,131,2,125,2,124,2,124,4,95,11, + 1,0,113,154,113,106,100,1,83,0,124,3,116,12,107,8, + 114,220,116,0,124,2,100,6,131,2,114,226,122,14,124,2, + 160,13,124,0,161,1,125,7,87,0,110,20,4,0,116,2, + 107,10,114,206,1,0,1,0,1,0,89,0,113,226,88,0, + 124,7,114,226,103,0,124,4,95,14,110,6,124,3,124,4, + 95,14,124,4,106,14,103,0,107,2,144,1,114,12,124,1, + 144,1,114,12,116,15,124,1,131,1,100,7,25,0,125,8, + 124,4,106,14,160,16,124,8,161,1,1,0,124,4,83,0, + 41,8,97,61,1,0,0,82,101,116,117,114,110,32,97,32, + 109,111,100,117,108,101,32,115,112,101,99,32,98,97,115,101, + 100,32,111,110,32,97,32,102,105,108,101,32,108,111,99,97, + 116,105,111,110,46,10,10,32,32,32,32,84,111,32,105,110, + 100,105,99,97,116,101,32,116,104,97,116,32,116,104,101,32, + 109,111,100,117,108,101,32,105,115,32,97,32,112,97,99,107, + 97,103,101,44,32,115,101,116,10,32,32,32,32,115,117,98, + 109,111,100,117,108,101,95,115,101,97,114,99,104,95,108,111, + 99,97,116,105,111,110,115,32,116,111,32,97,32,108,105,115, + 116,32,111,102,32,100,105,114,101,99,116,111,114,121,32,112, + 97,116,104,115,46,32,32,65,110,10,32,32,32,32,101,109, + 112,116,121,32,108,105,115,116,32,105,115,32,115,117,102,102, + 105,99,105,101,110,116,44,32,116,104,111,117,103,104,32,105, + 116,115,32,110,111,116,32,111,116,104,101,114,119,105,115,101, + 32,117,115,101,102,117,108,32,116,111,32,116,104,101,10,32, + 32,32,32,105,109,112,111,114,116,32,115,121,115,116,101,109, + 46,10,10,32,32,32,32,84,104,101,32,108,111,97,100,101, + 114,32,109,117,115,116,32,116,97,107,101,32,97,32,115,112, + 101,99,32,97,115,32,105,116,115,32,111,110,108,121,32,95, + 95,105,110,105,116,95,95,40,41,32,97,114,103,46,10,10, + 32,32,32,32,78,122,9,60,117,110,107,110,111,119,110,62, + 218,12,103,101,116,95,102,105,108,101,110,97,109,101,169,1, + 218,6,111,114,105,103,105,110,84,218,10,105,115,95,112,97, + 99,107,97,103,101,114,73,0,0,0,41,17,114,128,0,0, + 0,114,179,0,0,0,114,118,0,0,0,114,2,0,0,0, + 114,79,0,0,0,114,134,0,0,0,218,10,77,111,100,117, + 108,101,83,112,101,99,90,13,95,115,101,116,95,102,105,108, + 101,97,116,116,114,218,27,95,103,101,116,95,115,117,112,112, + 111,114,116,101,100,95,102,105,108,101,95,108,111,97,100,101, + 114,115,114,111,0,0,0,114,112,0,0,0,114,140,0,0, + 0,218,9,95,80,79,80,85,76,65,84,69,114,182,0,0, + 0,114,178,0,0,0,114,47,0,0,0,218,6,97,112,112, + 101,110,100,41,9,114,117,0,0,0,90,8,108,111,99,97, + 116,105,111,110,114,140,0,0,0,114,178,0,0,0,218,4, + 115,112,101,99,218,12,108,111,97,100,101,114,95,99,108,97, + 115,115,218,8,115,117,102,102,105,120,101,115,114,182,0,0, + 0,90,7,100,105,114,110,97,109,101,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,218,23,115,112,101,99,95, + 102,114,111,109,95,102,105,108,101,95,108,111,99,97,116,105, + 111,110,112,2,0,0,115,62,0,0,0,0,12,8,4,4, + 1,10,2,2,1,14,1,14,1,8,2,10,8,16,1,6, + 3,8,1,14,1,14,1,10,1,6,1,6,2,4,3,8, + 2,10,1,2,1,14,1,14,1,6,2,4,1,8,2,6, + 1,12,1,6,1,12,1,12,2,114,190,0,0,0,99,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, + 0,0,0,64,0,0,0,115,80,0,0,0,101,0,90,1, + 100,0,90,2,100,1,90,3,100,2,90,4,100,3,90,5, + 100,4,90,6,101,7,100,5,100,6,132,0,131,1,90,8, + 101,7,100,7,100,8,132,0,131,1,90,9,101,7,100,14, + 100,10,100,11,132,1,131,1,90,10,101,7,100,15,100,12, + 100,13,132,1,131,1,90,11,100,9,83,0,41,16,218,21, + 87,105,110,100,111,119,115,82,101,103,105,115,116,114,121,70, + 105,110,100,101,114,122,62,77,101,116,97,32,112,97,116,104, + 32,102,105,110,100,101,114,32,102,111,114,32,109,111,100,117, + 108,101,115,32,100,101,99,108,97,114,101,100,32,105,110,32, + 116,104,101,32,87,105,110,100,111,119,115,32,114,101,103,105, + 115,116,114,121,46,122,59,83,111,102,116,119,97,114,101,92, + 80,121,116,104,111,110,92,80,121,116,104,111,110,67,111,114, + 101,92,123,115,121,115,95,118,101,114,115,105,111,110,125,92, + 77,111,100,117,108,101,115,92,123,102,117,108,108,110,97,109, + 101,125,122,65,83,111,102,116,119,97,114,101,92,80,121,116, + 104,111,110,92,80,121,116,104,111,110,67,111,114,101,92,123, + 115,121,115,95,118,101,114,115,105,111,110,125,92,77,111,100, + 117,108,101,115,92,123,102,117,108,108,110,97,109,101,125,92, + 68,101,98,117,103,70,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,8,0,0,0,67,0,0,0,115, + 56,0,0,0,122,16,116,0,160,1,116,0,106,2,124,1, + 161,2,87,0,83,0,4,0,116,3,107,10,114,50,1,0, + 1,0,1,0,116,0,160,1,116,0,106,4,124,1,161,2, + 6,0,89,0,83,0,88,0,100,0,83,0,114,110,0,0, + 0,41,5,218,7,95,119,105,110,114,101,103,90,7,79,112, + 101,110,75,101,121,90,17,72,75,69,89,95,67,85,82,82, + 69,78,84,95,85,83,69,82,114,50,0,0,0,90,18,72, + 75,69,89,95,76,79,67,65,76,95,77,65,67,72,73,78, + 69,41,2,218,3,99,108,115,114,5,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,218,14,95,111, + 112,101,110,95,114,101,103,105,115,116,114,121,192,2,0,0, + 115,8,0,0,0,0,2,2,1,16,1,14,1,122,36,87, + 105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,105, + 110,100,101,114,46,95,111,112,101,110,95,114,101,103,105,115, + 116,114,121,99,2,0,0,0,0,0,0,0,0,0,0,0, + 6,0,0,0,9,0,0,0,67,0,0,0,115,114,0,0, + 0,124,0,106,0,114,14,124,0,106,1,125,2,110,6,124, + 0,106,2,125,2,124,2,106,3,124,1,100,1,116,4,106, + 5,100,0,100,2,133,2,25,0,22,0,100,3,141,2,125, + 3,122,38,124,0,160,6,124,3,161,1,143,18,125,4,116, + 7,160,8,124,4,100,4,161,2,125,5,87,0,53,0,81, + 0,82,0,88,0,87,0,110,22,4,0,116,9,107,10,114, + 108,1,0,1,0,1,0,89,0,100,0,83,0,88,0,124, 5,83,0,41,5,78,122,5,37,100,46,37,100,114,28,0, 0,0,41,2,114,139,0,0,0,90,11,115,121,115,95,118, 101,114,115,105,111,110,114,40,0,0,0,41,10,218,11,68, @@ -1013,7 +1011,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,3,0,0,0,114,6,0,0,0,218,16,95, 115,101,97,114,99,104,95,114,101,103,105,115,116,114,121,199, 2,0,0,115,24,0,0,0,0,2,6,1,8,2,6,1, - 6,1,16,255,6,2,2,1,12,1,26,1,14,1,12,1, + 6,1,16,255,6,2,2,1,12,1,26,1,14,1,8,1, 122,38,87,105,110,100,111,119,115,82,101,103,105,115,116,114, 121,70,105,110,100,101,114,46,95,115,101,97,114,99,104,95, 114,101,103,105,115,116,114,121,78,99,4,0,0,0,0,0, @@ -1057,1781 +1055,1783 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 115,8,0,0,0,0,7,12,1,8,1,6,2,122,33,87, 105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,105, 110,100,101,114,46,102,105,110,100,95,109,111,100,117,108,101, - 41,12,114,125,0,0,0,114,124,0,0,0,114,126,0,0, - 0,114,127,0,0,0,114,197,0,0,0,114,196,0,0,0, - 114,195,0,0,0,218,11,99,108,97,115,115,109,101,116,104, - 111,100,114,194,0,0,0,114,200,0,0,0,114,203,0,0, - 0,114,206,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,191,0,0,0,180, - 2,0,0,115,28,0,0,0,8,2,4,3,2,255,2,4, - 2,255,2,3,4,2,2,1,10,6,2,1,10,14,2,1, - 16,15,2,1,114,191,0,0,0,99,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,64,0, - 0,0,115,48,0,0,0,101,0,90,1,100,0,90,2,100, - 1,90,3,100,2,100,3,132,0,90,4,100,4,100,5,132, - 0,90,5,100,6,100,7,132,0,90,6,100,8,100,9,132, - 0,90,7,100,10,83,0,41,11,218,13,95,76,111,97,100, - 101,114,66,97,115,105,99,115,122,83,66,97,115,101,32,99, - 108,97,115,115,32,111,102,32,99,111,109,109,111,110,32,99, - 111,100,101,32,110,101,101,100,101,100,32,98,121,32,98,111, - 116,104,32,83,111,117,114,99,101,76,111,97,100,101,114,32, - 97,110,100,10,32,32,32,32,83,111,117,114,99,101,108,101, - 115,115,70,105,108,101,76,111,97,100,101,114,46,99,2,0, - 0,0,0,0,0,0,0,0,0,0,5,0,0,0,4,0, - 0,0,67,0,0,0,115,64,0,0,0,116,0,124,0,160, - 1,124,1,161,1,131,1,100,1,25,0,125,2,124,2,160, - 2,100,2,100,1,161,2,100,3,25,0,125,3,124,1,160, - 3,100,2,161,1,100,4,25,0,125,4,124,3,100,5,107, - 2,111,62,124,4,100,5,107,3,83,0,41,6,122,141,67, - 111,110,99,114,101,116,101,32,105,109,112,108,101,109,101,110, - 116,97,116,105,111,110,32,111,102,32,73,110,115,112,101,99, - 116,76,111,97,100,101,114,46,105,115,95,112,97,99,107,97, - 103,101,32,98,121,32,99,104,101,99,107,105,110,103,32,105, - 102,10,32,32,32,32,32,32,32,32,116,104,101,32,112,97, - 116,104,32,114,101,116,117,114,110,101,100,32,98,121,32,103, - 101,116,95,102,105,108,101,110,97,109,101,32,104,97,115,32, - 97,32,102,105,108,101,110,97,109,101,32,111,102,32,39,95, - 95,105,110,105,116,95,95,46,112,121,39,46,114,39,0,0, - 0,114,71,0,0,0,114,73,0,0,0,114,28,0,0,0, - 218,8,95,95,105,110,105,116,95,95,41,4,114,47,0,0, - 0,114,179,0,0,0,114,43,0,0,0,114,41,0,0,0, - 41,5,114,119,0,0,0,114,139,0,0,0,114,97,0,0, - 0,90,13,102,105,108,101,110,97,109,101,95,98,97,115,101, - 90,9,116,97,105,108,95,110,97,109,101,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,182,0,0,0,249, - 2,0,0,115,8,0,0,0,0,3,18,1,16,1,14,1, - 122,24,95,76,111,97,100,101,114,66,97,115,105,99,115,46, - 105,115,95,112,97,99,107,97,103,101,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, - 0,0,0,115,4,0,0,0,100,1,83,0,169,2,122,42, - 85,115,101,32,100,101,102,97,117,108,116,32,115,101,109,97, - 110,116,105,99,115,32,102,111,114,32,109,111,100,117,108,101, - 32,99,114,101,97,116,105,111,110,46,78,114,3,0,0,0, - 169,2,114,119,0,0,0,114,187,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,218,13,99,114,101, - 97,116,101,95,109,111,100,117,108,101,1,3,0,0,115,2, - 0,0,0,0,1,122,27,95,76,111,97,100,101,114,66,97, - 115,105,99,115,46,99,114,101,97,116,101,95,109,111,100,117, - 108,101,99,2,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,5,0,0,0,67,0,0,0,115,56,0,0,0, - 124,0,160,0,124,1,106,1,161,1,125,2,124,2,100,1, - 107,8,114,36,116,2,100,2,160,3,124,1,106,1,161,1, - 131,1,130,1,116,4,160,5,116,6,124,2,124,1,106,7, - 161,3,1,0,100,1,83,0,41,3,122,19,69,120,101,99, - 117,116,101,32,116,104,101,32,109,111,100,117,108,101,46,78, - 122,52,99,97,110,110,111,116,32,108,111,97,100,32,109,111, - 100,117,108,101,32,123,33,114,125,32,119,104,101,110,32,103, - 101,116,95,99,111,100,101,40,41,32,114,101,116,117,114,110, - 115,32,78,111,110,101,41,8,218,8,103,101,116,95,99,111, - 100,101,114,125,0,0,0,114,118,0,0,0,114,62,0,0, - 0,114,134,0,0,0,218,25,95,99,97,108,108,95,119,105, - 116,104,95,102,114,97,109,101,115,95,114,101,109,111,118,101, - 100,218,4,101,120,101,99,114,131,0,0,0,41,3,114,119, - 0,0,0,218,6,109,111,100,117,108,101,114,164,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, - 11,101,120,101,99,95,109,111,100,117,108,101,4,3,0,0, - 115,12,0,0,0,0,2,12,1,8,1,6,1,4,255,6, - 2,122,25,95,76,111,97,100,101,114,66,97,115,105,99,115, - 46,101,120,101,99,95,109,111,100,117,108,101,99,2,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0, - 0,67,0,0,0,115,12,0,0,0,116,0,160,1,124,0, - 124,1,161,2,83,0,41,1,122,26,84,104,105,115,32,109, - 111,100,117,108,101,32,105,115,32,100,101,112,114,101,99,97, - 116,101,100,46,41,2,114,134,0,0,0,218,17,95,108,111, - 97,100,95,109,111,100,117,108,101,95,115,104,105,109,169,2, - 114,119,0,0,0,114,139,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,11,108,111,97,100,95, - 109,111,100,117,108,101,12,3,0,0,115,2,0,0,0,0, - 2,122,25,95,76,111,97,100,101,114,66,97,115,105,99,115, - 46,108,111,97,100,95,109,111,100,117,108,101,78,41,8,114, - 125,0,0,0,114,124,0,0,0,114,126,0,0,0,114,127, - 0,0,0,114,182,0,0,0,114,212,0,0,0,114,217,0, - 0,0,114,220,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,208,0,0,0, - 244,2,0,0,115,10,0,0,0,8,2,4,3,8,8,8, - 3,8,8,114,208,0,0,0,99,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,64,0,0, - 0,115,74,0,0,0,101,0,90,1,100,0,90,2,100,1, - 100,2,132,0,90,3,100,3,100,4,132,0,90,4,100,5, - 100,6,132,0,90,5,100,7,100,8,132,0,90,6,100,9, - 100,10,132,0,90,7,100,11,100,12,156,1,100,13,100,14, - 132,2,90,8,100,15,100,16,132,0,90,9,100,17,83,0, - 41,18,218,12,83,111,117,114,99,101,76,111,97,100,101,114, - 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,1,0,0,0,67,0,0,0,115,8,0,0,0,116,0, - 130,1,100,1,83,0,41,2,122,165,79,112,116,105,111,110, - 97,108,32,109,101,116,104,111,100,32,116,104,97,116,32,114, - 101,116,117,114,110,115,32,116,104,101,32,109,111,100,105,102, - 105,99,97,116,105,111,110,32,116,105,109,101,32,40,97,110, - 32,105,110,116,41,32,102,111,114,32,116,104,101,10,32,32, - 32,32,32,32,32,32,115,112,101,99,105,102,105,101,100,32, - 112,97,116,104,32,40,97,32,115,116,114,41,46,10,10,32, - 32,32,32,32,32,32,32,82,97,105,115,101,115,32,79,83, - 69,114,114,111,114,32,119,104,101,110,32,116,104,101,32,112, - 97,116,104,32,99,97,110,110,111,116,32,98,101,32,104,97, - 110,100,108,101,100,46,10,32,32,32,32,32,32,32,32,78, - 41,1,114,50,0,0,0,169,2,114,119,0,0,0,114,44, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,218,10,112,97,116,104,95,109,116,105,109,101,19,3, - 0,0,115,2,0,0,0,0,6,122,23,83,111,117,114,99, - 101,76,111,97,100,101,114,46,112,97,116,104,95,109,116,105, - 109,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,4,0,0,0,67,0,0,0,115,14,0,0,0, - 100,1,124,0,160,0,124,1,161,1,105,1,83,0,41,2, - 97,158,1,0,0,79,112,116,105,111,110,97,108,32,109,101, - 116,104,111,100,32,114,101,116,117,114,110,105,110,103,32,97, - 32,109,101,116,97,100,97,116,97,32,100,105,99,116,32,102, - 111,114,32,116,104,101,32,115,112,101,99,105,102,105,101,100, - 10,32,32,32,32,32,32,32,32,112,97,116,104,32,40,97, - 32,115,116,114,41,46,10,10,32,32,32,32,32,32,32,32, - 80,111,115,115,105,98,108,101,32,107,101,121,115,58,10,32, - 32,32,32,32,32,32,32,45,32,39,109,116,105,109,101,39, - 32,40,109,97,110,100,97,116,111,114,121,41,32,105,115,32, - 116,104,101,32,110,117,109,101,114,105,99,32,116,105,109,101, - 115,116,97,109,112,32,111,102,32,108,97,115,116,32,115,111, - 117,114,99,101,10,32,32,32,32,32,32,32,32,32,32,99, - 111,100,101,32,109,111,100,105,102,105,99,97,116,105,111,110, - 59,10,32,32,32,32,32,32,32,32,45,32,39,115,105,122, - 101,39,32,40,111,112,116,105,111,110,97,108,41,32,105,115, - 32,116,104,101,32,115,105,122,101,32,105,110,32,98,121,116, - 101,115,32,111,102,32,116,104,101,32,115,111,117,114,99,101, - 32,99,111,100,101,46,10,10,32,32,32,32,32,32,32,32, - 73,109,112,108,101,109,101,110,116,105,110,103,32,116,104,105, - 115,32,109,101,116,104,111,100,32,97,108,108,111,119,115,32, - 116,104,101,32,108,111,97,100,101,114,32,116,111,32,114,101, - 97,100,32,98,121,116,101,99,111,100,101,32,102,105,108,101, - 115,46,10,32,32,32,32,32,32,32,32,82,97,105,115,101, - 115,32,79,83,69,114,114,111,114,32,119,104,101,110,32,116, - 104,101,32,112,97,116,104,32,99,97,110,110,111,116,32,98, - 101,32,104,97,110,100,108,101,100,46,10,32,32,32,32,32, - 32,32,32,114,169,0,0,0,41,1,114,223,0,0,0,114, - 222,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,218,10,112,97,116,104,95,115,116,97,116,115,27, - 3,0,0,115,2,0,0,0,0,12,122,23,83,111,117,114, - 99,101,76,111,97,100,101,114,46,112,97,116,104,95,115,116, - 97,116,115,99,4,0,0,0,0,0,0,0,0,0,0,0, - 4,0,0,0,4,0,0,0,67,0,0,0,115,12,0,0, - 0,124,0,160,0,124,2,124,3,161,2,83,0,41,1,122, - 228,79,112,116,105,111,110,97,108,32,109,101,116,104,111,100, - 32,119,104,105,99,104,32,119,114,105,116,101,115,32,100,97, - 116,97,32,40,98,121,116,101,115,41,32,116,111,32,97,32, - 102,105,108,101,32,112,97,116,104,32,40,97,32,115,116,114, - 41,46,10,10,32,32,32,32,32,32,32,32,73,109,112,108, - 101,109,101,110,116,105,110,103,32,116,104,105,115,32,109,101, - 116,104,111,100,32,97,108,108,111,119,115,32,102,111,114,32, - 116,104,101,32,119,114,105,116,105,110,103,32,111,102,32,98, - 121,116,101,99,111,100,101,32,102,105,108,101,115,46,10,10, - 32,32,32,32,32,32,32,32,84,104,101,32,115,111,117,114, - 99,101,32,112,97,116,104,32,105,115,32,110,101,101,100,101, - 100,32,105,110,32,111,114,100,101,114,32,116,111,32,99,111, - 114,114,101,99,116,108,121,32,116,114,97,110,115,102,101,114, - 32,112,101,114,109,105,115,115,105,111,110,115,10,32,32,32, - 32,32,32,32,32,41,1,218,8,115,101,116,95,100,97,116, - 97,41,4,114,119,0,0,0,114,108,0,0,0,90,10,99, - 97,99,104,101,95,112,97,116,104,114,26,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,218,15,95, - 99,97,99,104,101,95,98,121,116,101,99,111,100,101,41,3, - 0,0,115,2,0,0,0,0,8,122,28,83,111,117,114,99, - 101,76,111,97,100,101,114,46,95,99,97,99,104,101,95,98, - 121,116,101,99,111,100,101,99,3,0,0,0,0,0,0,0, - 0,0,0,0,3,0,0,0,1,0,0,0,67,0,0,0, - 115,4,0,0,0,100,1,83,0,41,2,122,150,79,112,116, - 105,111,110,97,108,32,109,101,116,104,111,100,32,119,104,105, - 99,104,32,119,114,105,116,101,115,32,100,97,116,97,32,40, - 98,121,116,101,115,41,32,116,111,32,97,32,102,105,108,101, - 32,112,97,116,104,32,40,97,32,115,116,114,41,46,10,10, - 32,32,32,32,32,32,32,32,73,109,112,108,101,109,101,110, - 116,105,110,103,32,116,104,105,115,32,109,101,116,104,111,100, - 32,97,108,108,111,119,115,32,102,111,114,32,116,104,101,32, - 119,114,105,116,105,110,103,32,111,102,32,98,121,116,101,99, - 111,100,101,32,102,105,108,101,115,46,10,32,32,32,32,32, - 32,32,32,78,114,3,0,0,0,41,3,114,119,0,0,0, - 114,44,0,0,0,114,26,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,225,0,0,0,51,3, - 0,0,115,2,0,0,0,0,1,122,21,83,111,117,114,99, - 101,76,111,97,100,101,114,46,115,101,116,95,100,97,116,97, - 99,2,0,0,0,0,0,0,0,0,0,0,0,5,0,0, - 0,10,0,0,0,67,0,0,0,115,82,0,0,0,124,0, - 160,0,124,1,161,1,125,2,122,14,124,0,160,1,124,2, - 161,1,125,3,87,0,110,48,4,0,116,2,107,10,114,72, - 1,0,125,4,1,0,122,18,116,3,100,1,124,1,100,2, - 141,2,124,4,130,2,87,0,53,0,100,3,125,4,126,4, - 88,0,89,0,110,2,88,0,116,4,124,3,131,1,83,0, - 41,4,122,52,67,111,110,99,114,101,116,101,32,105,109,112, - 108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,73, - 110,115,112,101,99,116,76,111,97,100,101,114,46,103,101,116, - 95,115,111,117,114,99,101,46,122,39,115,111,117,114,99,101, - 32,110,111,116,32,97,118,97,105,108,97,98,108,101,32,116, - 104,114,111,117,103,104,32,103,101,116,95,100,97,116,97,40, - 41,114,116,0,0,0,78,41,5,114,179,0,0,0,218,8, - 103,101,116,95,100,97,116,97,114,50,0,0,0,114,118,0, - 0,0,114,176,0,0,0,41,5,114,119,0,0,0,114,139, - 0,0,0,114,44,0,0,0,114,174,0,0,0,218,3,101, - 120,99,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,10,103,101,116,95,115,111,117,114,99,101,58,3,0, - 0,115,20,0,0,0,0,2,10,1,2,1,14,1,16,1, - 4,1,2,255,4,1,2,255,20,2,122,23,83,111,117,114, - 99,101,76,111,97,100,101,114,46,103,101,116,95,115,111,117, - 114,99,101,114,105,0,0,0,41,1,218,9,95,111,112,116, - 105,109,105,122,101,99,3,0,0,0,0,0,0,0,1,0, - 0,0,4,0,0,0,8,0,0,0,67,0,0,0,115,22, - 0,0,0,116,0,106,1,116,2,124,1,124,2,100,1,100, - 2,124,3,100,3,141,6,83,0,41,4,122,130,82,101,116, - 117,114,110,32,116,104,101,32,99,111,100,101,32,111,98,106, - 101,99,116,32,99,111,109,112,105,108,101,100,32,102,114,111, - 109,32,115,111,117,114,99,101,46,10,10,32,32,32,32,32, - 32,32,32,84,104,101,32,39,100,97,116,97,39,32,97,114, - 103,117,109,101,110,116,32,99,97,110,32,98,101,32,97,110, - 121,32,111,98,106,101,99,116,32,116,121,112,101,32,116,104, - 97,116,32,99,111,109,112,105,108,101,40,41,32,115,117,112, - 112,111,114,116,115,46,10,32,32,32,32,32,32,32,32,114, - 215,0,0,0,84,41,2,218,12,100,111,110,116,95,105,110, - 104,101,114,105,116,114,84,0,0,0,41,3,114,134,0,0, - 0,114,214,0,0,0,218,7,99,111,109,112,105,108,101,41, - 4,114,119,0,0,0,114,26,0,0,0,114,44,0,0,0, - 114,230,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,218,14,115,111,117,114,99,101,95,116,111,95, - 99,111,100,101,68,3,0,0,115,8,0,0,0,0,5,12, - 1,2,0,2,255,122,27,83,111,117,114,99,101,76,111,97, - 100,101,114,46,115,111,117,114,99,101,95,116,111,95,99,111, - 100,101,99,2,0,0,0,0,0,0,0,0,0,0,0,15, - 0,0,0,9,0,0,0,67,0,0,0,115,34,2,0,0, - 124,0,160,0,124,1,161,1,125,2,100,1,125,3,100,1, - 125,4,100,1,125,5,100,2,125,6,100,3,125,7,122,12, - 116,1,124,2,131,1,125,8,87,0,110,26,4,0,116,2, - 107,10,114,68,1,0,1,0,1,0,100,1,125,8,89,0, - 144,1,110,48,88,0,122,14,124,0,160,3,124,2,161,1, - 125,9,87,0,110,22,4,0,116,4,107,10,114,106,1,0, - 1,0,1,0,89,0,144,1,110,10,88,0,116,5,124,9, - 100,4,25,0,131,1,125,3,122,14,124,0,160,6,124,8, - 161,1,125,10,87,0,110,20,4,0,116,4,107,10,114,154, - 1,0,1,0,1,0,89,0,110,218,88,0,124,1,124,8, - 100,5,156,2,125,11,122,148,116,7,124,10,124,1,124,11, - 131,3,125,12,116,8,124,10,131,1,100,6,100,1,133,2, - 25,0,125,13,124,12,100,7,64,0,100,8,107,3,125,6, - 124,6,144,1,114,36,124,12,100,9,64,0,100,8,107,3, - 125,7,116,9,106,10,100,10,107,3,144,1,114,34,124,7, - 115,254,116,9,106,10,100,11,107,2,144,1,114,34,124,0, - 160,6,124,2,161,1,125,4,116,9,160,11,116,12,124,4, - 161,2,125,5,116,13,124,10,124,5,124,1,124,11,131,4, - 1,0,110,20,116,14,124,10,124,3,124,9,100,12,25,0, - 124,1,124,11,131,5,1,0,87,0,110,26,4,0,116,15, - 116,16,102,2,107,10,144,1,114,84,1,0,1,0,1,0, - 89,0,110,32,88,0,116,17,160,18,100,13,124,8,124,2, - 161,3,1,0,116,19,124,13,124,1,124,8,124,2,100,14, - 141,4,83,0,124,4,100,1,107,8,144,1,114,136,124,0, - 160,6,124,2,161,1,125,4,124,0,160,20,124,4,124,2, - 161,2,125,14,116,17,160,18,100,15,124,2,161,2,1,0, - 116,21,106,22,144,2,115,30,124,8,100,1,107,9,144,2, - 114,30,124,3,100,1,107,9,144,2,114,30,124,6,144,1, - 114,228,124,5,100,1,107,8,144,1,114,214,116,9,160,11, - 124,4,161,1,125,5,116,23,124,14,124,5,124,7,131,3, - 125,10,110,16,116,24,124,14,124,3,116,25,124,4,131,1, - 131,3,125,10,122,18,124,0,160,26,124,2,124,8,124,10, - 161,3,1,0,87,0,110,22,4,0,116,2,107,10,144,2, - 114,28,1,0,1,0,1,0,89,0,110,2,88,0,124,14, - 83,0,41,16,122,190,67,111,110,99,114,101,116,101,32,105, - 109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,102, - 32,73,110,115,112,101,99,116,76,111,97,100,101,114,46,103, - 101,116,95,99,111,100,101,46,10,10,32,32,32,32,32,32, - 32,32,82,101,97,100,105,110,103,32,111,102,32,98,121,116, - 101,99,111,100,101,32,114,101,113,117,105,114,101,115,32,112, - 97,116,104,95,115,116,97,116,115,32,116,111,32,98,101,32, - 105,109,112,108,101,109,101,110,116,101,100,46,32,84,111,32, - 119,114,105,116,101,10,32,32,32,32,32,32,32,32,98,121, - 116,101,99,111,100,101,44,32,115,101,116,95,100,97,116,97, - 32,109,117,115,116,32,97,108,115,111,32,98,101,32,105,109, - 112,108,101,109,101,110,116,101,100,46,10,10,32,32,32,32, - 32,32,32,32,78,70,84,114,169,0,0,0,114,159,0,0, - 0,114,145,0,0,0,114,39,0,0,0,114,73,0,0,0, - 114,28,0,0,0,90,5,110,101,118,101,114,90,6,97,108, - 119,97,121,115,218,4,115,105,122,101,122,13,123,125,32,109, - 97,116,99,104,101,115,32,123,125,41,3,114,117,0,0,0, - 114,107,0,0,0,114,108,0,0,0,122,19,99,111,100,101, - 32,111,98,106,101,99,116,32,102,114,111,109,32,123,125,41, - 27,114,179,0,0,0,114,98,0,0,0,114,82,0,0,0, - 114,224,0,0,0,114,50,0,0,0,114,17,0,0,0,114, - 227,0,0,0,114,152,0,0,0,218,10,109,101,109,111,114, - 121,118,105,101,119,114,163,0,0,0,90,21,99,104,101,99, - 107,95,104,97,115,104,95,98,97,115,101,100,95,112,121,99, - 115,114,157,0,0,0,218,17,95,82,65,87,95,77,65,71, - 73,67,95,78,85,77,66,69,82,114,158,0,0,0,114,156, - 0,0,0,114,118,0,0,0,114,150,0,0,0,114,134,0, - 0,0,114,149,0,0,0,114,165,0,0,0,114,233,0,0, - 0,114,8,0,0,0,218,19,100,111,110,116,95,119,114,105, - 116,101,95,98,121,116,101,99,111,100,101,114,171,0,0,0, - 114,170,0,0,0,114,22,0,0,0,114,226,0,0,0,41, - 15,114,119,0,0,0,114,139,0,0,0,114,108,0,0,0, - 114,154,0,0,0,114,174,0,0,0,114,157,0,0,0,90, - 10,104,97,115,104,95,98,97,115,101,100,90,12,99,104,101, - 99,107,95,115,111,117,114,99,101,114,107,0,0,0,218,2, - 115,116,114,26,0,0,0,114,151,0,0,0,114,83,0,0, - 0,90,10,98,121,116,101,115,95,100,97,116,97,90,11,99, - 111,100,101,95,111,98,106,101,99,116,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,213,0,0,0,76,3, - 0,0,115,152,0,0,0,0,7,10,1,4,1,4,1,4, - 1,4,1,4,1,2,1,12,1,14,1,12,2,2,1,14, - 1,14,1,8,2,12,1,2,1,14,1,14,1,6,3,2, - 1,2,254,6,4,2,1,12,1,16,1,12,1,6,1,12, - 1,12,1,2,255,2,2,8,254,4,3,10,1,4,1,2, - 1,2,254,4,4,8,1,2,255,6,3,2,1,2,1,2, - 1,6,1,2,1,2,251,8,7,20,1,6,2,8,1,2, - 255,4,2,6,1,2,1,2,254,6,3,10,1,10,1,12, - 1,12,1,18,1,6,255,4,2,6,1,10,1,10,1,14, - 2,6,1,6,255,4,2,2,1,18,1,16,1,6,1,122, - 21,83,111,117,114,99,101,76,111,97,100,101,114,46,103,101, - 116,95,99,111,100,101,78,41,10,114,125,0,0,0,114,124, - 0,0,0,114,126,0,0,0,114,223,0,0,0,114,224,0, - 0,0,114,226,0,0,0,114,225,0,0,0,114,229,0,0, - 0,114,233,0,0,0,114,213,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 221,0,0,0,17,3,0,0,115,14,0,0,0,8,2,8, - 8,8,14,8,10,8,7,8,10,14,8,114,221,0,0,0, + 41,2,78,78,41,1,78,41,12,114,125,0,0,0,114,124, + 0,0,0,114,126,0,0,0,114,127,0,0,0,114,197,0, + 0,0,114,196,0,0,0,114,195,0,0,0,218,11,99,108, + 97,115,115,109,101,116,104,111,100,114,194,0,0,0,114,200, + 0,0,0,114,203,0,0,0,114,206,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,114,191,0,0,0,180,2,0,0,115,28,0,0,0,8, + 2,4,3,2,255,2,4,2,255,2,3,4,2,2,1,10, + 6,2,1,10,14,2,1,12,15,2,1,114,191,0,0,0, 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,0,0,0,0,115,124,0,0,0,101,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,101,7,135,0,102,1,100,8,100,9,132,8,131,1, - 90,8,101,7,100,10,100,11,132,0,131,1,90,9,100,12, - 100,13,132,0,90,10,101,7,100,14,100,15,132,0,131,1, - 90,11,100,16,100,17,132,0,90,12,100,18,100,19,132,0, - 90,13,100,20,100,21,132,0,90,14,100,22,100,23,132,0, - 90,15,135,0,4,0,90,16,83,0,41,24,218,10,70,105, - 108,101,76,111,97,100,101,114,122,103,66,97,115,101,32,102, - 105,108,101,32,108,111,97,100,101,114,32,99,108,97,115,115, - 32,119,104,105,99,104,32,105,109,112,108,101,109,101,110,116, - 115,32,116,104,101,32,108,111,97,100,101,114,32,112,114,111, - 116,111,99,111,108,32,109,101,116,104,111,100,115,32,116,104, - 97,116,10,32,32,32,32,114,101,113,117,105,114,101,32,102, - 105,108,101,32,115,121,115,116,101,109,32,117,115,97,103,101, - 46,99,3,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,2,0,0,0,67,0,0,0,115,16,0,0,0,124, - 1,124,0,95,0,124,2,124,0,95,1,100,1,83,0,41, - 2,122,75,67,97,99,104,101,32,116,104,101,32,109,111,100, - 117,108,101,32,110,97,109,101,32,97,110,100,32,116,104,101, - 32,112,97,116,104,32,116,111,32,116,104,101,32,102,105,108, - 101,32,102,111,117,110,100,32,98,121,32,116,104,101,10,32, - 32,32,32,32,32,32,32,102,105,110,100,101,114,46,78,114, - 159,0,0,0,41,3,114,119,0,0,0,114,139,0,0,0, - 114,44,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,209,0,0,0,166,3,0,0,115,4,0, - 0,0,0,3,6,1,122,19,70,105,108,101,76,111,97,100, - 101,114,46,95,95,105,110,105,116,95,95,99,2,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0, - 67,0,0,0,115,24,0,0,0,124,0,106,0,124,1,106, - 0,107,2,111,22,124,0,106,1,124,1,106,1,107,2,83, - 0,114,110,0,0,0,169,2,218,9,95,95,99,108,97,115, - 115,95,95,114,131,0,0,0,169,2,114,119,0,0,0,90, - 5,111,116,104,101,114,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,6,95,95,101,113,95,95,172,3,0, - 0,115,6,0,0,0,0,1,12,1,10,255,122,17,70,105, - 108,101,76,111,97,100,101,114,46,95,95,101,113,95,95,99, - 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 3,0,0,0,67,0,0,0,115,20,0,0,0,116,0,124, - 0,106,1,131,1,116,0,124,0,106,2,131,1,65,0,83, - 0,114,110,0,0,0,169,3,218,4,104,97,115,104,114,117, - 0,0,0,114,44,0,0,0,169,1,114,119,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,8, - 95,95,104,97,115,104,95,95,176,3,0,0,115,2,0,0, - 0,0,1,122,19,70,105,108,101,76,111,97,100,101,114,46, - 95,95,104,97,115,104,95,95,99,2,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,3,0,0,0,3,0,0, - 0,115,16,0,0,0,116,0,116,1,124,0,131,2,160,2, - 124,1,161,1,83,0,41,1,122,100,76,111,97,100,32,97, - 32,109,111,100,117,108,101,32,102,114,111,109,32,97,32,102, - 105,108,101,46,10,10,32,32,32,32,32,32,32,32,84,104, - 105,115,32,109,101,116,104,111,100,32,105,115,32,100,101,112, - 114,101,99,97,116,101,100,46,32,32,85,115,101,32,101,120, - 101,99,95,109,111,100,117,108,101,40,41,32,105,110,115,116, - 101,97,100,46,10,10,32,32,32,32,32,32,32,32,41,3, - 218,5,115,117,112,101,114,114,239,0,0,0,114,220,0,0, - 0,114,219,0,0,0,169,1,114,241,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,220,0,0,0,179,3,0,0, - 115,2,0,0,0,0,10,122,22,70,105,108,101,76,111,97, - 100,101,114,46,108,111,97,100,95,109,111,100,117,108,101,99, + 90,6,100,8,100,9,132,0,90,7,100,10,83,0,41,11, + 218,13,95,76,111,97,100,101,114,66,97,115,105,99,115,122, + 83,66,97,115,101,32,99,108,97,115,115,32,111,102,32,99, + 111,109,109,111,110,32,99,111,100,101,32,110,101,101,100,101, + 100,32,98,121,32,98,111,116,104,32,83,111,117,114,99,101, + 76,111,97,100,101,114,32,97,110,100,10,32,32,32,32,83, + 111,117,114,99,101,108,101,115,115,70,105,108,101,76,111,97, + 100,101,114,46,99,2,0,0,0,0,0,0,0,0,0,0, + 0,5,0,0,0,4,0,0,0,67,0,0,0,115,64,0, + 0,0,116,0,124,0,160,1,124,1,161,1,131,1,100,1, + 25,0,125,2,124,2,160,2,100,2,100,1,161,2,100,3, + 25,0,125,3,124,1,160,3,100,2,161,1,100,4,25,0, + 125,4,124,3,100,5,107,2,111,62,124,4,100,5,107,3, + 83,0,41,6,122,141,67,111,110,99,114,101,116,101,32,105, + 109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,102, + 32,73,110,115,112,101,99,116,76,111,97,100,101,114,46,105, + 115,95,112,97,99,107,97,103,101,32,98,121,32,99,104,101, + 99,107,105,110,103,32,105,102,10,32,32,32,32,32,32,32, + 32,116,104,101,32,112,97,116,104,32,114,101,116,117,114,110, + 101,100,32,98,121,32,103,101,116,95,102,105,108,101,110,97, + 109,101,32,104,97,115,32,97,32,102,105,108,101,110,97,109, + 101,32,111,102,32,39,95,95,105,110,105,116,95,95,46,112, + 121,39,46,114,39,0,0,0,114,71,0,0,0,114,73,0, + 0,0,114,28,0,0,0,218,8,95,95,105,110,105,116,95, + 95,41,4,114,47,0,0,0,114,179,0,0,0,114,43,0, + 0,0,114,41,0,0,0,41,5,114,119,0,0,0,114,139, + 0,0,0,114,97,0,0,0,90,13,102,105,108,101,110,97, + 109,101,95,98,97,115,101,90,9,116,97,105,108,95,110,97, + 109,101,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,114,182,0,0,0,249,2,0,0,115,8,0,0,0,0, + 3,18,1,16,1,14,1,122,24,95,76,111,97,100,101,114, + 66,97,115,105,99,115,46,105,115,95,112,97,99,107,97,103, + 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, + 1,83,0,169,2,122,42,85,115,101,32,100,101,102,97,117, + 108,116,32,115,101,109,97,110,116,105,99,115,32,102,111,114, + 32,109,111,100,117,108,101,32,99,114,101,97,116,105,111,110, + 46,78,114,3,0,0,0,169,2,114,119,0,0,0,114,187, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,218,13,99,114,101,97,116,101,95,109,111,100,117,108, + 101,1,3,0,0,115,2,0,0,0,0,1,122,27,95,76, + 111,97,100,101,114,66,97,115,105,99,115,46,99,114,101,97, + 116,101,95,109,111,100,117,108,101,99,2,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,5,0,0,0,67,0, + 0,0,115,56,0,0,0,124,0,160,0,124,1,106,1,161, + 1,125,2,124,2,100,1,107,8,114,36,116,2,100,2,160, + 3,124,1,106,1,161,1,131,1,130,1,116,4,160,5,116, + 6,124,2,124,1,106,7,161,3,1,0,100,1,83,0,41, + 3,122,19,69,120,101,99,117,116,101,32,116,104,101,32,109, + 111,100,117,108,101,46,78,122,52,99,97,110,110,111,116,32, + 108,111,97,100,32,109,111,100,117,108,101,32,123,33,114,125, + 32,119,104,101,110,32,103,101,116,95,99,111,100,101,40,41, + 32,114,101,116,117,114,110,115,32,78,111,110,101,41,8,218, + 8,103,101,116,95,99,111,100,101,114,125,0,0,0,114,118, + 0,0,0,114,62,0,0,0,114,134,0,0,0,218,25,95, + 99,97,108,108,95,119,105,116,104,95,102,114,97,109,101,115, + 95,114,101,109,111,118,101,100,218,4,101,120,101,99,114,131, + 0,0,0,41,3,114,119,0,0,0,218,6,109,111,100,117, + 108,101,114,164,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,218,11,101,120,101,99,95,109,111,100, + 117,108,101,4,3,0,0,115,12,0,0,0,0,2,12,1, + 8,1,6,1,4,255,6,2,122,25,95,76,111,97,100,101, + 114,66,97,115,105,99,115,46,101,120,101,99,95,109,111,100, + 117,108,101,99,2,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,4,0,0,0,67,0,0,0,115,12,0,0, + 0,116,0,160,1,124,0,124,1,161,2,83,0,41,1,122, + 26,84,104,105,115,32,109,111,100,117,108,101,32,105,115,32, + 100,101,112,114,101,99,97,116,101,100,46,41,2,114,134,0, + 0,0,218,17,95,108,111,97,100,95,109,111,100,117,108,101, + 95,115,104,105,109,169,2,114,119,0,0,0,114,139,0,0, + 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 218,11,108,111,97,100,95,109,111,100,117,108,101,12,3,0, + 0,115,2,0,0,0,0,2,122,25,95,76,111,97,100,101, + 114,66,97,115,105,99,115,46,108,111,97,100,95,109,111,100, + 117,108,101,78,41,8,114,125,0,0,0,114,124,0,0,0, + 114,126,0,0,0,114,127,0,0,0,114,182,0,0,0,114, + 212,0,0,0,114,217,0,0,0,114,220,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,114,208,0,0,0,244,2,0,0,115,10,0,0,0, + 8,2,4,3,8,8,8,3,8,8,114,208,0,0,0,99, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,64,0,0,0,115,74,0,0,0,101,0,90, + 1,100,0,90,2,100,1,100,2,132,0,90,3,100,3,100, + 4,132,0,90,4,100,5,100,6,132,0,90,5,100,7,100, + 8,132,0,90,6,100,9,100,10,132,0,90,7,100,11,100, + 12,156,1,100,13,100,14,132,2,90,8,100,15,100,16,132, + 0,90,9,100,17,83,0,41,18,218,12,83,111,117,114,99, + 101,76,111,97,100,101,114,99,2,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,0, + 115,8,0,0,0,116,0,130,1,100,1,83,0,41,2,122, + 165,79,112,116,105,111,110,97,108,32,109,101,116,104,111,100, + 32,116,104,97,116,32,114,101,116,117,114,110,115,32,116,104, + 101,32,109,111,100,105,102,105,99,97,116,105,111,110,32,116, + 105,109,101,32,40,97,110,32,105,110,116,41,32,102,111,114, + 32,116,104,101,10,32,32,32,32,32,32,32,32,115,112,101, + 99,105,102,105,101,100,32,112,97,116,104,32,40,97,32,115, + 116,114,41,46,10,10,32,32,32,32,32,32,32,32,82,97, + 105,115,101,115,32,79,83,69,114,114,111,114,32,119,104,101, + 110,32,116,104,101,32,112,97,116,104,32,99,97,110,110,111, + 116,32,98,101,32,104,97,110,100,108,101,100,46,10,32,32, + 32,32,32,32,32,32,78,41,1,114,50,0,0,0,169,2, + 114,119,0,0,0,114,44,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,218,10,112,97,116,104,95, + 109,116,105,109,101,19,3,0,0,115,2,0,0,0,0,6, + 122,23,83,111,117,114,99,101,76,111,97,100,101,114,46,112, + 97,116,104,95,109,116,105,109,101,99,2,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,4,0,0,0,67,0, + 0,0,115,14,0,0,0,100,1,124,0,160,0,124,1,161, + 1,105,1,83,0,41,2,97,158,1,0,0,79,112,116,105, + 111,110,97,108,32,109,101,116,104,111,100,32,114,101,116,117, + 114,110,105,110,103,32,97,32,109,101,116,97,100,97,116,97, + 32,100,105,99,116,32,102,111,114,32,116,104,101,32,115,112, + 101,99,105,102,105,101,100,10,32,32,32,32,32,32,32,32, + 112,97,116,104,32,40,97,32,115,116,114,41,46,10,10,32, + 32,32,32,32,32,32,32,80,111,115,115,105,98,108,101,32, + 107,101,121,115,58,10,32,32,32,32,32,32,32,32,45,32, + 39,109,116,105,109,101,39,32,40,109,97,110,100,97,116,111, + 114,121,41,32,105,115,32,116,104,101,32,110,117,109,101,114, + 105,99,32,116,105,109,101,115,116,97,109,112,32,111,102,32, + 108,97,115,116,32,115,111,117,114,99,101,10,32,32,32,32, + 32,32,32,32,32,32,99,111,100,101,32,109,111,100,105,102, + 105,99,97,116,105,111,110,59,10,32,32,32,32,32,32,32, + 32,45,32,39,115,105,122,101,39,32,40,111,112,116,105,111, + 110,97,108,41,32,105,115,32,116,104,101,32,115,105,122,101, + 32,105,110,32,98,121,116,101,115,32,111,102,32,116,104,101, + 32,115,111,117,114,99,101,32,99,111,100,101,46,10,10,32, + 32,32,32,32,32,32,32,73,109,112,108,101,109,101,110,116, + 105,110,103,32,116,104,105,115,32,109,101,116,104,111,100,32, + 97,108,108,111,119,115,32,116,104,101,32,108,111,97,100,101, + 114,32,116,111,32,114,101,97,100,32,98,121,116,101,99,111, + 100,101,32,102,105,108,101,115,46,10,32,32,32,32,32,32, + 32,32,82,97,105,115,101,115,32,79,83,69,114,114,111,114, + 32,119,104,101,110,32,116,104,101,32,112,97,116,104,32,99, + 97,110,110,111,116,32,98,101,32,104,97,110,100,108,101,100, + 46,10,32,32,32,32,32,32,32,32,114,169,0,0,0,41, + 1,114,223,0,0,0,114,222,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,218,10,112,97,116,104, + 95,115,116,97,116,115,27,3,0,0,115,2,0,0,0,0, + 12,122,23,83,111,117,114,99,101,76,111,97,100,101,114,46, + 112,97,116,104,95,115,116,97,116,115,99,4,0,0,0,0, + 0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,67, + 0,0,0,115,12,0,0,0,124,0,160,0,124,2,124,3, + 161,2,83,0,41,1,122,228,79,112,116,105,111,110,97,108, + 32,109,101,116,104,111,100,32,119,104,105,99,104,32,119,114, + 105,116,101,115,32,100,97,116,97,32,40,98,121,116,101,115, + 41,32,116,111,32,97,32,102,105,108,101,32,112,97,116,104, + 32,40,97,32,115,116,114,41,46,10,10,32,32,32,32,32, + 32,32,32,73,109,112,108,101,109,101,110,116,105,110,103,32, + 116,104,105,115,32,109,101,116,104,111,100,32,97,108,108,111, + 119,115,32,102,111,114,32,116,104,101,32,119,114,105,116,105, + 110,103,32,111,102,32,98,121,116,101,99,111,100,101,32,102, + 105,108,101,115,46,10,10,32,32,32,32,32,32,32,32,84, + 104,101,32,115,111,117,114,99,101,32,112,97,116,104,32,105, + 115,32,110,101,101,100,101,100,32,105,110,32,111,114,100,101, + 114,32,116,111,32,99,111,114,114,101,99,116,108,121,32,116, + 114,97,110,115,102,101,114,32,112,101,114,109,105,115,115,105, + 111,110,115,10,32,32,32,32,32,32,32,32,41,1,218,8, + 115,101,116,95,100,97,116,97,41,4,114,119,0,0,0,114, + 108,0,0,0,90,10,99,97,99,104,101,95,112,97,116,104, + 114,26,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,218,15,95,99,97,99,104,101,95,98,121,116, + 101,99,111,100,101,41,3,0,0,115,2,0,0,0,0,8, + 122,28,83,111,117,114,99,101,76,111,97,100,101,114,46,95, + 99,97,99,104,101,95,98,121,116,101,99,111,100,101,99,3, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,1, + 0,0,0,67,0,0,0,115,4,0,0,0,100,1,83,0, + 41,2,122,150,79,112,116,105,111,110,97,108,32,109,101,116, + 104,111,100,32,119,104,105,99,104,32,119,114,105,116,101,115, + 32,100,97,116,97,32,40,98,121,116,101,115,41,32,116,111, + 32,97,32,102,105,108,101,32,112,97,116,104,32,40,97,32, + 115,116,114,41,46,10,10,32,32,32,32,32,32,32,32,73, + 109,112,108,101,109,101,110,116,105,110,103,32,116,104,105,115, + 32,109,101,116,104,111,100,32,97,108,108,111,119,115,32,102, + 111,114,32,116,104,101,32,119,114,105,116,105,110,103,32,111, + 102,32,98,121,116,101,99,111,100,101,32,102,105,108,101,115, + 46,10,32,32,32,32,32,32,32,32,78,114,3,0,0,0, + 41,3,114,119,0,0,0,114,44,0,0,0,114,26,0,0, + 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 114,225,0,0,0,51,3,0,0,115,2,0,0,0,0,1, + 122,21,83,111,117,114,99,101,76,111,97,100,101,114,46,115, + 101,116,95,100,97,116,97,99,2,0,0,0,0,0,0,0, + 0,0,0,0,5,0,0,0,10,0,0,0,67,0,0,0, + 115,82,0,0,0,124,0,160,0,124,1,161,1,125,2,122, + 14,124,0,160,1,124,2,161,1,125,3,87,0,110,48,4, + 0,116,2,107,10,114,72,1,0,125,4,1,0,122,18,116, + 3,100,1,124,1,100,2,141,2,124,4,130,2,87,0,53, + 0,100,3,125,4,126,4,88,0,89,0,110,2,88,0,116, + 4,124,3,131,1,83,0,41,4,122,52,67,111,110,99,114, + 101,116,101,32,105,109,112,108,101,109,101,110,116,97,116,105, + 111,110,32,111,102,32,73,110,115,112,101,99,116,76,111,97, + 100,101,114,46,103,101,116,95,115,111,117,114,99,101,46,122, + 39,115,111,117,114,99,101,32,110,111,116,32,97,118,97,105, + 108,97,98,108,101,32,116,104,114,111,117,103,104,32,103,101, + 116,95,100,97,116,97,40,41,114,116,0,0,0,78,41,5, + 114,179,0,0,0,218,8,103,101,116,95,100,97,116,97,114, + 50,0,0,0,114,118,0,0,0,114,176,0,0,0,41,5, + 114,119,0,0,0,114,139,0,0,0,114,44,0,0,0,114, + 174,0,0,0,218,3,101,120,99,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,10,103,101,116,95,115,111, + 117,114,99,101,58,3,0,0,115,20,0,0,0,0,2,10, + 1,2,1,14,1,16,1,4,1,2,255,4,1,2,255,20, + 2,122,23,83,111,117,114,99,101,76,111,97,100,101,114,46, + 103,101,116,95,115,111,117,114,99,101,114,105,0,0,0,41, + 1,218,9,95,111,112,116,105,109,105,122,101,99,3,0,0, + 0,0,0,0,0,1,0,0,0,4,0,0,0,8,0,0, + 0,67,0,0,0,115,22,0,0,0,116,0,106,1,116,2, + 124,1,124,2,100,1,100,2,124,3,100,3,141,6,83,0, + 41,4,122,130,82,101,116,117,114,110,32,116,104,101,32,99, + 111,100,101,32,111,98,106,101,99,116,32,99,111,109,112,105, + 108,101,100,32,102,114,111,109,32,115,111,117,114,99,101,46, + 10,10,32,32,32,32,32,32,32,32,84,104,101,32,39,100, + 97,116,97,39,32,97,114,103,117,109,101,110,116,32,99,97, + 110,32,98,101,32,97,110,121,32,111,98,106,101,99,116,32, + 116,121,112,101,32,116,104,97,116,32,99,111,109,112,105,108, + 101,40,41,32,115,117,112,112,111,114,116,115,46,10,32,32, + 32,32,32,32,32,32,114,215,0,0,0,84,41,2,218,12, + 100,111,110,116,95,105,110,104,101,114,105,116,114,84,0,0, + 0,41,3,114,134,0,0,0,114,214,0,0,0,218,7,99, + 111,109,112,105,108,101,41,4,114,119,0,0,0,114,26,0, + 0,0,114,44,0,0,0,114,230,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,218,14,115,111,117, + 114,99,101,95,116,111,95,99,111,100,101,68,3,0,0,115, + 8,0,0,0,0,5,12,1,2,0,2,255,122,27,83,111, + 117,114,99,101,76,111,97,100,101,114,46,115,111,117,114,99, + 101,95,116,111,95,99,111,100,101,99,2,0,0,0,0,0, + 0,0,0,0,0,0,15,0,0,0,9,0,0,0,67,0, + 0,0,115,34,2,0,0,124,0,160,0,124,1,161,1,125, + 2,100,1,125,3,100,1,125,4,100,1,125,5,100,2,125, + 6,100,3,125,7,122,12,116,1,124,2,131,1,125,8,87, + 0,110,26,4,0,116,2,107,10,114,68,1,0,1,0,1, + 0,100,1,125,8,89,0,144,1,110,48,88,0,122,14,124, + 0,160,3,124,2,161,1,125,9,87,0,110,22,4,0,116, + 4,107,10,114,106,1,0,1,0,1,0,89,0,144,1,110, + 10,88,0,116,5,124,9,100,4,25,0,131,1,125,3,122, + 14,124,0,160,6,124,8,161,1,125,10,87,0,110,20,4, + 0,116,4,107,10,114,154,1,0,1,0,1,0,89,0,110, + 218,88,0,124,1,124,8,100,5,156,2,125,11,122,148,116, + 7,124,10,124,1,124,11,131,3,125,12,116,8,124,10,131, + 1,100,6,100,1,133,2,25,0,125,13,124,12,100,7,64, + 0,100,8,107,3,125,6,124,6,144,1,114,36,124,12,100, + 9,64,0,100,8,107,3,125,7,116,9,106,10,100,10,107, + 3,144,1,114,56,124,7,115,254,116,9,106,10,100,11,107, + 2,144,1,114,56,124,0,160,6,124,2,161,1,125,4,116, + 9,160,11,116,12,124,4,161,2,125,5,116,13,124,10,124, + 5,124,1,124,11,131,4,1,0,110,20,116,14,124,10,124, + 3,124,9,100,12,25,0,124,1,124,11,131,5,1,0,87, + 0,110,26,4,0,116,15,116,16,102,2,107,10,144,1,114, + 84,1,0,1,0,1,0,89,0,110,32,88,0,116,17,160, + 18,100,13,124,8,124,2,161,3,1,0,116,19,124,13,124, + 1,124,8,124,2,100,14,141,4,83,0,124,4,100,1,107, + 8,144,1,114,136,124,0,160,6,124,2,161,1,125,4,124, + 0,160,20,124,4,124,2,161,2,125,14,116,17,160,18,100, + 15,124,2,161,2,1,0,116,21,106,22,144,2,115,30,124, + 8,100,1,107,9,144,2,114,30,124,3,100,1,107,9,144, + 2,114,30,124,6,144,1,114,228,124,5,100,1,107,8,144, + 1,114,214,116,9,160,11,124,4,161,1,125,5,116,23,124, + 14,124,5,124,7,131,3,125,10,110,16,116,24,124,14,124, + 3,116,25,124,4,131,1,131,3,125,10,122,18,124,0,160, + 26,124,2,124,8,124,10,161,3,1,0,87,0,110,22,4, + 0,116,2,107,10,144,2,114,28,1,0,1,0,1,0,89, + 0,110,2,88,0,124,14,83,0,41,16,122,190,67,111,110, + 99,114,101,116,101,32,105,109,112,108,101,109,101,110,116,97, + 116,105,111,110,32,111,102,32,73,110,115,112,101,99,116,76, + 111,97,100,101,114,46,103,101,116,95,99,111,100,101,46,10, + 10,32,32,32,32,32,32,32,32,82,101,97,100,105,110,103, + 32,111,102,32,98,121,116,101,99,111,100,101,32,114,101,113, + 117,105,114,101,115,32,112,97,116,104,95,115,116,97,116,115, + 32,116,111,32,98,101,32,105,109,112,108,101,109,101,110,116, + 101,100,46,32,84,111,32,119,114,105,116,101,10,32,32,32, + 32,32,32,32,32,98,121,116,101,99,111,100,101,44,32,115, + 101,116,95,100,97,116,97,32,109,117,115,116,32,97,108,115, + 111,32,98,101,32,105,109,112,108,101,109,101,110,116,101,100, + 46,10,10,32,32,32,32,32,32,32,32,78,70,84,114,169, + 0,0,0,114,159,0,0,0,114,145,0,0,0,114,39,0, + 0,0,114,73,0,0,0,114,28,0,0,0,90,5,110,101, + 118,101,114,90,6,97,108,119,97,121,115,218,4,115,105,122, + 101,122,13,123,125,32,109,97,116,99,104,101,115,32,123,125, + 41,3,114,117,0,0,0,114,107,0,0,0,114,108,0,0, + 0,122,19,99,111,100,101,32,111,98,106,101,99,116,32,102, + 114,111,109,32,123,125,41,27,114,179,0,0,0,114,98,0, + 0,0,114,82,0,0,0,114,224,0,0,0,114,50,0,0, + 0,114,17,0,0,0,114,227,0,0,0,114,152,0,0,0, + 218,10,109,101,109,111,114,121,118,105,101,119,114,163,0,0, + 0,90,21,99,104,101,99,107,95,104,97,115,104,95,98,97, + 115,101,100,95,112,121,99,115,114,157,0,0,0,218,17,95, + 82,65,87,95,77,65,71,73,67,95,78,85,77,66,69,82, + 114,158,0,0,0,114,156,0,0,0,114,118,0,0,0,114, + 150,0,0,0,114,134,0,0,0,114,149,0,0,0,114,165, + 0,0,0,114,233,0,0,0,114,8,0,0,0,218,19,100, + 111,110,116,95,119,114,105,116,101,95,98,121,116,101,99,111, + 100,101,114,171,0,0,0,114,170,0,0,0,114,22,0,0, + 0,114,226,0,0,0,41,15,114,119,0,0,0,114,139,0, + 0,0,114,108,0,0,0,114,154,0,0,0,114,174,0,0, + 0,114,157,0,0,0,90,10,104,97,115,104,95,98,97,115, + 101,100,90,12,99,104,101,99,107,95,115,111,117,114,99,101, + 114,107,0,0,0,218,2,115,116,114,26,0,0,0,114,151, + 0,0,0,114,83,0,0,0,90,10,98,121,116,101,115,95, + 100,97,116,97,90,11,99,111,100,101,95,111,98,106,101,99, + 116,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 114,213,0,0,0,76,3,0,0,115,152,0,0,0,0,7, + 10,1,4,1,4,1,4,1,4,1,4,1,2,1,12,1, + 14,1,12,2,2,1,14,1,14,1,8,2,12,1,2,1, + 14,1,14,1,6,3,2,1,2,254,6,4,2,1,12,1, + 16,1,12,1,6,1,12,1,12,1,2,255,2,2,8,254, + 4,3,10,1,4,1,2,1,2,254,4,4,8,1,2,255, + 6,3,2,1,2,1,2,1,6,1,2,1,2,251,8,7, + 20,1,6,2,8,1,2,255,4,2,6,1,2,1,2,254, + 6,3,10,1,10,1,12,1,12,1,18,1,6,255,4,2, + 6,1,10,1,10,1,14,2,6,1,6,255,4,2,2,1, + 18,1,16,1,6,1,122,21,83,111,117,114,99,101,76,111, + 97,100,101,114,46,103,101,116,95,99,111,100,101,78,41,10, + 114,125,0,0,0,114,124,0,0,0,114,126,0,0,0,114, + 223,0,0,0,114,224,0,0,0,114,226,0,0,0,114,225, + 0,0,0,114,229,0,0,0,114,233,0,0,0,114,213,0, + 0,0,114,3,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,114,221,0,0,0,17,3,0,0,115, + 14,0,0,0,8,2,8,8,8,14,8,10,8,7,8,10, + 14,8,114,221,0,0,0,99,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0, + 115,124,0,0,0,101,0,90,1,100,0,90,2,100,1,90, + 3,100,2,100,3,132,0,90,4,100,4,100,5,132,0,90, + 5,100,6,100,7,132,0,90,6,101,7,135,0,102,1,100, + 8,100,9,132,8,131,1,90,8,101,7,100,10,100,11,132, + 0,131,1,90,9,100,12,100,13,132,0,90,10,101,7,100, + 14,100,15,132,0,131,1,90,11,100,16,100,17,132,0,90, + 12,100,18,100,19,132,0,90,13,100,20,100,21,132,0,90, + 14,100,22,100,23,132,0,90,15,135,0,4,0,90,16,83, + 0,41,24,218,10,70,105,108,101,76,111,97,100,101,114,122, + 103,66,97,115,101,32,102,105,108,101,32,108,111,97,100,101, + 114,32,99,108,97,115,115,32,119,104,105,99,104,32,105,109, + 112,108,101,109,101,110,116,115,32,116,104,101,32,108,111,97, + 100,101,114,32,112,114,111,116,111,99,111,108,32,109,101,116, + 104,111,100,115,32,116,104,97,116,10,32,32,32,32,114,101, + 113,117,105,114,101,32,102,105,108,101,32,115,121,115,116,101, + 109,32,117,115,97,103,101,46,99,3,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,2,0,0,0,67,0,0, + 0,115,16,0,0,0,124,1,124,0,95,0,124,2,124,0, + 95,1,100,1,83,0,41,2,122,75,67,97,99,104,101,32, + 116,104,101,32,109,111,100,117,108,101,32,110,97,109,101,32, + 97,110,100,32,116,104,101,32,112,97,116,104,32,116,111,32, + 116,104,101,32,102,105,108,101,32,102,111,117,110,100,32,98, + 121,32,116,104,101,10,32,32,32,32,32,32,32,32,102,105, + 110,100,101,114,46,78,114,159,0,0,0,41,3,114,119,0, + 0,0,114,139,0,0,0,114,44,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,114,209,0,0,0, + 166,3,0,0,115,4,0,0,0,0,3,6,1,122,19,70, + 105,108,101,76,111,97,100,101,114,46,95,95,105,110,105,116, + 95,95,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,2,0,0,0,67,0,0,0,115,24,0,0,0, + 124,0,106,0,124,1,106,0,107,2,111,22,124,0,106,1, + 124,1,106,1,107,2,83,0,114,110,0,0,0,169,2,218, + 9,95,95,99,108,97,115,115,95,95,114,131,0,0,0,169, + 2,114,119,0,0,0,90,5,111,116,104,101,114,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,218,6,95,95, + 101,113,95,95,172,3,0,0,115,6,0,0,0,0,1,12, + 1,10,255,122,17,70,105,108,101,76,111,97,100,101,114,46, + 95,95,101,113,95,95,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, + 20,0,0,0,116,0,124,0,106,1,131,1,116,0,124,0, + 106,2,131,1,65,0,83,0,114,110,0,0,0,169,3,218, + 4,104,97,115,104,114,117,0,0,0,114,44,0,0,0,169, + 1,114,119,0,0,0,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,218,8,95,95,104,97,115,104,95,95,176, + 3,0,0,115,2,0,0,0,0,1,122,19,70,105,108,101, + 76,111,97,100,101,114,46,95,95,104,97,115,104,95,95,99, 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 1,0,0,0,67,0,0,0,115,6,0,0,0,124,0,106, - 0,83,0,169,1,122,58,82,101,116,117,114,110,32,116,104, - 101,32,112,97,116,104,32,116,111,32,116,104,101,32,115,111, - 117,114,99,101,32,102,105,108,101,32,97,115,32,102,111,117, - 110,100,32,98,121,32,116,104,101,32,102,105,110,100,101,114, - 46,114,48,0,0,0,114,219,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,179,0,0,0,191, - 3,0,0,115,2,0,0,0,0,3,122,23,70,105,108,101, - 76,111,97,100,101,114,46,103,101,116,95,102,105,108,101,110, - 97,109,101,99,2,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,10,0,0,0,67,0,0,0,115,102,0,0, - 0,116,0,124,0,116,1,116,2,102,2,131,2,114,58,116, - 3,160,4,116,5,124,1,131,1,161,1,143,22,125,2,124, - 2,160,6,161,0,87,0,2,0,53,0,81,0,82,0,163, - 0,83,0,81,0,82,0,88,0,110,40,116,3,160,7,124, - 1,100,1,161,2,143,22,125,2,124,2,160,6,161,0,87, - 0,2,0,53,0,81,0,82,0,163,0,83,0,81,0,82, - 0,88,0,100,2,83,0,41,3,122,39,82,101,116,117,114, - 110,32,116,104,101,32,100,97,116,97,32,102,114,111,109,32, - 112,97,116,104,32,97,115,32,114,97,119,32,98,121,116,101, - 115,46,218,1,114,78,41,8,114,161,0,0,0,114,221,0, - 0,0,218,19,69,120,116,101,110,115,105,111,110,70,105,108, - 101,76,111,97,100,101,114,114,64,0,0,0,90,9,111,112, - 101,110,95,99,111,100,101,114,85,0,0,0,90,4,114,101, - 97,100,114,65,0,0,0,41,3,114,119,0,0,0,114,44, - 0,0,0,114,68,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,227,0,0,0,196,3,0,0, - 115,10,0,0,0,0,2,14,1,16,1,28,2,14,1,122, - 19,70,105,108,101,76,111,97,100,101,114,46,103,101,116,95, - 100,97,116,97,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,3,0,0,0,67,0,0,0,115,18,0, - 0,0,124,0,160,0,124,1,161,1,114,14,124,0,83,0, - 100,0,83,0,114,110,0,0,0,41,1,114,182,0,0,0, - 169,2,114,119,0,0,0,114,216,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,218,19,103,101,116, - 95,114,101,115,111,117,114,99,101,95,114,101,97,100,101,114, - 207,3,0,0,115,6,0,0,0,0,2,10,1,4,1,122, - 30,70,105,108,101,76,111,97,100,101,114,46,103,101,116,95, - 114,101,115,111,117,114,99,101,95,114,101,97,100,101,114,99, - 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 4,0,0,0,67,0,0,0,115,32,0,0,0,116,0,116, - 1,124,0,106,2,131,1,100,1,25,0,124,1,131,2,125, - 2,116,3,160,4,124,2,100,2,161,2,83,0,41,3,78, - 114,73,0,0,0,114,251,0,0,0,41,5,114,38,0,0, - 0,114,47,0,0,0,114,44,0,0,0,114,64,0,0,0, - 114,65,0,0,0,169,3,114,119,0,0,0,90,8,114,101, - 115,111,117,114,99,101,114,44,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,13,111,112,101,110, - 95,114,101,115,111,117,114,99,101,213,3,0,0,115,4,0, - 0,0,0,1,20,1,122,24,70,105,108,101,76,111,97,100, - 101,114,46,111,112,101,110,95,114,101,115,111,117,114,99,101, - 99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,3,0,0,0,67,0,0,0,115,38,0,0,0,124,0, - 160,0,124,1,161,1,115,14,116,1,130,1,116,2,116,3, - 124,0,106,4,131,1,100,1,25,0,124,1,131,2,125,2, - 124,2,83,0,169,2,78,114,73,0,0,0,41,5,218,11, - 105,115,95,114,101,115,111,117,114,99,101,218,17,70,105,108, - 101,78,111,116,70,111,117,110,100,69,114,114,111,114,114,38, - 0,0,0,114,47,0,0,0,114,44,0,0,0,114,255,0, + 3,0,0,0,3,0,0,0,115,16,0,0,0,116,0,116, + 1,124,0,131,2,160,2,124,1,161,1,83,0,41,1,122, + 100,76,111,97,100,32,97,32,109,111,100,117,108,101,32,102, + 114,111,109,32,97,32,102,105,108,101,46,10,10,32,32,32, + 32,32,32,32,32,84,104,105,115,32,109,101,116,104,111,100, + 32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,32, + 32,85,115,101,32,101,120,101,99,95,109,111,100,117,108,101, + 40,41,32,105,110,115,116,101,97,100,46,10,10,32,32,32, + 32,32,32,32,32,41,3,218,5,115,117,112,101,114,114,239, + 0,0,0,114,220,0,0,0,114,219,0,0,0,169,1,114, + 241,0,0,0,114,3,0,0,0,114,6,0,0,0,114,220, + 0,0,0,179,3,0,0,115,2,0,0,0,0,10,122,22, + 70,105,108,101,76,111,97,100,101,114,46,108,111,97,100,95, + 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, + 6,0,0,0,124,0,106,0,83,0,169,1,122,58,82,101, + 116,117,114,110,32,116,104,101,32,112,97,116,104,32,116,111, + 32,116,104,101,32,115,111,117,114,99,101,32,102,105,108,101, + 32,97,115,32,102,111,117,110,100,32,98,121,32,116,104,101, + 32,102,105,110,100,101,114,46,114,48,0,0,0,114,219,0, 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,13,114,101,115,111,117,114,99,101,95,112,97,116,104, - 217,3,0,0,115,8,0,0,0,0,1,10,1,4,1,20, - 1,122,24,70,105,108,101,76,111,97,100,101,114,46,114,101, - 115,111,117,114,99,101,95,112,97,116,104,99,2,0,0,0, - 0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, - 67,0,0,0,115,40,0,0,0,116,0,124,1,107,6,114, - 12,100,1,83,0,116,1,116,2,124,0,106,3,131,1,100, - 2,25,0,124,1,131,2,125,2,116,4,124,2,131,1,83, - 0,41,3,78,70,114,73,0,0,0,41,5,114,35,0,0, - 0,114,38,0,0,0,114,47,0,0,0,114,44,0,0,0, - 114,54,0,0,0,169,3,114,119,0,0,0,114,117,0,0, - 0,114,44,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,2,1,0,0,223,3,0,0,115,8, - 0,0,0,0,1,8,1,4,1,20,1,122,22,70,105,108, - 101,76,111,97,100,101,114,46,105,115,95,114,101,115,111,117, - 114,99,101,99,1,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,5,0,0,0,67,0,0,0,115,24,0,0, - 0,116,0,116,1,160,2,116,3,124,0,106,4,131,1,100, - 1,25,0,161,1,131,1,83,0,114,1,1,0,0,41,5, - 218,4,105,116,101,114,114,2,0,0,0,218,7,108,105,115, - 116,100,105,114,114,47,0,0,0,114,44,0,0,0,114,246, + 0,114,179,0,0,0,191,3,0,0,115,2,0,0,0,0, + 3,122,23,70,105,108,101,76,111,97,100,101,114,46,103,101, + 116,95,102,105,108,101,110,97,109,101,99,2,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,10,0,0,0,67, + 0,0,0,115,102,0,0,0,116,0,124,0,116,1,116,2, + 102,2,131,2,114,58,116,3,160,4,116,5,124,1,131,1, + 161,1,143,22,125,2,124,2,160,6,161,0,87,0,2,0, + 53,0,81,0,82,0,163,0,83,0,81,0,82,0,88,0, + 110,40,116,3,160,7,124,1,100,1,161,2,143,22,125,2, + 124,2,160,6,161,0,87,0,2,0,53,0,81,0,82,0, + 163,0,83,0,81,0,82,0,88,0,100,2,83,0,41,3, + 122,39,82,101,116,117,114,110,32,116,104,101,32,100,97,116, + 97,32,102,114,111,109,32,112,97,116,104,32,97,115,32,114, + 97,119,32,98,121,116,101,115,46,218,1,114,78,41,8,114, + 161,0,0,0,114,221,0,0,0,218,19,69,120,116,101,110, + 115,105,111,110,70,105,108,101,76,111,97,100,101,114,114,64, + 0,0,0,90,9,111,112,101,110,95,99,111,100,101,114,85, + 0,0,0,90,4,114,101,97,100,114,65,0,0,0,41,3, + 114,119,0,0,0,114,44,0,0,0,114,68,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,227, + 0,0,0,196,3,0,0,115,10,0,0,0,0,2,14,1, + 16,1,28,2,14,1,122,19,70,105,108,101,76,111,97,100, + 101,114,46,103,101,116,95,100,97,116,97,99,2,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, + 67,0,0,0,115,18,0,0,0,124,0,160,0,124,1,161, + 1,114,14,124,0,83,0,100,0,83,0,114,110,0,0,0, + 41,1,114,182,0,0,0,169,2,114,119,0,0,0,114,216, 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,218,8,99,111,110,116,101,110,116,115,229,3,0,0, - 115,2,0,0,0,0,1,122,19,70,105,108,101,76,111,97, - 100,101,114,46,99,111,110,116,101,110,116,115,41,17,114,125, - 0,0,0,114,124,0,0,0,114,126,0,0,0,114,127,0, - 0,0,114,209,0,0,0,114,243,0,0,0,114,247,0,0, - 0,114,136,0,0,0,114,220,0,0,0,114,179,0,0,0, - 114,227,0,0,0,114,254,0,0,0,114,0,1,0,0,114, - 4,1,0,0,114,2,1,0,0,114,8,1,0,0,90,13, - 95,95,99,108,97,115,115,99,101,108,108,95,95,114,3,0, - 0,0,114,3,0,0,0,114,249,0,0,0,114,6,0,0, - 0,114,239,0,0,0,161,3,0,0,115,30,0,0,0,8, - 2,4,3,8,6,8,4,8,3,2,1,14,11,2,1,10, - 4,8,11,2,1,10,5,8,4,8,6,8,6,114,239,0, - 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,64,0,0,0,115,46,0,0,0, - 101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,3, - 132,0,90,4,100,4,100,5,132,0,90,5,100,6,100,7, - 156,1,100,8,100,9,132,2,90,6,100,10,83,0,41,11, - 218,16,83,111,117,114,99,101,70,105,108,101,76,111,97,100, - 101,114,122,62,67,111,110,99,114,101,116,101,32,105,109,112, - 108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,83, - 111,117,114,99,101,76,111,97,100,101,114,32,117,115,105,110, - 103,32,116,104,101,32,102,105,108,101,32,115,121,115,116,101, - 109,46,99,2,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,3,0,0,0,67,0,0,0,115,22,0,0,0, - 116,0,124,1,131,1,125,2,124,2,106,1,124,2,106,2, - 100,1,156,2,83,0,41,2,122,33,82,101,116,117,114,110, - 32,116,104,101,32,109,101,116,97,100,97,116,97,32,102,111, - 114,32,116,104,101,32,112,97,116,104,46,41,2,114,169,0, - 0,0,114,234,0,0,0,41,3,114,49,0,0,0,218,8, - 115,116,95,109,116,105,109,101,90,7,115,116,95,115,105,122, - 101,41,3,114,119,0,0,0,114,44,0,0,0,114,238,0, + 0,0,218,19,103,101,116,95,114,101,115,111,117,114,99,101, + 95,114,101,97,100,101,114,207,3,0,0,115,6,0,0,0, + 0,2,10,1,4,1,122,30,70,105,108,101,76,111,97,100, + 101,114,46,103,101,116,95,114,101,115,111,117,114,99,101,95, + 114,101,97,100,101,114,99,2,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,4,0,0,0,67,0,0,0,115, + 32,0,0,0,116,0,116,1,124,0,106,2,131,1,100,1, + 25,0,124,1,131,2,125,2,116,3,160,4,124,2,100,2, + 161,2,83,0,41,3,78,114,73,0,0,0,114,251,0,0, + 0,41,5,114,38,0,0,0,114,47,0,0,0,114,44,0, + 0,0,114,64,0,0,0,114,65,0,0,0,169,3,114,119, + 0,0,0,90,8,114,101,115,111,117,114,99,101,114,44,0, 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,224,0,0,0,237,3,0,0,115,4,0,0,0,0, - 2,8,1,122,27,83,111,117,114,99,101,70,105,108,101,76, - 111,97,100,101,114,46,112,97,116,104,95,115,116,97,116,115, - 99,4,0,0,0,0,0,0,0,0,0,0,0,5,0,0, - 0,5,0,0,0,67,0,0,0,115,24,0,0,0,116,0, - 124,1,131,1,125,4,124,0,106,1,124,2,124,3,124,4, - 100,1,141,3,83,0,41,2,78,169,1,218,5,95,109,111, - 100,101,41,2,114,115,0,0,0,114,225,0,0,0,41,5, - 114,119,0,0,0,114,108,0,0,0,114,107,0,0,0,114, - 26,0,0,0,114,52,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,226,0,0,0,242,3,0, - 0,115,4,0,0,0,0,2,8,1,122,32,83,111,117,114, - 99,101,70,105,108,101,76,111,97,100,101,114,46,95,99,97, - 99,104,101,95,98,121,116,101,99,111,100,101,114,60,0,0, - 0,114,11,1,0,0,99,3,0,0,0,0,0,0,0,1, - 0,0,0,9,0,0,0,11,0,0,0,67,0,0,0,115, - 0,1,0,0,116,0,124,1,131,1,92,2,125,4,125,5, - 103,0,125,6,124,4,114,52,116,1,124,4,131,1,115,52, - 116,0,124,4,131,1,92,2,125,4,125,7,124,6,160,2, - 124,7,161,1,1,0,113,16,116,3,124,6,131,1,68,0, - 93,112,125,7,116,4,124,4,124,7,131,2,125,4,122,14, - 116,5,160,6,124,4,161,1,1,0,87,0,110,82,4,0, - 116,7,107,10,114,112,1,0,1,0,1,0,89,0,113,60, - 89,0,110,60,4,0,116,8,107,10,114,170,1,0,125,8, - 1,0,122,30,116,9,160,10,100,1,124,4,124,8,161,3, - 1,0,87,0,89,0,162,10,1,0,100,2,83,0,87,0, - 53,0,100,2,125,8,126,8,88,0,89,0,110,2,88,0, - 113,60,122,28,116,11,124,1,124,2,124,3,131,3,1,0, - 116,9,160,10,100,3,124,1,161,2,1,0,87,0,110,48, - 4,0,116,8,107,10,114,250,1,0,125,8,1,0,122,18, - 116,9,160,10,100,1,124,1,124,8,161,3,1,0,87,0, - 53,0,100,2,125,8,126,8,88,0,89,0,110,2,88,0, - 100,2,83,0,41,4,122,27,87,114,105,116,101,32,98,121, - 116,101,115,32,100,97,116,97,32,116,111,32,97,32,102,105, - 108,101,46,122,27,99,111,117,108,100,32,110,111,116,32,99, - 114,101,97,116,101,32,123,33,114,125,58,32,123,33,114,125, - 78,122,12,99,114,101,97,116,101,100,32,123,33,114,125,41, - 12,114,47,0,0,0,114,56,0,0,0,114,186,0,0,0, - 114,42,0,0,0,114,38,0,0,0,114,2,0,0,0,90, - 5,109,107,100,105,114,218,15,70,105,108,101,69,120,105,115, - 116,115,69,114,114,111,114,114,50,0,0,0,114,134,0,0, - 0,114,149,0,0,0,114,69,0,0,0,41,9,114,119,0, - 0,0,114,44,0,0,0,114,26,0,0,0,114,12,1,0, - 0,218,6,112,97,114,101,110,116,114,97,0,0,0,114,37, - 0,0,0,114,33,0,0,0,114,228,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,225,0,0, - 0,247,3,0,0,115,48,0,0,0,0,2,12,1,4,2, - 12,1,12,1,12,2,12,1,10,1,2,1,14,1,14,2, - 8,1,16,3,6,1,2,0,2,255,4,2,32,1,2,1, - 12,1,16,1,16,2,8,1,2,255,122,25,83,111,117,114, - 99,101,70,105,108,101,76,111,97,100,101,114,46,115,101,116, - 95,100,97,116,97,78,41,7,114,125,0,0,0,114,124,0, - 0,0,114,126,0,0,0,114,127,0,0,0,114,224,0,0, - 0,114,226,0,0,0,114,225,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 9,1,0,0,233,3,0,0,115,8,0,0,0,8,2,4, - 2,8,5,8,5,114,9,1,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,64, - 0,0,0,115,32,0,0,0,101,0,90,1,100,0,90,2, - 100,1,90,3,100,2,100,3,132,0,90,4,100,4,100,5, - 132,0,90,5,100,6,83,0,41,7,218,20,83,111,117,114, - 99,101,108,101,115,115,70,105,108,101,76,111,97,100,101,114, - 122,45,76,111,97,100,101,114,32,119,104,105,99,104,32,104, - 97,110,100,108,101,115,32,115,111,117,114,99,101,108,101,115, - 115,32,102,105,108,101,32,105,109,112,111,114,116,115,46,99, - 2,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, - 5,0,0,0,67,0,0,0,115,68,0,0,0,124,0,160, - 0,124,1,161,1,125,2,124,0,160,1,124,2,161,1,125, - 3,124,1,124,2,100,1,156,2,125,4,116,2,124,3,124, - 1,124,4,131,3,1,0,116,3,116,4,124,3,131,1,100, - 2,100,0,133,2,25,0,124,1,124,2,100,3,141,3,83, - 0,41,4,78,114,159,0,0,0,114,145,0,0,0,41,2, - 114,117,0,0,0,114,107,0,0,0,41,5,114,179,0,0, - 0,114,227,0,0,0,114,152,0,0,0,114,165,0,0,0, - 114,235,0,0,0,41,5,114,119,0,0,0,114,139,0,0, - 0,114,44,0,0,0,114,26,0,0,0,114,151,0,0,0, + 0,218,13,111,112,101,110,95,114,101,115,111,117,114,99,101, + 213,3,0,0,115,4,0,0,0,0,1,20,1,122,24,70, + 105,108,101,76,111,97,100,101,114,46,111,112,101,110,95,114, + 101,115,111,117,114,99,101,99,2,0,0,0,0,0,0,0, + 0,0,0,0,3,0,0,0,3,0,0,0,67,0,0,0, + 115,38,0,0,0,124,0,160,0,124,1,161,1,115,14,116, + 1,130,1,116,2,116,3,124,0,106,4,131,1,100,1,25, + 0,124,1,131,2,125,2,124,2,83,0,169,2,78,114,73, + 0,0,0,41,5,218,11,105,115,95,114,101,115,111,117,114, + 99,101,218,17,70,105,108,101,78,111,116,70,111,117,110,100, + 69,114,114,111,114,114,38,0,0,0,114,47,0,0,0,114, + 44,0,0,0,114,255,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,13,114,101,115,111,117,114, + 99,101,95,112,97,116,104,217,3,0,0,115,8,0,0,0, + 0,1,10,1,4,1,20,1,122,24,70,105,108,101,76,111, + 97,100,101,114,46,114,101,115,111,117,114,99,101,95,112,97, + 116,104,99,2,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,3,0,0,0,67,0,0,0,115,40,0,0,0, + 116,0,124,1,107,6,114,12,100,1,83,0,116,1,116,2, + 124,0,106,3,131,1,100,2,25,0,124,1,131,2,125,2, + 116,4,124,2,131,1,83,0,41,3,78,70,114,73,0,0, + 0,41,5,114,35,0,0,0,114,38,0,0,0,114,47,0, + 0,0,114,44,0,0,0,114,54,0,0,0,169,3,114,119, + 0,0,0,114,117,0,0,0,114,44,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,2,1,0, + 0,223,3,0,0,115,8,0,0,0,0,1,8,1,4,1, + 20,1,122,22,70,105,108,101,76,111,97,100,101,114,46,105, + 115,95,114,101,115,111,117,114,99,101,99,1,0,0,0,0, + 0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,67, + 0,0,0,115,24,0,0,0,116,0,116,1,160,2,116,3, + 124,0,106,4,131,1,100,1,25,0,161,1,131,1,83,0, + 114,1,1,0,0,41,5,218,4,105,116,101,114,114,2,0, + 0,0,218,7,108,105,115,116,100,105,114,114,47,0,0,0, + 114,44,0,0,0,114,246,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,218,8,99,111,110,116,101, + 110,116,115,229,3,0,0,115,2,0,0,0,0,1,122,19, + 70,105,108,101,76,111,97,100,101,114,46,99,111,110,116,101, + 110,116,115,41,17,114,125,0,0,0,114,124,0,0,0,114, + 126,0,0,0,114,127,0,0,0,114,209,0,0,0,114,243, + 0,0,0,114,247,0,0,0,114,136,0,0,0,114,220,0, + 0,0,114,179,0,0,0,114,227,0,0,0,114,254,0,0, + 0,114,0,1,0,0,114,4,1,0,0,114,2,1,0,0, + 114,8,1,0,0,90,13,95,95,99,108,97,115,115,99,101, + 108,108,95,95,114,3,0,0,0,114,3,0,0,0,114,249, + 0,0,0,114,6,0,0,0,114,239,0,0,0,161,3,0, + 0,115,30,0,0,0,8,2,4,3,8,6,8,4,8,3, + 2,1,14,11,2,1,10,4,8,11,2,1,10,5,8,4, + 8,6,8,6,114,239,0,0,0,99,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,64,0, + 0,0,115,46,0,0,0,101,0,90,1,100,0,90,2,100, + 1,90,3,100,2,100,3,132,0,90,4,100,4,100,5,132, + 0,90,5,100,6,100,7,156,1,100,8,100,9,132,2,90, + 6,100,10,83,0,41,11,218,16,83,111,117,114,99,101,70, + 105,108,101,76,111,97,100,101,114,122,62,67,111,110,99,114, + 101,116,101,32,105,109,112,108,101,109,101,110,116,97,116,105, + 111,110,32,111,102,32,83,111,117,114,99,101,76,111,97,100, + 101,114,32,117,115,105,110,103,32,116,104,101,32,102,105,108, + 101,32,115,121,115,116,101,109,46,99,2,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,3,0,0,0,67,0, + 0,0,115,22,0,0,0,116,0,124,1,131,1,125,2,124, + 2,106,1,124,2,106,2,100,1,156,2,83,0,41,2,122, + 33,82,101,116,117,114,110,32,116,104,101,32,109,101,116,97, + 100,97,116,97,32,102,111,114,32,116,104,101,32,112,97,116, + 104,46,41,2,114,169,0,0,0,114,234,0,0,0,41,3, + 114,49,0,0,0,218,8,115,116,95,109,116,105,109,101,90, + 7,115,116,95,115,105,122,101,41,3,114,119,0,0,0,114, + 44,0,0,0,114,238,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,114,224,0,0,0,237,3,0, + 0,115,4,0,0,0,0,2,8,1,122,27,83,111,117,114, + 99,101,70,105,108,101,76,111,97,100,101,114,46,112,97,116, + 104,95,115,116,97,116,115,99,4,0,0,0,0,0,0,0, + 0,0,0,0,5,0,0,0,5,0,0,0,67,0,0,0, + 115,24,0,0,0,116,0,124,1,131,1,125,4,124,0,106, + 1,124,2,124,3,124,4,100,1,141,3,83,0,41,2,78, + 169,1,218,5,95,109,111,100,101,41,2,114,115,0,0,0, + 114,225,0,0,0,41,5,114,119,0,0,0,114,108,0,0, + 0,114,107,0,0,0,114,26,0,0,0,114,52,0,0,0, 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 213,0,0,0,26,4,0,0,115,22,0,0,0,0,1,10, - 1,10,4,2,1,2,254,6,4,12,1,2,1,14,1,2, - 1,2,253,122,29,83,111,117,114,99,101,108,101,115,115,70, - 105,108,101,76,111,97,100,101,114,46,103,101,116,95,99,111, - 100,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0, - 100,1,83,0,41,2,122,39,82,101,116,117,114,110,32,78, - 111,110,101,32,97,115,32,116,104,101,114,101,32,105,115,32, - 110,111,32,115,111,117,114,99,101,32,99,111,100,101,46,78, - 114,3,0,0,0,114,219,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,229,0,0,0,42,4, - 0,0,115,2,0,0,0,0,2,122,31,83,111,117,114,99, - 101,108,101,115,115,70,105,108,101,76,111,97,100,101,114,46, - 103,101,116,95,115,111,117,114,99,101,78,41,6,114,125,0, - 0,0,114,124,0,0,0,114,126,0,0,0,114,127,0,0, - 0,114,213,0,0,0,114,229,0,0,0,114,3,0,0,0, + 226,0,0,0,242,3,0,0,115,4,0,0,0,0,2,8, + 1,122,32,83,111,117,114,99,101,70,105,108,101,76,111,97, + 100,101,114,46,95,99,97,99,104,101,95,98,121,116,101,99, + 111,100,101,114,60,0,0,0,114,11,1,0,0,99,3,0, + 0,0,0,0,0,0,1,0,0,0,9,0,0,0,11,0, + 0,0,67,0,0,0,115,252,0,0,0,116,0,124,1,131, + 1,92,2,125,4,125,5,103,0,125,6,124,4,114,52,116, + 1,124,4,131,1,115,52,116,0,124,4,131,1,92,2,125, + 4,125,7,124,6,160,2,124,7,161,1,1,0,113,16,116, + 3,124,6,131,1,68,0,93,108,125,7,116,4,124,4,124, + 7,131,2,125,4,122,14,116,5,160,6,124,4,161,1,1, + 0,87,0,113,60,4,0,116,7,107,10,114,112,1,0,1, + 0,1,0,89,0,113,60,89,0,113,60,4,0,116,8,107, + 10,114,166,1,0,125,8,1,0,122,26,116,9,160,10,100, + 1,124,4,124,8,161,3,1,0,87,0,89,0,162,6,1, + 0,100,2,83,0,100,2,125,8,126,8,88,0,89,0,113, + 60,88,0,113,60,122,28,116,11,124,1,124,2,124,3,131, + 3,1,0,116,9,160,10,100,3,124,1,161,2,1,0,87, + 0,110,48,4,0,116,8,107,10,114,246,1,0,125,8,1, + 0,122,18,116,9,160,10,100,1,124,1,124,8,161,3,1, + 0,87,0,53,0,100,2,125,8,126,8,88,0,89,0,110, + 2,88,0,100,2,83,0,41,4,122,27,87,114,105,116,101, + 32,98,121,116,101,115,32,100,97,116,97,32,116,111,32,97, + 32,102,105,108,101,46,122,27,99,111,117,108,100,32,110,111, + 116,32,99,114,101,97,116,101,32,123,33,114,125,58,32,123, + 33,114,125,78,122,12,99,114,101,97,116,101,100,32,123,33, + 114,125,41,12,114,47,0,0,0,114,56,0,0,0,114,186, + 0,0,0,114,42,0,0,0,114,38,0,0,0,114,2,0, + 0,0,90,5,109,107,100,105,114,218,15,70,105,108,101,69, + 120,105,115,116,115,69,114,114,111,114,114,50,0,0,0,114, + 134,0,0,0,114,149,0,0,0,114,69,0,0,0,41,9, + 114,119,0,0,0,114,44,0,0,0,114,26,0,0,0,114, + 12,1,0,0,218,6,112,97,114,101,110,116,114,97,0,0, + 0,114,37,0,0,0,114,33,0,0,0,114,228,0,0,0, 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 15,1,0,0,22,4,0,0,115,6,0,0,0,8,2,4, - 2,8,16,114,15,1,0,0,99,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,64,0,0, - 0,115,92,0,0,0,101,0,90,1,100,0,90,2,100,1, - 90,3,100,2,100,3,132,0,90,4,100,4,100,5,132,0, - 90,5,100,6,100,7,132,0,90,6,100,8,100,9,132,0, - 90,7,100,10,100,11,132,0,90,8,100,12,100,13,132,0, - 90,9,100,14,100,15,132,0,90,10,100,16,100,17,132,0, - 90,11,101,12,100,18,100,19,132,0,131,1,90,13,100,20, - 83,0,41,21,114,252,0,0,0,122,93,76,111,97,100,101, - 114,32,102,111,114,32,101,120,116,101,110,115,105,111,110,32, - 109,111,100,117,108,101,115,46,10,10,32,32,32,32,84,104, - 101,32,99,111,110,115,116,114,117,99,116,111,114,32,105,115, - 32,100,101,115,105,103,110,101,100,32,116,111,32,119,111,114, - 107,32,119,105,116,104,32,70,105,108,101,70,105,110,100,101, - 114,46,10,10,32,32,32,32,99,3,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,2,0,0,0,67,0,0, - 0,115,16,0,0,0,124,1,124,0,95,0,124,2,124,0, - 95,1,100,0,83,0,114,110,0,0,0,114,159,0,0,0, - 114,5,1,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,209,0,0,0,59,4,0,0,115,4,0, - 0,0,0,1,6,1,122,28,69,120,116,101,110,115,105,111, - 110,70,105,108,101,76,111,97,100,101,114,46,95,95,105,110, - 105,116,95,95,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,2,0,0,0,67,0,0,0,115,24,0, - 0,0,124,0,106,0,124,1,106,0,107,2,111,22,124,0, - 106,1,124,1,106,1,107,2,83,0,114,110,0,0,0,114, - 240,0,0,0,114,242,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,243,0,0,0,63,4,0, - 0,115,6,0,0,0,0,1,12,1,10,255,122,26,69,120, - 116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,101, - 114,46,95,95,101,113,95,95,99,1,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, - 0,115,20,0,0,0,116,0,124,0,106,1,131,1,116,0, - 124,0,106,2,131,1,65,0,83,0,114,110,0,0,0,114, - 244,0,0,0,114,246,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,247,0,0,0,67,4,0, - 0,115,2,0,0,0,0,1,122,28,69,120,116,101,110,115, - 105,111,110,70,105,108,101,76,111,97,100,101,114,46,95,95, - 104,97,115,104,95,95,99,2,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,5,0,0,0,67,0,0,0,115, - 36,0,0,0,116,0,160,1,116,2,106,3,124,1,161,2, - 125,2,116,0,160,4,100,1,124,1,106,5,124,0,106,6, - 161,3,1,0,124,2,83,0,41,2,122,38,67,114,101,97, - 116,101,32,97,110,32,117,110,105,116,105,97,108,105,122,101, - 100,32,101,120,116,101,110,115,105,111,110,32,109,111,100,117, - 108,101,122,38,101,120,116,101,110,115,105,111,110,32,109,111, - 100,117,108,101,32,123,33,114,125,32,108,111,97,100,101,100, - 32,102,114,111,109,32,123,33,114,125,41,7,114,134,0,0, - 0,114,214,0,0,0,114,163,0,0,0,90,14,99,114,101, - 97,116,101,95,100,121,110,97,109,105,99,114,149,0,0,0, - 114,117,0,0,0,114,44,0,0,0,41,3,114,119,0,0, - 0,114,187,0,0,0,114,216,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,212,0,0,0,70, - 4,0,0,115,18,0,0,0,0,2,4,1,4,0,2,255, - 4,2,6,1,4,0,4,255,4,2,122,33,69,120,116,101, - 110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46, - 99,114,101,97,116,101,95,109,111,100,117,108,101,99,2,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,5,0, - 0,0,67,0,0,0,115,36,0,0,0,116,0,160,1,116, - 2,106,3,124,1,161,2,1,0,116,0,160,4,100,1,124, - 0,106,5,124,0,106,6,161,3,1,0,100,2,83,0,41, - 3,122,30,73,110,105,116,105,97,108,105,122,101,32,97,110, - 32,101,120,116,101,110,115,105,111,110,32,109,111,100,117,108, - 101,122,40,101,120,116,101,110,115,105,111,110,32,109,111,100, - 117,108,101,32,123,33,114,125,32,101,120,101,99,117,116,101, - 100,32,102,114,111,109,32,123,33,114,125,78,41,7,114,134, - 0,0,0,114,214,0,0,0,114,163,0,0,0,90,12,101, - 120,101,99,95,100,121,110,97,109,105,99,114,149,0,0,0, - 114,117,0,0,0,114,44,0,0,0,114,253,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,217, - 0,0,0,78,4,0,0,115,10,0,0,0,0,2,14,1, - 6,1,4,0,4,255,122,31,69,120,116,101,110,115,105,111, - 110,70,105,108,101,76,111,97,100,101,114,46,101,120,101,99, - 95,109,111,100,117,108,101,99,2,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,4,0,0,0,3,0,0,0, - 115,36,0,0,0,116,0,124,0,106,1,131,1,100,1,25, - 0,137,0,116,2,135,0,102,1,100,2,100,3,132,8,116, - 3,68,0,131,1,131,1,83,0,41,4,122,49,82,101,116, - 117,114,110,32,84,114,117,101,32,105,102,32,116,104,101,32, - 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101, - 32,105,115,32,97,32,112,97,99,107,97,103,101,46,114,39, - 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,4,0,0,0,51,0,0,0,115,26,0,0, - 0,124,0,93,18,125,1,136,0,100,0,124,1,23,0,107, - 2,86,0,1,0,113,2,100,1,83,0,41,2,114,209,0, - 0,0,78,114,3,0,0,0,169,2,114,32,0,0,0,218, - 6,115,117,102,102,105,120,169,1,90,9,102,105,108,101,95, - 110,97,109,101,114,3,0,0,0,114,6,0,0,0,218,9, - 60,103,101,110,101,120,112,114,62,87,4,0,0,115,4,0, - 0,0,4,1,2,255,122,49,69,120,116,101,110,115,105,111, - 110,70,105,108,101,76,111,97,100,101,114,46,105,115,95,112, - 97,99,107,97,103,101,46,60,108,111,99,97,108,115,62,46, - 60,103,101,110,101,120,112,114,62,41,4,114,47,0,0,0, - 114,44,0,0,0,218,3,97,110,121,218,18,69,88,84,69, - 78,83,73,79,78,95,83,85,70,70,73,88,69,83,114,219, - 0,0,0,114,3,0,0,0,114,18,1,0,0,114,6,0, - 0,0,114,182,0,0,0,84,4,0,0,115,8,0,0,0, - 0,2,14,1,12,1,2,255,122,30,69,120,116,101,110,115, - 105,111,110,70,105,108,101,76,111,97,100,101,114,46,105,115, - 95,112,97,99,107,97,103,101,99,2,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, - 0,115,4,0,0,0,100,1,83,0,41,2,122,63,82,101, - 116,117,114,110,32,78,111,110,101,32,97,115,32,97,110,32, - 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101, - 32,99,97,110,110,111,116,32,99,114,101,97,116,101,32,97, - 32,99,111,100,101,32,111,98,106,101,99,116,46,78,114,3, - 0,0,0,114,219,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,213,0,0,0,90,4,0,0, - 115,2,0,0,0,0,2,122,28,69,120,116,101,110,115,105, - 111,110,70,105,108,101,76,111,97,100,101,114,46,103,101,116, + 225,0,0,0,247,3,0,0,115,48,0,0,0,0,2,12, + 1,4,2,12,1,12,1,12,2,12,1,10,1,2,1,14, + 1,14,2,8,1,16,3,6,1,2,0,2,255,4,2,28, + 1,2,1,12,1,16,1,16,2,8,1,2,255,122,25,83, + 111,117,114,99,101,70,105,108,101,76,111,97,100,101,114,46, + 115,101,116,95,100,97,116,97,78,41,7,114,125,0,0,0, + 114,124,0,0,0,114,126,0,0,0,114,127,0,0,0,114, + 224,0,0,0,114,226,0,0,0,114,225,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,114,9,1,0,0,233,3,0,0,115,8,0,0,0, + 8,2,4,2,8,5,8,5,114,9,1,0,0,99,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,64,0,0,0,115,32,0,0,0,101,0,90,1,100, + 0,90,2,100,1,90,3,100,2,100,3,132,0,90,4,100, + 4,100,5,132,0,90,5,100,6,83,0,41,7,218,20,83, + 111,117,114,99,101,108,101,115,115,70,105,108,101,76,111,97, + 100,101,114,122,45,76,111,97,100,101,114,32,119,104,105,99, + 104,32,104,97,110,100,108,101,115,32,115,111,117,114,99,101, + 108,101,115,115,32,102,105,108,101,32,105,109,112,111,114,116, + 115,46,99,2,0,0,0,0,0,0,0,0,0,0,0,5, + 0,0,0,5,0,0,0,67,0,0,0,115,68,0,0,0, + 124,0,160,0,124,1,161,1,125,2,124,0,160,1,124,2, + 161,1,125,3,124,1,124,2,100,1,156,2,125,4,116,2, + 124,3,124,1,124,4,131,3,1,0,116,3,116,4,124,3, + 131,1,100,2,100,0,133,2,25,0,124,1,124,2,100,3, + 141,3,83,0,41,4,78,114,159,0,0,0,114,145,0,0, + 0,41,2,114,117,0,0,0,114,107,0,0,0,41,5,114, + 179,0,0,0,114,227,0,0,0,114,152,0,0,0,114,165, + 0,0,0,114,235,0,0,0,41,5,114,119,0,0,0,114, + 139,0,0,0,114,44,0,0,0,114,26,0,0,0,114,151, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,114,213,0,0,0,26,4,0,0,115,22,0,0,0, + 0,1,10,1,10,4,2,1,2,254,6,4,12,1,2,1, + 14,1,2,1,2,253,122,29,83,111,117,114,99,101,108,101, + 115,115,70,105,108,101,76,111,97,100,101,114,46,103,101,116, 95,99,111,100,101,99,2,0,0,0,0,0,0,0,0,0, 0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,4, - 0,0,0,100,1,83,0,41,2,122,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, + 0,0,0,100,1,83,0,41,2,122,39,82,101,116,117,114, + 110,32,78,111,110,101,32,97,115,32,116,104,101,114,101,32, + 105,115,32,110,111,32,115,111,117,114,99,101,32,99,111,100, + 101,46,78,114,3,0,0,0,114,219,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,229,0,0, + 0,42,4,0,0,115,2,0,0,0,0,2,122,31,83,111, + 117,114,99,101,108,101,115,115,70,105,108,101,76,111,97,100, + 101,114,46,103,101,116,95,115,111,117,114,99,101,78,41,6, + 114,125,0,0,0,114,124,0,0,0,114,126,0,0,0,114, + 127,0,0,0,114,213,0,0,0,114,229,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,114,15,1,0,0,22,4,0,0,115,6,0,0,0, + 8,2,4,2,8,16,114,15,1,0,0,99,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 64,0,0,0,115,92,0,0,0,101,0,90,1,100,0,90, + 2,100,1,90,3,100,2,100,3,132,0,90,4,100,4,100, + 5,132,0,90,5,100,6,100,7,132,0,90,6,100,8,100, + 9,132,0,90,7,100,10,100,11,132,0,90,8,100,12,100, + 13,132,0,90,9,100,14,100,15,132,0,90,10,100,16,100, + 17,132,0,90,11,101,12,100,18,100,19,132,0,131,1,90, + 13,100,20,83,0,41,21,114,252,0,0,0,122,93,76,111, + 97,100,101,114,32,102,111,114,32,101,120,116,101,110,115,105, + 111,110,32,109,111,100,117,108,101,115,46,10,10,32,32,32, + 32,84,104,101,32,99,111,110,115,116,114,117,99,116,111,114, + 32,105,115,32,100,101,115,105,103,110,101,100,32,116,111,32, + 119,111,114,107,32,119,105,116,104,32,70,105,108,101,70,105, + 110,100,101,114,46,10,10,32,32,32,32,99,3,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,2,0,0,0, + 67,0,0,0,115,16,0,0,0,124,1,124,0,95,0,124, + 2,124,0,95,1,100,0,83,0,114,110,0,0,0,114,159, + 0,0,0,114,5,1,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,209,0,0,0,59,4,0,0, + 115,4,0,0,0,0,1,6,1,122,28,69,120,116,101,110, + 115,105,111,110,70,105,108,101,76,111,97,100,101,114,46,95, + 95,105,110,105,116,95,95,99,2,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,2,0,0,0,67,0,0,0, + 115,24,0,0,0,124,0,106,0,124,1,106,0,107,2,111, + 22,124,0,106,1,124,1,106,1,107,2,83,0,114,110,0, + 0,0,114,240,0,0,0,114,242,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,114,243,0,0,0, + 63,4,0,0,115,6,0,0,0,0,1,12,1,10,255,122, + 26,69,120,116,101,110,115,105,111,110,70,105,108,101,76,111, + 97,100,101,114,46,95,95,101,113,95,95,99,1,0,0,0, + 0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0, + 67,0,0,0,115,20,0,0,0,116,0,124,0,106,1,131, + 1,116,0,124,0,106,2,131,1,65,0,83,0,114,110,0, + 0,0,114,244,0,0,0,114,246,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,114,247,0,0,0, + 67,4,0,0,115,2,0,0,0,0,1,122,28,69,120,116, + 101,110,115,105,111,110,70,105,108,101,76,111,97,100,101,114, + 46,95,95,104,97,115,104,95,95,99,2,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,5,0,0,0,67,0, + 0,0,115,36,0,0,0,116,0,160,1,116,2,106,3,124, + 1,161,2,125,2,116,0,160,4,100,1,124,1,106,5,124, + 0,106,6,161,3,1,0,124,2,83,0,41,2,122,38,67, + 114,101,97,116,101,32,97,110,32,117,110,105,116,105,97,108, + 105,122,101,100,32,101,120,116,101,110,115,105,111,110,32,109, + 111,100,117,108,101,122,38,101,120,116,101,110,115,105,111,110, + 32,109,111,100,117,108,101,32,123,33,114,125,32,108,111,97, + 100,101,100,32,102,114,111,109,32,123,33,114,125,41,7,114, + 134,0,0,0,114,214,0,0,0,114,163,0,0,0,90,14, + 99,114,101,97,116,101,95,100,121,110,97,109,105,99,114,149, + 0,0,0,114,117,0,0,0,114,44,0,0,0,41,3,114, + 119,0,0,0,114,187,0,0,0,114,216,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,114,212,0, + 0,0,70,4,0,0,115,18,0,0,0,0,2,4,1,4, + 0,2,255,4,2,6,1,4,0,4,255,4,2,122,33,69, + 120,116,101,110,115,105,111,110,70,105,108,101,76,111,97,100, + 101,114,46,99,114,101,97,116,101,95,109,111,100,117,108,101, + 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,5,0,0,0,67,0,0,0,115,36,0,0,0,116,0, + 160,1,116,2,106,3,124,1,161,2,1,0,116,0,160,4, + 100,1,124,0,106,5,124,0,106,6,161,3,1,0,100,2, + 83,0,41,3,122,30,73,110,105,116,105,97,108,105,122,101, + 32,97,110,32,101,120,116,101,110,115,105,111,110,32,109,111, + 100,117,108,101,122,40,101,120,116,101,110,115,105,111,110,32, + 109,111,100,117,108,101,32,123,33,114,125,32,101,120,101,99, + 117,116,101,100,32,102,114,111,109,32,123,33,114,125,78,41, + 7,114,134,0,0,0,114,214,0,0,0,114,163,0,0,0, + 90,12,101,120,101,99,95,100,121,110,97,109,105,99,114,149, + 0,0,0,114,117,0,0,0,114,44,0,0,0,114,253,0, + 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,114,217,0,0,0,78,4,0,0,115,10,0,0,0,0, + 2,14,1,6,1,4,0,4,255,122,31,69,120,116,101,110, + 115,105,111,110,70,105,108,101,76,111,97,100,101,114,46,101, + 120,101,99,95,109,111,100,117,108,101,99,2,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,3, + 0,0,0,115,36,0,0,0,116,0,124,0,106,1,131,1, + 100,1,25,0,137,0,116,2,135,0,102,1,100,2,100,3, + 132,8,116,3,68,0,131,1,131,1,83,0,41,4,122,49, + 82,101,116,117,114,110,32,84,114,117,101,32,105,102,32,116, + 104,101,32,101,120,116,101,110,115,105,111,110,32,109,111,100, + 117,108,101,32,105,115,32,97,32,112,97,99,107,97,103,101, + 46,114,39,0,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,4,0,0,0,51,0,0,0,115, + 26,0,0,0,124,0,93,18,125,1,136,0,100,0,124,1, + 23,0,107,2,86,0,1,0,113,2,100,1,83,0,41,2, + 114,209,0,0,0,78,114,3,0,0,0,169,2,114,32,0, + 0,0,218,6,115,117,102,102,105,120,169,1,90,9,102,105, + 108,101,95,110,97,109,101,114,3,0,0,0,114,6,0,0, + 0,218,9,60,103,101,110,101,120,112,114,62,87,4,0,0, + 115,4,0,0,0,4,1,2,255,122,49,69,120,116,101,110, + 115,105,111,110,70,105,108,101,76,111,97,100,101,114,46,105, + 115,95,112,97,99,107,97,103,101,46,60,108,111,99,97,108, + 115,62,46,60,103,101,110,101,120,112,114,62,41,4,114,47, + 0,0,0,114,44,0,0,0,218,3,97,110,121,218,18,69, + 88,84,69,78,83,73,79,78,95,83,85,70,70,73,88,69, + 83,114,219,0,0,0,114,3,0,0,0,114,18,1,0,0, + 114,6,0,0,0,114,182,0,0,0,84,4,0,0,115,8, + 0,0,0,0,2,14,1,12,1,2,255,122,30,69,120,116, + 101,110,115,105,111,110,70,105,108,101,76,111,97,100,101,114, + 46,105,115,95,112,97,99,107,97,103,101,99,2,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0, + 67,0,0,0,115,4,0,0,0,100,1,83,0,41,2,122, + 63,82,101,116,117,114,110,32,78,111,110,101,32,97,115,32, + 97,110,32,101,120,116,101,110,115,105,111,110,32,109,111,100, + 117,108,101,32,99,97,110,110,111,116,32,99,114,101,97,116, + 101,32,97,32,99,111,100,101,32,111,98,106,101,99,116,46, 78,114,3,0,0,0,114,219,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,229,0,0,0,94, - 4,0,0,115,2,0,0,0,0,2,122,30,69,120,116,101, + 114,3,0,0,0,114,6,0,0,0,114,213,0,0,0,90, + 4,0,0,115,2,0,0,0,0,2,122,28,69,120,116,101, 110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46, - 103,101,116,95,115,111,117,114,99,101,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, - 0,0,0,115,6,0,0,0,124,0,106,0,83,0,114,250, - 0,0,0,114,48,0,0,0,114,219,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,179,0,0, - 0,98,4,0,0,115,2,0,0,0,0,3,122,32,69,120, - 116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,101, - 114,46,103,101,116,95,102,105,108,101,110,97,109,101,78,41, - 14,114,125,0,0,0,114,124,0,0,0,114,126,0,0,0, - 114,127,0,0,0,114,209,0,0,0,114,243,0,0,0,114, - 247,0,0,0,114,212,0,0,0,114,217,0,0,0,114,182, - 0,0,0,114,213,0,0,0,114,229,0,0,0,114,136,0, - 0,0,114,179,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,252,0,0,0, - 51,4,0,0,115,22,0,0,0,8,2,4,6,8,4,8, - 4,8,3,8,8,8,6,8,6,8,4,8,4,2,1,114, - 252,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,64,0,0,0,115,104,0, - 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2, - 100,3,132,0,90,4,100,4,100,5,132,0,90,5,100,6, - 100,7,132,0,90,6,100,8,100,9,132,0,90,7,100,10, - 100,11,132,0,90,8,100,12,100,13,132,0,90,9,100,14, - 100,15,132,0,90,10,100,16,100,17,132,0,90,11,100,18, - 100,19,132,0,90,12,100,20,100,21,132,0,90,13,100,22, - 100,23,132,0,90,14,100,24,83,0,41,25,218,14,95,78, - 97,109,101,115,112,97,99,101,80,97,116,104,97,38,1,0, - 0,82,101,112,114,101,115,101,110,116,115,32,97,32,110,97, - 109,101,115,112,97,99,101,32,112,97,99,107,97,103,101,39, - 115,32,112,97,116,104,46,32,32,73,116,32,117,115,101,115, - 32,116,104,101,32,109,111,100,117,108,101,32,110,97,109,101, - 10,32,32,32,32,116,111,32,102,105,110,100,32,105,116,115, - 32,112,97,114,101,110,116,32,109,111,100,117,108,101,44,32, - 97,110,100,32,102,114,111,109,32,116,104,101,114,101,32,105, - 116,32,108,111,111,107,115,32,117,112,32,116,104,101,32,112, - 97,114,101,110,116,39,115,10,32,32,32,32,95,95,112,97, - 116,104,95,95,46,32,32,87,104,101,110,32,116,104,105,115, - 32,99,104,97,110,103,101,115,44,32,116,104,101,32,109,111, - 100,117,108,101,39,115,32,111,119,110,32,112,97,116,104,32, - 105,115,32,114,101,99,111,109,112,117,116,101,100,44,10,32, - 32,32,32,117,115,105,110,103,32,112,97,116,104,95,102,105, - 110,100,101,114,46,32,32,70,111,114,32,116,111,112,45,108, - 101,118,101,108,32,109,111,100,117,108,101,115,44,32,116,104, - 101,32,112,97,114,101,110,116,32,109,111,100,117,108,101,39, - 115,32,112,97,116,104,10,32,32,32,32,105,115,32,115,121, - 115,46,112,97,116,104,46,99,4,0,0,0,0,0,0,0, - 0,0,0,0,4,0,0,0,3,0,0,0,67,0,0,0, - 115,36,0,0,0,124,1,124,0,95,0,124,2,124,0,95, - 1,116,2,124,0,160,3,161,0,131,1,124,0,95,4,124, - 3,124,0,95,5,100,0,83,0,114,110,0,0,0,41,6, - 218,5,95,110,97,109,101,218,5,95,112,97,116,104,114,112, - 0,0,0,218,16,95,103,101,116,95,112,97,114,101,110,116, - 95,112,97,116,104,218,17,95,108,97,115,116,95,112,97,114, - 101,110,116,95,112,97,116,104,218,12,95,112,97,116,104,95, - 102,105,110,100,101,114,169,4,114,119,0,0,0,114,117,0, - 0,0,114,44,0,0,0,90,11,112,97,116,104,95,102,105, - 110,100,101,114,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,114,209,0,0,0,111,4,0,0,115,8,0,0, - 0,0,1,6,1,6,1,14,1,122,23,95,78,97,109,101, - 115,112,97,99,101,80,97,116,104,46,95,95,105,110,105,116, - 95,95,99,1,0,0,0,0,0,0,0,0,0,0,0,4, - 0,0,0,3,0,0,0,67,0,0,0,115,38,0,0,0, - 124,0,106,0,160,1,100,1,161,1,92,3,125,1,125,2, - 125,3,124,2,100,2,107,2,114,30,100,3,83,0,124,1, - 100,4,102,2,83,0,41,5,122,62,82,101,116,117,114,110, - 115,32,97,32,116,117,112,108,101,32,111,102,32,40,112,97, - 114,101,110,116,45,109,111,100,117,108,101,45,110,97,109,101, - 44,32,112,97,114,101,110,116,45,112,97,116,104,45,97,116, - 116,114,45,110,97,109,101,41,114,71,0,0,0,114,40,0, - 0,0,41,2,114,8,0,0,0,114,44,0,0,0,90,8, - 95,95,112,97,116,104,95,95,41,2,114,23,1,0,0,114, - 41,0,0,0,41,4,114,119,0,0,0,114,14,1,0,0, - 218,3,100,111,116,90,2,109,101,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,23,95,102,105,110,100,95, - 112,97,114,101,110,116,95,112,97,116,104,95,110,97,109,101, - 115,117,4,0,0,115,8,0,0,0,0,2,18,1,8,2, - 4,3,122,38,95,78,97,109,101,115,112,97,99,101,80,97, - 116,104,46,95,102,105,110,100,95,112,97,114,101,110,116,95, - 112,97,116,104,95,110,97,109,101,115,99,1,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,67, - 0,0,0,115,28,0,0,0,124,0,160,0,161,0,92,2, - 125,1,125,2,116,1,116,2,106,3,124,1,25,0,124,2, - 131,2,83,0,114,110,0,0,0,41,4,114,30,1,0,0, - 114,130,0,0,0,114,8,0,0,0,218,7,109,111,100,117, - 108,101,115,41,3,114,119,0,0,0,90,18,112,97,114,101, - 110,116,95,109,111,100,117,108,101,95,110,97,109,101,90,14, - 112,97,116,104,95,97,116,116,114,95,110,97,109,101,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,25,1, - 0,0,127,4,0,0,115,4,0,0,0,0,1,12,1,122, - 31,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46, - 95,103,101,116,95,112,97,114,101,110,116,95,112,97,116,104, - 99,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,4,0,0,0,67,0,0,0,115,80,0,0,0,116,0, - 124,0,160,1,161,0,131,1,125,1,124,1,124,0,106,2, - 107,3,114,74,124,0,160,3,124,0,106,4,124,1,161,2, - 125,2,124,2,100,0,107,9,114,68,124,2,106,5,100,0, - 107,8,114,68,124,2,106,6,114,68,124,2,106,6,124,0, - 95,7,124,1,124,0,95,2,124,0,106,7,83,0,114,110, - 0,0,0,41,8,114,112,0,0,0,114,25,1,0,0,114, - 26,1,0,0,114,27,1,0,0,114,23,1,0,0,114,140, - 0,0,0,114,178,0,0,0,114,24,1,0,0,41,3,114, - 119,0,0,0,90,11,112,97,114,101,110,116,95,112,97,116, - 104,114,187,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,12,95,114,101,99,97,108,99,117,108, - 97,116,101,131,4,0,0,115,16,0,0,0,0,2,12,1, - 10,1,14,3,18,1,6,1,8,1,6,1,122,27,95,78, - 97,109,101,115,112,97,99,101,80,97,116,104,46,95,114,101, - 99,97,108,99,117,108,97,116,101,99,1,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,0, - 0,0,115,12,0,0,0,116,0,124,0,160,1,161,0,131, - 1,83,0,114,110,0,0,0,41,2,114,6,1,0,0,114, - 32,1,0,0,114,246,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,8,95,95,105,116,101,114, - 95,95,144,4,0,0,115,2,0,0,0,0,1,122,23,95, - 78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,95, - 105,116,101,114,95,95,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,2,0,0,0,67,0,0,0,115, - 12,0,0,0,124,0,160,0,161,0,124,1,25,0,83,0, - 114,110,0,0,0,169,1,114,32,1,0,0,41,2,114,119, - 0,0,0,218,5,105,110,100,101,120,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,11,95,95,103,101,116, - 105,116,101,109,95,95,147,4,0,0,115,2,0,0,0,0, - 1,122,26,95,78,97,109,101,115,112,97,99,101,80,97,116, - 104,46,95,95,103,101,116,105,116,101,109,95,95,99,3,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0, - 0,0,67,0,0,0,115,14,0,0,0,124,2,124,0,106, - 0,124,1,60,0,100,0,83,0,114,110,0,0,0,41,1, - 114,24,1,0,0,41,3,114,119,0,0,0,114,35,1,0, - 0,114,44,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,11,95,95,115,101,116,105,116,101,109, - 95,95,150,4,0,0,115,2,0,0,0,0,1,122,26,95, - 78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,95, - 115,101,116,105,116,101,109,95,95,99,1,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,0, - 0,0,115,12,0,0,0,116,0,124,0,160,1,161,0,131, - 1,83,0,114,110,0,0,0,41,2,114,22,0,0,0,114, - 32,1,0,0,114,246,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,7,95,95,108,101,110,95, - 95,153,4,0,0,115,2,0,0,0,0,1,122,22,95,78, - 97,109,101,115,112,97,99,101,80,97,116,104,46,95,95,108, - 101,110,95,95,99,1,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,3,0,0,0,67,0,0,0,115,12,0, - 0,0,100,1,160,0,124,0,106,1,161,1,83,0,41,2, - 78,122,20,95,78,97,109,101,115,112,97,99,101,80,97,116, - 104,40,123,33,114,125,41,41,2,114,62,0,0,0,114,24, - 1,0,0,114,246,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,218,8,95,95,114,101,112,114,95, - 95,156,4,0,0,115,2,0,0,0,0,1,122,23,95,78, - 97,109,101,115,112,97,99,101,80,97,116,104,46,95,95,114, - 101,112,114,95,95,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,12, - 0,0,0,124,1,124,0,160,0,161,0,107,6,83,0,114, - 110,0,0,0,114,34,1,0,0,169,2,114,119,0,0,0, - 218,4,105,116,101,109,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,12,95,95,99,111,110,116,97,105,110, - 115,95,95,159,4,0,0,115,2,0,0,0,0,1,122,27, - 95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,95, - 95,99,111,110,116,97,105,110,115,95,95,99,2,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, - 67,0,0,0,115,16,0,0,0,124,0,106,0,160,1,124, - 1,161,1,1,0,100,0,83,0,114,110,0,0,0,41,2, - 114,24,1,0,0,114,186,0,0,0,114,40,1,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,186, - 0,0,0,162,4,0,0,115,2,0,0,0,0,1,122,21, - 95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,97, - 112,112,101,110,100,78,41,15,114,125,0,0,0,114,124,0, - 0,0,114,126,0,0,0,114,127,0,0,0,114,209,0,0, - 0,114,30,1,0,0,114,25,1,0,0,114,32,1,0,0, - 114,33,1,0,0,114,36,1,0,0,114,37,1,0,0,114, - 38,1,0,0,114,39,1,0,0,114,42,1,0,0,114,186, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,22,1,0,0,104,4,0,0, - 115,24,0,0,0,8,1,4,6,8,6,8,10,8,4,8, - 13,8,3,8,3,8,3,8,3,8,3,8,3,114,22,1, - 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,64,0,0,0,115,80,0,0,0, - 101,0,90,1,100,0,90,2,100,1,100,2,132,0,90,3, - 101,4,100,3,100,4,132,0,131,1,90,5,100,5,100,6, - 132,0,90,6,100,7,100,8,132,0,90,7,100,9,100,10, - 132,0,90,8,100,11,100,12,132,0,90,9,100,13,100,14, - 132,0,90,10,100,15,100,16,132,0,90,11,100,17,83,0, - 41,18,218,16,95,78,97,109,101,115,112,97,99,101,76,111, - 97,100,101,114,99,4,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,4,0,0,0,67,0,0,0,115,18,0, - 0,0,116,0,124,1,124,2,124,3,131,3,124,0,95,1, - 100,0,83,0,114,110,0,0,0,41,2,114,22,1,0,0, - 114,24,1,0,0,114,28,1,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,209,0,0,0,168,4, - 0,0,115,2,0,0,0,0,1,122,25,95,78,97,109,101, - 115,112,97,99,101,76,111,97,100,101,114,46,95,95,105,110, - 105,116,95,95,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,3,0,0,0,67,0,0,0,115,12,0, - 0,0,100,1,160,0,124,1,106,1,161,1,83,0,41,2, - 122,115,82,101,116,117,114,110,32,114,101,112,114,32,102,111, - 114,32,116,104,101,32,109,111,100,117,108,101,46,10,10,32, - 32,32,32,32,32,32,32,84,104,101,32,109,101,116,104,111, - 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46, - 32,32,84,104,101,32,105,109,112,111,114,116,32,109,97,99, - 104,105,110,101,114,121,32,100,111,101,115,32,116,104,101,32, - 106,111,98,32,105,116,115,101,108,102,46,10,10,32,32,32, - 32,32,32,32,32,122,25,60,109,111,100,117,108,101,32,123, - 33,114,125,32,40,110,97,109,101,115,112,97,99,101,41,62, - 41,2,114,62,0,0,0,114,125,0,0,0,41,2,114,193, - 0,0,0,114,216,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,218,11,109,111,100,117,108,101,95, - 114,101,112,114,171,4,0,0,115,2,0,0,0,0,7,122, - 28,95,78,97,109,101,115,112,97,99,101,76,111,97,100,101, - 114,46,109,111,100,117,108,101,95,114,101,112,114,99,2,0, + 103,101,116,95,99,111,100,101,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, + 0,115,4,0,0,0,100,1,83,0,41,2,122,53,82,101, + 116,117,114,110,32,78,111,110,101,32,97,115,32,101,120,116, + 101,110,115,105,111,110,32,109,111,100,117,108,101,115,32,104, + 97,118,101,32,110,111,32,115,111,117,114,99,101,32,99,111, + 100,101,46,78,114,3,0,0,0,114,219,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,114,229,0, + 0,0,94,4,0,0,115,2,0,0,0,0,2,122,30,69, + 120,116,101,110,115,105,111,110,70,105,108,101,76,111,97,100, + 101,114,46,103,101,116,95,115,111,117,114,99,101,99,2,0, 0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0, - 0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,41, - 2,78,84,114,3,0,0,0,114,219,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,182,0,0, - 0,180,4,0,0,115,2,0,0,0,0,1,122,27,95,78, - 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,105, - 115,95,112,97,99,107,97,103,101,99,2,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,1,0,0,0,67,0, - 0,0,115,4,0,0,0,100,1,83,0,41,2,78,114,40, - 0,0,0,114,3,0,0,0,114,219,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,229,0,0, - 0,183,4,0,0,115,2,0,0,0,0,1,122,27,95,78, - 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,103, - 101,116,95,115,111,117,114,99,101,99,2,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,6,0,0,0,67,0, - 0,0,115,16,0,0,0,116,0,100,1,100,2,100,3,100, - 4,100,5,141,4,83,0,41,6,78,114,40,0,0,0,122, - 8,60,115,116,114,105,110,103,62,114,215,0,0,0,84,41, - 1,114,231,0,0,0,41,1,114,232,0,0,0,114,219,0, + 0,0,67,0,0,0,115,6,0,0,0,124,0,106,0,83, + 0,114,250,0,0,0,114,48,0,0,0,114,219,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, + 179,0,0,0,98,4,0,0,115,2,0,0,0,0,3,122, + 32,69,120,116,101,110,115,105,111,110,70,105,108,101,76,111, + 97,100,101,114,46,103,101,116,95,102,105,108,101,110,97,109, + 101,78,41,14,114,125,0,0,0,114,124,0,0,0,114,126, + 0,0,0,114,127,0,0,0,114,209,0,0,0,114,243,0, + 0,0,114,247,0,0,0,114,212,0,0,0,114,217,0,0, + 0,114,182,0,0,0,114,213,0,0,0,114,229,0,0,0, + 114,136,0,0,0,114,179,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,252, + 0,0,0,51,4,0,0,115,22,0,0,0,8,2,4,6, + 8,4,8,4,8,3,8,8,8,6,8,6,8,4,8,4, + 2,1,114,252,0,0,0,99,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,64,0,0,0, + 115,104,0,0,0,101,0,90,1,100,0,90,2,100,1,90, + 3,100,2,100,3,132,0,90,4,100,4,100,5,132,0,90, + 5,100,6,100,7,132,0,90,6,100,8,100,9,132,0,90, + 7,100,10,100,11,132,0,90,8,100,12,100,13,132,0,90, + 9,100,14,100,15,132,0,90,10,100,16,100,17,132,0,90, + 11,100,18,100,19,132,0,90,12,100,20,100,21,132,0,90, + 13,100,22,100,23,132,0,90,14,100,24,83,0,41,25,218, + 14,95,78,97,109,101,115,112,97,99,101,80,97,116,104,97, + 38,1,0,0,82,101,112,114,101,115,101,110,116,115,32,97, + 32,110,97,109,101,115,112,97,99,101,32,112,97,99,107,97, + 103,101,39,115,32,112,97,116,104,46,32,32,73,116,32,117, + 115,101,115,32,116,104,101,32,109,111,100,117,108,101,32,110, + 97,109,101,10,32,32,32,32,116,111,32,102,105,110,100,32, + 105,116,115,32,112,97,114,101,110,116,32,109,111,100,117,108, + 101,44,32,97,110,100,32,102,114,111,109,32,116,104,101,114, + 101,32,105,116,32,108,111,111,107,115,32,117,112,32,116,104, + 101,32,112,97,114,101,110,116,39,115,10,32,32,32,32,95, + 95,112,97,116,104,95,95,46,32,32,87,104,101,110,32,116, + 104,105,115,32,99,104,97,110,103,101,115,44,32,116,104,101, + 32,109,111,100,117,108,101,39,115,32,111,119,110,32,112,97, + 116,104,32,105,115,32,114,101,99,111,109,112,117,116,101,100, + 44,10,32,32,32,32,117,115,105,110,103,32,112,97,116,104, + 95,102,105,110,100,101,114,46,32,32,70,111,114,32,116,111, + 112,45,108,101,118,101,108,32,109,111,100,117,108,101,115,44, + 32,116,104,101,32,112,97,114,101,110,116,32,109,111,100,117, + 108,101,39,115,32,112,97,116,104,10,32,32,32,32,105,115, + 32,115,121,115,46,112,97,116,104,46,99,4,0,0,0,0, + 0,0,0,0,0,0,0,4,0,0,0,3,0,0,0,67, + 0,0,0,115,36,0,0,0,124,1,124,0,95,0,124,2, + 124,0,95,1,116,2,124,0,160,3,161,0,131,1,124,0, + 95,4,124,3,124,0,95,5,100,0,83,0,114,110,0,0, + 0,41,6,218,5,95,110,97,109,101,218,5,95,112,97,116, + 104,114,112,0,0,0,218,16,95,103,101,116,95,112,97,114, + 101,110,116,95,112,97,116,104,218,17,95,108,97,115,116,95, + 112,97,114,101,110,116,95,112,97,116,104,218,12,95,112,97, + 116,104,95,102,105,110,100,101,114,169,4,114,119,0,0,0, + 114,117,0,0,0,114,44,0,0,0,90,11,112,97,116,104, + 95,102,105,110,100,101,114,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,114,209,0,0,0,111,4,0,0,115, + 8,0,0,0,0,1,6,1,6,1,14,1,122,23,95,78, + 97,109,101,115,112,97,99,101,80,97,116,104,46,95,95,105, + 110,105,116,95,95,99,1,0,0,0,0,0,0,0,0,0, + 0,0,4,0,0,0,3,0,0,0,67,0,0,0,115,38, + 0,0,0,124,0,106,0,160,1,100,1,161,1,92,3,125, + 1,125,2,125,3,124,2,100,2,107,2,114,30,100,3,83, + 0,124,1,100,4,102,2,83,0,41,5,122,62,82,101,116, + 117,114,110,115,32,97,32,116,117,112,108,101,32,111,102,32, + 40,112,97,114,101,110,116,45,109,111,100,117,108,101,45,110, + 97,109,101,44,32,112,97,114,101,110,116,45,112,97,116,104, + 45,97,116,116,114,45,110,97,109,101,41,114,71,0,0,0, + 114,40,0,0,0,41,2,114,8,0,0,0,114,44,0,0, + 0,90,8,95,95,112,97,116,104,95,95,41,2,114,23,1, + 0,0,114,41,0,0,0,41,4,114,119,0,0,0,114,14, + 1,0,0,218,3,100,111,116,90,2,109,101,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,218,23,95,102,105, + 110,100,95,112,97,114,101,110,116,95,112,97,116,104,95,110, + 97,109,101,115,117,4,0,0,115,8,0,0,0,0,2,18, + 1,8,2,4,3,122,38,95,78,97,109,101,115,112,97,99, + 101,80,97,116,104,46,95,102,105,110,100,95,112,97,114,101, + 110,116,95,112,97,116,104,95,110,97,109,101,115,99,1,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0, + 0,0,67,0,0,0,115,28,0,0,0,124,0,160,0,161, + 0,92,2,125,1,125,2,116,1,116,2,106,3,124,1,25, + 0,124,2,131,2,83,0,114,110,0,0,0,41,4,114,30, + 1,0,0,114,130,0,0,0,114,8,0,0,0,218,7,109, + 111,100,117,108,101,115,41,3,114,119,0,0,0,90,18,112, + 97,114,101,110,116,95,109,111,100,117,108,101,95,110,97,109, + 101,90,14,112,97,116,104,95,97,116,116,114,95,110,97,109, + 101,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 114,25,1,0,0,127,4,0,0,115,4,0,0,0,0,1, + 12,1,122,31,95,78,97,109,101,115,112,97,99,101,80,97, + 116,104,46,95,103,101,116,95,112,97,114,101,110,116,95,112, + 97,116,104,99,1,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,4,0,0,0,67,0,0,0,115,80,0,0, + 0,116,0,124,0,160,1,161,0,131,1,125,1,124,1,124, + 0,106,2,107,3,114,74,124,0,160,3,124,0,106,4,124, + 1,161,2,125,2,124,2,100,0,107,9,114,68,124,2,106, + 5,100,0,107,8,114,68,124,2,106,6,114,68,124,2,106, + 6,124,0,95,7,124,1,124,0,95,2,124,0,106,7,83, + 0,114,110,0,0,0,41,8,114,112,0,0,0,114,25,1, + 0,0,114,26,1,0,0,114,27,1,0,0,114,23,1,0, + 0,114,140,0,0,0,114,178,0,0,0,114,24,1,0,0, + 41,3,114,119,0,0,0,90,11,112,97,114,101,110,116,95, + 112,97,116,104,114,187,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,12,95,114,101,99,97,108, + 99,117,108,97,116,101,131,4,0,0,115,16,0,0,0,0, + 2,12,1,10,1,14,3,18,1,6,1,8,1,6,1,122, + 27,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46, + 95,114,101,99,97,108,99,117,108,97,116,101,99,1,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0, + 0,67,0,0,0,115,12,0,0,0,116,0,124,0,160,1, + 161,0,131,1,83,0,114,110,0,0,0,41,2,114,6,1, + 0,0,114,32,1,0,0,114,246,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,218,8,95,95,105, + 116,101,114,95,95,144,4,0,0,115,2,0,0,0,0,1, + 122,23,95,78,97,109,101,115,112,97,99,101,80,97,116,104, + 46,95,95,105,116,101,114,95,95,99,2,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,2,0,0,0,67,0, + 0,0,115,12,0,0,0,124,0,160,0,161,0,124,1,25, + 0,83,0,114,110,0,0,0,169,1,114,32,1,0,0,41, + 2,114,119,0,0,0,218,5,105,110,100,101,120,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,218,11,95,95, + 103,101,116,105,116,101,109,95,95,147,4,0,0,115,2,0, + 0,0,0,1,122,26,95,78,97,109,101,115,112,97,99,101, + 80,97,116,104,46,95,95,103,101,116,105,116,101,109,95,95, + 99,3,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,3,0,0,0,67,0,0,0,115,14,0,0,0,124,2, + 124,0,106,0,124,1,60,0,100,0,83,0,114,110,0,0, + 0,41,1,114,24,1,0,0,41,3,114,119,0,0,0,114, + 35,1,0,0,114,44,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,11,95,95,115,101,116,105, + 116,101,109,95,95,150,4,0,0,115,2,0,0,0,0,1, + 122,26,95,78,97,109,101,115,112,97,99,101,80,97,116,104, + 46,95,95,115,101,116,105,116,101,109,95,95,99,1,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0, + 0,67,0,0,0,115,12,0,0,0,116,0,124,0,160,1, + 161,0,131,1,83,0,114,110,0,0,0,41,2,114,22,0, + 0,0,114,32,1,0,0,114,246,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,218,7,95,95,108, + 101,110,95,95,153,4,0,0,115,2,0,0,0,0,1,122, + 22,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46, + 95,95,108,101,110,95,95,99,1,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,0, + 115,12,0,0,0,100,1,160,0,124,0,106,1,161,1,83, + 0,41,2,78,122,20,95,78,97,109,101,115,112,97,99,101, + 80,97,116,104,40,123,33,114,125,41,41,2,114,62,0,0, + 0,114,24,1,0,0,114,246,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,218,8,95,95,114,101, + 112,114,95,95,156,4,0,0,115,2,0,0,0,0,1,122, + 23,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46, + 95,95,114,101,112,114,95,95,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,3,0,0,0,67,0,0, + 0,115,12,0,0,0,124,1,124,0,160,0,161,0,107,6, + 83,0,114,110,0,0,0,114,34,1,0,0,169,2,114,119, + 0,0,0,218,4,105,116,101,109,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,12,95,95,99,111,110,116, + 97,105,110,115,95,95,159,4,0,0,115,2,0,0,0,0, + 1,122,27,95,78,97,109,101,115,112,97,99,101,80,97,116, + 104,46,95,95,99,111,110,116,97,105,110,115,95,95,99,2, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3, + 0,0,0,67,0,0,0,115,16,0,0,0,124,0,106,0, + 160,1,124,1,161,1,1,0,100,0,83,0,114,110,0,0, + 0,41,2,114,24,1,0,0,114,186,0,0,0,114,40,1, 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,213,0,0,0,186,4,0,0,115,2,0,0,0,0, - 1,122,25,95,78,97,109,101,115,112,97,99,101,76,111,97, - 100,101,114,46,103,101,116,95,99,111,100,101,99,2,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0, - 0,67,0,0,0,115,4,0,0,0,100,1,83,0,114,210, - 0,0,0,114,3,0,0,0,114,211,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,212,0,0, - 0,189,4,0,0,115,2,0,0,0,0,1,122,30,95,78, - 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,99, - 114,101,97,116,101,95,109,111,100,117,108,101,99,2,0,0, + 0,114,186,0,0,0,162,4,0,0,115,2,0,0,0,0, + 1,122,21,95,78,97,109,101,115,112,97,99,101,80,97,116, + 104,46,97,112,112,101,110,100,78,41,15,114,125,0,0,0, + 114,124,0,0,0,114,126,0,0,0,114,127,0,0,0,114, + 209,0,0,0,114,30,1,0,0,114,25,1,0,0,114,32, + 1,0,0,114,33,1,0,0,114,36,1,0,0,114,37,1, + 0,0,114,38,1,0,0,114,39,1,0,0,114,42,1,0, + 0,114,186,0,0,0,114,3,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,22,1,0,0,104, + 4,0,0,115,24,0,0,0,8,1,4,6,8,6,8,10, + 8,4,8,13,8,3,8,3,8,3,8,3,8,3,8,3, + 114,22,1,0,0,99,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,64,0,0,0,115,80, + 0,0,0,101,0,90,1,100,0,90,2,100,1,100,2,132, + 0,90,3,101,4,100,3,100,4,132,0,131,1,90,5,100, + 5,100,6,132,0,90,6,100,7,100,8,132,0,90,7,100, + 9,100,10,132,0,90,8,100,11,100,12,132,0,90,9,100, + 13,100,14,132,0,90,10,100,15,100,16,132,0,90,11,100, + 17,83,0,41,18,218,16,95,78,97,109,101,115,112,97,99, + 101,76,111,97,100,101,114,99,4,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,4,0,0,0,67,0,0,0, + 115,18,0,0,0,116,0,124,1,124,2,124,3,131,3,124, + 0,95,1,100,0,83,0,114,110,0,0,0,41,2,114,22, + 1,0,0,114,24,1,0,0,114,28,1,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,209,0,0, + 0,168,4,0,0,115,2,0,0,0,0,1,122,25,95,78, + 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,95, + 95,105,110,105,116,95,95,99,2,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,3,0,0,0,67,0,0,0, + 115,12,0,0,0,100,1,160,0,124,1,106,1,161,1,83, + 0,41,2,122,115,82,101,116,117,114,110,32,114,101,112,114, + 32,102,111,114,32,116,104,101,32,109,111,100,117,108,101,46, + 10,10,32,32,32,32,32,32,32,32,84,104,101,32,109,101, + 116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116, + 101,100,46,32,32,84,104,101,32,105,109,112,111,114,116,32, + 109,97,99,104,105,110,101,114,121,32,100,111,101,115,32,116, + 104,101,32,106,111,98,32,105,116,115,101,108,102,46,10,10, + 32,32,32,32,32,32,32,32,122,25,60,109,111,100,117,108, + 101,32,123,33,114,125,32,40,110,97,109,101,115,112,97,99, + 101,41,62,41,2,114,62,0,0,0,114,125,0,0,0,41, + 2,114,193,0,0,0,114,216,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,218,11,109,111,100,117, + 108,101,95,114,101,112,114,171,4,0,0,115,2,0,0,0, + 0,7,122,28,95,78,97,109,101,115,112,97,99,101,76,111, + 97,100,101,114,46,109,111,100,117,108,101,95,114,101,112,114, + 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,1, + 83,0,41,2,78,84,114,3,0,0,0,114,219,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, + 182,0,0,0,180,4,0,0,115,2,0,0,0,0,1,122, + 27,95,78,97,109,101,115,112,97,99,101,76,111,97,100,101, + 114,46,105,115,95,112,97,99,107,97,103,101,99,2,0,0, 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0, - 0,67,0,0,0,115,4,0,0,0,100,0,83,0,114,110, - 0,0,0,114,3,0,0,0,114,253,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,217,0,0, - 0,192,4,0,0,115,2,0,0,0,0,1,122,28,95,78, - 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,101, - 120,101,99,95,109,111,100,117,108,101,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,67, - 0,0,0,115,26,0,0,0,116,0,160,1,100,1,124,0, - 106,2,161,2,1,0,116,0,160,3,124,0,124,1,161,2, - 83,0,41,2,122,98,76,111,97,100,32,97,32,110,97,109, - 101,115,112,97,99,101,32,109,111,100,117,108,101,46,10,10, - 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, - 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, - 100,46,32,32,85,115,101,32,101,120,101,99,95,109,111,100, - 117,108,101,40,41,32,105,110,115,116,101,97,100,46,10,10, - 32,32,32,32,32,32,32,32,122,38,110,97,109,101,115,112, - 97,99,101,32,109,111,100,117,108,101,32,108,111,97,100,101, - 100,32,119,105,116,104,32,112,97,116,104,32,123,33,114,125, - 41,4,114,134,0,0,0,114,149,0,0,0,114,24,1,0, - 0,114,218,0,0,0,114,219,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,220,0,0,0,195, - 4,0,0,115,8,0,0,0,0,7,6,1,4,255,4,2, - 122,28,95,78,97,109,101,115,112,97,99,101,76,111,97,100, - 101,114,46,108,111,97,100,95,109,111,100,117,108,101,78,41, - 12,114,125,0,0,0,114,124,0,0,0,114,126,0,0,0, - 114,209,0,0,0,114,207,0,0,0,114,44,1,0,0,114, - 182,0,0,0,114,229,0,0,0,114,213,0,0,0,114,212, - 0,0,0,114,217,0,0,0,114,220,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,43,1,0,0,167,4,0,0,115,18,0,0,0,8, - 1,8,3,2,1,10,8,8,3,8,3,8,3,8,3,8, - 3,114,43,1,0,0,99,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,4,0,0,0,64,0,0,0,115, - 172,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, - 101,4,100,2,100,3,132,0,131,1,90,5,101,4,100,4, - 100,5,132,0,131,1,90,6,101,4,100,6,100,7,132,0, - 131,1,90,7,101,4,100,8,100,9,132,0,131,1,90,8, - 101,4,100,28,100,11,100,12,132,1,131,1,90,9,101,4, - 100,29,100,13,100,14,132,1,131,1,90,10,101,4,100,30, - 100,15,100,16,132,1,131,1,90,11,100,17,90,12,101,4, - 100,31,100,18,100,19,132,1,131,1,90,13,101,4,100,20, - 100,21,132,0,131,1,90,14,101,15,100,22,100,23,132,0, - 131,1,90,16,101,4,100,24,100,25,132,0,131,1,90,17, - 101,4,100,26,100,27,132,0,131,1,90,18,100,10,83,0, - 41,32,218,10,80,97,116,104,70,105,110,100,101,114,122,62, - 77,101,116,97,32,112,97,116,104,32,102,105,110,100,101,114, - 32,102,111,114,32,115,121,115,46,112,97,116,104,32,97,110, - 100,32,112,97,99,107,97,103,101,32,95,95,112,97,116,104, - 95,95,32,97,116,116,114,105,98,117,116,101,115,46,99,1, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,4, - 0,0,0,67,0,0,0,115,64,0,0,0,116,0,116,1, - 106,2,160,3,161,0,131,1,68,0,93,44,92,2,125,1, - 125,2,124,2,100,1,107,8,114,40,116,1,106,2,124,1, - 61,0,113,14,116,4,124,2,100,2,131,2,114,14,124,2, - 160,5,161,0,1,0,113,14,100,1,83,0,41,3,122,125, - 67,97,108,108,32,116,104,101,32,105,110,118,97,108,105,100, - 97,116,101,95,99,97,99,104,101,115,40,41,32,109,101,116, - 104,111,100,32,111,110,32,97,108,108,32,112,97,116,104,32, - 101,110,116,114,121,32,102,105,110,100,101,114,115,10,32,32, - 32,32,32,32,32,32,115,116,111,114,101,100,32,105,110,32, - 115,121,115,46,112,97,116,104,95,105,109,112,111,114,116,101, - 114,95,99,97,99,104,101,115,32,40,119,104,101,114,101,32, - 105,109,112,108,101,109,101,110,116,101,100,41,46,78,218,17, - 105,110,118,97,108,105,100,97,116,101,95,99,97,99,104,101, - 115,41,6,218,4,108,105,115,116,114,8,0,0,0,218,19, - 112,97,116,104,95,105,109,112,111,114,116,101,114,95,99,97, - 99,104,101,218,5,105,116,101,109,115,114,128,0,0,0,114, - 46,1,0,0,41,3,114,193,0,0,0,114,117,0,0,0, - 218,6,102,105,110,100,101,114,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,46,1,0,0,213,4,0,0, - 115,10,0,0,0,0,4,22,1,8,1,10,1,10,1,122, - 28,80,97,116,104,70,105,110,100,101,114,46,105,110,118,97, - 108,105,100,97,116,101,95,99,97,99,104,101,115,99,2,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,9,0, - 0,0,67,0,0,0,115,84,0,0,0,116,0,106,1,100, - 1,107,9,114,28,116,0,106,1,115,28,116,2,160,3,100, - 2,116,4,161,2,1,0,116,0,106,1,68,0,93,44,125, - 2,122,14,124,2,124,1,131,1,87,0,2,0,1,0,83, - 0,4,0,116,5,107,10,114,76,1,0,1,0,1,0,89, - 0,113,34,89,0,113,34,88,0,113,34,100,1,83,0,41, - 3,122,46,83,101,97,114,99,104,32,115,121,115,46,112,97, - 116,104,95,104,111,111,107,115,32,102,111,114,32,97,32,102, - 105,110,100,101,114,32,102,111,114,32,39,112,97,116,104,39, - 46,78,122,23,115,121,115,46,112,97,116,104,95,104,111,111, - 107,115,32,105,115,32,101,109,112,116,121,41,6,114,8,0, - 0,0,218,10,112,97,116,104,95,104,111,111,107,115,114,75, - 0,0,0,114,76,0,0,0,114,138,0,0,0,114,118,0, - 0,0,41,3,114,193,0,0,0,114,44,0,0,0,90,4, - 104,111,111,107,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,218,11,95,112,97,116,104,95,104,111,111,107,115, - 223,4,0,0,115,16,0,0,0,0,3,16,1,12,1,10, - 1,2,1,14,1,14,1,12,2,122,22,80,97,116,104,70, - 105,110,100,101,114,46,95,112,97,116,104,95,104,111,111,107, - 115,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,8,0,0,0,67,0,0,0,115,104,0,0,0,124, - 1,100,1,107,2,114,44,122,12,116,0,160,1,161,0,125, - 1,87,0,110,22,4,0,116,2,107,10,114,42,1,0,1, - 0,1,0,89,0,100,2,83,0,88,0,122,14,116,3,106, - 4,124,1,25,0,125,2,87,0,110,40,4,0,116,5,107, - 10,114,98,1,0,1,0,1,0,124,0,160,6,124,1,161, - 1,125,2,124,2,116,3,106,4,124,1,60,0,89,0,110, - 2,88,0,124,2,83,0,41,3,122,210,71,101,116,32,116, - 104,101,32,102,105,110,100,101,114,32,102,111,114,32,116,104, - 101,32,112,97,116,104,32,101,110,116,114,121,32,102,114,111, - 109,32,115,121,115,46,112,97,116,104,95,105,109,112,111,114, - 116,101,114,95,99,97,99,104,101,46,10,10,32,32,32,32, - 32,32,32,32,73,102,32,116,104,101,32,112,97,116,104,32, - 101,110,116,114,121,32,105,115,32,110,111,116,32,105,110,32, - 116,104,101,32,99,97,99,104,101,44,32,102,105,110,100,32, - 116,104,101,32,97,112,112,114,111,112,114,105,97,116,101,32, - 102,105,110,100,101,114,10,32,32,32,32,32,32,32,32,97, - 110,100,32,99,97,99,104,101,32,105,116,46,32,73,102,32, - 110,111,32,102,105,110,100,101,114,32,105,115,32,97,118,97, - 105,108,97,98,108,101,44,32,115,116,111,114,101,32,78,111, - 110,101,46,10,10,32,32,32,32,32,32,32,32,114,40,0, - 0,0,78,41,7,114,2,0,0,0,114,55,0,0,0,114, - 3,1,0,0,114,8,0,0,0,114,48,1,0,0,218,8, - 75,101,121,69,114,114,111,114,114,52,1,0,0,41,3,114, - 193,0,0,0,114,44,0,0,0,114,50,1,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,218,20,95, - 112,97,116,104,95,105,109,112,111,114,116,101,114,95,99,97, - 99,104,101,236,4,0,0,115,22,0,0,0,0,8,8,1, - 2,1,12,1,14,3,8,1,2,1,14,1,14,1,10,1, - 16,1,122,31,80,97,116,104,70,105,110,100,101,114,46,95, - 112,97,116,104,95,105,109,112,111,114,116,101,114,95,99,97, - 99,104,101,99,3,0,0,0,0,0,0,0,0,0,0,0, - 6,0,0,0,4,0,0,0,67,0,0,0,115,82,0,0, - 0,116,0,124,2,100,1,131,2,114,26,124,2,160,1,124, - 1,161,1,92,2,125,3,125,4,110,14,124,2,160,2,124, - 1,161,1,125,3,103,0,125,4,124,3,100,0,107,9,114, - 60,116,3,160,4,124,1,124,3,161,2,83,0,116,3,160, - 5,124,1,100,0,161,2,125,5,124,4,124,5,95,6,124, - 5,83,0,41,2,78,114,137,0,0,0,41,7,114,128,0, - 0,0,114,137,0,0,0,114,206,0,0,0,114,134,0,0, - 0,114,201,0,0,0,114,183,0,0,0,114,178,0,0,0, - 41,6,114,193,0,0,0,114,139,0,0,0,114,50,1,0, - 0,114,140,0,0,0,114,141,0,0,0,114,187,0,0,0, + 0,67,0,0,0,115,4,0,0,0,100,1,83,0,41,2, + 78,114,40,0,0,0,114,3,0,0,0,114,219,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, + 229,0,0,0,183,4,0,0,115,2,0,0,0,0,1,122, + 27,95,78,97,109,101,115,112,97,99,101,76,111,97,100,101, + 114,46,103,101,116,95,115,111,117,114,99,101,99,2,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,6,0,0, + 0,67,0,0,0,115,16,0,0,0,116,0,100,1,100,2, + 100,3,100,4,100,5,141,4,83,0,41,6,78,114,40,0, + 0,0,122,8,60,115,116,114,105,110,103,62,114,215,0,0, + 0,84,41,1,114,231,0,0,0,41,1,114,232,0,0,0, + 114,219,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,213,0,0,0,186,4,0,0,115,2,0, + 0,0,0,1,122,25,95,78,97,109,101,115,112,97,99,101, + 76,111,97,100,101,114,46,103,101,116,95,99,111,100,101,99, + 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 1,0,0,0,67,0,0,0,115,4,0,0,0,100,1,83, + 0,114,210,0,0,0,114,3,0,0,0,114,211,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, + 212,0,0,0,189,4,0,0,115,2,0,0,0,0,1,122, + 30,95,78,97,109,101,115,112,97,99,101,76,111,97,100,101, + 114,46,99,114,101,97,116,101,95,109,111,100,117,108,101,99, + 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 1,0,0,0,67,0,0,0,115,4,0,0,0,100,0,83, + 0,114,110,0,0,0,114,3,0,0,0,114,253,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, + 217,0,0,0,192,4,0,0,115,2,0,0,0,0,1,122, + 28,95,78,97,109,101,115,112,97,99,101,76,111,97,100,101, + 114,46,101,120,101,99,95,109,111,100,117,108,101,99,2,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,4,0, + 0,0,67,0,0,0,115,26,0,0,0,116,0,160,1,100, + 1,124,0,106,2,161,2,1,0,116,0,160,3,124,0,124, + 1,161,2,83,0,41,2,122,98,76,111,97,100,32,97,32, + 110,97,109,101,115,112,97,99,101,32,109,111,100,117,108,101, + 46,10,10,32,32,32,32,32,32,32,32,84,104,105,115,32, + 109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,99, + 97,116,101,100,46,32,32,85,115,101,32,101,120,101,99,95, + 109,111,100,117,108,101,40,41,32,105,110,115,116,101,97,100, + 46,10,10,32,32,32,32,32,32,32,32,122,38,110,97,109, + 101,115,112,97,99,101,32,109,111,100,117,108,101,32,108,111, + 97,100,101,100,32,119,105,116,104,32,112,97,116,104,32,123, + 33,114,125,41,4,114,134,0,0,0,114,149,0,0,0,114, + 24,1,0,0,114,218,0,0,0,114,219,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,114,220,0, + 0,0,195,4,0,0,115,8,0,0,0,0,7,6,1,4, + 255,4,2,122,28,95,78,97,109,101,115,112,97,99,101,76, + 111,97,100,101,114,46,108,111,97,100,95,109,111,100,117,108, + 101,78,41,12,114,125,0,0,0,114,124,0,0,0,114,126, + 0,0,0,114,209,0,0,0,114,207,0,0,0,114,44,1, + 0,0,114,182,0,0,0,114,229,0,0,0,114,213,0,0, + 0,114,212,0,0,0,114,217,0,0,0,114,220,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,43,1,0,0,167,4,0,0,115,18,0, + 0,0,8,1,8,3,2,1,10,8,8,3,8,3,8,3, + 8,3,8,3,114,43,1,0,0,99,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,4,0,0,0,64,0, + 0,0,115,172,0,0,0,101,0,90,1,100,0,90,2,100, + 1,90,3,101,4,100,2,100,3,132,0,131,1,90,5,101, + 4,100,4,100,5,132,0,131,1,90,6,101,4,100,6,100, + 7,132,0,131,1,90,7,101,4,100,8,100,9,132,0,131, + 1,90,8,101,4,100,28,100,11,100,12,132,1,131,1,90, + 9,101,4,100,29,100,13,100,14,132,1,131,1,90,10,101, + 4,100,30,100,15,100,16,132,1,131,1,90,11,100,17,90, + 12,101,4,100,31,100,18,100,19,132,1,131,1,90,13,101, + 4,100,20,100,21,132,0,131,1,90,14,101,15,100,22,100, + 23,132,0,131,1,90,16,101,4,100,24,100,25,132,0,131, + 1,90,17,101,4,100,26,100,27,132,0,131,1,90,18,100, + 10,83,0,41,32,218,10,80,97,116,104,70,105,110,100,101, + 114,122,62,77,101,116,97,32,112,97,116,104,32,102,105,110, + 100,101,114,32,102,111,114,32,115,121,115,46,112,97,116,104, + 32,97,110,100,32,112,97,99,107,97,103,101,32,95,95,112, + 97,116,104,95,95,32,97,116,116,114,105,98,117,116,101,115, + 46,99,1,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,4,0,0,0,67,0,0,0,115,64,0,0,0,116, + 0,116,1,106,2,160,3,161,0,131,1,68,0,93,44,92, + 2,125,1,125,2,124,2,100,1,107,8,114,40,116,1,106, + 2,124,1,61,0,113,14,116,4,124,2,100,2,131,2,114, + 14,124,2,160,5,161,0,1,0,113,14,100,1,83,0,41, + 3,122,125,67,97,108,108,32,116,104,101,32,105,110,118,97, + 108,105,100,97,116,101,95,99,97,99,104,101,115,40,41,32, + 109,101,116,104,111,100,32,111,110,32,97,108,108,32,112,97, + 116,104,32,101,110,116,114,121,32,102,105,110,100,101,114,115, + 10,32,32,32,32,32,32,32,32,115,116,111,114,101,100,32, + 105,110,32,115,121,115,46,112,97,116,104,95,105,109,112,111, + 114,116,101,114,95,99,97,99,104,101,115,32,40,119,104,101, + 114,101,32,105,109,112,108,101,109,101,110,116,101,100,41,46, + 78,218,17,105,110,118,97,108,105,100,97,116,101,95,99,97, + 99,104,101,115,41,6,218,4,108,105,115,116,114,8,0,0, + 0,218,19,112,97,116,104,95,105,109,112,111,114,116,101,114, + 95,99,97,99,104,101,218,5,105,116,101,109,115,114,128,0, + 0,0,114,46,1,0,0,41,3,114,193,0,0,0,114,117, + 0,0,0,218,6,102,105,110,100,101,114,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,46,1,0,0,213, + 4,0,0,115,10,0,0,0,0,4,22,1,8,1,10,1, + 10,1,122,28,80,97,116,104,70,105,110,100,101,114,46,105, + 110,118,97,108,105,100,97,116,101,95,99,97,99,104,101,115, + 99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,9,0,0,0,67,0,0,0,115,84,0,0,0,116,0, + 106,1,100,1,107,9,114,28,116,0,106,1,115,28,116,2, + 160,3,100,2,116,4,161,2,1,0,116,0,106,1,68,0, + 93,44,125,2,122,14,124,2,124,1,131,1,87,0,2,0, + 1,0,83,0,4,0,116,5,107,10,114,76,1,0,1,0, + 1,0,89,0,113,34,89,0,113,34,88,0,113,34,100,1, + 83,0,41,3,122,46,83,101,97,114,99,104,32,115,121,115, + 46,112,97,116,104,95,104,111,111,107,115,32,102,111,114,32, + 97,32,102,105,110,100,101,114,32,102,111,114,32,39,112,97, + 116,104,39,46,78,122,23,115,121,115,46,112,97,116,104,95, + 104,111,111,107,115,32,105,115,32,101,109,112,116,121,41,6, + 114,8,0,0,0,218,10,112,97,116,104,95,104,111,111,107, + 115,114,75,0,0,0,114,76,0,0,0,114,138,0,0,0, + 114,118,0,0,0,41,3,114,193,0,0,0,114,44,0,0, + 0,90,4,104,111,111,107,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,218,11,95,112,97,116,104,95,104,111, + 111,107,115,223,4,0,0,115,16,0,0,0,0,3,16,1, + 12,1,10,1,2,1,14,1,14,1,12,2,122,22,80,97, + 116,104,70,105,110,100,101,114,46,95,112,97,116,104,95,104, + 111,111,107,115,99,2,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,8,0,0,0,67,0,0,0,115,104,0, + 0,0,124,1,100,1,107,2,114,44,122,12,116,0,160,1, + 161,0,125,1,87,0,110,22,4,0,116,2,107,10,114,42, + 1,0,1,0,1,0,89,0,100,2,83,0,88,0,122,14, + 116,3,106,4,124,1,25,0,125,2,87,0,110,40,4,0, + 116,5,107,10,114,98,1,0,1,0,1,0,124,0,160,6, + 124,1,161,1,125,2,124,2,116,3,106,4,124,1,60,0, + 89,0,110,2,88,0,124,2,83,0,41,3,122,210,71,101, + 116,32,116,104,101,32,102,105,110,100,101,114,32,102,111,114, + 32,116,104,101,32,112,97,116,104,32,101,110,116,114,121,32, + 102,114,111,109,32,115,121,115,46,112,97,116,104,95,105,109, + 112,111,114,116,101,114,95,99,97,99,104,101,46,10,10,32, + 32,32,32,32,32,32,32,73,102,32,116,104,101,32,112,97, + 116,104,32,101,110,116,114,121,32,105,115,32,110,111,116,32, + 105,110,32,116,104,101,32,99,97,99,104,101,44,32,102,105, + 110,100,32,116,104,101,32,97,112,112,114,111,112,114,105,97, + 116,101,32,102,105,110,100,101,114,10,32,32,32,32,32,32, + 32,32,97,110,100,32,99,97,99,104,101,32,105,116,46,32, + 73,102,32,110,111,32,102,105,110,100,101,114,32,105,115,32, + 97,118,97,105,108,97,98,108,101,44,32,115,116,111,114,101, + 32,78,111,110,101,46,10,10,32,32,32,32,32,32,32,32, + 114,40,0,0,0,78,41,7,114,2,0,0,0,114,55,0, + 0,0,114,3,1,0,0,114,8,0,0,0,114,48,1,0, + 0,218,8,75,101,121,69,114,114,111,114,114,52,1,0,0, + 41,3,114,193,0,0,0,114,44,0,0,0,114,50,1,0, + 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 218,20,95,112,97,116,104,95,105,109,112,111,114,116,101,114, + 95,99,97,99,104,101,236,4,0,0,115,22,0,0,0,0, + 8,8,1,2,1,12,1,14,3,8,1,2,1,14,1,14, + 1,10,1,16,1,122,31,80,97,116,104,70,105,110,100,101, + 114,46,95,112,97,116,104,95,105,109,112,111,114,116,101,114, + 95,99,97,99,104,101,99,3,0,0,0,0,0,0,0,0, + 0,0,0,6,0,0,0,4,0,0,0,67,0,0,0,115, + 82,0,0,0,116,0,124,2,100,1,131,2,114,26,124,2, + 160,1,124,1,161,1,92,2,125,3,125,4,110,14,124,2, + 160,2,124,1,161,1,125,3,103,0,125,4,124,3,100,0, + 107,9,114,60,116,3,160,4,124,1,124,3,161,2,83,0, + 116,3,160,5,124,1,100,0,161,2,125,5,124,4,124,5, + 95,6,124,5,83,0,41,2,78,114,137,0,0,0,41,7, + 114,128,0,0,0,114,137,0,0,0,114,206,0,0,0,114, + 134,0,0,0,114,201,0,0,0,114,183,0,0,0,114,178, + 0,0,0,41,6,114,193,0,0,0,114,139,0,0,0,114, + 50,1,0,0,114,140,0,0,0,114,141,0,0,0,114,187, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,218,16,95,108,101,103,97,99,121,95,103,101,116,95, + 115,112,101,99,2,5,0,0,115,18,0,0,0,0,4,10, + 1,16,2,10,1,4,1,8,1,12,1,12,1,6,1,122, + 27,80,97,116,104,70,105,110,100,101,114,46,95,108,101,103, + 97,99,121,95,103,101,116,95,115,112,101,99,78,99,4,0, + 0,0,0,0,0,0,0,0,0,0,9,0,0,0,5,0, + 0,0,67,0,0,0,115,166,0,0,0,103,0,125,4,124, + 2,68,0,93,134,125,5,116,0,124,5,116,1,116,2,102, + 2,131,2,115,28,113,8,124,0,160,3,124,5,161,1,125, + 6,124,6,100,1,107,9,114,8,116,4,124,6,100,2,131, + 2,114,70,124,6,160,5,124,1,124,3,161,2,125,7,110, + 12,124,0,160,6,124,1,124,6,161,2,125,7,124,7,100, + 1,107,8,114,92,113,8,124,7,106,7,100,1,107,9,114, + 110,124,7,2,0,1,0,83,0,124,7,106,8,125,8,124, + 8,100,1,107,8,114,132,116,9,100,3,131,1,130,1,124, + 4,160,10,124,8,161,1,1,0,113,8,116,11,160,12,124, + 1,100,1,161,2,125,7,124,4,124,7,95,8,124,7,83, + 0,41,4,122,63,70,105,110,100,32,116,104,101,32,108,111, + 97,100,101,114,32,111,114,32,110,97,109,101,115,112,97,99, + 101,95,112,97,116,104,32,102,111,114,32,116,104,105,115,32, + 109,111,100,117,108,101,47,112,97,99,107,97,103,101,32,110, + 97,109,101,46,78,114,203,0,0,0,122,19,115,112,101,99, + 32,109,105,115,115,105,110,103,32,108,111,97,100,101,114,41, + 13,114,161,0,0,0,114,85,0,0,0,218,5,98,121,116, + 101,115,114,54,1,0,0,114,128,0,0,0,114,203,0,0, + 0,114,55,1,0,0,114,140,0,0,0,114,178,0,0,0, + 114,118,0,0,0,114,167,0,0,0,114,134,0,0,0,114, + 183,0,0,0,41,9,114,193,0,0,0,114,139,0,0,0, + 114,44,0,0,0,114,202,0,0,0,218,14,110,97,109,101, + 115,112,97,99,101,95,112,97,116,104,90,5,101,110,116,114, + 121,114,50,1,0,0,114,187,0,0,0,114,141,0,0,0, 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, - 16,95,108,101,103,97,99,121,95,103,101,116,95,115,112,101, - 99,2,5,0,0,115,18,0,0,0,0,4,10,1,16,2, - 10,1,4,1,8,1,12,1,12,1,6,1,122,27,80,97, - 116,104,70,105,110,100,101,114,46,95,108,101,103,97,99,121, - 95,103,101,116,95,115,112,101,99,78,99,4,0,0,0,0, - 0,0,0,0,0,0,0,9,0,0,0,5,0,0,0,67, - 0,0,0,115,166,0,0,0,103,0,125,4,124,2,68,0, - 93,134,125,5,116,0,124,5,116,1,116,2,102,2,131,2, - 115,28,113,8,124,0,160,3,124,5,161,1,125,6,124,6, - 100,1,107,9,114,8,116,4,124,6,100,2,131,2,114,70, - 124,6,160,5,124,1,124,3,161,2,125,7,110,12,124,0, - 160,6,124,1,124,6,161,2,125,7,124,7,100,1,107,8, - 114,92,113,8,124,7,106,7,100,1,107,9,114,110,124,7, - 2,0,1,0,83,0,124,7,106,8,125,8,124,8,100,1, - 107,8,114,132,116,9,100,3,131,1,130,1,124,4,160,10, - 124,8,161,1,1,0,113,8,116,11,160,12,124,1,100,1, - 161,2,125,7,124,4,124,7,95,8,124,7,83,0,41,4, - 122,63,70,105,110,100,32,116,104,101,32,108,111,97,100,101, - 114,32,111,114,32,110,97,109,101,115,112,97,99,101,95,112, - 97,116,104,32,102,111,114,32,116,104,105,115,32,109,111,100, - 117,108,101,47,112,97,99,107,97,103,101,32,110,97,109,101, - 46,78,114,203,0,0,0,122,19,115,112,101,99,32,109,105, - 115,115,105,110,103,32,108,111,97,100,101,114,41,13,114,161, - 0,0,0,114,85,0,0,0,218,5,98,121,116,101,115,114, - 54,1,0,0,114,128,0,0,0,114,203,0,0,0,114,55, - 1,0,0,114,140,0,0,0,114,178,0,0,0,114,118,0, - 0,0,114,167,0,0,0,114,134,0,0,0,114,183,0,0, - 0,41,9,114,193,0,0,0,114,139,0,0,0,114,44,0, - 0,0,114,202,0,0,0,218,14,110,97,109,101,115,112,97, - 99,101,95,112,97,116,104,90,5,101,110,116,114,121,114,50, - 1,0,0,114,187,0,0,0,114,141,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,9,95,103, - 101,116,95,115,112,101,99,17,5,0,0,115,40,0,0,0, - 0,5,4,1,8,1,14,1,2,1,10,1,8,1,10,1, - 14,2,12,1,8,1,2,1,10,1,8,1,6,1,8,1, - 8,5,12,2,12,1,6,1,122,20,80,97,116,104,70,105, - 110,100,101,114,46,95,103,101,116,95,115,112,101,99,99,4, - 0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,5, - 0,0,0,67,0,0,0,115,100,0,0,0,124,2,100,1, - 107,8,114,14,116,0,106,1,125,2,124,0,160,2,124,1, - 124,2,124,3,161,3,125,4,124,4,100,1,107,8,114,40, - 100,1,83,0,124,4,106,3,100,1,107,8,114,92,124,4, - 106,4,125,5,124,5,114,86,100,1,124,4,95,5,116,6, - 124,1,124,5,124,0,106,2,131,3,124,4,95,4,124,4, - 83,0,100,1,83,0,110,4,124,4,83,0,100,1,83,0, - 41,2,122,141,84,114,121,32,116,111,32,102,105,110,100,32, - 97,32,115,112,101,99,32,102,111,114,32,39,102,117,108,108, - 110,97,109,101,39,32,111,110,32,115,121,115,46,112,97,116, - 104,32,111,114,32,39,112,97,116,104,39,46,10,10,32,32, - 32,32,32,32,32,32,84,104,101,32,115,101,97,114,99,104, - 32,105,115,32,98,97,115,101,100,32,111,110,32,115,121,115, - 46,112,97,116,104,95,104,111,111,107,115,32,97,110,100,32, - 115,121,115,46,112,97,116,104,95,105,109,112,111,114,116,101, - 114,95,99,97,99,104,101,46,10,32,32,32,32,32,32,32, - 32,78,41,7,114,8,0,0,0,114,44,0,0,0,114,58, - 1,0,0,114,140,0,0,0,114,178,0,0,0,114,181,0, - 0,0,114,22,1,0,0,41,6,114,193,0,0,0,114,139, - 0,0,0,114,44,0,0,0,114,202,0,0,0,114,187,0, - 0,0,114,57,1,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,203,0,0,0,49,5,0,0,115, - 26,0,0,0,0,6,8,1,6,1,14,1,8,1,4,1, - 10,1,6,1,4,3,6,1,16,1,4,2,6,2,122,20, - 80,97,116,104,70,105,110,100,101,114,46,102,105,110,100,95, - 115,112,101,99,99,3,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,4,0,0,0,67,0,0,0,115,30,0, - 0,0,124,0,160,0,124,1,124,2,161,2,125,3,124,3, - 100,1,107,8,114,24,100,1,83,0,124,3,106,1,83,0, - 41,2,122,170,102,105,110,100,32,116,104,101,32,109,111,100, - 117,108,101,32,111,110,32,115,121,115,46,112,97,116,104,32, - 111,114,32,39,112,97,116,104,39,32,98,97,115,101,100,32, - 111,110,32,115,121,115,46,112,97,116,104,95,104,111,111,107, - 115,32,97,110,100,10,32,32,32,32,32,32,32,32,115,121, - 115,46,112,97,116,104,95,105,109,112,111,114,116,101,114,95, - 99,97,99,104,101,46,10,10,32,32,32,32,32,32,32,32, + 9,95,103,101,116,95,115,112,101,99,17,5,0,0,115,40, + 0,0,0,0,5,4,1,8,1,14,1,2,1,10,1,8, + 1,10,1,14,2,12,1,8,1,2,1,10,1,8,1,6, + 1,8,1,8,5,12,2,12,1,6,1,122,20,80,97,116, + 104,70,105,110,100,101,114,46,95,103,101,116,95,115,112,101, + 99,99,4,0,0,0,0,0,0,0,0,0,0,0,6,0, + 0,0,5,0,0,0,67,0,0,0,115,100,0,0,0,124, + 2,100,1,107,8,114,14,116,0,106,1,125,2,124,0,160, + 2,124,1,124,2,124,3,161,3,125,4,124,4,100,1,107, + 8,114,40,100,1,83,0,124,4,106,3,100,1,107,8,114, + 92,124,4,106,4,125,5,124,5,114,86,100,1,124,4,95, + 5,116,6,124,1,124,5,124,0,106,2,131,3,124,4,95, + 4,124,4,83,0,100,1,83,0,110,4,124,4,83,0,100, + 1,83,0,41,2,122,141,84,114,121,32,116,111,32,102,105, + 110,100,32,97,32,115,112,101,99,32,102,111,114,32,39,102, + 117,108,108,110,97,109,101,39,32,111,110,32,115,121,115,46, + 112,97,116,104,32,111,114,32,39,112,97,116,104,39,46,10, + 10,32,32,32,32,32,32,32,32,84,104,101,32,115,101,97, + 114,99,104,32,105,115,32,98,97,115,101,100,32,111,110,32, + 115,121,115,46,112,97,116,104,95,104,111,111,107,115,32,97, + 110,100,32,115,121,115,46,112,97,116,104,95,105,109,112,111, + 114,116,101,114,95,99,97,99,104,101,46,10,32,32,32,32, + 32,32,32,32,78,41,7,114,8,0,0,0,114,44,0,0, + 0,114,58,1,0,0,114,140,0,0,0,114,178,0,0,0, + 114,181,0,0,0,114,22,1,0,0,41,6,114,193,0,0, + 0,114,139,0,0,0,114,44,0,0,0,114,202,0,0,0, + 114,187,0,0,0,114,57,1,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,203,0,0,0,49,5, + 0,0,115,26,0,0,0,0,6,8,1,6,1,14,1,8, + 1,4,1,10,1,6,1,4,3,6,1,16,1,4,2,6, + 2,122,20,80,97,116,104,70,105,110,100,101,114,46,102,105, + 110,100,95,115,112,101,99,99,3,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,4,0,0,0,67,0,0,0, + 115,30,0,0,0,124,0,160,0,124,1,124,2,161,2,125, + 3,124,3,100,1,107,8,114,24,100,1,83,0,124,3,106, + 1,83,0,41,2,122,170,102,105,110,100,32,116,104,101,32, + 109,111,100,117,108,101,32,111,110,32,115,121,115,46,112,97, + 116,104,32,111,114,32,39,112,97,116,104,39,32,98,97,115, + 101,100,32,111,110,32,115,121,115,46,112,97,116,104,95,104, + 111,111,107,115,32,97,110,100,10,32,32,32,32,32,32,32, + 32,115,121,115,46,112,97,116,104,95,105,109,112,111,114,116, + 101,114,95,99,97,99,104,101,46,10,10,32,32,32,32,32, + 32,32,32,84,104,105,115,32,109,101,116,104,111,100,32,105, + 115,32,100,101,112,114,101,99,97,116,101,100,46,32,32,85, + 115,101,32,102,105,110,100,95,115,112,101,99,40,41,32,105, + 110,115,116,101,97,100,46,10,10,32,32,32,32,32,32,32, + 32,78,114,204,0,0,0,114,205,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,114,206,0,0,0, + 73,5,0,0,115,8,0,0,0,0,8,12,1,8,1,4, + 1,122,22,80,97,116,104,70,105,110,100,101,114,46,102,105, + 110,100,95,109,111,100,117,108,101,122,45,40,63,58,123,112, + 97,116,116,101,114,110,125,40,45,46,42,41,63,92,46,40, + 100,105,115,116,124,101,103,103,41,45,105,110,102,111,124,69, + 71,71,45,73,78,70,79,41,99,3,0,0,0,0,0,0, + 0,0,0,0,0,7,0,0,0,4,0,0,0,67,0,0, + 0,115,78,0,0,0,100,1,100,2,108,0,125,3,100,1, + 100,3,108,1,109,2,125,4,1,0,124,2,100,2,107,8, + 114,34,116,3,106,4,125,2,124,1,100,2,107,8,114,46, + 100,4,110,8,124,3,160,5,124,1,161,1,125,5,124,0, + 160,6,124,5,124,2,161,2,125,6,116,7,124,4,124,6, + 131,2,83,0,41,5,97,37,1,0,0,10,32,32,32,32, + 32,32,32,32,70,105,110,100,32,100,105,115,116,114,105,98, + 117,116,105,111,110,115,46,10,10,32,32,32,32,32,32,32, + 32,82,101,116,117,114,110,32,97,110,32,105,116,101,114,97, + 98,108,101,32,111,102,32,97,108,108,32,68,105,115,116,114, + 105,98,117,116,105,111,110,32,105,110,115,116,97,110,99,101, + 115,32,99,97,112,97,98,108,101,32,111,102,10,32,32,32, + 32,32,32,32,32,108,111,97,100,105,110,103,32,116,104,101, + 32,109,101,116,97,100,97,116,97,32,102,111,114,32,112,97, + 99,107,97,103,101,115,32,109,97,116,99,104,105,110,103,32, + 116,104,101,32,96,96,110,97,109,101,96,96,10,32,32,32, + 32,32,32,32,32,40,111,114,32,97,108,108,32,110,97,109, + 101,115,32,105,102,32,110,111,116,32,115,117,112,112,108,105, + 101,100,41,32,97,108,111,110,103,32,116,104,101,32,112,97, + 116,104,115,32,105,110,32,116,104,101,32,108,105,115,116,10, + 32,32,32,32,32,32,32,32,111,102,32,100,105,114,101,99, + 116,111,114,105,101,115,32,96,96,112,97,116,104,96,96,32, + 40,100,101,102,97,117,108,116,115,32,116,111,32,115,121,115, + 46,112,97,116,104,41,46,10,32,32,32,32,32,32,32,32, + 114,73,0,0,0,78,41,1,218,16,80,97,116,104,68,105, + 115,116,114,105,98,117,116,105,111,110,122,2,46,42,41,8, + 218,2,114,101,90,18,105,109,112,111,114,116,108,105,98,46, + 109,101,116,97,100,97,116,97,114,59,1,0,0,114,8,0, + 0,0,114,44,0,0,0,90,6,101,115,99,97,112,101,218, + 13,95,115,101,97,114,99,104,95,112,97,116,104,115,218,3, + 109,97,112,41,7,114,193,0,0,0,114,117,0,0,0,114, + 44,0,0,0,114,60,1,0,0,114,59,1,0,0,218,7, + 112,97,116,116,101,114,110,90,5,102,111,117,110,100,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,218,18,102, + 105,110,100,95,100,105,115,116,114,105,98,117,116,105,111,110, + 115,88,5,0,0,115,14,0,0,0,0,10,8,1,12,1, + 8,1,6,1,22,1,12,1,122,29,80,97,116,104,70,105, + 110,100,101,114,46,102,105,110,100,95,100,105,115,116,114,105, + 98,117,116,105,111,110,115,99,3,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,6,0,0,0,3,0,0,0, + 115,44,0,0,0,100,1,100,2,108,0,125,3,124,3,106, + 1,160,2,135,0,135,1,102,2,100,3,100,4,132,8,116, + 3,136,0,106,4,124,2,131,2,68,0,131,1,161,1,83, + 0,41,5,122,49,70,105,110,100,32,109,101,116,97,100,97, + 116,97,32,100,105,114,101,99,116,111,114,105,101,115,32,105, + 110,32,112,97,116,104,115,32,104,101,117,114,105,115,116,105, + 99,97,108,108,121,46,114,73,0,0,0,78,99,1,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,5,0,0, + 0,51,0,0,0,115,26,0,0,0,124,0,93,18,125,1, + 136,0,160,0,124,1,136,1,161,2,86,0,1,0,113,2, + 100,0,83,0,114,110,0,0,0,41,1,218,12,95,115,101, + 97,114,99,104,95,112,97,116,104,41,2,114,32,0,0,0, + 114,44,0,0,0,169,2,114,193,0,0,0,114,63,1,0, + 0,114,3,0,0,0,114,6,0,0,0,114,19,1,0,0, + 110,5,0,0,115,4,0,0,0,4,2,2,255,122,43,80, + 97,116,104,70,105,110,100,101,114,46,95,115,101,97,114,99, + 104,95,112,97,116,104,115,46,60,108,111,99,97,108,115,62, + 46,60,103,101,110,101,120,112,114,62,41,5,218,9,105,116, + 101,114,116,111,111,108,115,90,5,99,104,97,105,110,90,13, + 102,114,111,109,95,105,116,101,114,97,98,108,101,114,62,1, + 0,0,218,12,95,115,119,105,116,99,104,95,112,97,116,104, + 41,4,114,193,0,0,0,114,63,1,0,0,90,5,112,97, + 116,104,115,114,67,1,0,0,114,3,0,0,0,114,66,1, + 0,0,114,6,0,0,0,114,61,1,0,0,106,5,0,0, + 115,8,0,0,0,0,3,8,1,18,2,10,254,122,24,80, + 97,116,104,70,105,110,100,101,114,46,95,115,101,97,114,99, + 104,95,112,97,116,104,115,99,1,0,0,0,0,0,0,0, + 0,0,0,0,4,0,0,0,10,0,0,0,67,0,0,0, + 115,78,0,0,0,100,1,100,2,108,0,109,1,125,1,1, + 0,100,1,100,0,108,2,125,2,100,1,100,3,108,3,109, + 4,125,3,1,0,124,1,116,5,131,1,143,24,1,0,124, + 2,160,4,124,0,161,1,87,0,2,0,53,0,81,0,82, + 0,163,0,83,0,81,0,82,0,88,0,124,3,124,0,131, + 1,83,0,41,4,78,114,73,0,0,0,41,1,218,8,115, + 117,112,112,114,101,115,115,41,1,218,4,80,97,116,104,41, + 6,90,10,99,111,110,116,101,120,116,108,105,98,114,69,1, + 0,0,218,7,122,105,112,102,105,108,101,90,7,112,97,116, + 104,108,105,98,114,70,1,0,0,218,9,69,120,99,101,112, + 116,105,111,110,41,4,114,44,0,0,0,114,69,1,0,0, + 114,71,1,0,0,114,70,1,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,68,1,0,0,115,5, + 0,0,115,12,0,0,0,0,2,12,1,8,1,12,1,10, + 1,28,1,122,23,80,97,116,104,70,105,110,100,101,114,46, + 95,115,119,105,116,99,104,95,112,97,116,104,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,32,0,0,0,100,1,100,0,108,0, + 125,4,124,4,106,1,124,1,116,2,124,3,106,3,131,1, + 124,4,106,4,100,2,141,3,83,0,41,3,78,114,73,0, + 0,0,41,1,114,83,0,0,0,41,5,114,60,1,0,0, + 90,5,109,97,116,99,104,114,85,0,0,0,114,117,0,0, + 0,90,10,73,71,78,79,82,69,67,65,83,69,41,5,114, + 193,0,0,0,114,63,1,0,0,218,4,114,111,111,116,114, + 41,1,0,0,114,60,1,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,10,95,112,114,101,100,105, + 99,97,116,101,124,5,0,0,115,4,0,0,0,0,2,8, + 1,122,21,80,97,116,104,70,105,110,100,101,114,46,95,112, + 114,101,100,105,99,97,116,101,99,3,0,0,0,0,0,0, + 0,0,0,0,0,4,0,0,0,4,0,0,0,3,0,0, + 0,115,64,0,0,0,136,2,160,0,161,0,115,12,100,1, + 83,0,124,2,160,1,100,2,100,3,161,2,125,3,136,0, + 106,2,106,3,124,3,100,4,141,1,137,1,135,0,135,1, + 135,2,102,3,100,5,100,6,132,8,136,2,160,4,161,0, + 68,0,131,1,83,0,41,7,78,114,3,0,0,0,250,1, + 45,114,45,0,0,0,41,1,114,63,1,0,0,99,1,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,6,0, + 0,0,51,0,0,0,115,32,0,0,0,124,0,93,24,125, + 1,136,0,160,0,136,1,136,2,124,1,161,3,114,2,124, + 1,86,0,1,0,113,2,100,0,83,0,114,110,0,0,0, + 41,1,114,74,1,0,0,41,2,114,32,0,0,0,114,41, + 1,0,0,169,3,114,193,0,0,0,90,7,109,97,116,99, + 104,101,114,114,73,1,0,0,114,3,0,0,0,114,6,0, + 0,0,114,19,1,0,0,135,5,0,0,115,6,0,0,0, + 4,0,2,1,14,255,122,42,80,97,116,104,70,105,110,100, + 101,114,46,95,115,101,97,114,99,104,95,112,97,116,104,46, + 60,108,111,99,97,108,115,62,46,60,103,101,110,101,120,112, + 114,62,41,5,90,6,105,115,95,100,105,114,114,67,0,0, + 0,218,15,115,101,97,114,99,104,95,116,101,109,112,108,97, + 116,101,114,62,0,0,0,90,7,105,116,101,114,100,105,114, + 41,4,114,193,0,0,0,114,73,1,0,0,114,63,1,0, + 0,90,10,110,111,114,109,97,108,105,122,101,100,114,3,0, + 0,0,114,76,1,0,0,114,6,0,0,0,114,65,1,0, + 0,129,5,0,0,115,10,0,0,0,0,2,8,1,4,1, + 12,1,14,1,122,23,80,97,116,104,70,105,110,100,101,114, + 46,95,115,101,97,114,99,104,95,112,97,116,104,41,1,78, + 41,2,78,78,41,1,78,41,2,78,78,41,19,114,125,0, + 0,0,114,124,0,0,0,114,126,0,0,0,114,127,0,0, + 0,114,207,0,0,0,114,46,1,0,0,114,52,1,0,0, + 114,54,1,0,0,114,55,1,0,0,114,58,1,0,0,114, + 203,0,0,0,114,206,0,0,0,114,77,1,0,0,114,64, + 1,0,0,114,61,1,0,0,218,12,115,116,97,116,105,99, + 109,101,116,104,111,100,114,68,1,0,0,114,74,1,0,0, + 114,65,1,0,0,114,3,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,45,1,0,0,209,4, + 0,0,115,52,0,0,0,8,2,4,2,2,1,10,9,2, + 1,10,12,2,1,10,21,2,1,10,14,2,1,12,31,2, + 1,12,23,2,1,12,12,4,2,2,1,12,17,2,1,10, + 8,2,1,10,8,2,1,10,4,2,1,114,45,1,0,0, + 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,64,0,0,0,115,90,0,0,0,101,0, + 90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,0, + 90,4,100,4,100,5,132,0,90,5,101,6,90,7,100,6, + 100,7,132,0,90,8,100,8,100,9,132,0,90,9,100,19, + 100,11,100,12,132,1,90,10,100,13,100,14,132,0,90,11, + 101,12,100,15,100,16,132,0,131,1,90,13,100,17,100,18, + 132,0,90,14,100,10,83,0,41,20,218,10,70,105,108,101, + 70,105,110,100,101,114,122,172,70,105,108,101,45,98,97,115, + 101,100,32,102,105,110,100,101,114,46,10,10,32,32,32,32, + 73,110,116,101,114,97,99,116,105,111,110,115,32,119,105,116, + 104,32,116,104,101,32,102,105,108,101,32,115,121,115,116,101, + 109,32,97,114,101,32,99,97,99,104,101,100,32,102,111,114, + 32,112,101,114,102,111,114,109,97,110,99,101,44,32,98,101, + 105,110,103,10,32,32,32,32,114,101,102,114,101,115,104,101, + 100,32,119,104,101,110,32,116,104,101,32,100,105,114,101,99, + 116,111,114,121,32,116,104,101,32,102,105,110,100,101,114,32, + 105,115,32,104,97,110,100,108,105,110,103,32,104,97,115,32, + 98,101,101,110,32,109,111,100,105,102,105,101,100,46,10,10, + 32,32,32,32,99,2,0,0,0,0,0,0,0,0,0,0, + 0,5,0,0,0,6,0,0,0,7,0,0,0,115,84,0, + 0,0,103,0,125,3,124,2,68,0,93,32,92,2,137,0, + 125,4,124,3,160,0,135,0,102,1,100,1,100,2,132,8, + 124,4,68,0,131,1,161,1,1,0,113,8,124,3,124,0, + 95,1,124,1,112,54,100,3,124,0,95,2,100,4,124,0, + 95,3,116,4,131,0,124,0,95,5,116,4,131,0,124,0, + 95,6,100,5,83,0,41,6,122,154,73,110,105,116,105,97, + 108,105,122,101,32,119,105,116,104,32,116,104,101,32,112,97, + 116,104,32,116,111,32,115,101,97,114,99,104,32,111,110,32, + 97,110,100,32,97,32,118,97,114,105,97,98,108,101,32,110, + 117,109,98,101,114,32,111,102,10,32,32,32,32,32,32,32, + 32,50,45,116,117,112,108,101,115,32,99,111,110,116,97,105, + 110,105,110,103,32,116,104,101,32,108,111,97,100,101,114,32, + 97,110,100,32,116,104,101,32,102,105,108,101,32,115,117,102, + 102,105,120,101,115,32,116,104,101,32,108,111,97,100,101,114, + 10,32,32,32,32,32,32,32,32,114,101,99,111,103,110,105, + 122,101,115,46,99,1,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,3,0,0,0,51,0,0,0,115,22,0, + 0,0,124,0,93,14,125,1,124,1,136,0,102,2,86,0, + 1,0,113,2,100,0,83,0,114,110,0,0,0,114,3,0, + 0,0,114,16,1,0,0,169,1,114,140,0,0,0,114,3, + 0,0,0,114,6,0,0,0,114,19,1,0,0,154,5,0, + 0,115,4,0,0,0,4,0,2,0,122,38,70,105,108,101, + 70,105,110,100,101,114,46,95,95,105,110,105,116,95,95,46, + 60,108,111,99,97,108,115,62,46,60,103,101,110,101,120,112, + 114,62,114,71,0,0,0,114,105,0,0,0,78,41,7,114, + 167,0,0,0,218,8,95,108,111,97,100,101,114,115,114,44, + 0,0,0,218,11,95,112,97,116,104,95,109,116,105,109,101, + 218,3,115,101,116,218,11,95,112,97,116,104,95,99,97,99, + 104,101,218,19,95,114,101,108,97,120,101,100,95,112,97,116, + 104,95,99,97,99,104,101,41,5,114,119,0,0,0,114,44, + 0,0,0,218,14,108,111,97,100,101,114,95,100,101,116,97, + 105,108,115,90,7,108,111,97,100,101,114,115,114,189,0,0, + 0,114,3,0,0,0,114,80,1,0,0,114,6,0,0,0, + 114,209,0,0,0,148,5,0,0,115,16,0,0,0,0,4, + 4,1,12,1,26,1,6,2,10,1,6,1,8,1,122,19, + 70,105,108,101,70,105,110,100,101,114,46,95,95,105,110,105, + 116,95,95,99,1,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,0,2,0,0,0,67,0,0,0,115,10,0,0, + 0,100,1,124,0,95,0,100,2,83,0,41,3,122,31,73, + 110,118,97,108,105,100,97,116,101,32,116,104,101,32,100,105, + 114,101,99,116,111,114,121,32,109,116,105,109,101,46,114,105, + 0,0,0,78,41,1,114,82,1,0,0,114,246,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, + 46,1,0,0,162,5,0,0,115,2,0,0,0,0,2,122, + 28,70,105,108,101,70,105,110,100,101,114,46,105,110,118,97, + 108,105,100,97,116,101,95,99,97,99,104,101,115,99,2,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0, + 0,0,67,0,0,0,115,42,0,0,0,124,0,160,0,124, + 1,161,1,125,2,124,2,100,1,107,8,114,26,100,1,103, + 0,102,2,83,0,124,2,106,1,124,2,106,2,112,38,103, + 0,102,2,83,0,41,2,122,197,84,114,121,32,116,111,32, + 102,105,110,100,32,97,32,108,111,97,100,101,114,32,102,111, + 114,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32, + 109,111,100,117,108,101,44,32,111,114,32,116,104,101,32,110, + 97,109,101,115,112,97,99,101,10,32,32,32,32,32,32,32, + 32,112,97,99,107,97,103,101,32,112,111,114,116,105,111,110, + 115,46,32,82,101,116,117,114,110,115,32,40,108,111,97,100, + 101,114,44,32,108,105,115,116,45,111,102,45,112,111,114,116, + 105,111,110,115,41,46,10,10,32,32,32,32,32,32,32,32, 84,104,105,115,32,109,101,116,104,111,100,32,105,115,32,100, 101,112,114,101,99,97,116,101,100,46,32,32,85,115,101,32, 102,105,110,100,95,115,112,101,99,40,41,32,105,110,115,116, - 101,97,100,46,10,10,32,32,32,32,32,32,32,32,78,114, - 204,0,0,0,114,205,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,206,0,0,0,73,5,0, - 0,115,8,0,0,0,0,8,12,1,8,1,4,1,122,22, - 80,97,116,104,70,105,110,100,101,114,46,102,105,110,100,95, - 109,111,100,117,108,101,122,45,40,63,58,123,112,97,116,116, - 101,114,110,125,40,45,46,42,41,63,92,46,40,100,105,115, - 116,124,101,103,103,41,45,105,110,102,111,124,69,71,71,45, - 73,78,70,79,41,99,3,0,0,0,0,0,0,0,0,0, - 0,0,7,0,0,0,4,0,0,0,67,0,0,0,115,78, - 0,0,0,100,1,100,2,108,0,125,3,100,1,100,3,108, - 1,109,2,125,4,1,0,124,2,100,2,107,8,114,34,116, - 3,106,4,125,2,124,1,100,2,107,8,114,46,100,4,110, - 8,124,3,160,5,124,1,161,1,125,5,124,0,160,6,124, - 5,124,2,161,2,125,6,116,7,124,4,124,6,131,2,83, - 0,41,5,97,37,1,0,0,10,32,32,32,32,32,32,32, - 32,70,105,110,100,32,100,105,115,116,114,105,98,117,116,105, - 111,110,115,46,10,10,32,32,32,32,32,32,32,32,82,101, - 116,117,114,110,32,97,110,32,105,116,101,114,97,98,108,101, - 32,111,102,32,97,108,108,32,68,105,115,116,114,105,98,117, - 116,105,111,110,32,105,110,115,116,97,110,99,101,115,32,99, - 97,112,97,98,108,101,32,111,102,10,32,32,32,32,32,32, - 32,32,108,111,97,100,105,110,103,32,116,104,101,32,109,101, - 116,97,100,97,116,97,32,102,111,114,32,112,97,99,107,97, - 103,101,115,32,109,97,116,99,104,105,110,103,32,116,104,101, - 32,96,96,110,97,109,101,96,96,10,32,32,32,32,32,32, - 32,32,40,111,114,32,97,108,108,32,110,97,109,101,115,32, - 105,102,32,110,111,116,32,115,117,112,112,108,105,101,100,41, - 32,97,108,111,110,103,32,116,104,101,32,112,97,116,104,115, - 32,105,110,32,116,104,101,32,108,105,115,116,10,32,32,32, - 32,32,32,32,32,111,102,32,100,105,114,101,99,116,111,114, - 105,101,115,32,96,96,112,97,116,104,96,96,32,40,100,101, - 102,97,117,108,116,115,32,116,111,32,115,121,115,46,112,97, - 116,104,41,46,10,32,32,32,32,32,32,32,32,114,73,0, - 0,0,78,41,1,218,16,80,97,116,104,68,105,115,116,114, - 105,98,117,116,105,111,110,122,2,46,42,41,8,218,2,114, - 101,90,18,105,109,112,111,114,116,108,105,98,46,109,101,116, - 97,100,97,116,97,114,59,1,0,0,114,8,0,0,0,114, - 44,0,0,0,90,6,101,115,99,97,112,101,218,13,95,115, - 101,97,114,99,104,95,112,97,116,104,115,218,3,109,97,112, - 41,7,114,193,0,0,0,114,117,0,0,0,114,44,0,0, - 0,114,60,1,0,0,114,59,1,0,0,218,7,112,97,116, - 116,101,114,110,90,5,102,111,117,110,100,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,18,102,105,110,100, - 95,100,105,115,116,114,105,98,117,116,105,111,110,115,88,5, - 0,0,115,14,0,0,0,0,10,8,1,12,1,8,1,6, - 1,22,1,12,1,122,29,80,97,116,104,70,105,110,100,101, - 114,46,102,105,110,100,95,100,105,115,116,114,105,98,117,116, - 105,111,110,115,99,3,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,6,0,0,0,3,0,0,0,115,44,0, - 0,0,100,1,100,2,108,0,125,3,124,3,106,1,160,2, - 135,0,135,1,102,2,100,3,100,4,132,8,116,3,136,0, - 106,4,124,2,131,2,68,0,131,1,161,1,83,0,41,5, - 122,49,70,105,110,100,32,109,101,116,97,100,97,116,97,32, - 100,105,114,101,99,116,111,114,105,101,115,32,105,110,32,112, - 97,116,104,115,32,104,101,117,114,105,115,116,105,99,97,108, - 108,121,46,114,73,0,0,0,78,99,1,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,5,0,0,0,51,0, - 0,0,115,26,0,0,0,124,0,93,18,125,1,136,0,160, - 0,124,1,136,1,161,2,86,0,1,0,113,2,100,0,83, - 0,114,110,0,0,0,41,1,218,12,95,115,101,97,114,99, - 104,95,112,97,116,104,41,2,114,32,0,0,0,114,44,0, - 0,0,169,2,114,193,0,0,0,114,63,1,0,0,114,3, - 0,0,0,114,6,0,0,0,114,19,1,0,0,110,5,0, - 0,115,4,0,0,0,4,2,2,255,122,43,80,97,116,104, - 70,105,110,100,101,114,46,95,115,101,97,114,99,104,95,112, - 97,116,104,115,46,60,108,111,99,97,108,115,62,46,60,103, - 101,110,101,120,112,114,62,41,5,218,9,105,116,101,114,116, - 111,111,108,115,90,5,99,104,97,105,110,90,13,102,114,111, - 109,95,105,116,101,114,97,98,108,101,114,62,1,0,0,218, - 12,95,115,119,105,116,99,104,95,112,97,116,104,41,4,114, - 193,0,0,0,114,63,1,0,0,90,5,112,97,116,104,115, - 114,67,1,0,0,114,3,0,0,0,114,66,1,0,0,114, - 6,0,0,0,114,61,1,0,0,106,5,0,0,115,8,0, - 0,0,0,3,8,1,18,2,10,254,122,24,80,97,116,104, - 70,105,110,100,101,114,46,95,115,101,97,114,99,104,95,112, - 97,116,104,115,99,1,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,10,0,0,0,67,0,0,0,115,78,0, - 0,0,100,1,100,2,108,0,109,1,125,1,1,0,100,1, - 100,0,108,2,125,2,100,1,100,3,108,3,109,4,125,3, - 1,0,124,1,116,5,131,1,143,24,1,0,124,2,160,4, - 124,0,161,1,87,0,2,0,53,0,81,0,82,0,163,0, - 83,0,81,0,82,0,88,0,124,3,124,0,131,1,83,0, - 41,4,78,114,73,0,0,0,41,1,218,8,115,117,112,112, - 114,101,115,115,41,1,218,4,80,97,116,104,41,6,90,10, - 99,111,110,116,101,120,116,108,105,98,114,69,1,0,0,218, - 7,122,105,112,102,105,108,101,90,7,112,97,116,104,108,105, - 98,114,70,1,0,0,218,9,69,120,99,101,112,116,105,111, - 110,41,4,114,44,0,0,0,114,69,1,0,0,114,71,1, - 0,0,114,70,1,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,68,1,0,0,115,5,0,0,115, - 12,0,0,0,0,2,12,1,8,1,12,1,10,1,28,1, - 122,23,80,97,116,104,70,105,110,100,101,114,46,95,115,119, - 105,116,99,104,95,112,97,116,104,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,32,0,0,0,100,1,100,0,108,0,125,4,124, - 4,106,1,124,1,116,2,124,3,106,3,131,1,124,4,106, - 4,100,2,141,3,83,0,41,3,78,114,73,0,0,0,41, - 1,114,83,0,0,0,41,5,114,60,1,0,0,90,5,109, - 97,116,99,104,114,85,0,0,0,114,117,0,0,0,90,10, - 73,71,78,79,82,69,67,65,83,69,41,5,114,193,0,0, - 0,114,63,1,0,0,218,4,114,111,111,116,114,41,1,0, - 0,114,60,1,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,10,95,112,114,101,100,105,99,97,116, - 101,124,5,0,0,115,4,0,0,0,0,2,8,1,122,21, - 80,97,116,104,70,105,110,100,101,114,46,95,112,114,101,100, - 105,99,97,116,101,99,3,0,0,0,0,0,0,0,0,0, - 0,0,4,0,0,0,4,0,0,0,3,0,0,0,115,64, - 0,0,0,136,2,160,0,161,0,115,12,100,1,83,0,124, - 2,160,1,100,2,100,3,161,2,125,3,136,0,106,2,106, - 3,124,3,100,4,141,1,137,1,135,0,135,1,135,2,102, - 3,100,5,100,6,132,8,136,2,160,4,161,0,68,0,131, - 1,83,0,41,7,78,114,3,0,0,0,250,1,45,114,45, - 0,0,0,41,1,114,63,1,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,6,0,0,0,51, - 0,0,0,115,32,0,0,0,124,0,93,24,125,1,136,0, - 160,0,136,1,136,2,124,1,161,3,114,26,124,1,86,0, - 1,0,113,2,100,0,83,0,114,110,0,0,0,41,1,114, - 74,1,0,0,41,2,114,32,0,0,0,114,41,1,0,0, - 169,3,114,193,0,0,0,90,7,109,97,116,99,104,101,114, - 114,73,1,0,0,114,3,0,0,0,114,6,0,0,0,114, - 19,1,0,0,135,5,0,0,115,6,0,0,0,4,0,2, - 1,14,255,122,42,80,97,116,104,70,105,110,100,101,114,46, - 95,115,101,97,114,99,104,95,112,97,116,104,46,60,108,111, - 99,97,108,115,62,46,60,103,101,110,101,120,112,114,62,41, - 5,90,6,105,115,95,100,105,114,114,67,0,0,0,218,15, - 115,101,97,114,99,104,95,116,101,109,112,108,97,116,101,114, - 62,0,0,0,90,7,105,116,101,114,100,105,114,41,4,114, - 193,0,0,0,114,73,1,0,0,114,63,1,0,0,90,10, - 110,111,114,109,97,108,105,122,101,100,114,3,0,0,0,114, - 76,1,0,0,114,6,0,0,0,114,65,1,0,0,129,5, - 0,0,115,10,0,0,0,0,2,8,1,4,1,12,1,14, - 1,122,23,80,97,116,104,70,105,110,100,101,114,46,95,115, - 101,97,114,99,104,95,112,97,116,104,41,1,78,41,2,78, - 78,41,1,78,41,2,78,78,41,19,114,125,0,0,0,114, - 124,0,0,0,114,126,0,0,0,114,127,0,0,0,114,207, - 0,0,0,114,46,1,0,0,114,52,1,0,0,114,54,1, - 0,0,114,55,1,0,0,114,58,1,0,0,114,203,0,0, - 0,114,206,0,0,0,114,77,1,0,0,114,64,1,0,0, - 114,61,1,0,0,218,12,115,116,97,116,105,99,109,101,116, - 104,111,100,114,68,1,0,0,114,74,1,0,0,114,65,1, - 0,0,114,3,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,45,1,0,0,209,4,0,0,115, - 52,0,0,0,8,2,4,2,2,1,10,9,2,1,10,12, - 2,1,10,21,2,1,10,14,2,1,12,31,2,1,12,23, - 2,1,12,12,4,2,2,1,12,17,2,1,10,8,2,1, - 10,8,2,1,10,4,2,1,114,45,1,0,0,99,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,64,0,0,0,115,90,0,0,0,101,0,90,1,100, - 0,90,2,100,1,90,3,100,2,100,3,132,0,90,4,100, - 4,100,5,132,0,90,5,101,6,90,7,100,6,100,7,132, - 0,90,8,100,8,100,9,132,0,90,9,100,19,100,11,100, - 12,132,1,90,10,100,13,100,14,132,0,90,11,101,12,100, - 15,100,16,132,0,131,1,90,13,100,17,100,18,132,0,90, - 14,100,10,83,0,41,20,218,10,70,105,108,101,70,105,110, - 100,101,114,122,172,70,105,108,101,45,98,97,115,101,100,32, - 102,105,110,100,101,114,46,10,10,32,32,32,32,73,110,116, - 101,114,97,99,116,105,111,110,115,32,119,105,116,104,32,116, - 104,101,32,102,105,108,101,32,115,121,115,116,101,109,32,97, - 114,101,32,99,97,99,104,101,100,32,102,111,114,32,112,101, - 114,102,111,114,109,97,110,99,101,44,32,98,101,105,110,103, - 10,32,32,32,32,114,101,102,114,101,115,104,101,100,32,119, - 104,101,110,32,116,104,101,32,100,105,114,101,99,116,111,114, - 121,32,116,104,101,32,102,105,110,100,101,114,32,105,115,32, - 104,97,110,100,108,105,110,103,32,104,97,115,32,98,101,101, - 110,32,109,111,100,105,102,105,101,100,46,10,10,32,32,32, - 32,99,2,0,0,0,0,0,0,0,0,0,0,0,5,0, - 0,0,6,0,0,0,7,0,0,0,115,84,0,0,0,103, - 0,125,3,124,2,68,0,93,32,92,2,137,0,125,4,124, - 3,160,0,135,0,102,1,100,1,100,2,132,8,124,4,68, - 0,131,1,161,1,1,0,113,8,124,3,124,0,95,1,124, - 1,112,54,100,3,124,0,95,2,100,4,124,0,95,3,116, - 4,131,0,124,0,95,5,116,4,131,0,124,0,95,6,100, - 5,83,0,41,6,122,154,73,110,105,116,105,97,108,105,122, - 101,32,119,105,116,104,32,116,104,101,32,112,97,116,104,32, - 116,111,32,115,101,97,114,99,104,32,111,110,32,97,110,100, - 32,97,32,118,97,114,105,97,98,108,101,32,110,117,109,98, - 101,114,32,111,102,10,32,32,32,32,32,32,32,32,50,45, - 116,117,112,108,101,115,32,99,111,110,116,97,105,110,105,110, - 103,32,116,104,101,32,108,111,97,100,101,114,32,97,110,100, - 32,116,104,101,32,102,105,108,101,32,115,117,102,102,105,120, - 101,115,32,116,104,101,32,108,111,97,100,101,114,10,32,32, - 32,32,32,32,32,32,114,101,99,111,103,110,105,122,101,115, - 46,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,3,0,0,0,51,0,0,0,115,22,0,0,0,124, - 0,93,14,125,1,124,1,136,0,102,2,86,0,1,0,113, - 2,100,0,83,0,114,110,0,0,0,114,3,0,0,0,114, - 16,1,0,0,169,1,114,140,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,19,1,0,0,154,5,0,0,115,4, - 0,0,0,4,0,2,0,122,38,70,105,108,101,70,105,110, - 100,101,114,46,95,95,105,110,105,116,95,95,46,60,108,111, - 99,97,108,115,62,46,60,103,101,110,101,120,112,114,62,114, - 71,0,0,0,114,105,0,0,0,78,41,7,114,167,0,0, - 0,218,8,95,108,111,97,100,101,114,115,114,44,0,0,0, - 218,11,95,112,97,116,104,95,109,116,105,109,101,218,3,115, - 101,116,218,11,95,112,97,116,104,95,99,97,99,104,101,218, - 19,95,114,101,108,97,120,101,100,95,112,97,116,104,95,99, - 97,99,104,101,41,5,114,119,0,0,0,114,44,0,0,0, - 218,14,108,111,97,100,101,114,95,100,101,116,97,105,108,115, - 90,7,108,111,97,100,101,114,115,114,189,0,0,0,114,3, - 0,0,0,114,80,1,0,0,114,6,0,0,0,114,209,0, - 0,0,148,5,0,0,115,16,0,0,0,0,4,4,1,12, - 1,26,1,6,2,10,1,6,1,8,1,122,19,70,105,108, - 101,70,105,110,100,101,114,46,95,95,105,110,105,116,95,95, + 101,97,100,46,10,10,32,32,32,32,32,32,32,32,78,41, + 3,114,203,0,0,0,114,140,0,0,0,114,178,0,0,0, + 41,3,114,119,0,0,0,114,139,0,0,0,114,187,0,0, + 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 114,137,0,0,0,168,5,0,0,115,8,0,0,0,0,7, + 10,1,8,1,8,1,122,22,70,105,108,101,70,105,110,100, + 101,114,46,102,105,110,100,95,108,111,97,100,101,114,99,6, + 0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,6, + 0,0,0,67,0,0,0,115,26,0,0,0,124,1,124,2, + 124,3,131,2,125,6,116,0,124,2,124,3,124,6,124,4, + 100,1,141,4,83,0,41,2,78,114,177,0,0,0,41,1, + 114,190,0,0,0,41,7,114,119,0,0,0,114,188,0,0, + 0,114,139,0,0,0,114,44,0,0,0,90,4,115,109,115, + 108,114,202,0,0,0,114,140,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,58,1,0,0,180, + 5,0,0,115,8,0,0,0,0,1,10,1,8,1,2,255, + 122,20,70,105,108,101,70,105,110,100,101,114,46,95,103,101, + 116,95,115,112,101,99,78,99,3,0,0,0,0,0,0,0, + 0,0,0,0,14,0,0,0,8,0,0,0,67,0,0,0, + 115,98,1,0,0,100,1,125,3,124,1,160,0,100,2,161, + 1,100,3,25,0,125,4,122,24,116,1,124,0,106,2,112, + 34,116,3,160,4,161,0,131,1,106,5,125,5,87,0,110, + 24,4,0,116,6,107,10,114,66,1,0,1,0,1,0,100, + 4,125,5,89,0,110,2,88,0,124,5,124,0,106,7,107, + 3,114,92,124,0,160,8,161,0,1,0,124,5,124,0,95, + 7,116,9,131,0,114,114,124,0,106,10,125,6,124,4,160, + 11,161,0,125,7,110,10,124,0,106,12,125,6,124,4,125, + 7,124,7,124,6,107,6,114,218,116,13,124,0,106,2,124, + 4,131,2,125,8,124,0,106,14,68,0,93,58,92,2,125, + 9,125,10,100,5,124,9,23,0,125,11,116,13,124,8,124, + 11,131,2,125,12,116,15,124,12,131,1,114,150,124,0,160, + 16,124,10,124,1,124,12,124,8,103,1,124,2,161,5,2, + 0,1,0,83,0,113,150,116,17,124,8,131,1,125,3,124, + 0,106,14,68,0,93,82,92,2,125,9,125,10,116,13,124, + 0,106,2,124,4,124,9,23,0,131,2,125,12,116,18,106, + 19,100,6,124,12,100,3,100,7,141,3,1,0,124,7,124, + 9,23,0,124,6,107,6,114,224,116,15,124,12,131,1,114, + 224,124,0,160,16,124,10,124,1,124,12,100,8,124,2,161, + 5,2,0,1,0,83,0,113,224,124,3,144,1,114,94,116, + 18,160,19,100,9,124,8,161,2,1,0,116,18,160,20,124, + 1,100,8,161,2,125,13,124,8,103,1,124,13,95,21,124, + 13,83,0,100,8,83,0,41,10,122,111,84,114,121,32,116, + 111,32,102,105,110,100,32,97,32,115,112,101,99,32,102,111, + 114,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32, + 109,111,100,117,108,101,46,10,10,32,32,32,32,32,32,32, + 32,82,101,116,117,114,110,115,32,116,104,101,32,109,97,116, + 99,104,105,110,103,32,115,112,101,99,44,32,111,114,32,78, + 111,110,101,32,105,102,32,110,111,116,32,102,111,117,110,100, + 46,10,32,32,32,32,32,32,32,32,70,114,71,0,0,0, + 114,28,0,0,0,114,105,0,0,0,114,209,0,0,0,122, + 9,116,114,121,105,110,103,32,123,125,41,1,90,9,118,101, + 114,98,111,115,105,116,121,78,122,25,112,111,115,115,105,98, + 108,101,32,110,97,109,101,115,112,97,99,101,32,102,111,114, + 32,123,125,41,22,114,41,0,0,0,114,49,0,0,0,114, + 44,0,0,0,114,2,0,0,0,114,55,0,0,0,114,10, + 1,0,0,114,50,0,0,0,114,82,1,0,0,218,11,95, + 102,105,108,108,95,99,97,99,104,101,114,7,0,0,0,114, + 85,1,0,0,114,106,0,0,0,114,84,1,0,0,114,38, + 0,0,0,114,81,1,0,0,114,54,0,0,0,114,58,1, + 0,0,114,56,0,0,0,114,134,0,0,0,114,149,0,0, + 0,114,183,0,0,0,114,178,0,0,0,41,14,114,119,0, + 0,0,114,139,0,0,0,114,202,0,0,0,90,12,105,115, + 95,110,97,109,101,115,112,97,99,101,90,11,116,97,105,108, + 95,109,111,100,117,108,101,114,169,0,0,0,90,5,99,97, + 99,104,101,90,12,99,97,99,104,101,95,109,111,100,117,108, + 101,90,9,98,97,115,101,95,112,97,116,104,114,17,1,0, + 0,114,188,0,0,0,90,13,105,110,105,116,95,102,105,108, + 101,110,97,109,101,90,9,102,117,108,108,95,112,97,116,104, + 114,187,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,203,0,0,0,185,5,0,0,115,74,0, + 0,0,0,5,4,1,14,1,2,1,24,1,14,1,10,1, + 10,1,8,1,6,2,6,1,6,1,10,2,6,1,4,2, + 8,1,12,1,14,1,8,1,10,1,8,1,26,4,8,2, + 14,1,16,1,16,1,12,1,8,1,10,1,2,0,2,255, + 10,2,6,1,12,1,12,1,8,1,4,1,122,20,70,105, + 108,101,70,105,110,100,101,114,46,102,105,110,100,95,115,112, + 101,99,99,1,0,0,0,0,0,0,0,0,0,0,0,9, + 0,0,0,10,0,0,0,67,0,0,0,115,190,0,0,0, + 124,0,106,0,125,1,122,22,116,1,160,2,124,1,112,22, + 116,1,160,3,161,0,161,1,125,2,87,0,110,30,4,0, + 116,4,116,5,116,6,102,3,107,10,114,58,1,0,1,0, + 1,0,103,0,125,2,89,0,110,2,88,0,116,7,106,8, + 160,9,100,1,161,1,115,84,116,10,124,2,131,1,124,0, + 95,11,110,74,116,10,131,0,125,3,124,2,68,0,93,56, + 125,4,124,4,160,12,100,2,161,1,92,3,125,5,125,6, + 125,7,124,6,114,136,100,3,160,13,124,5,124,7,160,14, + 161,0,161,2,125,8,110,4,124,5,125,8,124,3,160,15, + 124,8,161,1,1,0,113,94,124,3,124,0,95,11,116,7, + 106,8,160,9,116,16,161,1,114,186,100,4,100,5,132,0, + 124,2,68,0,131,1,124,0,95,17,100,6,83,0,41,7, + 122,68,70,105,108,108,32,116,104,101,32,99,97,99,104,101, + 32,111,102,32,112,111,116,101,110,116,105,97,108,32,109,111, + 100,117,108,101,115,32,97,110,100,32,112,97,99,107,97,103, + 101,115,32,102,111,114,32,116,104,105,115,32,100,105,114,101, + 99,116,111,114,121,46,114,0,0,0,0,114,71,0,0,0, + 114,61,0,0,0,99,1,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,4,0,0,0,83,0,0,0,115,20, + 0,0,0,104,0,124,0,93,12,125,1,124,1,160,0,161, + 0,146,2,113,4,83,0,114,3,0,0,0,41,1,114,106, + 0,0,0,41,2,114,32,0,0,0,90,2,102,110,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,218,9,60, + 115,101,116,99,111,109,112,62,6,6,0,0,115,4,0,0, + 0,6,0,2,0,122,41,70,105,108,101,70,105,110,100,101, + 114,46,95,102,105,108,108,95,99,97,99,104,101,46,60,108, + 111,99,97,108,115,62,46,60,115,101,116,99,111,109,112,62, + 78,41,18,114,44,0,0,0,114,2,0,0,0,114,7,1, + 0,0,114,55,0,0,0,114,3,1,0,0,218,15,80,101, + 114,109,105,115,115,105,111,110,69,114,114,111,114,218,18,78, + 111,116,65,68,105,114,101,99,116,111,114,121,69,114,114,111, + 114,114,8,0,0,0,114,9,0,0,0,114,10,0,0,0, + 114,83,1,0,0,114,84,1,0,0,114,101,0,0,0,114, + 62,0,0,0,114,106,0,0,0,218,3,97,100,100,114,11, + 0,0,0,114,85,1,0,0,41,9,114,119,0,0,0,114, + 44,0,0,0,114,8,1,0,0,90,21,108,111,119,101,114, + 95,115,117,102,102,105,120,95,99,111,110,116,101,110,116,115, + 114,41,1,0,0,114,117,0,0,0,114,29,1,0,0,114, + 17,1,0,0,90,8,110,101,119,95,110,97,109,101,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,114,87,1, + 0,0,233,5,0,0,115,34,0,0,0,0,2,6,1,2, + 1,22,1,20,3,10,3,12,1,12,7,6,1,8,1,16, + 1,4,1,18,2,4,1,12,1,6,1,12,1,122,22,70, + 105,108,101,70,105,110,100,101,114,46,95,102,105,108,108,95, + 99,97,99,104,101,99,1,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,3,0,0,0,7,0,0,0,115,18, + 0,0,0,135,0,135,1,102,2,100,1,100,2,132,8,125, + 2,124,2,83,0,41,3,97,20,1,0,0,65,32,99,108, + 97,115,115,32,109,101,116,104,111,100,32,119,104,105,99,104, + 32,114,101,116,117,114,110,115,32,97,32,99,108,111,115,117, + 114,101,32,116,111,32,117,115,101,32,111,110,32,115,121,115, + 46,112,97,116,104,95,104,111,111,107,10,32,32,32,32,32, + 32,32,32,119,104,105,99,104,32,119,105,108,108,32,114,101, + 116,117,114,110,32,97,110,32,105,110,115,116,97,110,99,101, + 32,117,115,105,110,103,32,116,104,101,32,115,112,101,99,105, + 102,105,101,100,32,108,111,97,100,101,114,115,32,97,110,100, + 32,116,104,101,32,112,97,116,104,10,32,32,32,32,32,32, + 32,32,99,97,108,108,101,100,32,111,110,32,116,104,101,32, + 99,108,111,115,117,114,101,46,10,10,32,32,32,32,32,32, + 32,32,73,102,32,116,104,101,32,112,97,116,104,32,99,97, + 108,108,101,100,32,111,110,32,116,104,101,32,99,108,111,115, + 117,114,101,32,105,115,32,110,111,116,32,97,32,100,105,114, + 101,99,116,111,114,121,44,32,73,109,112,111,114,116,69,114, + 114,111,114,32,105,115,10,32,32,32,32,32,32,32,32,114, + 97,105,115,101,100,46,10,10,32,32,32,32,32,32,32,32, 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,2,0,0,0,67,0,0,0,115,10,0,0,0,100,1, - 124,0,95,0,100,2,83,0,41,3,122,31,73,110,118,97, - 108,105,100,97,116,101,32,116,104,101,32,100,105,114,101,99, - 116,111,114,121,32,109,116,105,109,101,46,114,105,0,0,0, - 78,41,1,114,82,1,0,0,114,246,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,46,1,0, - 0,162,5,0,0,115,2,0,0,0,0,2,122,28,70,105, - 108,101,70,105,110,100,101,114,46,105,110,118,97,108,105,100, - 97,116,101,95,99,97,99,104,101,115,99,2,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,67, - 0,0,0,115,42,0,0,0,124,0,160,0,124,1,161,1, - 125,2,124,2,100,1,107,8,114,26,100,1,103,0,102,2, - 83,0,124,2,106,1,124,2,106,2,112,38,103,0,102,2, - 83,0,41,2,122,197,84,114,121,32,116,111,32,102,105,110, - 100,32,97,32,108,111,97,100,101,114,32,102,111,114,32,116, - 104,101,32,115,112,101,99,105,102,105,101,100,32,109,111,100, - 117,108,101,44,32,111,114,32,116,104,101,32,110,97,109,101, - 115,112,97,99,101,10,32,32,32,32,32,32,32,32,112,97, - 99,107,97,103,101,32,112,111,114,116,105,111,110,115,46,32, - 82,101,116,117,114,110,115,32,40,108,111,97,100,101,114,44, - 32,108,105,115,116,45,111,102,45,112,111,114,116,105,111,110, - 115,41,46,10,10,32,32,32,32,32,32,32,32,84,104,105, - 115,32,109,101,116,104,111,100,32,105,115,32,100,101,112,114, - 101,99,97,116,101,100,46,32,32,85,115,101,32,102,105,110, - 100,95,115,112,101,99,40,41,32,105,110,115,116,101,97,100, - 46,10,10,32,32,32,32,32,32,32,32,78,41,3,114,203, - 0,0,0,114,140,0,0,0,114,178,0,0,0,41,3,114, - 119,0,0,0,114,139,0,0,0,114,187,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,137,0, - 0,0,168,5,0,0,115,8,0,0,0,0,7,10,1,8, - 1,8,1,122,22,70,105,108,101,70,105,110,100,101,114,46, - 102,105,110,100,95,108,111,97,100,101,114,99,6,0,0,0, - 0,0,0,0,0,0,0,0,7,0,0,0,6,0,0,0, - 67,0,0,0,115,26,0,0,0,124,1,124,2,124,3,131, - 2,125,6,116,0,124,2,124,3,124,6,124,4,100,1,141, - 4,83,0,41,2,78,114,177,0,0,0,41,1,114,190,0, - 0,0,41,7,114,119,0,0,0,114,188,0,0,0,114,139, - 0,0,0,114,44,0,0,0,90,4,115,109,115,108,114,202, - 0,0,0,114,140,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,58,1,0,0,180,5,0,0, - 115,8,0,0,0,0,1,10,1,8,1,2,255,122,20,70, - 105,108,101,70,105,110,100,101,114,46,95,103,101,116,95,115, - 112,101,99,78,99,3,0,0,0,0,0,0,0,0,0,0, - 0,14,0,0,0,8,0,0,0,67,0,0,0,115,102,1, - 0,0,100,1,125,3,124,1,160,0,100,2,161,1,100,3, - 25,0,125,4,122,24,116,1,124,0,106,2,112,34,116,3, - 160,4,161,0,131,1,106,5,125,5,87,0,110,24,4,0, - 116,6,107,10,114,66,1,0,1,0,1,0,100,4,125,5, - 89,0,110,2,88,0,124,5,124,0,106,7,107,3,114,92, - 124,0,160,8,161,0,1,0,124,5,124,0,95,7,116,9, - 131,0,114,114,124,0,106,10,125,6,124,4,160,11,161,0, - 125,7,110,10,124,0,106,12,125,6,124,4,125,7,124,7, - 124,6,107,6,114,218,116,13,124,0,106,2,124,4,131,2, - 125,8,124,0,106,14,68,0,93,58,92,2,125,9,125,10, - 100,5,124,9,23,0,125,11,116,13,124,8,124,11,131,2, - 125,12,116,15,124,12,131,1,114,208,124,0,160,16,124,10, - 124,1,124,12,124,8,103,1,124,2,161,5,2,0,1,0, - 83,0,113,150,116,17,124,8,131,1,125,3,124,0,106,14, - 68,0,93,86,92,2,125,9,125,10,116,13,124,0,106,2, - 124,4,124,9,23,0,131,2,125,12,116,18,106,19,100,6, - 124,12,100,3,100,7,141,3,1,0,124,7,124,9,23,0, - 124,6,107,6,144,1,114,54,116,15,124,12,131,1,144,1, - 114,54,124,0,160,16,124,10,124,1,124,12,100,8,124,2, - 161,5,2,0,1,0,83,0,113,224,124,3,144,1,114,98, - 116,18,160,19,100,9,124,8,161,2,1,0,116,18,160,20, - 124,1,100,8,161,2,125,13,124,8,103,1,124,13,95,21, - 124,13,83,0,100,8,83,0,41,10,122,111,84,114,121,32, - 116,111,32,102,105,110,100,32,97,32,115,112,101,99,32,102, - 111,114,32,116,104,101,32,115,112,101,99,105,102,105,101,100, - 32,109,111,100,117,108,101,46,10,10,32,32,32,32,32,32, - 32,32,82,101,116,117,114,110,115,32,116,104,101,32,109,97, - 116,99,104,105,110,103,32,115,112,101,99,44,32,111,114,32, - 78,111,110,101,32,105,102,32,110,111,116,32,102,111,117,110, - 100,46,10,32,32,32,32,32,32,32,32,70,114,71,0,0, - 0,114,28,0,0,0,114,105,0,0,0,114,209,0,0,0, - 122,9,116,114,121,105,110,103,32,123,125,41,1,90,9,118, - 101,114,98,111,115,105,116,121,78,122,25,112,111,115,115,105, - 98,108,101,32,110,97,109,101,115,112,97,99,101,32,102,111, - 114,32,123,125,41,22,114,41,0,0,0,114,49,0,0,0, - 114,44,0,0,0,114,2,0,0,0,114,55,0,0,0,114, - 10,1,0,0,114,50,0,0,0,114,82,1,0,0,218,11, - 95,102,105,108,108,95,99,97,99,104,101,114,7,0,0,0, - 114,85,1,0,0,114,106,0,0,0,114,84,1,0,0,114, - 38,0,0,0,114,81,1,0,0,114,54,0,0,0,114,58, - 1,0,0,114,56,0,0,0,114,134,0,0,0,114,149,0, - 0,0,114,183,0,0,0,114,178,0,0,0,41,14,114,119, - 0,0,0,114,139,0,0,0,114,202,0,0,0,90,12,105, - 115,95,110,97,109,101,115,112,97,99,101,90,11,116,97,105, - 108,95,109,111,100,117,108,101,114,169,0,0,0,90,5,99, - 97,99,104,101,90,12,99,97,99,104,101,95,109,111,100,117, - 108,101,90,9,98,97,115,101,95,112,97,116,104,114,17,1, - 0,0,114,188,0,0,0,90,13,105,110,105,116,95,102,105, - 108,101,110,97,109,101,90,9,102,117,108,108,95,112,97,116, - 104,114,187,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,203,0,0,0,185,5,0,0,115,74, - 0,0,0,0,5,4,1,14,1,2,1,24,1,14,1,10, - 1,10,1,8,1,6,2,6,1,6,1,10,2,6,1,4, - 2,8,1,12,1,14,1,8,1,10,1,8,1,26,4,8, - 2,14,1,16,1,16,1,14,1,10,1,10,1,2,0,2, - 255,10,2,6,1,12,1,12,1,8,1,4,1,122,20,70, - 105,108,101,70,105,110,100,101,114,46,102,105,110,100,95,115, - 112,101,99,99,1,0,0,0,0,0,0,0,0,0,0,0, - 9,0,0,0,10,0,0,0,67,0,0,0,115,190,0,0, - 0,124,0,106,0,125,1,122,22,116,1,160,2,124,1,112, - 22,116,1,160,3,161,0,161,1,125,2,87,0,110,30,4, - 0,116,4,116,5,116,6,102,3,107,10,114,58,1,0,1, - 0,1,0,103,0,125,2,89,0,110,2,88,0,116,7,106, - 8,160,9,100,1,161,1,115,84,116,10,124,2,131,1,124, - 0,95,11,110,74,116,10,131,0,125,3,124,2,68,0,93, - 56,125,4,124,4,160,12,100,2,161,1,92,3,125,5,125, - 6,125,7,124,6,114,136,100,3,160,13,124,5,124,7,160, - 14,161,0,161,2,125,8,110,4,124,5,125,8,124,3,160, - 15,124,8,161,1,1,0,113,94,124,3,124,0,95,11,116, - 7,106,8,160,9,116,16,161,1,114,186,100,4,100,5,132, - 0,124,2,68,0,131,1,124,0,95,17,100,6,83,0,41, - 7,122,68,70,105,108,108,32,116,104,101,32,99,97,99,104, - 101,32,111,102,32,112,111,116,101,110,116,105,97,108,32,109, - 111,100,117,108,101,115,32,97,110,100,32,112,97,99,107,97, - 103,101,115,32,102,111,114,32,116,104,105,115,32,100,105,114, - 101,99,116,111,114,121,46,114,0,0,0,0,114,71,0,0, - 0,114,61,0,0,0,99,1,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,4,0,0,0,83,0,0,0,115, - 20,0,0,0,104,0,124,0,93,12,125,1,124,1,160,0, - 161,0,146,2,113,4,83,0,114,3,0,0,0,41,1,114, - 106,0,0,0,41,2,114,32,0,0,0,90,2,102,110,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,9, - 60,115,101,116,99,111,109,112,62,6,6,0,0,115,4,0, - 0,0,6,0,2,0,122,41,70,105,108,101,70,105,110,100, - 101,114,46,95,102,105,108,108,95,99,97,99,104,101,46,60, - 108,111,99,97,108,115,62,46,60,115,101,116,99,111,109,112, - 62,78,41,18,114,44,0,0,0,114,2,0,0,0,114,7, - 1,0,0,114,55,0,0,0,114,3,1,0,0,218,15,80, - 101,114,109,105,115,115,105,111,110,69,114,114,111,114,218,18, - 78,111,116,65,68,105,114,101,99,116,111,114,121,69,114,114, - 111,114,114,8,0,0,0,114,9,0,0,0,114,10,0,0, - 0,114,83,1,0,0,114,84,1,0,0,114,101,0,0,0, - 114,62,0,0,0,114,106,0,0,0,218,3,97,100,100,114, - 11,0,0,0,114,85,1,0,0,41,9,114,119,0,0,0, - 114,44,0,0,0,114,8,1,0,0,90,21,108,111,119,101, - 114,95,115,117,102,102,105,120,95,99,111,110,116,101,110,116, - 115,114,41,1,0,0,114,117,0,0,0,114,29,1,0,0, - 114,17,1,0,0,90,8,110,101,119,95,110,97,109,101,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,87, - 1,0,0,233,5,0,0,115,34,0,0,0,0,2,6,1, - 2,1,22,1,20,3,10,3,12,1,12,7,6,1,8,1, - 16,1,4,1,18,2,4,1,12,1,6,1,12,1,122,22, - 70,105,108,101,70,105,110,100,101,114,46,95,102,105,108,108, - 95,99,97,99,104,101,99,1,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,3,0,0,0,7,0,0,0,115, - 18,0,0,0,135,0,135,1,102,2,100,1,100,2,132,8, - 125,2,124,2,83,0,41,3,97,20,1,0,0,65,32,99, - 108,97,115,115,32,109,101,116,104,111,100,32,119,104,105,99, - 104,32,114,101,116,117,114,110,115,32,97,32,99,108,111,115, - 117,114,101,32,116,111,32,117,115,101,32,111,110,32,115,121, - 115,46,112,97,116,104,95,104,111,111,107,10,32,32,32,32, - 32,32,32,32,119,104,105,99,104,32,119,105,108,108,32,114, - 101,116,117,114,110,32,97,110,32,105,110,115,116,97,110,99, - 101,32,117,115,105,110,103,32,116,104,101,32,115,112,101,99, - 105,102,105,101,100,32,108,111,97,100,101,114,115,32,97,110, - 100,32,116,104,101,32,112,97,116,104,10,32,32,32,32,32, - 32,32,32,99,97,108,108,101,100,32,111,110,32,116,104,101, - 32,99,108,111,115,117,114,101,46,10,10,32,32,32,32,32, - 32,32,32,73,102,32,116,104,101,32,112,97,116,104,32,99, - 97,108,108,101,100,32,111,110,32,116,104,101,32,99,108,111, - 115,117,114,101,32,105,115,32,110,111,116,32,97,32,100,105, - 114,101,99,116,111,114,121,44,32,73,109,112,111,114,116,69, - 114,114,111,114,32,105,115,10,32,32,32,32,32,32,32,32, - 114,97,105,115,101,100,46,10,10,32,32,32,32,32,32,32, - 32,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,4,0,0,0,19,0,0,0,115,34,0,0,0,116, - 0,124,0,131,1,115,20,116,1,100,1,124,0,100,2,141, - 2,130,1,136,0,124,0,102,1,136,1,158,2,142,0,83, - 0,41,3,122,45,80,97,116,104,32,104,111,111,107,32,102, - 111,114,32,105,109,112,111,114,116,108,105,98,46,109,97,99, - 104,105,110,101,114,121,46,70,105,108,101,70,105,110,100,101, - 114,46,122,30,111,110,108,121,32,100,105,114,101,99,116,111, - 114,105,101,115,32,97,114,101,32,115,117,112,112,111,114,116, - 101,100,114,48,0,0,0,41,2,114,56,0,0,0,114,118, - 0,0,0,114,48,0,0,0,169,2,114,193,0,0,0,114, - 86,1,0,0,114,3,0,0,0,114,6,0,0,0,218,24, - 112,97,116,104,95,104,111,111,107,95,102,111,114,95,70,105, - 108,101,70,105,110,100,101,114,18,6,0,0,115,6,0,0, - 0,0,2,8,1,12,1,122,54,70,105,108,101,70,105,110, - 100,101,114,46,112,97,116,104,95,104,111,111,107,46,60,108, - 111,99,97,108,115,62,46,112,97,116,104,95,104,111,111,107, - 95,102,111,114,95,70,105,108,101,70,105,110,100,101,114,114, - 3,0,0,0,41,3,114,193,0,0,0,114,86,1,0,0, - 114,93,1,0,0,114,3,0,0,0,114,92,1,0,0,114, - 6,0,0,0,218,9,112,97,116,104,95,104,111,111,107,8, - 6,0,0,115,4,0,0,0,0,10,14,6,122,20,70,105, - 108,101,70,105,110,100,101,114,46,112,97,116,104,95,104,111, - 111,107,99,1,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,3,0,0,0,67,0,0,0,115,12,0,0,0, - 100,1,160,0,124,0,106,1,161,1,83,0,41,2,78,122, - 16,70,105,108,101,70,105,110,100,101,114,40,123,33,114,125, - 41,41,2,114,62,0,0,0,114,44,0,0,0,114,246,0, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,39,1,0,0,26,6,0,0,115,2,0,0,0,0, - 1,122,19,70,105,108,101,70,105,110,100,101,114,46,95,95, - 114,101,112,114,95,95,41,1,78,41,15,114,125,0,0,0, - 114,124,0,0,0,114,126,0,0,0,114,127,0,0,0,114, - 209,0,0,0,114,46,1,0,0,114,143,0,0,0,114,206, - 0,0,0,114,137,0,0,0,114,58,1,0,0,114,203,0, - 0,0,114,87,1,0,0,114,207,0,0,0,114,94,1,0, - 0,114,39,1,0,0,114,3,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,79,1,0,0,139, - 5,0,0,115,22,0,0,0,8,2,4,7,8,14,8,4, - 4,2,8,12,8,5,10,48,8,31,2,1,10,17,114,79, - 1,0,0,99,4,0,0,0,0,0,0,0,0,0,0,0, - 6,0,0,0,8,0,0,0,67,0,0,0,115,146,0,0, - 0,124,0,160,0,100,1,161,1,125,4,124,0,160,0,100, - 2,161,1,125,5,124,4,115,66,124,5,114,36,124,5,106, - 1,125,4,110,30,124,2,124,3,107,2,114,56,116,2,124, - 1,124,2,131,2,125,4,110,10,116,3,124,1,124,2,131, - 2,125,4,124,5,115,84,116,4,124,1,124,2,124,4,100, - 3,141,3,125,5,122,36,124,5,124,0,100,2,60,0,124, - 4,124,0,100,1,60,0,124,2,124,0,100,4,60,0,124, - 3,124,0,100,5,60,0,87,0,110,20,4,0,116,5,107, - 10,114,140,1,0,1,0,1,0,89,0,110,2,88,0,100, - 0,83,0,41,6,78,218,10,95,95,108,111,97,100,101,114, - 95,95,218,8,95,95,115,112,101,99,95,95,114,80,1,0, - 0,90,8,95,95,102,105,108,101,95,95,90,10,95,95,99, - 97,99,104,101,100,95,95,41,6,218,3,103,101,116,114,140, - 0,0,0,114,15,1,0,0,114,9,1,0,0,114,190,0, - 0,0,114,72,1,0,0,41,6,90,2,110,115,114,117,0, - 0,0,90,8,112,97,116,104,110,97,109,101,90,9,99,112, - 97,116,104,110,97,109,101,114,140,0,0,0,114,187,0,0, + 0,4,0,0,0,19,0,0,0,115,34,0,0,0,116,0, + 124,0,131,1,115,20,116,1,100,1,124,0,100,2,141,2, + 130,1,136,0,124,0,102,1,136,1,158,2,142,0,83,0, + 41,3,122,45,80,97,116,104,32,104,111,111,107,32,102,111, + 114,32,105,109,112,111,114,116,108,105,98,46,109,97,99,104, + 105,110,101,114,121,46,70,105,108,101,70,105,110,100,101,114, + 46,122,30,111,110,108,121,32,100,105,114,101,99,116,111,114, + 105,101,115,32,97,114,101,32,115,117,112,112,111,114,116,101, + 100,114,48,0,0,0,41,2,114,56,0,0,0,114,118,0, + 0,0,114,48,0,0,0,169,2,114,193,0,0,0,114,86, + 1,0,0,114,3,0,0,0,114,6,0,0,0,218,24,112, + 97,116,104,95,104,111,111,107,95,102,111,114,95,70,105,108, + 101,70,105,110,100,101,114,18,6,0,0,115,6,0,0,0, + 0,2,8,1,12,1,122,54,70,105,108,101,70,105,110,100, + 101,114,46,112,97,116,104,95,104,111,111,107,46,60,108,111, + 99,97,108,115,62,46,112,97,116,104,95,104,111,111,107,95, + 102,111,114,95,70,105,108,101,70,105,110,100,101,114,114,3, + 0,0,0,41,3,114,193,0,0,0,114,86,1,0,0,114, + 93,1,0,0,114,3,0,0,0,114,92,1,0,0,114,6, + 0,0,0,218,9,112,97,116,104,95,104,111,111,107,8,6, + 0,0,115,4,0,0,0,0,10,14,6,122,20,70,105,108, + 101,70,105,110,100,101,114,46,112,97,116,104,95,104,111,111, + 107,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,3,0,0,0,67,0,0,0,115,12,0,0,0,100, + 1,160,0,124,0,106,1,161,1,83,0,41,2,78,122,16, + 70,105,108,101,70,105,110,100,101,114,40,123,33,114,125,41, + 41,2,114,62,0,0,0,114,44,0,0,0,114,246,0,0, 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 218,14,95,102,105,120,95,117,112,95,109,111,100,117,108,101, - 32,6,0,0,115,34,0,0,0,0,2,10,1,10,1,4, - 1,4,1,8,1,8,1,12,2,10,1,4,1,14,1,2, - 1,8,1,8,1,8,1,12,1,14,2,114,98,1,0,0, - 99,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,3,0,0,0,67,0,0,0,115,38,0,0,0,116,0, - 116,1,160,2,161,0,102,2,125,0,116,3,116,4,102,2, - 125,1,116,5,116,6,102,2,125,2,124,0,124,1,124,2, - 103,3,83,0,41,1,122,95,82,101,116,117,114,110,115,32, - 97,32,108,105,115,116,32,111,102,32,102,105,108,101,45,98, - 97,115,101,100,32,109,111,100,117,108,101,32,108,111,97,100, - 101,114,115,46,10,10,32,32,32,32,69,97,99,104,32,105, - 116,101,109,32,105,115,32,97,32,116,117,112,108,101,32,40, - 108,111,97,100,101,114,44,32,115,117,102,102,105,120,101,115, - 41,46,10,32,32,32,32,41,7,114,252,0,0,0,114,163, - 0,0,0,218,18,101,120,116,101,110,115,105,111,110,95,115, - 117,102,102,105,120,101,115,114,9,1,0,0,114,102,0,0, - 0,114,15,1,0,0,114,89,0,0,0,41,3,90,10,101, - 120,116,101,110,115,105,111,110,115,90,6,115,111,117,114,99, - 101,90,8,98,121,116,101,99,111,100,101,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,184,0,0,0,55, - 6,0,0,115,8,0,0,0,0,5,12,1,8,1,8,1, - 114,184,0,0,0,99,1,0,0,0,0,0,0,0,0,0, - 0,0,12,0,0,0,9,0,0,0,67,0,0,0,115,178, - 1,0,0,124,0,97,0,116,0,106,1,97,1,116,0,106, - 2,97,2,116,1,106,3,116,4,25,0,125,1,100,1,68, - 0,93,48,125,2,124,2,116,1,106,3,107,7,114,56,116, - 0,160,5,124,2,161,1,125,3,110,10,116,1,106,3,124, - 2,25,0,125,3,116,6,124,1,124,2,124,3,131,3,1, - 0,113,30,100,2,100,3,103,1,102,2,100,4,100,5,100, - 3,103,2,102,2,102,2,125,4,124,4,68,0,93,110,92, - 2,125,5,125,6,116,7,100,6,100,7,132,0,124,6,68, - 0,131,1,131,1,115,136,116,8,130,1,124,6,100,8,25, - 0,125,7,124,5,116,1,106,3,107,6,114,170,116,1,106, - 3,124,5,25,0,125,8,1,0,113,226,113,106,122,20,116, - 0,160,5,124,5,161,1,125,8,87,0,1,0,113,226,87, - 0,113,106,4,0,116,9,107,10,114,214,1,0,1,0,1, - 0,89,0,113,106,89,0,113,106,88,0,113,106,116,9,100, - 9,131,1,130,1,116,6,124,1,100,10,124,8,131,3,1, - 0,116,6,124,1,100,11,124,7,131,3,1,0,116,6,124, - 1,100,12,100,13,160,10,124,6,161,1,131,3,1,0,116, - 6,124,1,100,14,100,15,100,16,132,0,124,6,68,0,131, - 1,131,3,1,0,116,0,160,5,100,17,161,1,125,9,116, - 6,124,1,100,17,124,9,131,3,1,0,116,0,160,5,100, - 18,161,1,125,10,116,6,124,1,100,18,124,10,131,3,1, - 0,124,5,100,4,107,2,144,1,114,110,116,0,160,5,100, - 19,161,1,125,11,116,6,124,1,100,20,124,11,131,3,1, - 0,116,6,124,1,100,21,116,11,131,0,131,3,1,0,116, - 12,160,13,116,2,160,14,161,0,161,1,1,0,124,5,100, - 4,107,2,144,1,114,174,116,15,160,16,100,22,161,1,1, - 0,100,23,116,12,107,6,144,1,114,174,100,24,116,17,95, - 18,100,25,83,0,41,26,122,205,83,101,116,117,112,32,116, - 104,101,32,112,97,116,104,45,98,97,115,101,100,32,105,109, - 112,111,114,116,101,114,115,32,102,111,114,32,105,109,112,111, - 114,116,108,105,98,32,98,121,32,105,109,112,111,114,116,105, - 110,103,32,110,101,101,100,101,100,10,32,32,32,32,98,117, - 105,108,116,45,105,110,32,109,111,100,117,108,101,115,32,97, - 110,100,32,105,110,106,101,99,116,105,110,103,32,116,104,101, - 109,32,105,110,116,111,32,116,104,101,32,103,108,111,98,97, - 108,32,110,97,109,101,115,112,97,99,101,46,10,10,32,32, - 32,32,79,116,104,101,114,32,99,111,109,112,111,110,101,110, - 116,115,32,97,114,101,32,101,120,116,114,97,99,116,101,100, - 32,102,114,111,109,32,116,104,101,32,99,111,114,101,32,98, - 111,111,116,115,116,114,97,112,32,109,111,100,117,108,101,46, - 10,10,32,32,32,32,41,4,114,64,0,0,0,114,75,0, - 0,0,218,8,98,117,105,108,116,105,110,115,114,160,0,0, - 0,90,5,112,111,115,105,120,250,1,47,90,2,110,116,250, - 1,92,99,1,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,3,0,0,0,115,0,0,0,115,26,0,0,0, - 124,0,93,18,125,1,116,0,124,1,131,1,100,0,107,2, - 86,0,1,0,113,2,100,1,83,0,41,2,114,39,0,0, - 0,78,41,1,114,22,0,0,0,41,2,114,32,0,0,0, - 114,95,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,19,1,0,0,91,6,0,0,115,4,0, - 0,0,4,0,2,0,122,25,95,115,101,116,117,112,46,60, - 108,111,99,97,108,115,62,46,60,103,101,110,101,120,112,114, - 62,114,73,0,0,0,122,30,105,109,112,111,114,116,108,105, - 98,32,114,101,113,117,105,114,101,115,32,112,111,115,105,120, - 32,111,114,32,110,116,114,2,0,0,0,114,35,0,0,0, - 114,31,0,0,0,114,40,0,0,0,114,58,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 4,0,0,0,83,0,0,0,115,22,0,0,0,104,0,124, - 0,93,14,125,1,100,0,124,1,155,0,157,2,146,2,113, - 4,83,0,41,1,114,74,0,0,0,114,3,0,0,0,41, - 2,114,32,0,0,0,218,1,115,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,88,1,0,0,107,6,0, - 0,115,4,0,0,0,6,0,2,0,122,25,95,115,101,116, - 117,112,46,60,108,111,99,97,108,115,62,46,60,115,101,116, - 99,111,109,112,62,90,7,95,116,104,114,101,97,100,90,8, - 95,119,101,97,107,114,101,102,90,6,119,105,110,114,101,103, - 114,192,0,0,0,114,7,0,0,0,122,4,46,112,121,119, - 122,6,95,100,46,112,121,100,84,78,41,19,114,134,0,0, - 0,114,8,0,0,0,114,163,0,0,0,114,31,1,0,0, - 114,125,0,0,0,90,18,95,98,117,105,108,116,105,110,95, - 102,114,111,109,95,110,97,109,101,114,129,0,0,0,218,3, - 97,108,108,114,23,0,0,0,114,118,0,0,0,114,36,0, - 0,0,114,13,0,0,0,114,21,1,0,0,114,167,0,0, - 0,114,99,1,0,0,114,102,0,0,0,114,186,0,0,0, - 114,191,0,0,0,114,195,0,0,0,41,12,218,17,95,98, - 111,111,116,115,116,114,97,112,95,109,111,100,117,108,101,90, - 11,115,101,108,102,95,109,111,100,117,108,101,90,12,98,117, - 105,108,116,105,110,95,110,97,109,101,90,14,98,117,105,108, - 116,105,110,95,109,111,100,117,108,101,90,10,111,115,95,100, - 101,116,97,105,108,115,90,10,98,117,105,108,116,105,110,95, - 111,115,114,31,0,0,0,114,35,0,0,0,90,9,111,115, - 95,109,111,100,117,108,101,90,13,116,104,114,101,97,100,95, - 109,111,100,117,108,101,90,14,119,101,97,107,114,101,102,95, - 109,111,100,117,108,101,90,13,119,105,110,114,101,103,95,109, - 111,100,117,108,101,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,218,6,95,115,101,116,117,112,66,6,0,0, - 115,78,0,0,0,0,8,4,1,6,1,6,3,10,1,8, - 1,10,1,12,2,10,1,14,3,22,1,12,2,22,1,8, - 1,10,1,10,1,6,2,2,1,10,1,10,1,14,1,12, - 2,8,1,12,1,12,1,18,1,22,3,10,1,12,3,10, - 1,12,3,10,1,10,1,12,3,14,1,14,1,10,1,10, - 1,10,1,114,106,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,106,1,0,0,114,184,0, - 0,0,114,8,0,0,0,114,51,1,0,0,114,167,0,0, - 0,114,79,1,0,0,114,94,1,0,0,218,9,109,101,116, - 97,95,112,97,116,104,114,186,0,0,0,114,45,1,0,0, - 41,2,114,105,1,0,0,90,17,115,117,112,112,111,114,116, - 101,100,95,108,111,97,100,101,114,115,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,8,95,105,110,115,116, - 97,108,108,131,6,0,0,115,8,0,0,0,0,2,8,1, - 6,1,20,1,114,108,1,0,0,41,63,114,127,0,0,0, - 114,12,0,0,0,90,37,95,67,65,83,69,95,73,78,83, - 69,78,83,73,84,73,86,69,95,80,76,65,84,70,79,82, - 77,83,95,66,89,84,69,83,95,75,69,89,114,11,0,0, - 0,114,13,0,0,0,114,20,0,0,0,114,27,0,0,0, - 114,29,0,0,0,114,38,0,0,0,114,47,0,0,0,114, - 49,0,0,0,114,53,0,0,0,114,54,0,0,0,114,56, - 0,0,0,114,59,0,0,0,114,69,0,0,0,218,4,116, - 121,112,101,218,8,95,95,99,111,100,101,95,95,114,162,0, - 0,0,114,18,0,0,0,114,148,0,0,0,114,17,0,0, - 0,114,24,0,0,0,114,236,0,0,0,114,92,0,0,0, - 114,88,0,0,0,114,102,0,0,0,114,89,0,0,0,90, - 23,68,69,66,85,71,95,66,89,84,69,67,79,68,69,95, - 83,85,70,70,73,88,69,83,90,27,79,80,84,73,77,73, - 90,69,68,95,66,89,84,69,67,79,68,69,95,83,85,70, - 70,73,88,69,83,114,98,0,0,0,114,103,0,0,0,114, - 109,0,0,0,114,113,0,0,0,114,115,0,0,0,114,136, - 0,0,0,114,143,0,0,0,114,152,0,0,0,114,156,0, - 0,0,114,158,0,0,0,114,165,0,0,0,114,170,0,0, - 0,114,171,0,0,0,114,176,0,0,0,218,6,111,98,106, - 101,99,116,114,185,0,0,0,114,190,0,0,0,114,191,0, - 0,0,114,208,0,0,0,114,221,0,0,0,114,239,0,0, - 0,114,9,1,0,0,114,15,1,0,0,114,21,1,0,0, - 114,252,0,0,0,114,22,1,0,0,114,43,1,0,0,114, - 45,1,0,0,114,79,1,0,0,114,98,1,0,0,114,184, - 0,0,0,114,106,1,0,0,114,108,1,0,0,114,3,0, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,8,60,109,111,100,117,108,101,62,1,0,0,0,115, - 126,0,0,0,4,22,4,1,4,1,2,1,2,255,4,4, - 8,17,8,5,8,5,8,6,8,6,8,12,8,10,8,9, - 8,5,8,7,8,9,12,22,10,127,0,8,16,1,12,2, - 4,1,4,2,6,2,6,2,8,2,18,71,8,40,8,19, - 8,12,8,12,8,28,8,17,8,33,8,28,8,24,16,13, - 14,10,12,11,8,14,6,3,6,1,2,255,12,68,14,64, - 14,29,16,127,0,17,14,72,18,45,18,26,4,3,18,53, - 14,63,14,42,14,127,0,59,14,127,0,22,12,23,8,11, - 8,65, + 114,39,1,0,0,26,6,0,0,115,2,0,0,0,0,1, + 122,19,70,105,108,101,70,105,110,100,101,114,46,95,95,114, + 101,112,114,95,95,41,1,78,41,15,114,125,0,0,0,114, + 124,0,0,0,114,126,0,0,0,114,127,0,0,0,114,209, + 0,0,0,114,46,1,0,0,114,143,0,0,0,114,206,0, + 0,0,114,137,0,0,0,114,58,1,0,0,114,203,0,0, + 0,114,87,1,0,0,114,207,0,0,0,114,94,1,0,0, + 114,39,1,0,0,114,3,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,79,1,0,0,139,5, + 0,0,115,22,0,0,0,8,2,4,7,8,14,8,4,4, + 2,8,12,8,5,10,48,8,31,2,1,10,17,114,79,1, + 0,0,99,4,0,0,0,0,0,0,0,0,0,0,0,6, + 0,0,0,8,0,0,0,67,0,0,0,115,146,0,0,0, + 124,0,160,0,100,1,161,1,125,4,124,0,160,0,100,2, + 161,1,125,5,124,4,115,66,124,5,114,36,124,5,106,1, + 125,4,110,30,124,2,124,3,107,2,114,56,116,2,124,1, + 124,2,131,2,125,4,110,10,116,3,124,1,124,2,131,2, + 125,4,124,5,115,84,116,4,124,1,124,2,124,4,100,3, + 141,3,125,5,122,36,124,5,124,0,100,2,60,0,124,4, + 124,0,100,1,60,0,124,2,124,0,100,4,60,0,124,3, + 124,0,100,5,60,0,87,0,110,20,4,0,116,5,107,10, + 114,140,1,0,1,0,1,0,89,0,110,2,88,0,100,0, + 83,0,41,6,78,218,10,95,95,108,111,97,100,101,114,95, + 95,218,8,95,95,115,112,101,99,95,95,114,80,1,0,0, + 90,8,95,95,102,105,108,101,95,95,90,10,95,95,99,97, + 99,104,101,100,95,95,41,6,218,3,103,101,116,114,140,0, + 0,0,114,15,1,0,0,114,9,1,0,0,114,190,0,0, + 0,114,72,1,0,0,41,6,90,2,110,115,114,117,0,0, + 0,90,8,112,97,116,104,110,97,109,101,90,9,99,112,97, + 116,104,110,97,109,101,114,140,0,0,0,114,187,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, + 14,95,102,105,120,95,117,112,95,109,111,100,117,108,101,32, + 6,0,0,115,34,0,0,0,0,2,10,1,10,1,4,1, + 4,1,8,1,8,1,12,2,10,1,4,1,14,1,2,1, + 8,1,8,1,8,1,12,1,14,2,114,98,1,0,0,99, + 0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 3,0,0,0,67,0,0,0,115,38,0,0,0,116,0,116, + 1,160,2,161,0,102,2,125,0,116,3,116,4,102,2,125, + 1,116,5,116,6,102,2,125,2,124,0,124,1,124,2,103, + 3,83,0,41,1,122,95,82,101,116,117,114,110,115,32,97, + 32,108,105,115,116,32,111,102,32,102,105,108,101,45,98,97, + 115,101,100,32,109,111,100,117,108,101,32,108,111,97,100,101, + 114,115,46,10,10,32,32,32,32,69,97,99,104,32,105,116, + 101,109,32,105,115,32,97,32,116,117,112,108,101,32,40,108, + 111,97,100,101,114,44,32,115,117,102,102,105,120,101,115,41, + 46,10,32,32,32,32,41,7,114,252,0,0,0,114,163,0, + 0,0,218,18,101,120,116,101,110,115,105,111,110,95,115,117, + 102,102,105,120,101,115,114,9,1,0,0,114,102,0,0,0, + 114,15,1,0,0,114,89,0,0,0,41,3,90,10,101,120, + 116,101,110,115,105,111,110,115,90,6,115,111,117,114,99,101, + 90,8,98,121,116,101,99,111,100,101,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,184,0,0,0,55,6, + 0,0,115,8,0,0,0,0,5,12,1,8,1,8,1,114, + 184,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,12,0,0,0,9,0,0,0,67,0,0,0,115,178,1, + 0,0,124,0,97,0,116,0,106,1,97,1,116,0,106,2, + 97,2,116,1,106,3,116,4,25,0,125,1,100,1,68,0, + 93,48,125,2,124,2,116,1,106,3,107,7,114,56,116,0, + 160,5,124,2,161,1,125,3,110,10,116,1,106,3,124,2, + 25,0,125,3,116,6,124,1,124,2,124,3,131,3,1,0, + 113,30,100,2,100,3,103,1,102,2,100,4,100,5,100,3, + 103,2,102,2,102,2,125,4,124,4,68,0,93,110,92,2, + 125,5,125,6,116,7,100,6,100,7,132,0,124,6,68,0, + 131,1,131,1,115,136,116,8,130,1,124,6,100,8,25,0, + 125,7,124,5,116,1,106,3,107,6,114,170,116,1,106,3, + 124,5,25,0,125,8,1,0,113,226,113,106,122,20,116,0, + 160,5,124,5,161,1,125,8,87,0,1,0,113,226,87,0, + 113,106,4,0,116,9,107,10,114,214,1,0,1,0,1,0, + 89,0,113,106,89,0,113,106,88,0,113,106,116,9,100,9, + 131,1,130,1,116,6,124,1,100,10,124,8,131,3,1,0, + 116,6,124,1,100,11,124,7,131,3,1,0,116,6,124,1, + 100,12,100,13,160,10,124,6,161,1,131,3,1,0,116,6, + 124,1,100,14,100,15,100,16,132,0,124,6,68,0,131,1, + 131,3,1,0,116,0,160,5,100,17,161,1,125,9,116,6, + 124,1,100,17,124,9,131,3,1,0,116,0,160,5,100,18, + 161,1,125,10,116,6,124,1,100,18,124,10,131,3,1,0, + 124,5,100,4,107,2,144,1,114,110,116,0,160,5,100,19, + 161,1,125,11,116,6,124,1,100,20,124,11,131,3,1,0, + 116,6,124,1,100,21,116,11,131,0,131,3,1,0,116,12, + 160,13,116,2,160,14,161,0,161,1,1,0,124,5,100,4, + 107,2,144,1,114,174,116,15,160,16,100,22,161,1,1,0, + 100,23,116,12,107,6,144,1,114,174,100,24,116,17,95,18, + 100,25,83,0,41,26,122,205,83,101,116,117,112,32,116,104, + 101,32,112,97,116,104,45,98,97,115,101,100,32,105,109,112, + 111,114,116,101,114,115,32,102,111,114,32,105,109,112,111,114, + 116,108,105,98,32,98,121,32,105,109,112,111,114,116,105,110, + 103,32,110,101,101,100,101,100,10,32,32,32,32,98,117,105, + 108,116,45,105,110,32,109,111,100,117,108,101,115,32,97,110, + 100,32,105,110,106,101,99,116,105,110,103,32,116,104,101,109, + 32,105,110,116,111,32,116,104,101,32,103,108,111,98,97,108, + 32,110,97,109,101,115,112,97,99,101,46,10,10,32,32,32, + 32,79,116,104,101,114,32,99,111,109,112,111,110,101,110,116, + 115,32,97,114,101,32,101,120,116,114,97,99,116,101,100,32, + 102,114,111,109,32,116,104,101,32,99,111,114,101,32,98,111, + 111,116,115,116,114,97,112,32,109,111,100,117,108,101,46,10, + 10,32,32,32,32,41,4,114,64,0,0,0,114,75,0,0, + 0,218,8,98,117,105,108,116,105,110,115,114,160,0,0,0, + 90,5,112,111,115,105,120,250,1,47,90,2,110,116,250,1, + 92,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,3,0,0,0,115,0,0,0,115,26,0,0,0,124, + 0,93,18,125,1,116,0,124,1,131,1,100,0,107,2,86, + 0,1,0,113,2,100,1,83,0,41,2,114,39,0,0,0, + 78,41,1,114,22,0,0,0,41,2,114,32,0,0,0,114, + 95,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,114,19,1,0,0,91,6,0,0,115,4,0,0, + 0,4,0,2,0,122,25,95,115,101,116,117,112,46,60,108, + 111,99,97,108,115,62,46,60,103,101,110,101,120,112,114,62, + 114,73,0,0,0,122,30,105,109,112,111,114,116,108,105,98, + 32,114,101,113,117,105,114,101,115,32,112,111,115,105,120,32, + 111,114,32,110,116,114,2,0,0,0,114,35,0,0,0,114, + 31,0,0,0,114,40,0,0,0,114,58,0,0,0,99,1, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,4, + 0,0,0,83,0,0,0,115,22,0,0,0,104,0,124,0, + 93,14,125,1,100,0,124,1,155,0,157,2,146,2,113,4, + 83,0,41,1,114,74,0,0,0,114,3,0,0,0,41,2, + 114,32,0,0,0,218,1,115,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,88,1,0,0,107,6,0,0, + 115,4,0,0,0,6,0,2,0,122,25,95,115,101,116,117, + 112,46,60,108,111,99,97,108,115,62,46,60,115,101,116,99, + 111,109,112,62,90,7,95,116,104,114,101,97,100,90,8,95, + 119,101,97,107,114,101,102,90,6,119,105,110,114,101,103,114, + 192,0,0,0,114,7,0,0,0,122,4,46,112,121,119,122, + 6,95,100,46,112,121,100,84,78,41,19,114,134,0,0,0, + 114,8,0,0,0,114,163,0,0,0,114,31,1,0,0,114, + 125,0,0,0,90,18,95,98,117,105,108,116,105,110,95,102, + 114,111,109,95,110,97,109,101,114,129,0,0,0,218,3,97, + 108,108,114,23,0,0,0,114,118,0,0,0,114,36,0,0, + 0,114,13,0,0,0,114,21,1,0,0,114,167,0,0,0, + 114,99,1,0,0,114,102,0,0,0,114,186,0,0,0,114, + 191,0,0,0,114,195,0,0,0,41,12,218,17,95,98,111, + 111,116,115,116,114,97,112,95,109,111,100,117,108,101,90,11, + 115,101,108,102,95,109,111,100,117,108,101,90,12,98,117,105, + 108,116,105,110,95,110,97,109,101,90,14,98,117,105,108,116, + 105,110,95,109,111,100,117,108,101,90,10,111,115,95,100,101, + 116,97,105,108,115,90,10,98,117,105,108,116,105,110,95,111, + 115,114,31,0,0,0,114,35,0,0,0,90,9,111,115,95, + 109,111,100,117,108,101,90,13,116,104,114,101,97,100,95,109, + 111,100,117,108,101,90,14,119,101,97,107,114,101,102,95,109, + 111,100,117,108,101,90,13,119,105,110,114,101,103,95,109,111, + 100,117,108,101,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,218,6,95,115,101,116,117,112,66,6,0,0,115, + 78,0,0,0,0,8,4,1,6,1,6,3,10,1,8,1, + 10,1,12,2,10,1,14,3,22,1,12,2,22,1,8,1, + 10,1,10,1,6,2,2,1,10,1,10,1,14,1,12,2, + 8,1,12,1,12,1,18,1,22,3,10,1,12,3,10,1, + 12,3,10,1,10,1,12,3,14,1,14,1,10,1,10,1, + 10,1,114,106,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,106,1,0,0,114,184,0,0, + 0,114,8,0,0,0,114,51,1,0,0,114,167,0,0,0, + 114,79,1,0,0,114,94,1,0,0,218,9,109,101,116,97, + 95,112,97,116,104,114,186,0,0,0,114,45,1,0,0,41, + 2,114,105,1,0,0,90,17,115,117,112,112,111,114,116,101, + 100,95,108,111,97,100,101,114,115,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,8,95,105,110,115,116,97, + 108,108,131,6,0,0,115,8,0,0,0,0,2,8,1,6, + 1,20,1,114,108,1,0,0,41,1,114,60,0,0,0,41, + 1,78,41,3,78,78,78,41,2,114,73,0,0,0,114,73, + 0,0,0,41,1,84,41,1,78,41,1,78,41,63,114,127, + 0,0,0,114,12,0,0,0,90,37,95,67,65,83,69,95, + 73,78,83,69,78,83,73,84,73,86,69,95,80,76,65,84, + 70,79,82,77,83,95,66,89,84,69,83,95,75,69,89,114, + 11,0,0,0,114,13,0,0,0,114,20,0,0,0,114,27, + 0,0,0,114,29,0,0,0,114,38,0,0,0,114,47,0, + 0,0,114,49,0,0,0,114,53,0,0,0,114,54,0,0, + 0,114,56,0,0,0,114,59,0,0,0,114,69,0,0,0, + 218,4,116,121,112,101,218,8,95,95,99,111,100,101,95,95, + 114,162,0,0,0,114,18,0,0,0,114,148,0,0,0,114, + 17,0,0,0,114,24,0,0,0,114,236,0,0,0,114,92, + 0,0,0,114,88,0,0,0,114,102,0,0,0,114,89,0, + 0,0,90,23,68,69,66,85,71,95,66,89,84,69,67,79, + 68,69,95,83,85,70,70,73,88,69,83,90,27,79,80,84, + 73,77,73,90,69,68,95,66,89,84,69,67,79,68,69,95, + 83,85,70,70,73,88,69,83,114,98,0,0,0,114,103,0, + 0,0,114,109,0,0,0,114,113,0,0,0,114,115,0,0, + 0,114,136,0,0,0,114,143,0,0,0,114,152,0,0,0, + 114,156,0,0,0,114,158,0,0,0,114,165,0,0,0,114, + 170,0,0,0,114,171,0,0,0,114,176,0,0,0,218,6, + 111,98,106,101,99,116,114,185,0,0,0,114,190,0,0,0, + 114,191,0,0,0,114,208,0,0,0,114,221,0,0,0,114, + 239,0,0,0,114,9,1,0,0,114,15,1,0,0,114,21, + 1,0,0,114,252,0,0,0,114,22,1,0,0,114,43,1, + 0,0,114,45,1,0,0,114,79,1,0,0,114,98,1,0, + 0,114,184,0,0,0,114,106,1,0,0,114,108,1,0,0, + 114,3,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,218,8,60,109,111,100,117,108,101,62,1,0, + 0,0,115,126,0,0,0,4,22,4,1,4,1,2,1,2, + 255,4,4,8,17,8,5,8,5,8,6,8,6,8,12,8, + 10,8,9,8,5,8,7,8,9,10,22,10,127,0,8,16, + 1,12,2,4,1,4,2,6,2,6,2,8,2,16,71,8, + 40,8,19,8,12,8,12,8,28,8,17,8,33,8,28,8, + 24,10,13,10,10,10,11,8,14,6,3,4,1,2,255,12, + 68,14,64,14,29,16,127,0,17,14,72,18,45,18,26,4, + 3,18,53,14,63,14,42,14,127,0,59,14,127,0,22,10, + 23,8,11,8,65, }; diff --git a/Python/importlib_zipimport.h b/Python/importlib_zipimport.h index cbb3d909a10b..056e85d343d8 100644 --- a/Python/importlib_zipimport.h +++ b/Python/importlib_zipimport.h @@ -783,301 +783,301 @@ const unsigned char _Py_M__zipimport[] = { 0,0,0,218,9,95,101,113,95,109,116,105,109,101,65,2, 0,0,115,2,0,0,0,0,2,114,147,0,0,0,99,5, 0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,8, - 0,0,0,67,0,0,0,115,68,1,0,0,124,3,124,2, + 0,0,0,67,0,0,0,115,60,1,0,0,124,3,124,2, 100,1,156,2,125,5,122,18,116,0,160,1,124,4,124,3, - 124,5,161,3,125,6,87,0,110,26,4,0,116,2,107,10, - 114,54,1,0,1,0,1,0,89,0,100,0,83,0,89,0, - 110,2,88,0,124,6,100,2,64,0,100,3,107,3,125,7, - 124,7,114,190,124,6,100,4,64,0,100,3,107,3,125,8, - 116,3,106,4,100,5,107,3,114,188,124,8,115,108,116,3, - 106,4,100,6,107,2,114,188,116,5,124,0,124,2,131,2, - 125,9,124,9,100,0,107,9,114,188,116,3,160,6,116,0, - 106,7,124,9,161,2,125,10,122,20,116,8,160,9,124,4, - 124,10,124,3,124,5,161,4,1,0,87,0,110,26,4,0, - 116,2,107,10,114,186,1,0,1,0,1,0,89,0,100,0, - 83,0,89,0,110,2,88,0,110,84,116,10,124,0,124,2, - 131,2,92,2,125,11,125,12,124,11,144,1,114,18,116,11, - 116,12,124,4,100,7,100,8,133,2,25,0,131,1,124,11, - 131,2,114,254,116,12,124,4,100,8,100,9,133,2,25,0, - 131,1,124,12,107,3,144,1,114,18,116,13,160,14,100,10, - 124,3,155,2,157,2,161,1,1,0,100,0,83,0,116,15, - 160,16,124,4,100,9,100,0,133,2,25,0,161,1,125,13, - 116,17,124,13,116,18,131,2,144,1,115,64,116,19,100,11, - 124,1,155,2,100,12,157,3,131,1,130,1,124,13,83,0, - 41,13,78,41,2,114,59,0,0,0,114,13,0,0,0,114, - 5,0,0,0,114,0,0,0,0,114,86,0,0,0,90,5, - 110,101,118,101,114,90,6,97,108,119,97,121,115,114,99,0, - 0,0,114,94,0,0,0,114,95,0,0,0,122,22,98,121, - 116,101,99,111,100,101,32,105,115,32,115,116,97,108,101,32, - 102,111,114,32,122,16,99,111,109,112,105,108,101,100,32,109, - 111,100,117,108,101,32,122,21,32,105,115,32,110,111,116,32, - 97,32,99,111,100,101,32,111,98,106,101,99,116,41,20,114, - 21,0,0,0,90,13,95,99,108,97,115,115,105,102,121,95, - 112,121,99,114,75,0,0,0,218,4,95,105,109,112,90,21, - 99,104,101,99,107,95,104,97,115,104,95,98,97,115,101,100, - 95,112,121,99,115,218,15,95,103,101,116,95,112,121,99,95, - 115,111,117,114,99,101,218,11,115,111,117,114,99,101,95,104, - 97,115,104,90,17,95,82,65,87,95,77,65,71,73,67,95, - 78,85,77,66,69,82,90,18,95,98,111,111,115,116,114,97, - 112,95,101,120,116,101,114,110,97,108,90,18,95,118,97,108, - 105,100,97,116,101,95,104,97,115,104,95,112,121,99,218,29, - 95,103,101,116,95,109,116,105,109,101,95,97,110,100,95,115, - 105,122,101,95,111,102,95,115,111,117,114,99,101,114,147,0, - 0,0,114,2,0,0,0,114,76,0,0,0,114,77,0,0, - 0,218,7,109,97,114,115,104,97,108,90,5,108,111,97,100, - 115,114,15,0,0,0,218,10,95,99,111,100,101,95,116,121, - 112,101,218,9,84,121,112,101,69,114,114,111,114,41,14,114, - 32,0,0,0,114,53,0,0,0,114,63,0,0,0,114,38, - 0,0,0,114,126,0,0,0,90,11,101,120,99,95,100,101, - 116,97,105,108,115,114,129,0,0,0,90,10,104,97,115,104, - 95,98,97,115,101,100,90,12,99,104,101,99,107,95,115,111, - 117,114,99,101,90,12,115,111,117,114,99,101,95,98,121,116, - 101,115,114,150,0,0,0,90,12,115,111,117,114,99,101,95, - 109,116,105,109,101,90,11,115,111,117,114,99,101,95,115,105, - 122,101,114,46,0,0,0,114,9,0,0,0,114,9,0,0, - 0,114,10,0,0,0,218,15,95,117,110,109,97,114,115,104, - 97,108,95,99,111,100,101,75,2,0,0,115,88,0,0,0, - 0,2,2,1,2,254,6,5,2,1,18,1,14,1,12,2, - 12,1,4,1,12,1,10,1,2,255,2,1,8,255,2,2, - 10,1,8,1,4,1,4,1,2,254,4,5,2,1,4,1, - 2,0,2,0,2,0,2,255,8,2,14,1,14,3,8,255, - 6,3,6,3,22,1,18,255,4,2,4,1,8,255,4,2, - 4,2,18,1,12,1,16,1,114,155,0,0,0,99,1,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0, - 0,0,67,0,0,0,115,28,0,0,0,124,0,160,0,100, - 1,100,2,161,2,125,0,124,0,160,0,100,3,100,2,161, - 2,125,0,124,0,83,0,41,4,78,115,2,0,0,0,13, - 10,243,1,0,0,0,10,243,1,0,0,0,13,41,1,114, - 19,0,0,0,41,1,218,6,115,111,117,114,99,101,114,9, - 0,0,0,114,9,0,0,0,114,10,0,0,0,218,23,95, - 110,111,114,109,97,108,105,122,101,95,108,105,110,101,95,101, - 110,100,105,110,103,115,126,2,0,0,115,6,0,0,0,0, - 1,12,1,12,1,114,159,0,0,0,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,6,0,0,0,67, - 0,0,0,115,24,0,0,0,116,0,124,1,131,1,125,1, - 116,1,124,1,124,0,100,1,100,2,100,3,141,4,83,0, - 41,4,78,114,74,0,0,0,84,41,1,90,12,100,111,110, - 116,95,105,110,104,101,114,105,116,41,2,114,159,0,0,0, - 218,7,99,111,109,112,105,108,101,41,2,114,53,0,0,0, - 114,158,0,0,0,114,9,0,0,0,114,9,0,0,0,114, - 10,0,0,0,218,15,95,99,111,109,112,105,108,101,95,115, - 111,117,114,99,101,133,2,0,0,115,4,0,0,0,0,1, - 8,1,114,161,0,0,0,99,2,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,11,0,0,0,67,0,0,0, - 115,68,0,0,0,116,0,160,1,124,0,100,1,63,0,100, - 2,23,0,124,0,100,3,63,0,100,4,64,0,124,0,100, - 5,64,0,124,1,100,6,63,0,124,1,100,3,63,0,100, - 7,64,0,124,1,100,5,64,0,100,8,20,0,100,9,100, - 9,100,9,102,9,161,1,83,0,41,10,78,233,9,0,0, - 0,105,188,7,0,0,233,5,0,0,0,233,15,0,0,0, - 233,31,0,0,0,233,11,0,0,0,233,63,0,0,0,114, - 86,0,0,0,114,14,0,0,0,41,2,114,131,0,0,0, - 90,6,109,107,116,105,109,101,41,2,218,1,100,114,138,0, - 0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, - 0,218,14,95,112,97,114,115,101,95,100,111,115,116,105,109, - 101,139,2,0,0,115,22,0,0,0,0,1,4,1,10,1, - 10,1,6,1,6,1,10,1,10,1,2,0,2,0,2,249, - 114,169,0,0,0,99,2,0,0,0,0,0,0,0,0,0, - 0,0,6,0,0,0,10,0,0,0,67,0,0,0,115,116, - 0,0,0,122,82,124,1,100,1,100,0,133,2,25,0,100, - 2,107,6,115,22,116,0,130,1,124,1,100,0,100,1,133, - 2,25,0,125,1,124,0,106,1,124,1,25,0,125,2,124, - 2,100,3,25,0,125,3,124,2,100,4,25,0,125,4,124, - 2,100,5,25,0,125,5,116,2,124,4,124,3,131,2,124, - 5,102,2,87,0,83,0,4,0,116,3,116,4,116,5,102, - 3,107,10,114,110,1,0,1,0,1,0,89,0,100,6,83, - 0,88,0,100,0,83,0,41,7,78,114,14,0,0,0,169, - 2,218,1,99,218,1,111,114,163,0,0,0,233,6,0,0, - 0,233,3,0,0,0,41,2,114,0,0,0,0,114,0,0, - 0,0,41,6,218,14,65,115,115,101,114,116,105,111,110,69, - 114,114,111,114,114,28,0,0,0,114,169,0,0,0,114,26, - 0,0,0,218,10,73,110,100,101,120,69,114,114,111,114,114, - 154,0,0,0,41,6,114,32,0,0,0,114,13,0,0,0, - 114,54,0,0,0,114,131,0,0,0,114,132,0,0,0,90, - 17,117,110,99,111,109,112,114,101,115,115,101,100,95,115,105, - 122,101,114,9,0,0,0,114,9,0,0,0,114,10,0,0, - 0,114,151,0,0,0,152,2,0,0,115,20,0,0,0,0, - 1,2,2,20,1,12,1,10,3,8,1,8,1,8,1,16, - 1,20,1,114,151,0,0,0,99,2,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,8,0,0,0,67,0,0, - 0,115,86,0,0,0,124,1,100,1,100,0,133,2,25,0, - 100,2,107,6,115,20,116,0,130,1,124,1,100,0,100,1, - 133,2,25,0,125,1,122,14,124,0,106,1,124,1,25,0, - 125,2,87,0,110,22,4,0,116,2,107,10,114,68,1,0, - 1,0,1,0,89,0,100,0,83,0,88,0,116,3,124,0, - 106,4,124,2,131,2,83,0,100,0,83,0,41,3,78,114, - 14,0,0,0,114,170,0,0,0,41,5,114,175,0,0,0, - 114,28,0,0,0,114,26,0,0,0,114,52,0,0,0,114, - 29,0,0,0,41,3,114,32,0,0,0,114,13,0,0,0, - 114,54,0,0,0,114,9,0,0,0,114,9,0,0,0,114, - 10,0,0,0,114,149,0,0,0,171,2,0,0,115,14,0, - 0,0,0,2,20,1,12,2,2,1,14,1,14,1,8,2, - 114,149,0,0,0,99,2,0,0,0,0,0,0,0,0,0, - 0,0,11,0,0,0,9,0,0,0,67,0,0,0,115,198, - 0,0,0,116,0,124,0,124,1,131,2,125,2,116,1,68, - 0,93,160,92,3,125,3,125,4,125,5,124,2,124,3,23, - 0,125,6,116,2,106,3,100,1,124,0,106,4,116,5,124, - 6,100,2,100,3,141,5,1,0,122,14,124,0,106,6,124, - 6,25,0,125,7,87,0,110,20,4,0,116,7,107,10,114, - 88,1,0,1,0,1,0,89,0,113,14,88,0,124,7,100, - 4,25,0,125,8,116,8,124,0,106,4,124,7,131,2,125, - 9,124,4,114,132,116,9,124,0,124,8,124,6,124,1,124, - 9,131,5,125,10,110,10,116,10,124,8,124,9,131,2,125, - 10,124,10,100,0,107,8,114,152,113,14,124,7,100,4,25, - 0,125,8,124,10,124,5,124,8,102,3,2,0,1,0,83, - 0,113,14,116,11,100,5,124,1,155,2,157,2,124,1,100, - 6,141,2,130,1,100,0,83,0,41,7,78,122,13,116,114, - 121,105,110,103,32,123,125,123,125,123,125,114,86,0,0,0, - 41,1,90,9,118,101,114,98,111,115,105,116,121,114,0,0, - 0,0,114,57,0,0,0,114,58,0,0,0,41,12,114,36, - 0,0,0,114,89,0,0,0,114,76,0,0,0,114,77,0, - 0,0,114,29,0,0,0,114,20,0,0,0,114,28,0,0, - 0,114,26,0,0,0,114,52,0,0,0,114,155,0,0,0, - 114,161,0,0,0,114,3,0,0,0,41,11,114,32,0,0, - 0,114,38,0,0,0,114,13,0,0,0,114,90,0,0,0, - 114,91,0,0,0,114,47,0,0,0,114,63,0,0,0,114, - 54,0,0,0,114,40,0,0,0,114,126,0,0,0,114,46, - 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, - 0,0,114,44,0,0,0,186,2,0,0,115,36,0,0,0, - 0,1,10,1,14,1,8,1,22,1,2,1,14,1,14,1, - 6,2,8,1,12,1,4,1,18,2,10,1,8,3,2,1, - 8,1,16,2,114,44,0,0,0,99,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,64,0, - 0,0,115,60,0,0,0,101,0,90,1,100,0,90,2,100, - 1,90,3,100,2,90,4,100,3,100,4,132,0,90,5,100, - 5,100,6,132,0,90,6,100,7,100,8,132,0,90,7,100, - 9,100,10,132,0,90,8,100,11,100,12,132,0,90,9,100, - 13,83,0,41,14,114,80,0,0,0,122,165,80,114,105,118, - 97,116,101,32,99,108,97,115,115,32,117,115,101,100,32,116, - 111,32,115,117,112,112,111,114,116,32,90,105,112,73,109,112, - 111,114,116,46,103,101,116,95,114,101,115,111,117,114,99,101, - 95,114,101,97,100,101,114,40,41,46,10,10,32,32,32,32, - 84,104,105,115,32,99,108,97,115,115,32,105,115,32,97,108, - 108,111,119,101,100,32,116,111,32,114,101,102,101,114,101,110, - 99,101,32,97,108,108,32,116,104,101,32,105,110,110,97,114, - 100,115,32,97,110,100,32,112,114,105,118,97,116,101,32,112, - 97,114,116,115,32,111,102,10,32,32,32,32,116,104,101,32, - 122,105,112,105,109,112,111,114,116,101,114,46,10,32,32,32, - 32,70,99,3,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,2,0,0,0,67,0,0,0,115,16,0,0,0, - 124,1,124,0,95,0,124,2,124,0,95,1,100,0,83,0, - 114,88,0,0,0,41,2,114,4,0,0,0,114,38,0,0, - 0,41,3,114,32,0,0,0,114,4,0,0,0,114,38,0, - 0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, - 0,114,34,0,0,0,220,2,0,0,115,4,0,0,0,0, - 1,6,1,122,33,95,90,105,112,73,109,112,111,114,116,82, - 101,115,111,117,114,99,101,82,101,97,100,101,114,46,95,95, - 105,110,105,116,95,95,99,2,0,0,0,0,0,0,0,0, - 0,0,0,5,0,0,0,8,0,0,0,67,0,0,0,115, - 92,0,0,0,124,0,106,0,160,1,100,1,100,2,161,2, - 125,2,124,2,155,0,100,2,124,1,155,0,157,3,125,3, - 100,3,100,4,108,2,109,3,125,4,1,0,122,18,124,4, - 124,0,106,4,160,5,124,3,161,1,131,1,87,0,83,0, - 4,0,116,6,107,10,114,86,1,0,1,0,1,0,116,7, - 124,3,131,1,130,1,89,0,110,2,88,0,100,0,83,0, - 41,5,78,114,85,0,0,0,114,109,0,0,0,114,0,0, - 0,0,41,1,218,7,66,121,116,101,115,73,79,41,8,114, - 38,0,0,0,114,19,0,0,0,90,2,105,111,114,177,0, - 0,0,114,4,0,0,0,114,55,0,0,0,114,22,0,0, - 0,218,17,70,105,108,101,78,111,116,70,111,117,110,100,69, - 114,114,111,114,41,5,114,32,0,0,0,218,8,114,101,115, - 111,117,114,99,101,218,16,102,117,108,108,110,97,109,101,95, - 97,115,95,112,97,116,104,114,13,0,0,0,114,177,0,0, - 0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, - 218,13,111,112,101,110,95,114,101,115,111,117,114,99,101,224, - 2,0,0,115,14,0,0,0,0,1,14,1,14,1,12,1, - 2,1,18,1,14,1,122,38,95,90,105,112,73,109,112,111, - 114,116,82,101,115,111,117,114,99,101,82,101,97,100,101,114, - 46,111,112,101,110,95,114,101,115,111,117,114,99,101,99,2, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1, - 0,0,0,67,0,0,0,115,8,0,0,0,116,0,130,1, - 100,0,83,0,114,88,0,0,0,41,1,114,178,0,0,0, - 41,2,114,32,0,0,0,114,179,0,0,0,114,9,0,0, - 0,114,9,0,0,0,114,10,0,0,0,218,13,114,101,115, - 111,117,114,99,101,95,112,97,116,104,233,2,0,0,115,2, - 0,0,0,0,4,122,38,95,90,105,112,73,109,112,111,114, - 116,82,101,115,111,117,114,99,101,82,101,97,100,101,114,46, - 114,101,115,111,117,114,99,101,95,112,97,116,104,99,2,0, - 0,0,0,0,0,0,0,0,0,0,4,0,0,0,8,0, - 0,0,67,0,0,0,115,72,0,0,0,124,0,106,0,160, - 1,100,1,100,2,161,2,125,2,124,2,155,0,100,2,124, - 1,155,0,157,3,125,3,122,16,124,0,106,2,160,3,124, - 3,161,1,1,0,87,0,110,22,4,0,116,4,107,10,114, - 66,1,0,1,0,1,0,89,0,100,3,83,0,88,0,100, - 4,83,0,41,5,78,114,85,0,0,0,114,109,0,0,0, - 70,84,41,5,114,38,0,0,0,114,19,0,0,0,114,4, - 0,0,0,114,55,0,0,0,114,22,0,0,0,41,4,114, - 32,0,0,0,114,59,0,0,0,114,180,0,0,0,114,13, - 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, - 0,0,218,11,105,115,95,114,101,115,111,117,114,99,101,239, - 2,0,0,115,14,0,0,0,0,3,14,1,14,1,2,1, - 16,1,14,1,8,1,122,36,95,90,105,112,73,109,112,111, - 114,116,82,101,115,111,117,114,99,101,82,101,97,100,101,114, - 46,105,115,95,114,101,115,111,117,114,99,101,99,1,0,0, - 0,0,0,0,0,0,0,0,0,9,0,0,0,9,0,0, - 0,99,0,0,0,115,186,0,0,0,100,1,100,2,108,0, - 109,1,125,1,1,0,124,1,124,0,106,2,160,3,124,0, - 106,4,161,1,131,1,125,2,124,2,160,5,124,0,106,2, - 106,6,161,1,125,3,124,3,106,7,100,3,107,2,115,58, - 116,8,130,1,124,3,106,9,125,4,116,10,131,0,125,5, - 124,0,106,2,106,11,68,0,93,102,125,6,122,18,124,1, - 124,6,131,1,160,5,124,4,161,1,125,7,87,0,110,24, - 4,0,116,12,107,10,114,124,1,0,1,0,1,0,89,0, - 113,78,89,0,110,2,88,0,124,7,106,9,106,7,125,8, - 116,13,124,8,131,1,100,1,107,2,114,156,124,7,106,7, - 86,0,1,0,113,78,124,8,124,5,107,7,114,78,124,5, - 160,14,124,8,161,1,1,0,124,8,86,0,1,0,113,78, - 100,0,83,0,41,4,78,114,0,0,0,0,41,1,218,4, - 80,97,116,104,114,60,0,0,0,41,15,90,7,112,97,116, - 104,108,105,98,114,184,0,0,0,114,4,0,0,0,114,56, - 0,0,0,114,38,0,0,0,90,11,114,101,108,97,116,105, - 118,101,95,116,111,114,29,0,0,0,114,59,0,0,0,114, - 175,0,0,0,90,6,112,97,114,101,110,116,218,3,115,101, - 116,114,28,0,0,0,114,23,0,0,0,114,51,0,0,0, - 218,3,97,100,100,41,9,114,32,0,0,0,114,184,0,0, - 0,90,13,102,117,108,108,110,97,109,101,95,112,97,116,104, - 90,13,114,101,108,97,116,105,118,101,95,112,97,116,104,90, - 12,112,97,99,107,97,103,101,95,112,97,116,104,90,12,115, - 117,98,100,105,114,115,95,115,101,101,110,218,8,102,105,108, - 101,110,97,109,101,90,8,114,101,108,97,116,105,118,101,90, - 11,112,97,114,101,110,116,95,110,97,109,101,114,9,0,0, - 0,114,9,0,0,0,114,10,0,0,0,218,8,99,111,110, - 116,101,110,116,115,250,2,0,0,115,34,0,0,0,0,8, - 12,1,18,1,14,3,14,1,6,1,6,1,12,1,2,1, - 18,1,14,1,10,5,8,1,12,1,10,1,8,1,10,1, - 122,33,95,90,105,112,73,109,112,111,114,116,82,101,115,111, - 117,114,99,101,82,101,97,100,101,114,46,99,111,110,116,101, - 110,116,115,78,41,10,114,6,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,84,0,0,0,114,81,0,0,0,114, - 34,0,0,0,114,181,0,0,0,114,182,0,0,0,114,183, - 0,0,0,114,188,0,0,0,114,9,0,0,0,114,9,0, - 0,0,114,9,0,0,0,114,10,0,0,0,114,80,0,0, - 0,212,2,0,0,115,14,0,0,0,8,1,4,5,4,2, - 8,4,8,9,8,6,8,11,114,80,0,0,0,41,45,114, - 84,0,0,0,90,26,95,102,114,111,122,101,110,95,105,109, - 112,111,114,116,108,105,98,95,101,120,116,101,114,110,97,108, - 114,21,0,0,0,114,1,0,0,0,114,2,0,0,0,90, - 17,95,102,114,111,122,101,110,95,105,109,112,111,114,116,108, - 105,98,114,76,0,0,0,114,148,0,0,0,114,110,0,0, - 0,114,152,0,0,0,114,67,0,0,0,114,131,0,0,0, - 90,7,95,95,97,108,108,95,95,114,20,0,0,0,90,15, - 112,97,116,104,95,115,101,112,97,114,97,116,111,114,115,114, - 18,0,0,0,114,75,0,0,0,114,3,0,0,0,114,25, - 0,0,0,218,4,116,121,112,101,114,70,0,0,0,114,113, - 0,0,0,114,115,0,0,0,114,117,0,0,0,114,4,0, - 0,0,114,89,0,0,0,114,36,0,0,0,114,37,0,0, - 0,114,35,0,0,0,114,27,0,0,0,114,122,0,0,0, - 114,142,0,0,0,114,144,0,0,0,114,52,0,0,0,114, - 147,0,0,0,114,155,0,0,0,218,8,95,95,99,111,100, - 101,95,95,114,153,0,0,0,114,159,0,0,0,114,161,0, - 0,0,114,169,0,0,0,114,151,0,0,0,114,149,0,0, - 0,114,44,0,0,0,114,80,0,0,0,114,9,0,0,0, - 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, - 8,60,109,111,100,117,108,101,62,1,0,0,0,115,88,0, - 0,0,4,16,8,1,16,1,8,1,8,1,8,1,8,1, - 8,1,8,2,8,3,6,1,14,3,16,4,4,2,8,2, - 4,1,4,1,4,2,14,127,0,127,0,1,12,1,12,1, - 2,1,2,252,4,9,8,4,8,9,8,31,8,126,2,254, - 2,29,4,5,8,21,8,46,8,10,8,46,10,5,8,7, - 8,6,8,13,8,19,8,15,8,26, + 124,5,161,3,125,6,87,0,110,22,4,0,116,2,107,10, + 114,50,1,0,1,0,1,0,89,0,100,0,83,0,88,0, + 124,6,100,2,64,0,100,3,107,3,125,7,124,7,114,182, + 124,6,100,4,64,0,100,3,107,3,125,8,116,3,106,4, + 100,5,107,3,114,180,124,8,115,104,116,3,106,4,100,6, + 107,2,114,180,116,5,124,0,124,2,131,2,125,9,124,9, + 100,0,107,9,114,180,116,3,160,6,116,0,106,7,124,9, + 161,2,125,10,122,20,116,8,160,9,124,4,124,10,124,3, + 124,5,161,4,1,0,87,0,110,22,4,0,116,2,107,10, + 114,178,1,0,1,0,1,0,89,0,100,0,83,0,88,0, + 110,84,116,10,124,0,124,2,131,2,92,2,125,11,125,12, + 124,11,144,1,114,10,116,11,116,12,124,4,100,7,100,8, + 133,2,25,0,131,1,124,11,131,2,114,246,116,12,124,4, + 100,8,100,9,133,2,25,0,131,1,124,12,107,3,144,1, + 114,10,116,13,160,14,100,10,124,3,155,2,157,2,161,1, + 1,0,100,0,83,0,116,15,160,16,124,4,100,9,100,0, + 133,2,25,0,161,1,125,13,116,17,124,13,116,18,131,2, + 144,1,115,56,116,19,100,11,124,1,155,2,100,12,157,3, + 131,1,130,1,124,13,83,0,41,13,78,41,2,114,59,0, + 0,0,114,13,0,0,0,114,5,0,0,0,114,0,0,0, + 0,114,86,0,0,0,90,5,110,101,118,101,114,90,6,97, + 108,119,97,121,115,114,99,0,0,0,114,94,0,0,0,114, + 95,0,0,0,122,22,98,121,116,101,99,111,100,101,32,105, + 115,32,115,116,97,108,101,32,102,111,114,32,122,16,99,111, + 109,112,105,108,101,100,32,109,111,100,117,108,101,32,122,21, + 32,105,115,32,110,111,116,32,97,32,99,111,100,101,32,111, + 98,106,101,99,116,41,20,114,21,0,0,0,90,13,95,99, + 108,97,115,115,105,102,121,95,112,121,99,114,75,0,0,0, + 218,4,95,105,109,112,90,21,99,104,101,99,107,95,104,97, + 115,104,95,98,97,115,101,100,95,112,121,99,115,218,15,95, + 103,101,116,95,112,121,99,95,115,111,117,114,99,101,218,11, + 115,111,117,114,99,101,95,104,97,115,104,90,17,95,82,65, + 87,95,77,65,71,73,67,95,78,85,77,66,69,82,90,18, + 95,98,111,111,115,116,114,97,112,95,101,120,116,101,114,110, + 97,108,90,18,95,118,97,108,105,100,97,116,101,95,104,97, + 115,104,95,112,121,99,218,29,95,103,101,116,95,109,116,105, + 109,101,95,97,110,100,95,115,105,122,101,95,111,102,95,115, + 111,117,114,99,101,114,147,0,0,0,114,2,0,0,0,114, + 76,0,0,0,114,77,0,0,0,218,7,109,97,114,115,104, + 97,108,90,5,108,111,97,100,115,114,15,0,0,0,218,10, + 95,99,111,100,101,95,116,121,112,101,218,9,84,121,112,101, + 69,114,114,111,114,41,14,114,32,0,0,0,114,53,0,0, + 0,114,63,0,0,0,114,38,0,0,0,114,126,0,0,0, + 90,11,101,120,99,95,100,101,116,97,105,108,115,114,129,0, + 0,0,90,10,104,97,115,104,95,98,97,115,101,100,90,12, + 99,104,101,99,107,95,115,111,117,114,99,101,90,12,115,111, + 117,114,99,101,95,98,121,116,101,115,114,150,0,0,0,90, + 12,115,111,117,114,99,101,95,109,116,105,109,101,90,11,115, + 111,117,114,99,101,95,115,105,122,101,114,46,0,0,0,114, + 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,15, + 95,117,110,109,97,114,115,104,97,108,95,99,111,100,101,75, + 2,0,0,115,88,0,0,0,0,2,2,1,2,254,6,5, + 2,1,18,1,14,1,8,2,12,1,4,1,12,1,10,1, + 2,255,2,1,8,255,2,2,10,1,8,1,4,1,4,1, + 2,254,4,5,2,1,4,1,2,0,2,0,2,0,2,255, + 8,2,14,1,10,3,8,255,6,3,6,3,22,1,18,255, + 4,2,4,1,8,255,4,2,4,2,18,1,12,1,16,1, + 114,155,0,0,0,99,1,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,4,0,0,0,67,0,0,0,115,28, + 0,0,0,124,0,160,0,100,1,100,2,161,2,125,0,124, + 0,160,0,100,3,100,2,161,2,125,0,124,0,83,0,41, + 4,78,115,2,0,0,0,13,10,243,1,0,0,0,10,243, + 1,0,0,0,13,41,1,114,19,0,0,0,41,1,218,6, + 115,111,117,114,99,101,114,9,0,0,0,114,9,0,0,0, + 114,10,0,0,0,218,23,95,110,111,114,109,97,108,105,122, + 101,95,108,105,110,101,95,101,110,100,105,110,103,115,126,2, + 0,0,115,6,0,0,0,0,1,12,1,12,1,114,159,0, + 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,6,0,0,0,67,0,0,0,115,24,0,0,0, + 116,0,124,1,131,1,125,1,116,1,124,1,124,0,100,1, + 100,2,100,3,141,4,83,0,41,4,78,114,74,0,0,0, + 84,41,1,90,12,100,111,110,116,95,105,110,104,101,114,105, + 116,41,2,114,159,0,0,0,218,7,99,111,109,112,105,108, + 101,41,2,114,53,0,0,0,114,158,0,0,0,114,9,0, + 0,0,114,9,0,0,0,114,10,0,0,0,218,15,95,99, + 111,109,112,105,108,101,95,115,111,117,114,99,101,133,2,0, + 0,115,4,0,0,0,0,1,8,1,114,161,0,0,0,99, + 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 11,0,0,0,67,0,0,0,115,68,0,0,0,116,0,160, + 1,124,0,100,1,63,0,100,2,23,0,124,0,100,3,63, + 0,100,4,64,0,124,0,100,5,64,0,124,1,100,6,63, + 0,124,1,100,3,63,0,100,7,64,0,124,1,100,5,64, + 0,100,8,20,0,100,9,100,9,100,9,102,9,161,1,83, + 0,41,10,78,233,9,0,0,0,105,188,7,0,0,233,5, + 0,0,0,233,15,0,0,0,233,31,0,0,0,233,11,0, + 0,0,233,63,0,0,0,114,86,0,0,0,114,14,0,0, + 0,41,2,114,131,0,0,0,90,6,109,107,116,105,109,101, + 41,2,218,1,100,114,138,0,0,0,114,9,0,0,0,114, + 9,0,0,0,114,10,0,0,0,218,14,95,112,97,114,115, + 101,95,100,111,115,116,105,109,101,139,2,0,0,115,22,0, + 0,0,0,1,4,1,10,1,10,1,6,1,6,1,10,1, + 10,1,2,0,2,0,2,249,114,169,0,0,0,99,2,0, + 0,0,0,0,0,0,0,0,0,0,6,0,0,0,10,0, + 0,0,67,0,0,0,115,116,0,0,0,122,82,124,1,100, + 1,100,0,133,2,25,0,100,2,107,6,115,22,116,0,130, + 1,124,1,100,0,100,1,133,2,25,0,125,1,124,0,106, + 1,124,1,25,0,125,2,124,2,100,3,25,0,125,3,124, + 2,100,4,25,0,125,4,124,2,100,5,25,0,125,5,116, + 2,124,4,124,3,131,2,124,5,102,2,87,0,83,0,4, + 0,116,3,116,4,116,5,102,3,107,10,114,110,1,0,1, + 0,1,0,89,0,100,6,83,0,88,0,100,0,83,0,41, + 7,78,114,14,0,0,0,169,2,218,1,99,218,1,111,114, + 163,0,0,0,233,6,0,0,0,233,3,0,0,0,41,2, + 114,0,0,0,0,114,0,0,0,0,41,6,218,14,65,115, + 115,101,114,116,105,111,110,69,114,114,111,114,114,28,0,0, + 0,114,169,0,0,0,114,26,0,0,0,218,10,73,110,100, + 101,120,69,114,114,111,114,114,154,0,0,0,41,6,114,32, + 0,0,0,114,13,0,0,0,114,54,0,0,0,114,131,0, + 0,0,114,132,0,0,0,90,17,117,110,99,111,109,112,114, + 101,115,115,101,100,95,115,105,122,101,114,9,0,0,0,114, + 9,0,0,0,114,10,0,0,0,114,151,0,0,0,152,2, + 0,0,115,20,0,0,0,0,1,2,2,20,1,12,1,10, + 3,8,1,8,1,8,1,16,1,20,1,114,151,0,0,0, + 99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,8,0,0,0,67,0,0,0,115,86,0,0,0,124,1, + 100,1,100,0,133,2,25,0,100,2,107,6,115,20,116,0, + 130,1,124,1,100,0,100,1,133,2,25,0,125,1,122,14, + 124,0,106,1,124,1,25,0,125,2,87,0,110,22,4,0, + 116,2,107,10,114,68,1,0,1,0,1,0,89,0,100,0, + 83,0,88,0,116,3,124,0,106,4,124,2,131,2,83,0, + 100,0,83,0,41,3,78,114,14,0,0,0,114,170,0,0, + 0,41,5,114,175,0,0,0,114,28,0,0,0,114,26,0, + 0,0,114,52,0,0,0,114,29,0,0,0,41,3,114,32, + 0,0,0,114,13,0,0,0,114,54,0,0,0,114,9,0, + 0,0,114,9,0,0,0,114,10,0,0,0,114,149,0,0, + 0,171,2,0,0,115,14,0,0,0,0,2,20,1,12,2, + 2,1,14,1,14,1,8,2,114,149,0,0,0,99,2,0, + 0,0,0,0,0,0,0,0,0,0,11,0,0,0,9,0, + 0,0,67,0,0,0,115,198,0,0,0,116,0,124,0,124, + 1,131,2,125,2,116,1,68,0,93,160,92,3,125,3,125, + 4,125,5,124,2,124,3,23,0,125,6,116,2,106,3,100, + 1,124,0,106,4,116,5,124,6,100,2,100,3,141,5,1, + 0,122,14,124,0,106,6,124,6,25,0,125,7,87,0,110, + 20,4,0,116,7,107,10,114,88,1,0,1,0,1,0,89, + 0,113,14,88,0,124,7,100,4,25,0,125,8,116,8,124, + 0,106,4,124,7,131,2,125,9,124,4,114,132,116,9,124, + 0,124,8,124,6,124,1,124,9,131,5,125,10,110,10,116, + 10,124,8,124,9,131,2,125,10,124,10,100,0,107,8,114, + 152,113,14,124,7,100,4,25,0,125,8,124,10,124,5,124, + 8,102,3,2,0,1,0,83,0,113,14,116,11,100,5,124, + 1,155,2,157,2,124,1,100,6,141,2,130,1,100,0,83, + 0,41,7,78,122,13,116,114,121,105,110,103,32,123,125,123, + 125,123,125,114,86,0,0,0,41,1,90,9,118,101,114,98, + 111,115,105,116,121,114,0,0,0,0,114,57,0,0,0,114, + 58,0,0,0,41,12,114,36,0,0,0,114,89,0,0,0, + 114,76,0,0,0,114,77,0,0,0,114,29,0,0,0,114, + 20,0,0,0,114,28,0,0,0,114,26,0,0,0,114,52, + 0,0,0,114,155,0,0,0,114,161,0,0,0,114,3,0, + 0,0,41,11,114,32,0,0,0,114,38,0,0,0,114,13, + 0,0,0,114,90,0,0,0,114,91,0,0,0,114,47,0, + 0,0,114,63,0,0,0,114,54,0,0,0,114,40,0,0, + 0,114,126,0,0,0,114,46,0,0,0,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,114,44,0,0,0,186, + 2,0,0,115,36,0,0,0,0,1,10,1,14,1,8,1, + 22,1,2,1,14,1,14,1,6,2,8,1,12,1,4,1, + 18,2,10,1,8,3,2,1,8,1,16,2,114,44,0,0, + 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,64,0,0,0,115,60,0,0,0,101, + 0,90,1,100,0,90,2,100,1,90,3,100,2,90,4,100, + 3,100,4,132,0,90,5,100,5,100,6,132,0,90,6,100, + 7,100,8,132,0,90,7,100,9,100,10,132,0,90,8,100, + 11,100,12,132,0,90,9,100,13,83,0,41,14,114,80,0, + 0,0,122,165,80,114,105,118,97,116,101,32,99,108,97,115, + 115,32,117,115,101,100,32,116,111,32,115,117,112,112,111,114, + 116,32,90,105,112,73,109,112,111,114,116,46,103,101,116,95, + 114,101,115,111,117,114,99,101,95,114,101,97,100,101,114,40, + 41,46,10,10,32,32,32,32,84,104,105,115,32,99,108,97, + 115,115,32,105,115,32,97,108,108,111,119,101,100,32,116,111, + 32,114,101,102,101,114,101,110,99,101,32,97,108,108,32,116, + 104,101,32,105,110,110,97,114,100,115,32,97,110,100,32,112, + 114,105,118,97,116,101,32,112,97,114,116,115,32,111,102,10, + 32,32,32,32,116,104,101,32,122,105,112,105,109,112,111,114, + 116,101,114,46,10,32,32,32,32,70,99,3,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,2,0,0,0,67, + 0,0,0,115,16,0,0,0,124,1,124,0,95,0,124,2, + 124,0,95,1,100,0,83,0,114,88,0,0,0,41,2,114, + 4,0,0,0,114,38,0,0,0,41,3,114,32,0,0,0, + 114,4,0,0,0,114,38,0,0,0,114,9,0,0,0,114, + 9,0,0,0,114,10,0,0,0,114,34,0,0,0,220,2, + 0,0,115,4,0,0,0,0,1,6,1,122,33,95,90,105, + 112,73,109,112,111,114,116,82,101,115,111,117,114,99,101,82, + 101,97,100,101,114,46,95,95,105,110,105,116,95,95,99,2, + 0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,8, + 0,0,0,67,0,0,0,115,92,0,0,0,124,0,106,0, + 160,1,100,1,100,2,161,2,125,2,124,2,155,0,100,2, + 124,1,155,0,157,3,125,3,100,3,100,4,108,2,109,3, + 125,4,1,0,122,18,124,4,124,0,106,4,160,5,124,3, + 161,1,131,1,87,0,83,0,4,0,116,6,107,10,114,86, + 1,0,1,0,1,0,116,7,124,3,131,1,130,1,89,0, + 110,2,88,0,100,0,83,0,41,5,78,114,85,0,0,0, + 114,109,0,0,0,114,0,0,0,0,41,1,218,7,66,121, + 116,101,115,73,79,41,8,114,38,0,0,0,114,19,0,0, + 0,90,2,105,111,114,177,0,0,0,114,4,0,0,0,114, + 55,0,0,0,114,22,0,0,0,218,17,70,105,108,101,78, + 111,116,70,111,117,110,100,69,114,114,111,114,41,5,114,32, + 0,0,0,218,8,114,101,115,111,117,114,99,101,218,16,102, + 117,108,108,110,97,109,101,95,97,115,95,112,97,116,104,114, + 13,0,0,0,114,177,0,0,0,114,9,0,0,0,114,9, + 0,0,0,114,10,0,0,0,218,13,111,112,101,110,95,114, + 101,115,111,117,114,99,101,224,2,0,0,115,14,0,0,0, + 0,1,14,1,14,1,12,1,2,1,18,1,14,1,122,38, + 95,90,105,112,73,109,112,111,114,116,82,101,115,111,117,114, + 99,101,82,101,97,100,101,114,46,111,112,101,110,95,114,101, + 115,111,117,114,99,101,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, + 8,0,0,0,116,0,130,1,100,0,83,0,114,88,0,0, + 0,41,1,114,178,0,0,0,41,2,114,32,0,0,0,114, + 179,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, + 0,0,0,218,13,114,101,115,111,117,114,99,101,95,112,97, + 116,104,233,2,0,0,115,2,0,0,0,0,4,122,38,95, + 90,105,112,73,109,112,111,114,116,82,101,115,111,117,114,99, + 101,82,101,97,100,101,114,46,114,101,115,111,117,114,99,101, + 95,112,97,116,104,99,2,0,0,0,0,0,0,0,0,0, + 0,0,4,0,0,0,8,0,0,0,67,0,0,0,115,72, + 0,0,0,124,0,106,0,160,1,100,1,100,2,161,2,125, + 2,124,2,155,0,100,2,124,1,155,0,157,3,125,3,122, + 16,124,0,106,2,160,3,124,3,161,1,1,0,87,0,110, + 22,4,0,116,4,107,10,114,66,1,0,1,0,1,0,89, + 0,100,3,83,0,88,0,100,4,83,0,41,5,78,114,85, + 0,0,0,114,109,0,0,0,70,84,41,5,114,38,0,0, + 0,114,19,0,0,0,114,4,0,0,0,114,55,0,0,0, + 114,22,0,0,0,41,4,114,32,0,0,0,114,59,0,0, + 0,114,180,0,0,0,114,13,0,0,0,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,218,11,105,115,95,114, + 101,115,111,117,114,99,101,239,2,0,0,115,14,0,0,0, + 0,3,14,1,14,1,2,1,16,1,14,1,8,1,122,36, + 95,90,105,112,73,109,112,111,114,116,82,101,115,111,117,114, + 99,101,82,101,97,100,101,114,46,105,115,95,114,101,115,111, + 117,114,99,101,99,1,0,0,0,0,0,0,0,0,0,0, + 0,9,0,0,0,9,0,0,0,99,0,0,0,115,186,0, + 0,0,100,1,100,2,108,0,109,1,125,1,1,0,124,1, + 124,0,106,2,160,3,124,0,106,4,161,1,131,1,125,2, + 124,2,160,5,124,0,106,2,106,6,161,1,125,3,124,3, + 106,7,100,3,107,2,115,58,116,8,130,1,124,3,106,9, + 125,4,116,10,131,0,125,5,124,0,106,2,106,11,68,0, + 93,102,125,6,122,18,124,1,124,6,131,1,160,5,124,4, + 161,1,125,7,87,0,110,24,4,0,116,12,107,10,114,124, + 1,0,1,0,1,0,89,0,113,78,89,0,110,2,88,0, + 124,7,106,9,106,7,125,8,116,13,124,8,131,1,100,1, + 107,2,114,156,124,7,106,7,86,0,1,0,113,78,124,8, + 124,5,107,7,114,78,124,5,160,14,124,8,161,1,1,0, + 124,8,86,0,1,0,113,78,100,0,83,0,41,4,78,114, + 0,0,0,0,41,1,218,4,80,97,116,104,114,60,0,0, + 0,41,15,90,7,112,97,116,104,108,105,98,114,184,0,0, + 0,114,4,0,0,0,114,56,0,0,0,114,38,0,0,0, + 90,11,114,101,108,97,116,105,118,101,95,116,111,114,29,0, + 0,0,114,59,0,0,0,114,175,0,0,0,90,6,112,97, + 114,101,110,116,218,3,115,101,116,114,28,0,0,0,114,23, + 0,0,0,114,51,0,0,0,218,3,97,100,100,41,9,114, + 32,0,0,0,114,184,0,0,0,90,13,102,117,108,108,110, + 97,109,101,95,112,97,116,104,90,13,114,101,108,97,116,105, + 118,101,95,112,97,116,104,90,12,112,97,99,107,97,103,101, + 95,112,97,116,104,90,12,115,117,98,100,105,114,115,95,115, + 101,101,110,218,8,102,105,108,101,110,97,109,101,90,8,114, + 101,108,97,116,105,118,101,90,11,112,97,114,101,110,116,95, + 110,97,109,101,114,9,0,0,0,114,9,0,0,0,114,10, + 0,0,0,218,8,99,111,110,116,101,110,116,115,250,2,0, + 0,115,34,0,0,0,0,8,12,1,18,1,14,3,14,1, + 6,1,6,1,12,1,2,1,18,1,14,1,10,5,8,1, + 12,1,10,1,8,1,10,1,122,33,95,90,105,112,73,109, + 112,111,114,116,82,101,115,111,117,114,99,101,82,101,97,100, + 101,114,46,99,111,110,116,101,110,116,115,78,41,10,114,6, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,84,0, + 0,0,114,81,0,0,0,114,34,0,0,0,114,181,0,0, + 0,114,182,0,0,0,114,183,0,0,0,114,188,0,0,0, + 114,9,0,0,0,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,114,80,0,0,0,212,2,0,0,115,14,0, + 0,0,8,1,4,5,4,2,8,4,8,9,8,6,8,11, + 114,80,0,0,0,41,45,114,84,0,0,0,90,26,95,102, + 114,111,122,101,110,95,105,109,112,111,114,116,108,105,98,95, + 101,120,116,101,114,110,97,108,114,21,0,0,0,114,1,0, + 0,0,114,2,0,0,0,90,17,95,102,114,111,122,101,110, + 95,105,109,112,111,114,116,108,105,98,114,76,0,0,0,114, + 148,0,0,0,114,110,0,0,0,114,152,0,0,0,114,67, + 0,0,0,114,131,0,0,0,90,7,95,95,97,108,108,95, + 95,114,20,0,0,0,90,15,112,97,116,104,95,115,101,112, + 97,114,97,116,111,114,115,114,18,0,0,0,114,75,0,0, + 0,114,3,0,0,0,114,25,0,0,0,218,4,116,121,112, + 101,114,70,0,0,0,114,113,0,0,0,114,115,0,0,0, + 114,117,0,0,0,114,4,0,0,0,114,89,0,0,0,114, + 36,0,0,0,114,37,0,0,0,114,35,0,0,0,114,27, + 0,0,0,114,122,0,0,0,114,142,0,0,0,114,144,0, + 0,0,114,52,0,0,0,114,147,0,0,0,114,155,0,0, + 0,218,8,95,95,99,111,100,101,95,95,114,153,0,0,0, + 114,159,0,0,0,114,161,0,0,0,114,169,0,0,0,114, + 151,0,0,0,114,149,0,0,0,114,44,0,0,0,114,80, + 0,0,0,114,9,0,0,0,114,9,0,0,0,114,9,0, + 0,0,114,10,0,0,0,218,8,60,109,111,100,117,108,101, + 62,1,0,0,0,115,88,0,0,0,4,16,8,1,16,1, + 8,1,8,1,8,1,8,1,8,1,8,2,8,3,6,1, + 14,3,16,4,4,2,8,2,4,1,4,1,4,2,14,127, + 0,127,0,1,12,1,12,1,2,1,2,252,4,9,8,4, + 8,9,8,31,8,126,2,254,2,29,4,5,8,21,8,46, + 8,10,8,46,10,5,8,7,8,6,8,13,8,19,8,15, + 8,26, }; diff --git a/Python/peephole.c b/Python/peephole.c index 1ce3535626e9..6f3e2ed88b2b 100644 --- a/Python/peephole.c +++ b/Python/peephole.c @@ -250,12 +250,16 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, lnotab = (unsigned char*)PyBytes_AS_STRING(lnotab_obj); tabsiz = PyBytes_GET_SIZE(lnotab_obj); assert(tabsiz == 0 || Py_REFCNT(lnotab_obj) == 1); - if (memchr(lnotab, 255, tabsiz) != NULL) { - /* 255 value are used for multibyte bytecode instructions */ - goto exitUnchanged; + + /* Don't optimize if lnotab contains instruction pointer delta larger + than +255 (encoded as multiple bytes), just to keep the peephole optimizer + simple. The optimizer leaves line number deltas unchanged. */ + + for (j = 0; j < tabsiz; j += 2) { + if (lnotab[j] == 255) { + goto exitUnchanged; + } } - /* Note: -128 and 127 special values for line number delta are ok, - the peephole optimizer doesn't modify line numbers. */ assert(PyBytes_Check(code)); Py_ssize_t codesize = PyBytes_GET_SIZE(code); From webhook-mailer at python.org Thu Jun 13 16:41:48 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Thu, 13 Jun 2019 20:41:48 -0000 Subject: [Python-checkins] bpo-36710: Pass explicitly tstate in sysmodule.c (GH-14060) Message-ID: https://github.com/python/cpython/commit/838f26402de82640698c38ea9d2be65c6cf780d6 commit: 838f26402de82640698c38ea9d2be65c6cf780d6 branch: master author: Victor Stinner committer: GitHub date: 2019-06-13T22:41:23+02:00 summary: bpo-36710: Pass explicitly tstate in sysmodule.c (GH-14060) * Replace global var Py_VerboseFlag with interp->config.verbose. * Add _PyErr_NoMemory(tstate) function. * Add tstate parameter to _PyEval_SetCoroutineOriginTrackingDepth() and move the function to the internal API. * Replace _PySys_InitMain(runtime, interp) with _PySys_InitMain(runtime, tstate). files: M Include/ceval.h M Include/internal/pycore_ceval.h M Include/internal/pycore_pyerrors.h M Include/internal/pycore_pylifecycle.h M Python/ceval.c M Python/errors.c M Python/pylifecycle.c M Python/sysmodule.c diff --git a/Include/ceval.h b/Include/ceval.h index 36fd014a91a7..e78194d51237 100644 --- a/Include/ceval.h +++ b/Include/ceval.h @@ -31,7 +31,6 @@ PyAPI_FUNC(PyObject *) PyEval_CallMethod(PyObject *obj, #ifndef Py_LIMITED_API PyAPI_FUNC(void) PyEval_SetProfile(Py_tracefunc, PyObject *); PyAPI_FUNC(void) PyEval_SetTrace(Py_tracefunc, PyObject *); -PyAPI_FUNC(void) _PyEval_SetCoroutineOriginTrackingDepth(int new_depth); PyAPI_FUNC(int) _PyEval_GetCoroutineOriginTrackingDepth(void); PyAPI_FUNC(void) _PyEval_SetAsyncGenFirstiter(PyObject *); PyAPI_FUNC(PyObject *) _PyEval_GetAsyncGenFirstiter(void); diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index 4c1c0e2439ee..30cd6c9e09e4 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -27,6 +27,9 @@ PyAPI_FUNC(void) _PyEval_SignalAsyncExc( struct _ceval_runtime_state *ceval); PyAPI_FUNC(void) _PyEval_ReInitThreads( _PyRuntimeState *runtime); +PyAPI_FUNC(void) _PyEval_SetCoroutineOriginTrackingDepth( + PyThreadState *tstate, + int new_depth); /* Private function */ void _PyEval_Fini(void); diff --git a/Include/internal/pycore_pyerrors.h b/Include/internal/pycore_pyerrors.h index 23327ef78397..2efbf4a62f81 100644 --- a/Include/internal/pycore_pyerrors.h +++ b/Include/internal/pycore_pyerrors.h @@ -39,6 +39,8 @@ PyAPI_FUNC(void) _PyErr_Clear(PyThreadState *tstate); PyAPI_FUNC(void) _PyErr_SetNone(PyThreadState *tstate, PyObject *exception); +PyAPI_FUNC(PyObject *) _PyErr_NoMemory(PyThreadState *tstate); + PyAPI_FUNC(void) _PyErr_SetString( PyThreadState *tstate, PyObject *exception, diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index 8a692ea16495..6bfadd49eef8 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -45,7 +45,7 @@ extern PyStatus _PySys_Create( extern PyStatus _PySys_SetPreliminaryStderr(PyObject *sysdict); extern int _PySys_InitMain( _PyRuntimeState *runtime, - PyInterpreterState *interp); + PyThreadState *tstate); extern PyStatus _PyImport_Init(PyInterpreterState *interp); extern PyStatus _PyExc_Init(void); extern PyStatus _PyErr_Init(void); diff --git a/Python/ceval.c b/Python/ceval.c index 7063647d584f..bb0416f4ceba 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -4728,10 +4728,9 @@ PyEval_SetTrace(Py_tracefunc func, PyObject *arg) } void -_PyEval_SetCoroutineOriginTrackingDepth(int new_depth) +_PyEval_SetCoroutineOriginTrackingDepth(PyThreadState *tstate, int new_depth) { assert(new_depth >= 0); - PyThreadState *tstate = _PyThreadState_GET(); tstate->coroutine_origin_tracking_depth = new_depth; } diff --git a/Python/errors.c b/Python/errors.c index 8a94afdd8c41..b3b9ac94cd14 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -547,9 +547,8 @@ PyErr_BadArgument(void) } PyObject * -PyErr_NoMemory(void) +_PyErr_NoMemory(PyThreadState *tstate) { - PyThreadState *tstate = _PyThreadState_GET(); if (Py_TYPE(PyExc_MemoryError) == NULL) { /* PyErr_NoMemory() has been called before PyExc_MemoryError has been initialized by _PyExc_Init() */ @@ -560,6 +559,13 @@ PyErr_NoMemory(void) return NULL; } +PyObject * +PyErr_NoMemory(void) +{ + PyThreadState *tstate = _PyThreadState_GET(); + return _PyErr_NoMemory(tstate); +} + PyObject * PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject) { diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 751c4d6d1d63..54e8ce2b1557 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -899,6 +899,7 @@ pyinit_main(_PyRuntimeState *runtime, PyInterpreterState *interp) } /* Configure the main interpreter */ + PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); PyConfig *config = &interp->config; if (runtime->initialized) { @@ -919,7 +920,7 @@ pyinit_main(_PyRuntimeState *runtime, PyInterpreterState *interp) return _PyStatus_ERR("can't initialize time"); } - if (_PySys_InitMain(runtime, interp) < 0) { + if (_PySys_InitMain(runtime, tstate) < 0) { return _PyStatus_ERR("can't finish initializing sys"); } @@ -1456,7 +1457,7 @@ new_interpreter(PyThreadState **tstate_p) } Py_INCREF(interp->sysdict); PyDict_SetItemString(interp->sysdict, "modules", modules); - if (_PySys_InitMain(runtime, interp) < 0) { + if (_PySys_InitMain(runtime, tstate) < 0) { return _PyStatus_ERR("can't finish initializing sys"); } } diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 12b1bd7711d5..fcbcb3b24d52 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -17,10 +17,12 @@ Data members: #include "Python.h" #include "code.h" #include "frameobject.h" +#include "pycore_ceval.h" #include "pycore_initconfig.h" +#include "pycore_pathconfig.h" +#include "pycore_pyerrors.h" #include "pycore_pylifecycle.h" #include "pycore_pymem.h" -#include "pycore_pathconfig.h" #include "pycore_pystate.h" #include "pycore_tupleobject.h" #include "pythread.h" @@ -59,30 +61,38 @@ _Py_IDENTIFIER(stderr); _Py_IDENTIFIER(warnoptions); _Py_IDENTIFIER(write); -PyObject * -_PySys_GetObjectId(_Py_Identifier *key) +static PyObject * +sys_get_object_id(PyThreadState *tstate, _Py_Identifier *key) { - PyObject *sd = _PyInterpreterState_GET_UNSAFE()->sysdict; + PyObject *sd = tstate->interp->sysdict; if (sd == NULL) { return NULL; } return _PyDict_GetItemId(sd, key); } +PyObject * +_PySys_GetObjectId(_Py_Identifier *key) +{ + PyThreadState *tstate = _PyThreadState_GET(); + return sys_get_object_id(tstate, key); +} + PyObject * PySys_GetObject(const char *name) { - PyObject *sd = _PyInterpreterState_GET_UNSAFE()->sysdict; + PyThreadState *tstate = _PyThreadState_GET(); + PyObject *sd = tstate->interp->sysdict; if (sd == NULL) { return NULL; } return PyDict_GetItemString(sd, name); } -int -_PySys_SetObjectId(_Py_Identifier *key, PyObject *v) +static int +sys_set_object_id(PyThreadState *tstate, _Py_Identifier *key, PyObject *v) { - PyObject *sd = _PyInterpreterState_GET_UNSAFE()->sysdict; + PyObject *sd = tstate->interp->sysdict; if (v == NULL) { if (_PyDict_GetItemId(sd, key) == NULL) { return 0; @@ -97,9 +107,16 @@ _PySys_SetObjectId(_Py_Identifier *key, PyObject *v) } int -PySys_SetObject(const char *name, PyObject *v) +_PySys_SetObjectId(_Py_Identifier *key, PyObject *v) +{ + PyThreadState *tstate = _PyThreadState_GET(); + return sys_set_object_id(tstate, key, v); +} + +static int +sys_set_object(PyThreadState *tstate, const char *name, PyObject *v) { - PyObject *sd = _PyInterpreterState_GET_UNSAFE()->sysdict; + PyObject *sd = tstate->interp->sysdict; if (v == NULL) { if (PyDict_GetItemString(sd, name) == NULL) { return 0; @@ -113,10 +130,16 @@ PySys_SetObject(const char *name, PyObject *v) } } +int +PySys_SetObject(const char *name, PyObject *v) +{ + PyThreadState *tstate = _PyThreadState_GET(); + return sys_set_object(tstate, name, v); +} + static int -should_audit(void) +should_audit(PyThreadState *ts) { - PyThreadState *ts = _PyThreadState_GET(); if (!ts) { return 0; } @@ -134,6 +157,7 @@ PySys_Audit(const char *event, const char *argFormat, ...) PyObject *hooks = NULL; PyObject *hook = NULL; int res = -1; + PyThreadState *ts = _PyThreadState_GET(); /* N format is inappropriate, because you do not know whether the reference is consumed by the call. @@ -141,18 +165,16 @@ PySys_Audit(const char *event, const char *argFormat, ...) assert(!argFormat || !strchr(argFormat, 'N')); /* Early exit when no hooks are registered */ - if (!should_audit()) { + if (!should_audit(ts)) { return 0; } _Py_AuditHookEntry *e = _PyRuntime.audit_hook_head; - PyThreadState *ts = _PyThreadState_GET(); - PyInterpreterState *is = ts ? ts->interp : NULL; int dtrace = PyDTrace_AUDIT_ENABLED(); PyObject *exc_type, *exc_value, *exc_tb; if (ts) { - PyErr_Fetch(&exc_type, &exc_value, &exc_tb); + _PyErr_Fetch(ts, &exc_type, &exc_value, &exc_tb); } /* Initialize event args now */ @@ -185,6 +207,7 @@ PySys_Audit(const char *event, const char *argFormat, ...) } /* Call interpreter hooks */ + PyInterpreterState *is = ts ? ts->interp : NULL; if (is && is->audit_hooks) { eventName = PyUnicode_FromString(event); if (!eventName) { @@ -206,9 +229,9 @@ PySys_Audit(const char *event, const char *argFormat, ...) if (o) { canTrace = PyObject_IsTrue(o); Py_DECREF(o); - } else if (PyErr_Occurred() && - PyErr_ExceptionMatches(PyExc_AttributeError)) { - PyErr_Clear(); + } else if (_PyErr_Occurred(ts) && + _PyErr_ExceptionMatches(ts, PyExc_AttributeError)) { + _PyErr_Clear(ts); canTrace = 0; } if (canTrace < 0) { @@ -232,7 +255,7 @@ PySys_Audit(const char *event, const char *argFormat, ...) } ts->use_tracing = (ts->c_tracefunc || ts->c_profilefunc); ts->tracing--; - if (PyErr_Occurred()) { + if (_PyErr_Occurred(ts)) { goto exit; } } @@ -247,9 +270,9 @@ PySys_Audit(const char *event, const char *argFormat, ...) if (ts) { if (!res) { - PyErr_Restore(exc_type, exc_value, exc_tb); + _PyErr_Restore(ts, exc_type, exc_value, exc_tb); } else { - assert(PyErr_Occurred()); + assert(_PyErr_Occurred(ts)); Py_XDECREF(exc_type); Py_XDECREF(exc_value); Py_XDECREF(exc_tb); @@ -263,22 +286,26 @@ PySys_Audit(const char *event, const char *argFormat, ...) * finalization. In general, it should not need to be called, * and as such it is not defined in any header files. */ -void _PySys_ClearAuditHooks(void) { +void +_PySys_ClearAuditHooks(void) +{ /* Must be finalizing to clear hooks */ _PyRuntimeState *runtime = &_PyRuntime; PyThreadState *ts = _PyRuntimeState_GetThreadState(runtime); assert(!ts || _Py_CURRENTLY_FINALIZING(runtime, ts)); - if (!ts || !_Py_CURRENTLY_FINALIZING(runtime, ts)) + if (!ts || !_Py_CURRENTLY_FINALIZING(runtime, ts)) { return; + } - if (Py_VerboseFlag) { + const PyConfig *config = &ts->interp->config; + if (config->verbose) { PySys_WriteStderr("# clear sys.audit hooks\n"); } /* Hooks can abort later hooks for this event, but cannot abort the clear operation itself. */ PySys_Audit("cpython._PySys_ClearAuditHooks", NULL); - PyErr_Clear(); + _PyErr_Clear(ts); _Py_AuditHookEntry *e = _PyRuntime.audit_hook_head, *n; _PyRuntime.audit_hook_head = NULL; @@ -292,13 +319,16 @@ void _PySys_ClearAuditHooks(void) { int PySys_AddAuditHook(Py_AuditHookFunction hook, void *userData) { + _PyRuntimeState *runtime = &_PyRuntime; + PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); + /* Invoke existing audit hooks to allow them an opportunity to abort. */ /* Cannot invoke hooks until we are initialized */ - if (Py_IsInitialized()) { + if (runtime->initialized) { if (PySys_Audit("sys.addaudithook", NULL) < 0) { - if (PyErr_ExceptionMatches(PyExc_Exception)) { + if (_PyErr_ExceptionMatches(tstate, PyExc_Exception)) { /* We do not report errors derived from Exception */ - PyErr_Clear(); + _PyErr_Clear(tstate); return 0; } return -1; @@ -310,15 +340,17 @@ PySys_AddAuditHook(Py_AuditHookFunction hook, void *userData) e = (_Py_AuditHookEntry*)PyMem_RawMalloc(sizeof(_Py_AuditHookEntry)); _PyRuntime.audit_hook_head = e; } else { - while (e->next) + while (e->next) { e = e->next; + } e = e->next = (_Py_AuditHookEntry*)PyMem_RawMalloc( sizeof(_Py_AuditHookEntry)); } if (!e) { - if (Py_IsInitialized()) - PyErr_NoMemory(); + if (runtime->initialized) { + _PyErr_NoMemory(tstate); + } return -1; } @@ -341,17 +373,19 @@ static PyObject * sys_addaudithook_impl(PyObject *module, PyObject *hook) /*[clinic end generated code: output=4f9c17aaeb02f44e input=0f3e191217a45e34]*/ { + PyThreadState *tstate = _PyThreadState_GET(); + /* Invoke existing audit hooks to allow them an opportunity to abort. */ if (PySys_Audit("sys.addaudithook", NULL) < 0) { - if (PyErr_ExceptionMatches(PyExc_Exception)) { + if (_PyErr_ExceptionMatches(tstate, PyExc_Exception)) { /* We do not report errors derived from Exception */ - PyErr_Clear(); + _PyErr_Clear(tstate); Py_RETURN_NONE; } return NULL; } - PyInterpreterState *is = _PyInterpreterState_Get(); + PyInterpreterState *is = tstate->interp; if (is->audit_hooks == NULL) { is->audit_hooks = PyList_New(0); @@ -375,23 +409,29 @@ Passes the event to any audit hooks that are attached."); static PyObject * sys_audit(PyObject *self, PyObject *const *args, Py_ssize_t argc) { + PyThreadState *tstate = _PyThreadState_GET(); + if (argc == 0) { - PyErr_SetString(PyExc_TypeError, "audit() missing 1 required positional argument: 'event'"); + _PyErr_SetString(tstate, PyExc_TypeError, + "audit() missing 1 required positional argument: " + "'event'"); return NULL; } - if (!should_audit()) { + if (!should_audit(tstate)) { Py_RETURN_NONE; } PyObject *auditEvent = args[0]; if (!auditEvent) { - PyErr_SetString(PyExc_TypeError, "expected str for argument 'event'"); + _PyErr_SetString(tstate, PyExc_TypeError, + "expected str for argument 'event'"); return NULL; } if (!PyUnicode_Check(auditEvent)) { - PyErr_Format(PyExc_TypeError, "expected str for argument 'event', not %.200s", - Py_TYPE(auditEvent)->tp_name); + _PyErr_Format(tstate, PyExc_TypeError, + "expected str for argument 'event', not %.200s", + Py_TYPE(auditEvent)->tp_name); return NULL; } const char *event = PyUnicode_AsUTF8(auditEvent); @@ -418,7 +458,8 @@ sys_audit(PyObject *self, PyObject *const *args, Py_ssize_t argc) static PyObject * sys_breakpointhook(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *keywords) { - assert(!PyErr_Occurred()); + PyThreadState *tstate = _PyThreadState_GET(); + assert(!_PyErr_Occurred(tstate)); char *envar = Py_GETENV("PYTHONBREAKPOINT"); if (envar == NULL || strlen(envar) == 0) { @@ -434,7 +475,7 @@ sys_breakpointhook(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyOb * we need to save a copy of envar. */ envar = _PyMem_RawStrdup(envar); if (envar == NULL) { - PyErr_NoMemory(); + _PyErr_NoMemory(tstate); return NULL; } const char *last_dot = strrchr(envar, '.'); @@ -463,7 +504,7 @@ sys_breakpointhook(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyOb Py_DECREF(modulepath); if (module == NULL) { - if (PyErr_ExceptionMatches(PyExc_ImportError)) { + if (_PyErr_ExceptionMatches(tstate, PyExc_ImportError)) { goto warn; } PyMem_RawFree(envar); @@ -474,7 +515,7 @@ sys_breakpointhook(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyOb Py_DECREF(module); if (hook == NULL) { - if (PyErr_ExceptionMatches(PyExc_AttributeError)) { + if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) { goto warn; } PyMem_RawFree(envar); @@ -487,7 +528,7 @@ sys_breakpointhook(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyOb warn: /* If any of the imports went wrong, then warn and ignore. */ - PyErr_Clear(); + _PyErr_Clear(tstate); int status = PyErr_WarnFormat( PyExc_RuntimeWarning, 0, "Ignoring unimportable $PYTHONBREAKPOINT: \"%s\"", envar); @@ -513,7 +554,7 @@ PyDoc_STRVAR(breakpointhook_doc, Helper function for sys_displayhook(). */ static int -sys_displayhook_unencodable(PyObject *outf, PyObject *o) +sys_displayhook_unencodable(PyThreadState *tstate, PyObject *outf, PyObject *o) { PyObject *stdout_encoding = NULL; PyObject *encoded, *escaped_str, *repr_str, *buffer, *result; @@ -547,7 +588,7 @@ sys_displayhook_unencodable(PyObject *outf, PyObject *o) Py_DECREF(result); } else { - PyErr_Clear(); + _PyErr_Clear(tstate); escaped_str = PyUnicode_FromEncodedObject(encoded, stdout_encoding_str, "strict"); @@ -585,11 +626,13 @@ sys_displayhook(PyObject *module, PyObject *o) PyObject *builtins; static PyObject *newline = NULL; int err; + PyThreadState *tstate = _PyThreadState_GET(); builtins = _PyImport_GetModuleId(&PyId_builtins); if (builtins == NULL) { - if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_RuntimeError, "lost builtins module"); + if (!_PyErr_Occurred(tstate)) { + _PyErr_SetString(tstate, PyExc_RuntimeError, + "lost builtins module"); } return NULL; } @@ -603,19 +646,20 @@ sys_displayhook(PyObject *module, PyObject *o) } if (_PyObject_SetAttrId(builtins, &PyId__, Py_None) != 0) return NULL; - outf = _PySys_GetObjectId(&PyId_stdout); + outf = sys_get_object_id(tstate, &PyId_stdout); if (outf == NULL || outf == Py_None) { - PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout"); + _PyErr_SetString(tstate, PyExc_RuntimeError, "lost sys.stdout"); return NULL; } if (PyFile_WriteObject(o, outf, 0) != 0) { - if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError)) { + if (_PyErr_ExceptionMatches(tstate, PyExc_UnicodeEncodeError)) { /* repr(o) is not encodable to sys.stdout.encoding with * sys.stdout.errors error handler (which is probably 'strict') */ - PyErr_Clear(); - err = sys_displayhook_unencodable(outf, o); - if (err) + _PyErr_Clear(tstate); + err = sys_displayhook_unencodable(tstate, outf, o); + if (err) { return NULL; + } } else { return NULL; @@ -722,7 +766,8 @@ sys_exit_impl(PyObject *module, PyObject *status) /*[clinic end generated code: output=13870986c1ab2ec0 input=a737351f86685e9c]*/ { /* Raise SystemExit so callers may catch it or clean up. */ - PyErr_SetObject(PyExc_SystemExit, status); + PyThreadState *tstate = _PyThreadState_GET(); + _PyErr_SetObject(tstate, PyExc_SystemExit, status); return NULL; } @@ -751,8 +796,8 @@ static PyObject * sys_getfilesystemencoding_impl(PyObject *module) /*[clinic end generated code: output=1dc4bdbe9be44aa7 input=8475f8649b8c7d8c]*/ { - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); - const PyConfig *config = &interp->config; + PyThreadState *tstate = _PyThreadState_GET(); + const PyConfig *config = &tstate->interp->config; return PyUnicode_FromWideChar(config->filesystem_encoding, -1); } @@ -766,8 +811,8 @@ static PyObject * sys_getfilesystemencodeerrors_impl(PyObject *module) /*[clinic end generated code: output=ba77b36bbf7c96f5 input=22a1e8365566f1e5]*/ { - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); - const PyConfig *config = &interp->config; + PyThreadState *tstate = _PyThreadState_GET(); + const PyConfig *config = &tstate->interp->config; return PyUnicode_FromWideChar(config->filesystem_errors, -1); } @@ -788,14 +833,15 @@ static PyObject * sys_intern_impl(PyObject *module, PyObject *s) /*[clinic end generated code: output=be680c24f5c9e5d6 input=849483c006924e2f]*/ { + PyThreadState *tstate = _PyThreadState_GET(); if (PyUnicode_CheckExact(s)) { Py_INCREF(s); PyUnicode_InternInPlace(&s); return s; } else { - PyErr_Format(PyExc_TypeError, - "can't intern %.400s", s->ob_type->tp_name); + _PyErr_Format(tstate, PyExc_TypeError, + "can't intern %.400s", s->ob_type->tp_name); return NULL; } } @@ -833,19 +879,17 @@ static PyObject * call_trampoline(PyObject* callback, PyFrameObject *frame, int what, PyObject *arg) { - PyObject *result; - PyObject *stack[3]; - if (PyFrame_FastToLocalsWithError(frame) < 0) { return NULL; } + PyObject *stack[3]; stack[0] = (PyObject *)frame; stack[1] = whatstrings[what]; stack[2] = (arg != NULL) ? arg : Py_None; /* call the Python-level function */ - result = _PyObject_FastCall(callback, stack, 3); + PyObject *result = _PyObject_FastCall(callback, stack, 3); PyFrame_LocalsToFast(frame, 1); if (result == NULL) { @@ -1001,11 +1045,12 @@ sys_setcheckinterval_impl(PyObject *module, int n) if (PyErr_WarnEx(PyExc_DeprecationWarning, "sys.getcheckinterval() and sys.setcheckinterval() " "are deprecated. Use sys.setswitchinterval() " - "instead.", 1) < 0) + "instead.", 1) < 0) { return NULL; + } - PyInterpreterState *interp = _PyInterpreterState_Get(); - interp->check_interval = n; + PyThreadState *tstate = _PyThreadState_GET(); + tstate->interp->check_interval = n; Py_RETURN_NONE; } @@ -1022,10 +1067,12 @@ sys_getcheckinterval_impl(PyObject *module) if (PyErr_WarnEx(PyExc_DeprecationWarning, "sys.getcheckinterval() and sys.setcheckinterval() " "are deprecated. Use sys.getswitchinterval() " - "instead.", 1) < 0) + "instead.", 1) < 0) { return NULL; - PyInterpreterState *interp = _PyInterpreterState_Get(); - return PyLong_FromLong(interp->check_interval); + } + + PyThreadState *tstate = _PyThreadState_GET(); + return PyLong_FromLong(tstate->interp->check_interval); } /*[clinic input] @@ -1048,9 +1095,10 @@ static PyObject * sys_setswitchinterval_impl(PyObject *module, double interval) /*[clinic end generated code: output=65a19629e5153983 input=561b477134df91d9]*/ { + PyThreadState *tstate = _PyThreadState_GET(); if (interval <= 0.0) { - PyErr_SetString(PyExc_ValueError, - "switch interval must be strictly positive"); + _PyErr_SetString(tstate, PyExc_ValueError, + "switch interval must be strictly positive"); return NULL; } _PyEval_SetSwitchInterval((unsigned long) (1e6 * interval)); @@ -1089,11 +1137,11 @@ sys_setrecursionlimit_impl(PyObject *module, int new_limit) /*[clinic end generated code: output=35e1c64754800ace input=b0f7a23393924af3]*/ { int mark; - PyThreadState *tstate; + PyThreadState *tstate = _PyThreadState_GET(); if (new_limit < 1) { - PyErr_SetString(PyExc_ValueError, - "recursion limit must be greater or equal than 1"); + _PyErr_SetString(tstate, PyExc_ValueError, + "recursion limit must be greater or equal than 1"); return NULL; } @@ -1107,12 +1155,11 @@ sys_setrecursionlimit_impl(PyObject *module, int new_limit) the new low-water mark. Otherwise it may not be possible anymore to reset the overflowed flag to 0. */ mark = _Py_RecursionLimitLowerWaterMark(new_limit); - tstate = _PyThreadState_GET(); if (tstate->recursion_depth >= mark) { - PyErr_Format(PyExc_RecursionError, - "cannot set the recursion limit to %i at " - "the recursion depth %i: the limit is too low", - new_limit, tstate->recursion_depth); + _PyErr_Format(tstate, PyExc_RecursionError, + "cannot set the recursion limit to %i at " + "the recursion depth %i: the limit is too low", + new_limit, tstate->recursion_depth); return NULL; } @@ -1137,11 +1184,12 @@ static PyObject * sys_set_coroutine_origin_tracking_depth_impl(PyObject *module, int depth) /*[clinic end generated code: output=0a2123c1cc6759c5 input=a1d0a05f89d2c426]*/ { + PyThreadState *tstate = _PyThreadState_GET(); if (depth < 0) { - PyErr_SetString(PyExc_ValueError, "depth must be >= 0"); + _PyErr_SetString(tstate, PyExc_ValueError, "depth must be >= 0"); return NULL; } - _PyEval_SetCoroutineOriginTrackingDepth(depth); + _PyEval_SetCoroutineOriginTrackingDepth(tstate, depth); Py_RETURN_NONE; } @@ -1185,6 +1233,7 @@ 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, @@ -1194,9 +1243,9 @@ sys_set_asyncgen_hooks(PyObject *self, PyObject *args, PyObject *kw) if (finalizer && finalizer != Py_None) { if (!PyCallable_Check(finalizer)) { - PyErr_Format(PyExc_TypeError, - "callable finalizer expected, got %.50s", - Py_TYPE(finalizer)->tp_name); + _PyErr_Format(tstate, PyExc_TypeError, + "callable finalizer expected, got %.50s", + Py_TYPE(finalizer)->tp_name); return NULL; } _PyEval_SetAsyncGenFinalizer(finalizer); @@ -1207,9 +1256,9 @@ sys_set_asyncgen_hooks(PyObject *self, PyObject *args, PyObject *kw) if (firstiter && firstiter != Py_None) { if (!PyCallable_Check(firstiter)) { - PyErr_Format(PyExc_TypeError, - "callable firstiter expected, got %.50s", - Py_TYPE(firstiter)->tp_name); + _PyErr_Format(tstate, PyExc_TypeError, + "callable firstiter expected, got %.50s", + Py_TYPE(firstiter)->tp_name); return NULL; } _PyEval_SetAsyncGenFirstiter(firstiter); @@ -1297,7 +1346,7 @@ static PyStructSequence_Desc hash_info_desc = { }; static PyObject * -get_hash_info(void) +get_hash_info(PyThreadState *tstate) { PyObject *hash_info; int field = 0; @@ -1324,7 +1373,7 @@ get_hash_info(void) PyLong_FromLong(hashfunc->seed_bits)); PyStructSequence_SET_ITEM(hash_info, field++, PyLong_FromLong(Py_HASH_CUTOFF)); - if (PyErr_Occurred()) { + if (_PyErr_Occurred(tstate)) { Py_CLEAR(hash_info); return NULL; } @@ -1408,6 +1457,7 @@ sys_getwindowsversion_impl(PyObject *module) wchar_t kernel32_path[MAX_PATH]; LPVOID verblock; DWORD verblock_size; + PyThreadState *tstate = _PyThreadState_GET(); ver.dwOSVersionInfoSize = sizeof(ver); if (!GetVersionExW((OSVERSIONINFOW*) &ver)) @@ -1458,7 +1508,7 @@ sys_getwindowsversion_impl(PyObject *module) realBuild )); - if (PyErr_Occurred()) { + if (_PyErr_Occurred(tstate)) { Py_DECREF(version); return NULL; } @@ -1515,8 +1565,8 @@ static PyObject * sys_setdlopenflags_impl(PyObject *module, int new_val) /*[clinic end generated code: output=ec918b7fe0a37281 input=4c838211e857a77f]*/ { - PyInterpreterState *interp = _PyInterpreterState_Get(); - interp->dlopenflags = new_val; + PyThreadState *tstate = _PyThreadState_GET(); + tstate->interp->dlopenflags = new_val; Py_RETURN_NONE; } @@ -1533,8 +1583,8 @@ static PyObject * sys_getdlopenflags_impl(PyObject *module) /*[clinic end generated code: output=e92cd1bc5005da6e input=dc4ea0899c53b4b6]*/ { - PyInterpreterState *interp = _PyInterpreterState_Get(); - return PyLong_FromLong(interp->dlopenflags); + PyThreadState *tstate = _PyThreadState_GET(); + return PyLong_FromLong(tstate->interp->dlopenflags); } #endif /* HAVE_DLOPEN */ @@ -1566,17 +1616,20 @@ _PySys_GetSizeOf(PyObject *o) PyObject *res = NULL; PyObject *method; Py_ssize_t size; + PyThreadState *tstate = _PyThreadState_GET(); /* Make sure the type is initialized. float gets initialized late */ - if (PyType_Ready(Py_TYPE(o)) < 0) + if (PyType_Ready(Py_TYPE(o)) < 0) { return (size_t)-1; + } method = _PyObject_LookupSpecial(o, &PyId___sizeof__); if (method == NULL) { - if (!PyErr_Occurred()) - PyErr_Format(PyExc_TypeError, - "Type %.100s doesn't define __sizeof__", - Py_TYPE(o)->tp_name); + if (!_PyErr_Occurred(tstate)) { + _PyErr_Format(tstate, PyExc_TypeError, + "Type %.100s doesn't define __sizeof__", + Py_TYPE(o)->tp_name); + } } else { res = _PyObject_CallNoArg(method); @@ -1588,11 +1641,12 @@ _PySys_GetSizeOf(PyObject *o) size = PyLong_AsSsize_t(res); Py_DECREF(res); - if (size == -1 && PyErr_Occurred()) + if (size == -1 && _PyErr_Occurred(tstate)) return (size_t)-1; if (size < 0) { - PyErr_SetString(PyExc_ValueError, "__sizeof__() should return >= 0"); + _PyErr_SetString(tstate, PyExc_ValueError, + "__sizeof__() should return >= 0"); return (size_t)-1; } @@ -1608,17 +1662,19 @@ sys_getsizeof(PyObject *self, PyObject *args, PyObject *kwds) static char *kwlist[] = {"object", "default", 0}; size_t size; PyObject *o, *dflt = NULL; + PyThreadState *tstate = _PyThreadState_GET(); if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:getsizeof", - kwlist, &o, &dflt)) + kwlist, &o, &dflt)) { return NULL; + } size = _PySys_GetSizeOf(o); - if (size == (size_t)-1 && PyErr_Occurred()) { + if (size == (size_t)-1 && _PyErr_Occurred(tstate)) { /* Has a default value been given */ - if (dflt != NULL && PyErr_ExceptionMatches(PyExc_TypeError)) { - PyErr_Clear(); + if (dflt != NULL && _PyErr_ExceptionMatches(tstate, PyExc_TypeError)) { + _PyErr_Clear(tstate); Py_INCREF(dflt); return dflt; } @@ -1716,7 +1772,8 @@ static PyObject * sys__getframe_impl(PyObject *module, int depth) /*[clinic end generated code: output=d438776c04d59804 input=c1be8a6464b11ee5]*/ { - PyFrameObject *f = _PyThreadState_GET()->frame; + PyThreadState *tstate = _PyThreadState_GET(); + PyFrameObject *f = tstate->frame; if (PySys_Audit("sys._getframe", "O", f) < 0) { return NULL; @@ -1727,8 +1784,8 @@ sys__getframe_impl(PyObject *module, int depth) --depth; } if (f == NULL) { - PyErr_SetString(PyExc_ValueError, - "call stack is not deep enough"); + _PyErr_SetString(tstate, PyExc_ValueError, + "call stack is not deep enough"); return NULL; } Py_INCREF(f); @@ -2078,10 +2135,9 @@ _clear_all_preinit_options(void) } static int -_PySys_ReadPreInitOptions(void) +sys_read_preinit_options(PyThreadState *tstate) { /* Rerun the add commands with the actual sys module available */ - PyThreadState *tstate = _PyThreadState_GET(); if (tstate == NULL) { /* Still don't have a thread state, so something is wrong! */ return -1; @@ -2102,9 +2158,9 @@ _PySys_ReadPreInitOptions(void) } static PyObject * -get_warnoptions(void) +get_warnoptions(PyThreadState *tstate) { - PyObject *warnoptions = _PySys_GetObjectId(&PyId_warnoptions); + PyObject *warnoptions = sys_get_object_id(tstate, &PyId_warnoptions); if (warnoptions == NULL || !PyList_Check(warnoptions)) { /* PEP432 TODO: we can reach this if warnoptions is NULL in the main * interpreter config. When that happens, we need to properly set @@ -2117,9 +2173,10 @@ get_warnoptions(void) * reachable again. */ warnoptions = PyList_New(0); - if (warnoptions == NULL) + if (warnoptions == NULL) { return NULL; - if (_PySys_SetObjectId(&PyId_warnoptions, warnoptions)) { + } + if (sys_set_object_id(tstate, &PyId_warnoptions, warnoptions)) { Py_DECREF(warnoptions); return NULL; } @@ -2137,16 +2194,16 @@ PySys_ResetWarnOptions(void) return; } - PyObject *warnoptions = _PySys_GetObjectId(&PyId_warnoptions); + PyObject *warnoptions = sys_get_object_id(tstate, &PyId_warnoptions); if (warnoptions == NULL || !PyList_Check(warnoptions)) return; PyList_SetSlice(warnoptions, 0, PyList_GET_SIZE(warnoptions), NULL); } static int -_PySys_AddWarnOptionWithError(PyObject *option) +_PySys_AddWarnOptionWithError(PyThreadState *tstate, PyObject *option) { - PyObject *warnoptions = get_warnoptions(); + PyObject *warnoptions = get_warnoptions(tstate); if (warnoptions == NULL) { return -1; } @@ -2159,10 +2216,11 @@ _PySys_AddWarnOptionWithError(PyObject *option) void PySys_AddWarnOptionUnicode(PyObject *option) { - if (_PySys_AddWarnOptionWithError(option) < 0) { + PyThreadState *tstate = _PyThreadState_GET(); + if (_PySys_AddWarnOptionWithError(tstate, option) < 0) { /* No return value, therefore clear error state if possible */ - if (_PyThreadState_UncheckedGet()) { - PyErr_Clear(); + if (tstate) { + _PyErr_Clear(tstate); } } } @@ -2186,15 +2244,16 @@ PySys_AddWarnOption(const wchar_t *s) int PySys_HasWarnOptions(void) { - PyObject *warnoptions = _PySys_GetObjectId(&PyId_warnoptions); + PyThreadState *tstate = _PyThreadState_GET(); + PyObject *warnoptions = sys_get_object_id(tstate, &PyId_warnoptions); return (warnoptions != NULL && PyList_Check(warnoptions) && PyList_GET_SIZE(warnoptions) > 0); } static PyObject * -get_xoptions(void) +get_xoptions(PyThreadState *tstate) { - PyObject *xoptions = _PySys_GetObjectId(&PyId__xoptions); + PyObject *xoptions = sys_get_object_id(tstate, &PyId__xoptions); if (xoptions == NULL || !PyDict_Check(xoptions)) { /* PEP432 TODO: we can reach this if xoptions is NULL in the main * interpreter config. When that happens, we need to properly set @@ -2207,9 +2266,10 @@ get_xoptions(void) * reachable again. */ xoptions = PyDict_New(); - if (xoptions == NULL) + if (xoptions == NULL) { return NULL; - if (_PySys_SetObjectId(&PyId__xoptions, xoptions)) { + } + if (sys_set_object_id(tstate, &PyId__xoptions, xoptions)) { Py_DECREF(xoptions); return NULL; } @@ -2223,7 +2283,8 @@ _PySys_AddXOptionWithError(const wchar_t *s) { PyObject *name = NULL, *value = NULL; - PyObject *opts = get_xoptions(); + PyThreadState *tstate = _PyThreadState_GET(); + PyObject *opts = get_xoptions(tstate); if (opts == NULL) { goto error; } @@ -2264,8 +2325,8 @@ PySys_AddXOption(const wchar_t *s) } if (_PySys_AddXOptionWithError(s) < 0) { /* No return value, therefore clear error state if possible */ - if (_PyThreadState_UncheckedGet()) { - PyErr_Clear(); + if (tstate) { + _PyErr_Clear(tstate); } } } @@ -2273,7 +2334,8 @@ PySys_AddXOption(const wchar_t *s) PyObject * PySys_GetXOptions(void) { - return get_xoptions(); + PyThreadState *tstate = _PyThreadState_GET(); + return get_xoptions(tstate); } /* XXX This doc string is too long to be a single string literal in VC++ 5.0. @@ -2413,12 +2475,12 @@ static PyStructSequence_Desc flags_desc = { }; static PyObject* -make_flags(_PyRuntimeState *runtime, PyInterpreterState *interp) +make_flags(_PyRuntimeState *runtime, PyThreadState *tstate) { int pos = 0; PyObject *seq; const PyPreConfig *preconfig = &runtime->preconfig; - const PyConfig *config = &interp->config; + const PyConfig *config = &tstate->interp->config; seq = PyStructSequence_New(&FlagsType); if (seq == NULL) @@ -2446,7 +2508,7 @@ make_flags(_PyRuntimeState *runtime, PyInterpreterState *interp) SetFlag(preconfig->utf8_mode); #undef SetFlag - if (PyErr_Occurred()) { + if (_PyErr_Occurred(tstate)) { Py_DECREF(seq); return NULL; } @@ -2477,7 +2539,7 @@ static PyStructSequence_Desc version_info_desc = { }; static PyObject * -make_version_info(void) +make_version_info(PyThreadState *tstate) { PyObject *version_info; char *s; @@ -2515,7 +2577,7 @@ make_version_info(void) #undef SetIntItem #undef SetStrItem - if (PyErr_Occurred()) { + if (_PyErr_Occurred(tstate)) { Py_CLEAR(version_info); return NULL; } @@ -2633,7 +2695,7 @@ static struct PyModuleDef sysmodule = { } while (0) static PyStatus -_PySys_InitCore(_PyRuntimeState *runtime, PyInterpreterState *interp, +_PySys_InitCore(_PyRuntimeState *runtime, PyThreadState *tstate, PyObject *sysdict) { PyObject *version_info; @@ -2678,7 +2740,7 @@ _PySys_InitCore(_PyRuntimeState *runtime, PyInterpreterState *interp, } } SET_SYS_FROM_STRING("hash_info", - get_hash_info()); + get_hash_info(tstate)); SET_SYS_FROM_STRING("maxunicode", PyLong_FromLong(0x10FFFF)); SET_SYS_FROM_STRING("builtin_module_names", @@ -2709,14 +2771,15 @@ _PySys_InitCore(_PyRuntimeState *runtime, PyInterpreterState *interp, goto type_init_failed; } } - version_info = make_version_info(); + version_info = make_version_info(tstate); SET_SYS_FROM_STRING("version_info", version_info); /* prevent user from creating new instances */ VersionInfoType.tp_init = NULL; VersionInfoType.tp_new = NULL; res = PyDict_DelItemString(VersionInfoType.tp_dict, "__new__"); - if (res < 0 && PyErr_ExceptionMatches(PyExc_KeyError)) - PyErr_Clear(); + if (res < 0 && _PyErr_ExceptionMatches(tstate, PyExc_KeyError)) { + _PyErr_Clear(tstate); + } /* implementation */ SET_SYS_FROM_STRING("implementation", make_impl_info(version_info)); @@ -2728,7 +2791,7 @@ _PySys_InitCore(_PyRuntimeState *runtime, PyInterpreterState *interp, } } /* Set flags to their default values (updated by _PySys_InitMain()) */ - SET_SYS_FROM_STRING("flags", make_flags(runtime, interp)); + SET_SYS_FROM_STRING("flags", make_flags(runtime, tstate)); #if defined(MS_WINDOWS) /* getwindowsversion */ @@ -2740,10 +2803,10 @@ _PySys_InitCore(_PyRuntimeState *runtime, PyInterpreterState *interp, /* prevent user from creating new instances */ WindowsVersionType.tp_init = NULL; WindowsVersionType.tp_new = NULL; - assert(!PyErr_Occurred()); + assert(!_PyErr_Occurred(tstate)); res = PyDict_DelItemString(WindowsVersionType.tp_dict, "__new__"); - if (res < 0 && PyErr_ExceptionMatches(PyExc_KeyError)) { - PyErr_Clear(); + if (res < 0 && _PyErr_ExceptionMatches(tstate, PyExc_KeyError)) { + _PyErr_Clear(tstate); } #endif @@ -2766,7 +2829,7 @@ _PySys_InitCore(_PyRuntimeState *runtime, PyInterpreterState *interp, } } - if (PyErr_Occurred()) { + if (_PyErr_Occurred(tstate)) { goto err_occurred; } return _PyStatus_OK(); @@ -2849,10 +2912,10 @@ sys_create_xoptions_dict(const PyConfig *config) int -_PySys_InitMain(_PyRuntimeState *runtime, PyInterpreterState *interp) +_PySys_InitMain(_PyRuntimeState *runtime, PyThreadState *tstate) { - PyObject *sysdict = interp->sysdict; - const PyConfig *config = &interp->config; + PyObject *sysdict = tstate->interp->sysdict; + const PyConfig *config = &tstate->interp->config; int res; #define COPY_LIST(KEY, VALUE) \ @@ -2903,34 +2966,37 @@ _PySys_InitMain(_PyRuntimeState *runtime, PyInterpreterState *interp) #undef SET_SYS_FROM_WSTR /* Set flags to their final values */ - SET_SYS_FROM_STRING_INT_RESULT("flags", make_flags(runtime, interp)); + SET_SYS_FROM_STRING_INT_RESULT("flags", make_flags(runtime, tstate)); /* prevent user from creating new instances */ FlagsType.tp_init = NULL; FlagsType.tp_new = NULL; res = PyDict_DelItemString(FlagsType.tp_dict, "__new__"); if (res < 0) { - if (!PyErr_ExceptionMatches(PyExc_KeyError)) { + if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) { return res; } - PyErr_Clear(); + _PyErr_Clear(tstate); } SET_SYS_FROM_STRING_INT_RESULT("dont_write_bytecode", PyBool_FromLong(!config->write_bytecode)); - if (get_warnoptions() == NULL) + if (get_warnoptions(tstate) == NULL) { return -1; + } - if (get_xoptions() == NULL) + if (get_xoptions(tstate) == NULL) return -1; /* Transfer any sys.warnoptions and sys._xoptions set directly * by an embedding application from the linked list to the module. */ - if (_PySys_ReadPreInitOptions() != 0) + if (sys_read_preinit_options(tstate) != 0) return -1; - if (PyErr_Occurred()) - return -1; + if (_PyErr_Occurred(tstate)) { + goto err_occurred; + } + return 0; err_occurred: @@ -2973,6 +3039,8 @@ PyStatus _PySys_Create(_PyRuntimeState *runtime, PyInterpreterState *interp, PyObject **sysmod_p) { + PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); + PyObject *modules = PyDict_New(); if (modules == NULL) { return _PyStatus_ERR("can't make modules dictionary"); @@ -3000,7 +3068,7 @@ _PySys_Create(_PyRuntimeState *runtime, PyInterpreterState *interp, return status; } - status = _PySys_InitCore(runtime, interp, sysdict); + status = _PySys_InitCore(runtime, tstate, sysdict); if (_PyStatus_EXCEPTION(status)) { return status; } @@ -3051,8 +3119,10 @@ PySys_SetPath(const wchar_t *path) PyObject *v; if ((v = makepathobject(path, DELIM)) == NULL) Py_FatalError("can't create sys.path"); - if (_PySys_SetObjectId(&PyId_path, v) != 0) + PyThreadState *tstate = _PyThreadState_GET(); + if (sys_set_object_id(tstate, &PyId_path, v) != 0) { Py_FatalError("can't assign sys.path"); + } Py_DECREF(v); } @@ -3078,6 +3148,8 @@ make_sys_argv(int argc, wchar_t * const * argv) void PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath) { + PyThreadState *tstate = _PyThreadState_GET(); + if (argc < 1 || argv == NULL) { /* Ensure at least one (empty) argument is seen */ wchar_t* empty_argv[1] = {L""}; @@ -3089,7 +3161,7 @@ PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath) if (av == NULL) { Py_FatalError("no mem for sys.argv"); } - if (PySys_SetObject("argv", av) != 0) { + if (sys_set_object(tstate, "argv", av) != 0) { Py_DECREF(av); Py_FatalError("can't assign sys.argv"); } @@ -3105,7 +3177,7 @@ PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath) Py_FatalError("can't compute path0 from argv"); } - PyObject *sys_path = _PySys_GetObjectId(&PyId_path); + PyObject *sys_path = sys_get_object_id(tstate, &PyId_path); if (sys_path != NULL) { if (PyList_Insert(sys_path, 0, path0) < 0) { Py_DECREF(path0); @@ -3208,12 +3280,13 @@ sys_write(_Py_Identifier *key, FILE *fp, const char *format, va_list va) PyObject *error_type, *error_value, *error_traceback; char buffer[1001]; int written; + PyThreadState *tstate = _PyThreadState_GET(); - PyErr_Fetch(&error_type, &error_value, &error_traceback); - file = _PySys_GetObjectId(key); + _PyErr_Fetch(tstate, &error_type, &error_value, &error_traceback); + file = sys_get_object_id(tstate, key); written = PyOS_vsnprintf(buffer, sizeof(buffer), format, va); if (sys_pyfile_write(buffer, file) != 0) { - PyErr_Clear(); + _PyErr_Clear(tstate); fputs(buffer, fp); } if (written < 0 || (size_t)written >= sizeof(buffer)) { @@ -3221,7 +3294,7 @@ sys_write(_Py_Identifier *key, FILE *fp, const char *format, va_list va) if (sys_pyfile_write(truncated, file) != 0) fputs(truncated, fp); } - PyErr_Restore(error_type, error_value, error_traceback); + _PyErr_Restore(tstate, error_type, error_value, error_traceback); } void @@ -3250,20 +3323,21 @@ sys_format(_Py_Identifier *key, FILE *fp, const char *format, va_list va) PyObject *file, *message; PyObject *error_type, *error_value, *error_traceback; const char *utf8; + PyThreadState *tstate = _PyThreadState_GET(); - PyErr_Fetch(&error_type, &error_value, &error_traceback); - file = _PySys_GetObjectId(key); + _PyErr_Fetch(tstate, &error_type, &error_value, &error_traceback); + file = sys_get_object_id(tstate, key); message = PyUnicode_FromFormatV(format, va); if (message != NULL) { if (sys_pyfile_write_unicode(message, file) != 0) { - PyErr_Clear(); + _PyErr_Clear(tstate); utf8 = PyUnicode_AsUTF8(message); if (utf8 != NULL) fputs(utf8, fp); } Py_DECREF(message); } - PyErr_Restore(error_type, error_value, error_traceback); + _PyErr_Restore(tstate, error_type, error_value, error_traceback); } void From webhook-mailer at python.org Thu Jun 13 18:35:10 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 13 Jun 2019 22:35:10 -0000 Subject: [Python-checkins] bpo-37077: Add native thread ID (TID) for AIX (GH-13624) Message-ID: https://github.com/python/cpython/commit/d0eeb936d8daf05d7d89f6935e3f4c0dee49c5be commit: d0eeb936d8daf05d7d89f6935e3f4c0dee49c5be branch: master author: Michael Felt committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-06-13T15:34:46-07:00 summary: bpo-37077: Add native thread ID (TID) for AIX (GH-13624) This is the followup for issue36084 https://bugs.python.org/issue37077 files: A Misc/NEWS.d/next/Core and Builtins/2019-05-28-11-47-44.bpo-37077.S1h0Fc.rst M Doc/library/_thread.rst M Doc/library/threading.rst M Include/pythread.h M Python/thread_pthread.h diff --git a/Doc/library/_thread.rst b/Doc/library/_thread.rst index 5b4fcde669e1..bd653ab32bb9 100644 --- a/Doc/library/_thread.rst +++ b/Doc/library/_thread.rst @@ -106,7 +106,7 @@ This module defines the following constants and functions: Its value may be used to uniquely identify this particular thread system-wide (until the thread terminates, after which the value may be recycled by the OS). - .. availability:: Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD. + .. availability:: Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD, AIX. .. versionadded:: 3.8 diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst index b4f4814c4ad3..2907b65f5bca 100644 --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -82,7 +82,7 @@ This module defines the following functions: Its value may be used to uniquely identify this particular thread system-wide (until the thread terminates, after which the value may be recycled by the OS). - .. availability:: Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD. + .. availability:: Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD, AIX. .. versionadded:: 3.8 diff --git a/Include/pythread.h b/Include/pythread.h index 79a9210af3a4..f22e8c42c502 100644 --- a/Include/pythread.h +++ b/Include/pythread.h @@ -26,7 +26,7 @@ PyAPI_FUNC(unsigned long) PyThread_start_new_thread(void (*)(void *), void *); PyAPI_FUNC(void) _Py_NO_RETURN PyThread_exit_thread(void); PyAPI_FUNC(unsigned long) PyThread_get_thread_ident(void); -#if defined(__APPLE__) || defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(_WIN32) +#if defined(__APPLE__) || defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(_WIN32) || defined(_AIX) #define PY_HAVE_THREAD_NATIVE_ID PyAPI_FUNC(unsigned long) PyThread_get_thread_native_id(void); #endif diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-28-11-47-44.bpo-37077.S1h0Fc.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-28-11-47-44.bpo-37077.S1h0Fc.rst new file mode 100644 index 000000000000..832dfc94ac49 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-28-11-47-44.bpo-37077.S1h0Fc.rst @@ -0,0 +1,2 @@ +Add :func:`threading.get_native_id` support for AIX. +Patch by M. Felt diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h index 9b4b23bdc7d7..a36d16c19ead 100644 --- a/Python/thread_pthread.h +++ b/Python/thread_pthread.h @@ -18,8 +18,10 @@ # include /* pthread_getthreadid_np() */ #elif defined(__OpenBSD__) # include /* getthrid() */ -#elif defined(__NetBSD__) /* _lwp_self */ -# include +#elif defined(_AIX) +# include /* thread_self() */ +#elif defined(__NetBSD__) +# include /* _lwp_self() */ #endif /* The POSIX spec requires that use of pthread_attr_setstacksize @@ -330,6 +332,9 @@ PyThread_get_thread_native_id(void) #elif defined(__OpenBSD__) pid_t native_id; native_id = getthrid(); +#elif defined(_AIX) + tid_t native_id; + native_id = thread_self(); #elif defined(__NetBSD__) lwpid_t native_id; native_id = _lwp_self(); From webhook-mailer at python.org Thu Jun 13 18:54:13 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Thu, 13 Jun 2019 22:54:13 -0000 Subject: [Python-checkins] bpo-37077: Add native thread ID (TID) for AIX (GH-13624) Message-ID: https://github.com/python/cpython/commit/886d83e5aa8df2dd2e93421d2f614438a3244a1c commit: 886d83e5aa8df2dd2e93421d2f614438a3244a1c branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-13T15:54:04-07:00 summary: bpo-37077: Add native thread ID (TID) for AIX (GH-13624) This is the followup for issue36084 https://bugs.python.org/issue37077 (cherry picked from commit d0eeb936d8daf05d7d89f6935e3f4c0dee49c5be) Co-authored-by: Michael Felt files: A Misc/NEWS.d/next/Core and Builtins/2019-05-28-11-47-44.bpo-37077.S1h0Fc.rst M Doc/library/_thread.rst M Doc/library/threading.rst M Include/pythread.h M Python/thread_pthread.h diff --git a/Doc/library/_thread.rst b/Doc/library/_thread.rst index 5b4fcde669e1..bd653ab32bb9 100644 --- a/Doc/library/_thread.rst +++ b/Doc/library/_thread.rst @@ -106,7 +106,7 @@ This module defines the following constants and functions: Its value may be used to uniquely identify this particular thread system-wide (until the thread terminates, after which the value may be recycled by the OS). - .. availability:: Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD. + .. availability:: Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD, AIX. .. versionadded:: 3.8 diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst index b4f4814c4ad3..2907b65f5bca 100644 --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -82,7 +82,7 @@ This module defines the following functions: Its value may be used to uniquely identify this particular thread system-wide (until the thread terminates, after which the value may be recycled by the OS). - .. availability:: Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD. + .. availability:: Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD, AIX. .. versionadded:: 3.8 diff --git a/Include/pythread.h b/Include/pythread.h index 79a9210af3a4..f22e8c42c502 100644 --- a/Include/pythread.h +++ b/Include/pythread.h @@ -26,7 +26,7 @@ PyAPI_FUNC(unsigned long) PyThread_start_new_thread(void (*)(void *), void *); PyAPI_FUNC(void) _Py_NO_RETURN PyThread_exit_thread(void); PyAPI_FUNC(unsigned long) PyThread_get_thread_ident(void); -#if defined(__APPLE__) || defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(_WIN32) +#if defined(__APPLE__) || defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(_WIN32) || defined(_AIX) #define PY_HAVE_THREAD_NATIVE_ID PyAPI_FUNC(unsigned long) PyThread_get_thread_native_id(void); #endif diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-28-11-47-44.bpo-37077.S1h0Fc.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-28-11-47-44.bpo-37077.S1h0Fc.rst new file mode 100644 index 000000000000..832dfc94ac49 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-28-11-47-44.bpo-37077.S1h0Fc.rst @@ -0,0 +1,2 @@ +Add :func:`threading.get_native_id` support for AIX. +Patch by M. Felt diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h index 9b4b23bdc7d7..a36d16c19ead 100644 --- a/Python/thread_pthread.h +++ b/Python/thread_pthread.h @@ -18,8 +18,10 @@ # include /* pthread_getthreadid_np() */ #elif defined(__OpenBSD__) # include /* getthrid() */ -#elif defined(__NetBSD__) /* _lwp_self */ -# include +#elif defined(_AIX) +# include /* thread_self() */ +#elif defined(__NetBSD__) +# include /* _lwp_self() */ #endif /* The POSIX spec requires that use of pthread_attr_setstacksize @@ -330,6 +332,9 @@ PyThread_get_thread_native_id(void) #elif defined(__OpenBSD__) pid_t native_id; native_id = getthrid(); +#elif defined(_AIX) + tid_t native_id; + native_id = thread_self(); #elif defined(__NetBSD__) lwpid_t native_id; native_id = _lwp_self(); From webhook-mailer at python.org Fri Jun 14 01:55:03 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Fri, 14 Jun 2019 05:55:03 -0000 Subject: [Python-checkins] bpo-37269: Correctly optimise conditionals with constant booleans (GH-14071) Message-ID: https://github.com/python/cpython/commit/05f831865545b08c9a21cfb7773af58b76ec64cb commit: 05f831865545b08c9a21cfb7773af58b76ec64cb branch: master author: Pablo Galindo committer: GitHub date: 2019-06-14T06:54:53+01:00 summary: bpo-37269: Correctly optimise conditionals with constant booleans (GH-14071) Fix a regression introduced by af8646c8054d0f4180a2013383039b6a472f9698 that was causing code of the form: if True and False: do_something() to be optimized incorrectly, eliminating the block. files: A Misc/NEWS.d/next/Core and Builtins/2019-06-14-06-32-33.bpo-37269.SjVVAe.rst M Lib/test/test_peepholer.py M Python/peephole.c diff --git a/Lib/test/test_peepholer.py b/Lib/test/test_peepholer.py index 860ceeb003e7..5d00240e2595 100644 --- a/Lib/test/test_peepholer.py +++ b/Lib/test/test_peepholer.py @@ -414,6 +414,13 @@ def forloop(): pass self.assertEqual(count_instr_recursively(forloop, 'BUILD_LIST'), 0) + def test_condition_with_binop_with_bools(self): + def f(): + if True or False: + return 1 + return 0 + self.assertEqual(f(), 1) + class TestBuglets(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-06-14-06-32-33.bpo-37269.SjVVAe.rst b/Misc/NEWS.d/next/Core and Builtins/2019-06-14-06-32-33.bpo-37269.SjVVAe.rst new file mode 100644 index 000000000000..b9b79066774f --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-06-14-06-32-33.bpo-37269.SjVVAe.rst @@ -0,0 +1,2 @@ +Fix a bug in the peephole optimizer that was not treating correctly constant +conditions with binary operators. Patch by Pablo Galindo. diff --git a/Python/peephole.c b/Python/peephole.c index 6f3e2ed88b2b..d7b1dfc4d9c1 100644 --- a/Python/peephole.c +++ b/Python/peephole.c @@ -315,6 +315,11 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, fill_nops(codestr, op_start, nexti + 1); cumlc = 0; } else if (is_true == 0) { + if (i > 1 && + (_Py_OPCODE(codestr[i - 1]) == POP_JUMP_IF_TRUE || + _Py_OPCODE(codestr[i - 1]) == POP_JUMP_IF_FALSE)) { + break; + } h = get_arg(codestr, nexti) / sizeof(_Py_CODEUNIT); tgt = find_op(codestr, codelen, h); fill_nops(codestr, op_start, tgt); From webhook-mailer at python.org Fri Jun 14 02:13:29 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 14 Jun 2019 06:13:29 -0000 Subject: [Python-checkins] bpo-37269: Correctly optimise conditionals with constant booleans (GH-14071) Message-ID: https://github.com/python/cpython/commit/7cd581a6bf82309b3c9b9251c54067d442732485 commit: 7cd581a6bf82309b3c9b9251c54067d442732485 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-13T23:13:24-07:00 summary: bpo-37269: Correctly optimise conditionals with constant booleans (GH-14071) Fix a regression introduced by af8646c8054d0f4180a2013383039b6a472f9698 that was causing code of the form: if True and False: do_something() to be optimized incorrectly, eliminating the block. (cherry picked from commit 05f831865545b08c9a21cfb7773af58b76ec64cb) Co-authored-by: Pablo Galindo files: A Misc/NEWS.d/next/Core and Builtins/2019-06-14-06-32-33.bpo-37269.SjVVAe.rst M Lib/test/test_peepholer.py M Python/peephole.c diff --git a/Lib/test/test_peepholer.py b/Lib/test/test_peepholer.py index 860ceeb003e7..5d00240e2595 100644 --- a/Lib/test/test_peepholer.py +++ b/Lib/test/test_peepholer.py @@ -414,6 +414,13 @@ def forloop(): pass self.assertEqual(count_instr_recursively(forloop, 'BUILD_LIST'), 0) + def test_condition_with_binop_with_bools(self): + def f(): + if True or False: + return 1 + return 0 + self.assertEqual(f(), 1) + class TestBuglets(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-06-14-06-32-33.bpo-37269.SjVVAe.rst b/Misc/NEWS.d/next/Core and Builtins/2019-06-14-06-32-33.bpo-37269.SjVVAe.rst new file mode 100644 index 000000000000..b9b79066774f --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-06-14-06-32-33.bpo-37269.SjVVAe.rst @@ -0,0 +1,2 @@ +Fix a bug in the peephole optimizer that was not treating correctly constant +conditions with binary operators. Patch by Pablo Galindo. diff --git a/Python/peephole.c b/Python/peephole.c index 6f3e2ed88b2b..d7b1dfc4d9c1 100644 --- a/Python/peephole.c +++ b/Python/peephole.c @@ -315,6 +315,11 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, fill_nops(codestr, op_start, nexti + 1); cumlc = 0; } else if (is_true == 0) { + if (i > 1 && + (_Py_OPCODE(codestr[i - 1]) == POP_JUMP_IF_TRUE || + _Py_OPCODE(codestr[i - 1]) == POP_JUMP_IF_FALSE)) { + break; + } h = get_arg(codestr, nexti) / sizeof(_Py_CODEUNIT); tgt = find_op(codestr, codelen, h); fill_nops(codestr, op_start, tgt); From webhook-mailer at python.org Fri Jun 14 02:18:55 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Fri, 14 Jun 2019 06:18:55 -0000 Subject: [Python-checkins] [3.7] bpo-37269: Correctly optimise conditionals with constant booleans (GH-14071) (GH-14073) Message-ID: https://github.com/python/cpython/commit/5292179afc6fd0dc533add054d4790773c9766d0 commit: 5292179afc6fd0dc533add054d4790773c9766d0 branch: 3.7 author: Pablo Galindo committer: GitHub date: 2019-06-14T07:18:51+01:00 summary: [3.7] bpo-37269: Correctly optimise conditionals with constant booleans (GH-14071) (GH-14073) Fix a regression introduced by af8646c8054d0f4180a2013383039b6a472f9698 that was causing code of the form: if True and False: do_something() to be optimized incorrectly, eliminating the block.. (cherry picked from commit 05f831865545b08c9a21cfb7773af58b76ec64cb) Co-authored-by: Pablo Galindo files: A Misc/NEWS.d/next/Core and Builtins/2019-06-14-06-32-33.bpo-37269.SjVVAe.rst M Lib/test/test_peepholer.py M Python/peephole.c diff --git a/Lib/test/test_peepholer.py b/Lib/test/test_peepholer.py index 0cc1e92907b5..1a031544fc01 100644 --- a/Lib/test/test_peepholer.py +++ b/Lib/test/test_peepholer.py @@ -311,6 +311,13 @@ def test_constant_folding(self): self.assertFalse(instr.opname.startswith('BINARY_')) self.assertFalse(instr.opname.startswith('BUILD_')) + def test_condition_with_binop_with_bools(self): + def f(): + if True or False: + return 1 + return 0 + self.assertEqual(f(), 1) + class TestBuglets(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-06-14-06-32-33.bpo-37269.SjVVAe.rst b/Misc/NEWS.d/next/Core and Builtins/2019-06-14-06-32-33.bpo-37269.SjVVAe.rst new file mode 100644 index 000000000000..b9b79066774f --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-06-14-06-32-33.bpo-37269.SjVVAe.rst @@ -0,0 +1,2 @@ +Fix a bug in the peephole optimizer that was not treating correctly constant +conditions with binary operators. Patch by Pablo Galindo. diff --git a/Python/peephole.c b/Python/peephole.c index 1ae62fa39a27..f1b71ed1a730 100644 --- a/Python/peephole.c +++ b/Python/peephole.c @@ -313,6 +313,11 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, fill_nops(codestr, op_start, nexti + 1); cumlc = 0; } else if (is_true == 0) { + if (i > 1 && + (_Py_OPCODE(codestr[i - 1]) == POP_JUMP_IF_TRUE || + _Py_OPCODE(codestr[i - 1]) == POP_JUMP_IF_FALSE)) { + break; + } h = get_arg(codestr, nexti) / sizeof(_Py_CODEUNIT); tgt = find_op(codestr, codelen, h); fill_nops(codestr, op_start, tgt); From webhook-mailer at python.org Fri Jun 14 06:37:20 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Fri, 14 Jun 2019 10:37:20 -0000 Subject: [Python-checkins] bpo-37249: add declaration of _PyObject_GetMethod (GH-14015) Message-ID: https://github.com/python/cpython/commit/b2f94730d947f25b8507c5f76202e917683e76f7 commit: b2f94730d947f25b8507c5f76202e917683e76f7 branch: master author: Jeroen Demeyer committer: Inada Naoki date: 2019-06-14T19:37:15+09:00 summary: bpo-37249: add declaration of _PyObject_GetMethod (GH-14015) files: M Include/cpython/object.h M Objects/call.c M Python/ceval.c diff --git a/Include/cpython/object.h b/Include/cpython/object.h index a65aaf648215..fd4e77103f01 100644 --- a/Include/cpython/object.h +++ b/Include/cpython/object.h @@ -318,6 +318,9 @@ PyAPI_FUNC(int) _PyObject_HasAttrId(PyObject *, struct _Py_Identifier *); */ PyAPI_FUNC(int) _PyObject_LookupAttr(PyObject *, PyObject *, PyObject **); PyAPI_FUNC(int) _PyObject_LookupAttrId(PyObject *, struct _Py_Identifier *, PyObject **); + +PyAPI_FUNC(int) _PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method); + PyAPI_FUNC(PyObject **) _PyObject_GetDictPtr(PyObject *); PyAPI_FUNC(PyObject *) _PyObject_NextNotImplemented(PyObject *); PyAPI_FUNC(void) PyObject_CallFinalizer(PyObject *); diff --git a/Objects/call.c b/Objects/call.c index 578e1b3ab619..8eae1e10d8c5 100644 --- a/Objects/call.c +++ b/Objects/call.c @@ -1211,9 +1211,6 @@ object_vacall(PyObject *base, PyObject *callable, va_list vargs) } -/* Private API for the LOAD_METHOD opcode. */ -extern int _PyObject_GetMethod(PyObject *, PyObject *, PyObject **); - PyObject * PyObject_CallMethodObjArgs(PyObject *obj, PyObject *name, ...) { diff --git a/Python/ceval.c b/Python/ceval.c index bb0416f4ceba..60367a665d7d 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -38,10 +38,6 @@ # error "ceval.c must be build with Py_BUILD_CORE define for best performance" #endif -/* Private API for the LOAD_METHOD opcode. */ -extern int _PyObject_GetMethod(PyObject *, PyObject *, PyObject **); - -typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *); /* Forward declarations */ Py_LOCAL_INLINE(PyObject *) call_function( From webhook-mailer at python.org Fri Jun 14 07:03:07 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 14 Jun 2019 11:03:07 -0000 Subject: [Python-checkins] bpo-37278: Fix test_asyncio ProactorLoopCtrlC (GH-14074) Message-ID: https://github.com/python/cpython/commit/07559450b2d9179e4c99e0af088ce7550e549f94 commit: 07559450b2d9179e4c99e0af088ce7550e549f94 branch: master author: Victor Stinner committer: GitHub date: 2019-06-14T13:02:51+02:00 summary: bpo-37278: Fix test_asyncio ProactorLoopCtrlC (GH-14074) Join the thread to prevent leaking a running thread and leaking a reference. Cleanup also the test: * asyncioWindowsProactorEventLoopPolicy became the default policy, there is no need to set it manually. * Only start the thread once the loop is running. * Use a shorter sleep in the thread (100 ms rather than 1 sec). * Use close_loop(loop) rather than loop.close(). * Use longer variable names. files: A Misc/NEWS.d/next/Tests/2019-06-14-12-21-47.bpo-37278.z0HUOr.rst M Lib/test/test_asyncio/test_windows_events.py diff --git a/Lib/test/test_asyncio/test_windows_events.py b/Lib/test/test_asyncio/test_windows_events.py index 13aef7cf1f77..1e1c01d713b5 100644 --- a/Lib/test/test_asyncio/test_windows_events.py +++ b/Lib/test/test_asyncio/test_windows_events.py @@ -45,20 +45,21 @@ class ProactorLoopCtrlC(test_utils.TestCase): def test_ctrl_c(self): def SIGINT_after_delay(): - time.sleep(1) + time.sleep(0.1) signal.raise_signal(signal.SIGINT) - asyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy()) - l = asyncio.get_event_loop() + thread = threading.Thread(target=SIGINT_after_delay) + loop = asyncio.get_event_loop() try: - t = threading.Thread(target=SIGINT_after_delay) - t.start() - l.run_forever() + # only start the loop once the event loop is running + loop.call_soon(thread.start) + loop.run_forever() self.fail("should not fall through 'run_forever'") except KeyboardInterrupt: pass finally: - l.close() + self.close_loop(loop) + thread.join() class ProactorTests(test_utils.TestCase): diff --git a/Misc/NEWS.d/next/Tests/2019-06-14-12-21-47.bpo-37278.z0HUOr.rst b/Misc/NEWS.d/next/Tests/2019-06-14-12-21-47.bpo-37278.z0HUOr.rst new file mode 100644 index 000000000000..3d3011b51c5b --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-06-14-12-21-47.bpo-37278.z0HUOr.rst @@ -0,0 +1,2 @@ +Fix test_asyncio ProactorLoopCtrlC: join the thread to prevent leaking a +running thread and leaking a reference. From webhook-mailer at python.org Fri Jun 14 07:53:20 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 14 Jun 2019 11:53:20 -0000 Subject: [Python-checkins] bpo-37278: Fix test_asyncio ProactorLoopCtrlC (GH-14074) Message-ID: https://github.com/python/cpython/commit/8b66dbb212d7dffbf9fb545dad2a3400aead1461 commit: 8b66dbb212d7dffbf9fb545dad2a3400aead1461 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-14T04:53:13-07:00 summary: bpo-37278: Fix test_asyncio ProactorLoopCtrlC (GH-14074) Join the thread to prevent leaking a running thread and leaking a reference. Cleanup also the test: * asyncioWindowsProactorEventLoopPolicy became the default policy, there is no need to set it manually. * Only start the thread once the loop is running. * Use a shorter sleep in the thread (100 ms rather than 1 sec). * Use close_loop(loop) rather than loop.close(). * Use longer variable names. (cherry picked from commit 07559450b2d9179e4c99e0af088ce7550e549f94) Co-authored-by: Victor Stinner files: A Misc/NEWS.d/next/Tests/2019-06-14-12-21-47.bpo-37278.z0HUOr.rst M Lib/test/test_asyncio/test_windows_events.py diff --git a/Lib/test/test_asyncio/test_windows_events.py b/Lib/test/test_asyncio/test_windows_events.py index 13aef7cf1f77..1e1c01d713b5 100644 --- a/Lib/test/test_asyncio/test_windows_events.py +++ b/Lib/test/test_asyncio/test_windows_events.py @@ -45,20 +45,21 @@ class ProactorLoopCtrlC(test_utils.TestCase): def test_ctrl_c(self): def SIGINT_after_delay(): - time.sleep(1) + time.sleep(0.1) signal.raise_signal(signal.SIGINT) - asyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy()) - l = asyncio.get_event_loop() + thread = threading.Thread(target=SIGINT_after_delay) + loop = asyncio.get_event_loop() try: - t = threading.Thread(target=SIGINT_after_delay) - t.start() - l.run_forever() + # only start the loop once the event loop is running + loop.call_soon(thread.start) + loop.run_forever() self.fail("should not fall through 'run_forever'") except KeyboardInterrupt: pass finally: - l.close() + self.close_loop(loop) + thread.join() class ProactorTests(test_utils.TestCase): diff --git a/Misc/NEWS.d/next/Tests/2019-06-14-12-21-47.bpo-37278.z0HUOr.rst b/Misc/NEWS.d/next/Tests/2019-06-14-12-21-47.bpo-37278.z0HUOr.rst new file mode 100644 index 000000000000..3d3011b51c5b --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-06-14-12-21-47.bpo-37278.z0HUOr.rst @@ -0,0 +1,2 @@ +Fix test_asyncio ProactorLoopCtrlC: join the thread to prevent leaking a +running thread and leaking a reference. From webhook-mailer at python.org Fri Jun 14 10:40:08 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 14 Jun 2019 14:40:08 -0000 Subject: [Python-checkins] Update concurrent.futures.rst (GH-14061) Message-ID: https://github.com/python/cpython/commit/431478d5d74d880692817323198b9605af972fa5 commit: 431478d5d74d880692817323198b9605af972fa5 branch: master author: G?ry Ogam committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-06-14T07:39:43-07:00 summary: Update concurrent.futures.rst (GH-14061) This PR adds missing details in the [`concurrent.futures`](https://docs.python.org/3/library/concurrent.futures.html) documentation: * the mention that `Future.cancel` also returns `False` if the call finished running; * the mention of the states for `Future` that did not complete: pending or running. files: M Doc/library/concurrent.futures.rst diff --git a/Doc/library/concurrent.futures.rst b/Doc/library/concurrent.futures.rst index 34905c449d7f..d71f2d80c9e2 100644 --- a/Doc/library/concurrent.futures.rst +++ b/Doc/library/concurrent.futures.rst @@ -306,9 +306,10 @@ The :class:`Future` class encapsulates the asynchronous execution of a callable. .. method:: cancel() - Attempt to cancel the call. If the call is currently being executed and - cannot be cancelled then the method will return ``False``, otherwise the - call will be cancelled and the method will return ``True``. + Attempt to cancel the call. If the call is currently being executed or + finished running and cannot be cancelled then the method will return + ``False``, otherwise the call will be cancelled and the method will + return ``True``. .. method:: cancelled() @@ -423,8 +424,9 @@ Module Functions Wait for the :class:`Future` instances (possibly created by different :class:`Executor` instances) given by *fs* to complete. Returns a named 2-tuple of sets. The first set, named ``done``, contains the futures that - completed (finished or were cancelled) before the wait completed. The second - set, named ``not_done``, contains uncompleted futures. + completed (finished or cancelled futures) before the wait completed. The + second set, named ``not_done``, contains the futures that did not complete + (pending or running futures). *timeout* can be used to control the maximum number of seconds to wait before returning. *timeout* can be an int or float. If *timeout* is not specified @@ -455,7 +457,7 @@ Module Functions Returns an iterator over the :class:`Future` instances (possibly created by different :class:`Executor` instances) given by *fs* that yields futures as - they complete (finished or were cancelled). Any futures given by *fs* that + they complete (finished or cancelled futures). Any futures given by *fs* that are duplicated will be returned once. Any futures that completed before :func:`as_completed` is called will be yielded first. The returned iterator raises a :exc:`concurrent.futures.TimeoutError` if :meth:`~iterator.__next__` From webhook-mailer at python.org Fri Jun 14 10:52:28 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 14 Jun 2019 14:52:28 -0000 Subject: [Python-checkins] Update concurrent.futures.rst (GH-14061) Message-ID: https://github.com/python/cpython/commit/0bd1469a90648229f4c704741ba13f6709b166ea commit: 0bd1469a90648229f4c704741ba13f6709b166ea branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-14T07:52:14-07:00 summary: Update concurrent.futures.rst (GH-14061) This PR adds missing details in the [`concurrent.futures`](https://docs.python.org/3/library/concurrent.futures.html) documentation: * the mention that `Future.cancel` also returns `False` if the call finished running; * the mention of the states for `Future` that did not complete: pending or running. (cherry picked from commit 431478d5d74d880692817323198b9605af972fa5) Co-authored-by: G?ry Ogam files: M Doc/library/concurrent.futures.rst diff --git a/Doc/library/concurrent.futures.rst b/Doc/library/concurrent.futures.rst index 24d684a0123d..9295df84278d 100644 --- a/Doc/library/concurrent.futures.rst +++ b/Doc/library/concurrent.futures.rst @@ -293,9 +293,10 @@ The :class:`Future` class encapsulates the asynchronous execution of a callable. .. method:: cancel() - Attempt to cancel the call. If the call is currently being executed and - cannot be cancelled then the method will return ``False``, otherwise the - call will be cancelled and the method will return ``True``. + Attempt to cancel the call. If the call is currently being executed or + finished running and cannot be cancelled then the method will return + ``False``, otherwise the call will be cancelled and the method will + return ``True``. .. method:: cancelled() @@ -401,8 +402,9 @@ Module Functions Wait for the :class:`Future` instances (possibly created by different :class:`Executor` instances) given by *fs* to complete. Returns a named 2-tuple of sets. The first set, named ``done``, contains the futures that - completed (finished or were cancelled) before the wait completed. The second - set, named ``not_done``, contains uncompleted futures. + completed (finished or cancelled futures) before the wait completed. The + second set, named ``not_done``, contains the futures that did not complete + (pending or running futures). *timeout* can be used to control the maximum number of seconds to wait before returning. *timeout* can be an int or float. If *timeout* is not specified @@ -433,7 +435,7 @@ Module Functions Returns an iterator over the :class:`Future` instances (possibly created by different :class:`Executor` instances) given by *fs* that yields futures as - they complete (finished or were cancelled). Any futures given by *fs* that + they complete (finished or cancelled futures). Any futures given by *fs* that are duplicated will be returned once. Any futures that completed before :func:`as_completed` is called will be yielded first. The returned iterator raises a :exc:`concurrent.futures.TimeoutError` if :meth:`~iterator.__next__` From webhook-mailer at python.org Fri Jun 14 11:11:13 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 14 Jun 2019 15:11:13 -0000 Subject: [Python-checkins] Update concurrent.futures.rst (GH-14061) Message-ID: https://github.com/python/cpython/commit/047fa1ddae856aa9aaee21c799349348657b8918 commit: 047fa1ddae856aa9aaee21c799349348657b8918 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-14T08:11:04-07:00 summary: Update concurrent.futures.rst (GH-14061) This PR adds missing details in the [`concurrent.futures`](https://docs.python.org/3/library/concurrent.futures.html) documentation: * the mention that `Future.cancel` also returns `False` if the call finished running; * the mention of the states for `Future` that did not complete: pending or running. (cherry picked from commit 431478d5d74d880692817323198b9605af972fa5) Co-authored-by: G?ry Ogam files: M Doc/library/concurrent.futures.rst diff --git a/Doc/library/concurrent.futures.rst b/Doc/library/concurrent.futures.rst index f2491dd24571..41d47c7ef153 100644 --- a/Doc/library/concurrent.futures.rst +++ b/Doc/library/concurrent.futures.rst @@ -306,9 +306,10 @@ The :class:`Future` class encapsulates the asynchronous execution of a callable. .. method:: cancel() - Attempt to cancel the call. If the call is currently being executed and - cannot be cancelled then the method will return ``False``, otherwise the - call will be cancelled and the method will return ``True``. + Attempt to cancel the call. If the call is currently being executed or + finished running and cannot be cancelled then the method will return + ``False``, otherwise the call will be cancelled and the method will + return ``True``. .. method:: cancelled() @@ -423,8 +424,9 @@ Module Functions Wait for the :class:`Future` instances (possibly created by different :class:`Executor` instances) given by *fs* to complete. Returns a named 2-tuple of sets. The first set, named ``done``, contains the futures that - completed (finished or were cancelled) before the wait completed. The second - set, named ``not_done``, contains uncompleted futures. + completed (finished or cancelled futures) before the wait completed. The + second set, named ``not_done``, contains the futures that did not complete + (pending or running futures). *timeout* can be used to control the maximum number of seconds to wait before returning. *timeout* can be an int or float. If *timeout* is not specified @@ -455,7 +457,7 @@ Module Functions Returns an iterator over the :class:`Future` instances (possibly created by different :class:`Executor` instances) given by *fs* that yields futures as - they complete (finished or were cancelled). Any futures given by *fs* that + they complete (finished or cancelled futures). Any futures given by *fs* that are duplicated will be returned once. Any futures that completed before :func:`as_completed` is called will be yielded first. The returned iterator raises a :exc:`concurrent.futures.TimeoutError` if :meth:`~iterator.__next__` From webhook-mailer at python.org Fri Jun 14 11:26:45 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 14 Jun 2019 15:26:45 -0000 Subject: [Python-checkins] bpo-35998: Avoid TimeoutError in test_asyncio: test_start_tls_server_1() (GH-14080) Message-ID: https://github.com/python/cpython/commit/f0749da9a535375f05a2015e8960e8ae54877349 commit: f0749da9a535375f05a2015e8960e8ae54877349 branch: master author: Andrew Svetlov committer: Victor Stinner date: 2019-06-14T17:26:24+02:00 summary: bpo-35998: Avoid TimeoutError in test_asyncio: test_start_tls_server_1() (GH-14080) files: A Misc/NEWS.d/next/Tests/2019-06-14-17-05-49.bpo-35998.yX82oD.rst M Lib/test/test_asyncio/test_sslproto.py diff --git a/Lib/test/test_asyncio/test_sslproto.py b/Lib/test/test_asyncio/test_sslproto.py index 4215abf5d863..5c861e92b7d6 100644 --- a/Lib/test/test_asyncio/test_sslproto.py +++ b/Lib/test/test_asyncio/test_sslproto.py @@ -494,17 +494,14 @@ def eof_received(self): def test_start_tls_server_1(self): HELLO_MSG = b'1' * self.PAYLOAD_SIZE + ANSWER = b'answer' server_context = test_utils.simple_server_sslcontext() client_context = test_utils.simple_client_sslcontext() - if sys.platform.startswith('freebsd') or sys.platform.startswith('win'): - # bpo-35031: Some FreeBSD and Windows buildbots fail to run this test - # as the eof was not being received by the server if the payload - # size is not big enough. This behaviour only appears if the - # client is using TLS1.3. - client_context.options |= ssl.OP_NO_TLSv1_3 + answer = None def client(sock, addr): + nonlocal answer sock.settimeout(self.TIMEOUT) sock.connect(addr) @@ -513,33 +510,36 @@ def client(sock, addr): sock.start_tls(client_context) sock.sendall(HELLO_MSG) - - sock.shutdown(socket.SHUT_RDWR) + answer = sock.recv_all(len(ANSWER)) sock.close() class ServerProto(asyncio.Protocol): - def __init__(self, on_con, on_eof, on_con_lost): + def __init__(self, on_con, on_con_lost): self.on_con = on_con - self.on_eof = on_eof self.on_con_lost = on_con_lost self.data = b'' + self.transport = None def connection_made(self, tr): + self.transport = tr self.on_con.set_result(tr) + def replace_transport(self, tr): + self.transport = tr + def data_received(self, data): self.data += data - - def eof_received(self): - self.on_eof.set_result(1) + if len(self.data) >= len(HELLO_MSG): + self.transport.write(ANSWER) def connection_lost(self, exc): + self.transport = None if exc is None: self.on_con_lost.set_result(None) else: self.on_con_lost.set_exception(exc) - async def main(proto, on_con, on_eof, on_con_lost): + async def main(proto, on_con, on_con_lost): tr = await on_con tr.write(HELLO_MSG) @@ -550,16 +550,16 @@ def connection_lost(self, exc): server_side=True, ssl_handshake_timeout=self.TIMEOUT) - await on_eof + proto.replace_transport(new_tr) + await on_con_lost self.assertEqual(proto.data, HELLO_MSG) new_tr.close() async def run_main(): on_con = self.loop.create_future() - on_eof = self.loop.create_future() on_con_lost = self.loop.create_future() - proto = ServerProto(on_con, on_eof, on_con_lost) + proto = ServerProto(on_con, on_con_lost) server = await self.loop.create_server( lambda: proto, '127.0.0.1', 0) @@ -568,11 +568,12 @@ def connection_lost(self, exc): with self.tcp_client(lambda sock: client(sock, addr), timeout=self.TIMEOUT): await asyncio.wait_for( - main(proto, on_con, on_eof, on_con_lost), + main(proto, on_con, on_con_lost), timeout=self.TIMEOUT) server.close() await server.wait_closed() + self.assertEqual(answer, ANSWER) self.loop.run_until_complete(run_main()) diff --git a/Misc/NEWS.d/next/Tests/2019-06-14-17-05-49.bpo-35998.yX82oD.rst b/Misc/NEWS.d/next/Tests/2019-06-14-17-05-49.bpo-35998.yX82oD.rst new file mode 100644 index 000000000000..23b6d00f42c5 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-06-14-17-05-49.bpo-35998.yX82oD.rst @@ -0,0 +1 @@ +Avoid TimeoutError in test_asyncio: test_start_tls_server_1() From webhook-mailer at python.org Fri Jun 14 11:29:26 2019 From: webhook-mailer at python.org (Steve Dower) Date: Fri, 14 Jun 2019 15:29:26 -0000 Subject: [Python-checkins] Implement Windows release builds in Azure Pipelines (GH-14065) Message-ID: https://github.com/python/cpython/commit/21a92f8cda525d25a165b773fbe1bfffd303a000 commit: 21a92f8cda525d25a165b773fbe1bfffd303a000 branch: master author: Steve Dower committer: GitHub date: 2019-06-14T08:29:20-07:00 summary: Implement Windows release builds in Azure Pipelines (GH-14065) files: A .azure-pipelines/windows-release.yml A .azure-pipelines/windows-release/build-steps.yml A .azure-pipelines/windows-release/checkout.yml A .azure-pipelines/windows-release/find-sdk.yml A .azure-pipelines/windows-release/layout-command.yml A .azure-pipelines/windows-release/mingw-lib.yml A .azure-pipelines/windows-release/msi-steps.yml A .azure-pipelines/windows-release/stage-build.yml A .azure-pipelines/windows-release/stage-layout-embed.yml A .azure-pipelines/windows-release/stage-layout-full.yml A .azure-pipelines/windows-release/stage-layout-msix.yml A .azure-pipelines/windows-release/stage-layout-nuget.yml A .azure-pipelines/windows-release/stage-msi.yml A .azure-pipelines/windows-release/stage-pack-msix.yml A .azure-pipelines/windows-release/stage-pack-nuget.yml A .azure-pipelines/windows-release/stage-publish-nugetorg.yml A .azure-pipelines/windows-release/stage-publish-pythonorg.yml A .azure-pipelines/windows-release/stage-publish-store.yml A .azure-pipelines/windows-release/stage-sign.yml A .azure-pipelines/windows-release/stage-test-embed.yml A .azure-pipelines/windows-release/stage-test-msi.yml A .azure-pipelines/windows-release/stage-test-nuget.yml A PC/crtlicense.txt A PC/layout/support/nuspec.py D Tools/msi/exe/crtlicense.txt M Doc/make.bat M PC/layout/main.py M PC/layout/support/appxmanifest.py M PC/layout/support/options.py M PC/layout/support/pip.py M PC/layout/support/props.py M PC/python_uwp.cpp M PCbuild/_tkinter.vcxproj M PCbuild/build.bat M PCbuild/pyproject.props M PCbuild/python.props M PCbuild/python.vcxproj M PCbuild/tcltk.props M Tools/msi/buildrelease.bat M Tools/msi/exe/exe.wixproj M Tools/msi/exe/exe_files.wxs M Tools/msi/make_cat.ps1 M Tools/msi/msi.props M Tools/msi/msi.targets M Tools/msi/sign_build.ps1 M Tools/msi/tcltk/tcltk.wixproj M Tools/msi/uploadrelease.ps1 diff --git a/.azure-pipelines/windows-release.yml b/.azure-pipelines/windows-release.yml new file mode 100644 index 000000000000..774585792484 --- /dev/null +++ b/.azure-pipelines/windows-release.yml @@ -0,0 +1,96 @@ +name: Release_$(Build.SourceBranchName)_$(SourceTag)_$(Date:yyyyMMdd)$(Rev:.rr) + +# QUEUE TIME VARIABLES +# variables: +# GitRemote: python +# SourceTag: +# DoPGO: true +# SigningCertificate: 'Python Software Foundation' +# SigningDescription: 'Built: $(Build.BuildNumber)' +# DoLayout: true +# DoMSIX: true +# DoNuget: true +# DoEmbed: true +# DoMSI: true +# DoPublish: false + +trigger: none +pr: none + +stages: +- stage: Build + displayName: Build binaries + jobs: + - template: windows-release/stage-build.yml + +- stage: Sign + displayName: Sign binaries + dependsOn: Build + jobs: + - template: windows-release/stage-sign.yml + +- stage: Layout + displayName: Generate layouts + dependsOn: Sign + jobs: + - template: windows-release/stage-layout-full.yml + - template: windows-release/stage-layout-embed.yml + - template: windows-release/stage-layout-nuget.yml + +- stage: Pack + dependsOn: Layout + jobs: + - template: windows-release/stage-pack-nuget.yml + +- stage: Test + dependsOn: Pack + jobs: + - template: windows-release/stage-test-embed.yml + - template: windows-release/stage-test-nuget.yml + +- stage: Layout_MSIX + displayName: Generate MSIX layouts + dependsOn: Sign + condition: and(succeeded(), eq(variables['DoMSIX'], 'true')) + jobs: + - template: windows-release/stage-layout-msix.yml + +- stage: Pack_MSIX + displayName: Package MSIX + dependsOn: Layout_MSIX + jobs: + - template: windows-release/stage-pack-msix.yml + +- stage: Build_MSI + displayName: Build MSI installer + dependsOn: Sign + condition: and(succeeded(), eq(variables['DoMSI'], 'true')) + jobs: + - template: windows-release/stage-msi.yml + +- stage: Test_MSI + displayName: Test MSI installer + dependsOn: Build_MSI + jobs: + - template: windows-release/stage-test-msi.yml + +- stage: PublishPyDotOrg + displayName: Publish to python.org + dependsOn: ['Test_MSI', 'Test'] + condition: and(succeeded(), eq(variables['DoPublish'], 'true')) + jobs: + - template: windows-release/stage-publish-pythonorg.yml + +- stage: PublishNuget + displayName: Publish to nuget.org + dependsOn: Test + condition: and(succeeded(), eq(variables['DoPublish'], 'true')) + jobs: + - template: windows-release/stage-publish-nugetorg.yml + +- stage: PublishStore + displayName: Publish to Store + dependsOn: Pack_MSIX + condition: and(succeeded(), eq(variables['DoPublish'], 'true')) + jobs: + - template: windows-release/stage-publish-store.yml diff --git a/.azure-pipelines/windows-release/build-steps.yml b/.azure-pipelines/windows-release/build-steps.yml new file mode 100644 index 000000000000..508d73b0865f --- /dev/null +++ b/.azure-pipelines/windows-release/build-steps.yml @@ -0,0 +1,83 @@ +parameters: + ShouldPGO: false + +steps: +- template: ./checkout.yml + +- powershell: | + $d = (.\PCbuild\build.bat -V) | %{ if($_ -match '\s+(\w+):\s*(.+)\s*$') { @{$Matches[1] = $Matches[2];} }}; + Write-Host "##vso[task.setvariable variable=VersionText]$($d.PythonVersion)" + Write-Host "##vso[task.setvariable variable=VersionNumber]$($d.PythonVersionNumber)" + Write-Host "##vso[task.setvariable variable=VersionHex]$($d.PythonVersionHex)" + Write-Host "##vso[task.setvariable variable=VersionUnique]$($d.PythonVersionUnique)" + Write-Host "##vso[build.addbuildtag]$($d.PythonVersion)" + Write-Host "##vso[build.addbuildtag]$($d.PythonVersion)-$(Name)" + displayName: 'Extract version numbers' + +- ${{ if eq(parameters.ShouldPGO, 'false') }}: + - powershell: | + $env:SigningCertificate = $null + .\PCbuild\build.bat -v -p $(Platform) -c $(Configuration) + displayName: 'Run build' + env: + IncludeUwp: true + Py_OutDir: '$(Build.BinariesDirectory)\bin' + +- ${{ if eq(parameters.ShouldPGO, 'true') }}: + - powershell: | + $env:SigningCertificate = $null + .\PCbuild\build.bat -v -p $(Platform) --pgo + displayName: 'Run build with PGO' + env: + IncludeUwp: true + Py_OutDir: '$(Build.BinariesDirectory)\bin' + +- powershell: | + $kitroot = (gp 'HKLM:\SOFTWARE\Microsoft\Windows Kits\Installed Roots\').KitsRoot10 + $tool = (gci -r "$kitroot\Bin\*\x64\signtool.exe" | sort FullName -Desc | select -First 1) + if (-not $tool) { + throw "SDK is not available" + } + Write-Host "##vso[task.prependpath]$($tool.Directory)" + displayName: 'Add WinSDK tools to path' + +- powershell: | + $env:SigningCertificate = $null + .\python.bat PC\layout -vv -t "$(Build.BinariesDirectory)\catalog" --catalog "${env:CAT}.cdf" --preset-default + makecat "${env:CAT}.cdf" + del "${env:CAT}.cdf" + if (-not (Test-Path "${env:CAT}.cat")) { + throw "Failed to build catalog file" + } + displayName: 'Generate catalog' + env: + CAT: $(Build.BinariesDirectory)\bin\$(Arch)\python + +- task: PublishBuildArtifacts at 1 + displayName: 'Publish binaries' + condition: and(succeeded(), not(and(eq(variables['Configuration'], 'Release'), variables['SigningCertificate']))) + inputs: + PathtoPublish: '$(Build.BinariesDirectory)\bin\$(Arch)' + ArtifactName: bin_$(Name) + +- task: PublishBuildArtifacts at 1 + displayName: 'Publish binaries for signing' + condition: and(succeeded(), and(eq(variables['Configuration'], 'Release'), variables['SigningCertificate'])) + inputs: + PathtoPublish: '$(Build.BinariesDirectory)\bin\$(Arch)' + ArtifactName: unsigned_bin_$(Name) + +- task: CopyFiles at 2 + displayName: 'Layout Artifact: symbols' + inputs: + sourceFolder: $(Build.BinariesDirectory)\bin\$(Arch) + targetFolder: $(Build.ArtifactStagingDirectory)\symbols\$(Name) + flatten: true + contents: | + **\*.pdb + +- task: PublishBuildArtifacts at 1 + displayName: 'Publish Artifact: symbols' + inputs: + PathToPublish: '$(Build.ArtifactStagingDirectory)\symbols' + ArtifactName: symbols diff --git a/.azure-pipelines/windows-release/checkout.yml b/.azure-pipelines/windows-release/checkout.yml new file mode 100644 index 000000000000..d42d55fff08d --- /dev/null +++ b/.azure-pipelines/windows-release/checkout.yml @@ -0,0 +1,21 @@ +parameters: + depth: 3 + +steps: +- checkout: none + +- script: git clone --progress -v --depth ${{ parameters.depth }} --branch $(SourceTag) --single-branch https://github.com/$(GitRemote)/cpython.git . + displayName: 'git clone ($(GitRemote)/$(SourceTag))' + condition: and(succeeded(), and(variables['GitRemote'], variables['SourceTag'])) + +- script: git clone --progress -v --depth ${{ parameters.depth }} --branch $(SourceTag) --single-branch $(Build.Repository.Uri) . + displayName: 'git clone (/$(SourceTag))' + condition: and(succeeded(), and(not(variables['GitRemote']), variables['SourceTag'])) + +- script: git clone --progress -v --depth ${{ parameters.depth }} --branch $(Build.SourceBranchName) --single-branch https://github.com/$(GitRemote)/cpython.git . + displayName: 'git clone ($(GitRemote)/)' + condition: and(succeeded(), and(variables['GitRemote'], not(variables['SourceTag']))) + +- script: git clone --progress -v --depth ${{ parameters.depth }} --branch $(Build.SourceBranchName) --single-branch $(Build.Repository.Uri) . + displayName: 'git clone' + condition: and(succeeded(), and(not(variables['GitRemote']), not(variables['SourceTag']))) diff --git a/.azure-pipelines/windows-release/find-sdk.yml b/.azure-pipelines/windows-release/find-sdk.yml new file mode 100644 index 000000000000..e4de78555b3f --- /dev/null +++ b/.azure-pipelines/windows-release/find-sdk.yml @@ -0,0 +1,17 @@ +# Locate the Windows SDK and add its binaries directory to PATH +# +# `toolname` can be overridden to use a different marker file. + +parameters: + toolname: signtool.exe + +steps: + - powershell: | + $kitroot = (gp 'HKLM:\SOFTWARE\Microsoft\Windows Kits\Installed Roots\').KitsRoot10 + $tool = (gci -r "$kitroot\Bin\*\${{ parameters.toolname }}" | sort FullName -Desc | select -First 1) + if (-not $tool) { + throw "SDK is not available" + } + Write-Host "##vso[task.prependpath]$($tool.Directory)" + Write-Host "Adding $($tool.Directory) to PATH" + displayName: 'Add WinSDK tools to path' diff --git a/.azure-pipelines/windows-release/layout-command.yml b/.azure-pipelines/windows-release/layout-command.yml new file mode 100644 index 000000000000..3ec9b69ad712 --- /dev/null +++ b/.azure-pipelines/windows-release/layout-command.yml @@ -0,0 +1,20 @@ +steps: +- powershell: > + Write-Host ( + '##vso[task.setvariable variable=LayoutCmd]& + "{0}" + "{1}\PC\layout" + -vv + --source "{1}" + --build "{2}" + --temp "{3}" + --include-cat "{2}\python.cat" + --doc-build "{4}"' + -f ( + "$(PYTHON)", + "$(Build.SourcesDirectory)", + (Split-Path -Parent "$(PYTHON)"), + "$(Build.BinariesDirectory)\layout-temp", + "$(Build.BinariesDirectory)\doc" + )) + displayName: 'Set LayoutCmd' diff --git a/.azure-pipelines/windows-release/mingw-lib.yml b/.azure-pipelines/windows-release/mingw-lib.yml new file mode 100644 index 000000000000..30f7d34fa61d --- /dev/null +++ b/.azure-pipelines/windows-release/mingw-lib.yml @@ -0,0 +1,13 @@ +parameters: + DllToolOpt: -m i386:x86-64 + #DllToolOpt: -m i386 --as-flags=--32 + +steps: +- powershell: | + git clone https://github.com/python/cpython-bin-deps --branch binutils --single-branch --depth 1 --progress -v "binutils" + gci "bin\$(Arch)\python*.dll" | %{ + & "binutils\gendef.exe" $_ | Out-File -Encoding ascii tmp.def + & "binutils\dlltool.exe" --dllname $($_.BaseName).dll --def tmp.def --output-lib "$($_.Directory)\lib$($_.BaseName).a" ${{ parameters.DllToolOpt }} + } + displayName: 'Generate MinGW import library' + workingDirectory: $(Build.BinariesDirectory) diff --git a/.azure-pipelines/windows-release/msi-steps.yml b/.azure-pipelines/windows-release/msi-steps.yml new file mode 100644 index 000000000000..2f80c34eeb7d --- /dev/null +++ b/.azure-pipelines/windows-release/msi-steps.yml @@ -0,0 +1,142 @@ +steps: + - template: ./checkout.yml + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: doc' + inputs: + artifactName: doc + downloadPath: $(Build.BinariesDirectory) + + - task: CopyFiles at 2 + displayName: 'Merge documentation files' + inputs: + sourceFolder: $(Build.BinariesDirectory)\doc + targetFolder: $(Build.SourcesDirectory)\Doc\build + contents: | + htmlhelp\*.chm + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: bin_win32' + inputs: + artifactName: bin_win32 + downloadPath: $(Build.BinariesDirectory) + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: bin_win32_d' + inputs: + artifactName: bin_win32_d + downloadPath: $(Build.BinariesDirectory) + + - task: CopyFiles at 2 + displayName: 'Merge win32 debug files' + inputs: + sourceFolder: $(Build.BinariesDirectory)\bin_win32_d + targetFolder: $(Build.BinariesDirectory)\bin_win32 + contents: | + **\*_d.* + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: bin_amd64' + inputs: + artifactName: bin_amd64 + downloadPath: $(Build.BinariesDirectory) + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: bin_amd64_d' + inputs: + artifactName: bin_amd64_d + downloadPath: $(Build.BinariesDirectory) + + - task: CopyFiles at 2 + displayName: 'Merge amd64 debug files' + inputs: + sourceFolder: $(Build.BinariesDirectory)\bin_amd64_d + targetFolder: $(Build.BinariesDirectory)\bin_amd64 + contents: | + **\*_d.* + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: tcltk_lib_win32' + inputs: + artifactName: tcltk_lib_win32 + downloadPath: $(Build.BinariesDirectory) + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: tcltk_lib_amd64' + inputs: + artifactName: tcltk_lib_amd64 + downloadPath: $(Build.BinariesDirectory) + + - script: | + ren bin_win32 win32 + ren bin_amd64 amd64 + displayName: 'Correct artifact directory names' + workingDirectory: $(Build.BinariesDirectory) + + - script: | + call Tools\msi\get_externals.bat + call PCbuild\find_python.bat + echo ##vso[task.setvariable variable=PYTHON]%PYTHON% + call PCbuild/find_msbuild.bat + echo ##vso[task.setvariable variable=MSBUILD]%MSBUILD% + displayName: 'Get external dependencies' + + - script: | + %PYTHON% -m pip install blurb + %PYTHON% -m blurb merge -f Misc\NEWS + displayName: 'Merge NEWS file' + + - script: | + %MSBUILD% Tools\msi\launcher\launcher.wixproj + displayName: 'Build launcher installer' + env: + Platform: x86 + Py_OutDir: $(Build.BinariesDirectory) + + - script: | + %MSBUILD% Tools\msi\bundle\releaselocal.wixproj /t:Rebuild /p:RebuildAll=true /p:BuildForRelease=true + %MSBUILD% Tools\msi\bundle\releaseweb.wixproj /t:Rebuild /p:RebuildAll=false /p:BuildForRelease=true + displayName: 'Build win32 installer' + env: + Platform: x86 + Py_OutDir: $(Build.BinariesDirectory) + PYTHON: $(Build.BinariesDirectory)\win32\python.exe + PYTHONHOME: $(Build.SourcesDirectory) + TclTkLibraryDir: $(Build.BinariesDirectory)\tcltk_lib_win32 + + - script: | + %MSBUILD% Tools\msi\bundle\releaselocal.wixproj /t:Rebuild /p:RebuildAll=true /p:BuildForRelease=true + %MSBUILD% Tools\msi\bundle\releaseweb.wixproj /t:Rebuild /p:RebuildAll=false /p:BuildForRelease=true + displayName: 'Build amd64 installer' + env: + Platform: x64 + Py_OutDir: $(Build.BinariesDirectory) + PYTHON: $(Build.BinariesDirectory)\amd64\python.exe + PYTHONHOME: $(Build.SourcesDirectory) + TclTkLibraryDir: $(Build.BinariesDirectory)\tcltk_lib_amd64 + + - task: CopyFiles at 2 + displayName: 'Assemble artifact: msi (1/2)' + inputs: + sourceFolder: $(Build.BinariesDirectory)\win32\en-us + targetFolder: $(Build.ArtifactStagingDirectory)\msi\win32 + contents: | + *.msi + *.cab + *.exe + + - task: CopyFiles at 2 + displayName: 'Assemble artifact: msi (2/2)' + inputs: + sourceFolder: $(Build.BinariesDirectory)\amd64\en-us + targetFolder: $(Build.ArtifactStagingDirectory)\msi\amd64 + contents: | + *.msi + *.cab + *.exe + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish MSI' + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)\msi' + ArtifactName: msi diff --git a/.azure-pipelines/windows-release/stage-build.yml b/.azure-pipelines/windows-release/stage-build.yml new file mode 100644 index 000000000000..121e4b1a278e --- /dev/null +++ b/.azure-pipelines/windows-release/stage-build.yml @@ -0,0 +1,157 @@ +jobs: +- job: Build_Docs + displayName: Docs build + pool: + name: 'Windows Release' + #vmName: win2016-vs2017 + + workspace: + clean: all + + steps: + - template: ./checkout.yml + + - script: Doc\make.bat html + displayName: 'Build HTML docs' + env: + BUILDDIR: $(Build.BinariesDirectory)\Doc + + #- powershell: iwr "https://www.python.org/ftp/python/3.7.3/python373.chm" -OutFile "$(Build.BinariesDirectory)\python390a0.chm" + # displayName: 'Cheat at building CHM docs' + + - script: Doc\make.bat htmlhelp + displayName: 'Build CHM docs' + env: + BUILDDIR: $(Build.BinariesDirectory)\Doc + + - task: CopyFiles at 2 + displayName: 'Assemble artifact: Doc' + inputs: + sourceFolder: $(Build.BinariesDirectory)\Doc + targetFolder: $(Build.ArtifactStagingDirectory)\Doc + contents: | + html\**\* + htmlhelp\*.chm + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish artifact: doc' + inputs: + PathtoPublish: $(Build.ArtifactStagingDirectory)\Doc + ArtifactName: doc + +- job: Build_Python + displayName: Python build + + pool: + vmName: win2016-vs2017 + + workspace: + clean: all + + strategy: + matrix: + win32: + Name: win32 + Arch: win32 + Platform: x86 + Configuration: Release + win32_d: + Name: win32_d + Arch: win32 + Platform: x86 + Configuration: Debug + amd64_d: + Name: amd64_d + Arch: amd64 + Platform: x64 + Configuration: Debug + + steps: + - template: ./build-steps.yml + +- job: Build_Python_NonPGO + displayName: Python non-PGO build + condition: and(succeeded(), ne(variables['DoPGO'], 'true')) + + pool: + vmName: win2016-vs2017 + + workspace: + clean: all + + strategy: + matrix: + amd64: + Name: amd64 + Arch: amd64 + Platform: x64 + Configuration: Release + + steps: + - template: ./build-steps.yml + + +- job: Build_Python_PGO + displayName: Python PGO build + condition: and(succeeded(), eq(variables['DoPGO'], 'true')) + + pool: + name: 'Windows Release' + + workspace: + clean: all + + strategy: + matrix: + amd64: + Name: amd64 + Arch: amd64 + Platform: x64 + Configuration: Release + + steps: + - template: ./build-steps.yml + parameters: + ShouldPGO: true + + +- job: TclTk_Lib + displayName: Publish Tcl/Tk Library + + pool: + vmName: win2016-vs2017 + + workspace: + clean: all + + steps: + - template: ./checkout.yml + + - script: PCbuild\get_externals.bat --no-openssl --no-libffi + displayName: 'Get external dependencies' + + - task: MSBuild at 1 + displayName: 'Copy Tcl/Tk lib for publish' + inputs: + solution: PCbuild\tcltk.props + platform: x86 + msbuildArguments: /t:CopyTclTkLib /p:OutDir="$(Build.ArtifactStagingDirectory)\tcl_win32" + + - task: MSBuild at 1 + displayName: 'Copy Tcl/Tk lib for publish' + inputs: + solution: PCbuild\tcltk.props + platform: x64 + msbuildArguments: /t:CopyTclTkLib /p:OutDir="$(Build.ArtifactStagingDirectory)\tcl_amd64" + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish artifact: tcltk_lib_win32' + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)\tcl_win32' + ArtifactName: tcltk_lib_win32 + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish artifact: tcltk_lib_amd64' + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)\tcl_amd64' + ArtifactName: tcltk_lib_amd64 diff --git a/.azure-pipelines/windows-release/stage-layout-embed.yml b/.azure-pipelines/windows-release/stage-layout-embed.yml new file mode 100644 index 000000000000..c9d58b6b30a2 --- /dev/null +++ b/.azure-pipelines/windows-release/stage-layout-embed.yml @@ -0,0 +1,56 @@ +jobs: +- job: Make_Embed_Layout + displayName: Make embeddable layout + condition: and(succeeded(), eq(variables['DoEmbed'], 'true')) + + pool: + vmName: win2016-vs2017 + + workspace: + clean: all + + strategy: + matrix: + win32: + Name: win32 + Python: $(Build.BinariesDirectory)\bin_$(Name)\python.exe + PYTHONHOME: $(Build.SourcesDirectory) + amd64: + Name: amd64 + Python: $(Build.BinariesDirectory)\bin_$(Name)\python.exe + PYTHONHOME: $(Build.SourcesDirectory) + + steps: + - template: ./checkout.yml + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: bin_$(Name)' + inputs: + artifactName: bin_$(Name) + downloadPath: $(Build.BinariesDirectory) + + - template: ./layout-command.yml + + - powershell: | + $d = (.\PCbuild\build.bat -V) | %{ if($_ -match '\s+(\w+):\s*(.+)\s*$') { @{$Matches[1] = $Matches[2];} }}; + Write-Host "##vso[task.setvariable variable=VersionText]$($d.PythonVersion)" + displayName: 'Extract version numbers' + + - powershell: > + $(LayoutCmd) + --copy "$(Build.ArtifactStagingDirectory)\layout" + --zip "$(Build.ArtifactStagingDirectory)\embed\$(VersionText)-embed-$(Name).zip" + --preset-embed + displayName: 'Generate embeddable layout' + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish Artifact: layout_embed_$(Name)' + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)\layout' + ArtifactName: layout_embed_$(Name) + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish Artifact: embed' + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)\embed' + ArtifactName: embed diff --git a/.azure-pipelines/windows-release/stage-layout-full.yml b/.azure-pipelines/windows-release/stage-layout-full.yml new file mode 100644 index 000000000000..3593cf0a3f69 --- /dev/null +++ b/.azure-pipelines/windows-release/stage-layout-full.yml @@ -0,0 +1,62 @@ +jobs: +- job: Make_Layouts + displayName: Make layouts + condition: and(succeeded(), eq(variables['DoLayout'], 'true')) + + pool: + vmName: win2016-vs2017 + + workspace: + clean: all + + strategy: + matrix: + win32: + Name: win32 + Python: $(Build.BinariesDirectory)\bin_$(Name)\python.exe + PYTHONHOME: $(Build.SourcesDirectory) + amd64: + Name: amd64 + Python: $(Build.BinariesDirectory)\bin_$(Name)\python.exe + PYTHONHOME: $(Build.SourcesDirectory) + + steps: + - template: ./checkout.yml + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: bin_$(Name)' + inputs: + artifactName: bin_$(Name) + downloadPath: $(Build.BinariesDirectory) + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: bin_$(Name)_d' + inputs: + artifactName: bin_$(Name)_d + downloadPath: $(Build.BinariesDirectory) + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: doc' + inputs: + artifactName: doc + downloadPath: $(Build.BinariesDirectory) + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: tcltk_lib_$(Name)' + inputs: + artifactName: tcltk_lib_$(Name) + downloadPath: $(Build.BinariesDirectory) + + - template: ./layout-command.yml + + - powershell: | + $(LayoutCmd) --copy "$(Build.ArtifactStagingDirectory)\layout" --preset-default + displayName: 'Generate full layout' + env: + TCL_LIBRARY: $(Build.BinariesDirectory)\tcltk_lib_$(Name)\tcl8 + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish Artifact: layout_full_$(Name)' + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)\layout' + ArtifactName: layout_full_$(Name) diff --git a/.azure-pipelines/windows-release/stage-layout-msix.yml b/.azure-pipelines/windows-release/stage-layout-msix.yml new file mode 100644 index 000000000000..1a1e0a2fd685 --- /dev/null +++ b/.azure-pipelines/windows-release/stage-layout-msix.yml @@ -0,0 +1,86 @@ +jobs: +- job: Make_MSIX_Layout + displayName: Make MSIX layout + + pool: + vmName: win2016-vs2017 + + workspace: + clean: all + + strategy: + matrix: + #win32: + # Name: win32 + # Python: $(Build.BinariesDirectory)\bin_$(Name)\python.exe + # PYTHONHOME: $(Build.SourcesDirectory) + amd64: + Name: amd64 + Python: $(Build.BinariesDirectory)\bin_$(Name)\python.exe + PYTHONHOME: $(Build.SourcesDirectory) + + steps: + - template: ./checkout.yml + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: bin_$(Name)' + inputs: + artifactName: bin_$(Name) + downloadPath: $(Build.BinariesDirectory) + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: bin_$(Name)_d' + inputs: + artifactName: bin_$(Name)_d + downloadPath: $(Build.BinariesDirectory) + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: tcltk_lib_$(Name)' + inputs: + artifactName: tcltk_lib_$(Name) + downloadPath: $(Build.BinariesDirectory) + + - template: ./layout-command.yml + + - powershell: | + Remove-Item "$(Build.ArtifactStagingDirectory)\appx-store" -Recurse -Force -EA 0 + $(LayoutCmd) --copy "$(Build.ArtifactStagingDirectory)\appx-store" --preset-appx --precompile + displayName: 'Generate store APPX layout' + env: + TCL_LIBRARY: $(Build.BinariesDirectory)\tcltk_lib_$(Name)\tcl8 + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish Artifact: layout_appxstore_$(Name)' + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)\appx-store' + ArtifactName: layout_appxstore_$(Name) + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: cert' + condition: and(succeeded(), variables['SigningCertificate']) + inputs: + artifactName: cert + downloadPath: $(Build.BinariesDirectory) + + - powershell: | + $info = (gc "$(Build.BinariesDirectory)\cert\certinfo.json" | ConvertFrom-JSON) + Write-Host "Side-loadable APPX must be signed with '$($info.Subject)'" + Write-Host "##vso[task.setvariable variable=APPX_DATA_PUBLISHER]$($info.Subject)" + Write-Host "##vso[task.setvariable variable=APPX_DATA_SHA256]$($info.SHA256)" + displayName: 'Override signing parameters' + condition: and(succeeded(), variables['SigningCertificate']) + + - powershell: | + Remove-Item "$(Build.ArtifactStagingDirectory)\appx" -Recurse -Force -EA 0 + $(LayoutCmd) --copy "$(Build.ArtifactStagingDirectory)\appx" --preset-appx --precompile --include-symbols --include-tests + displayName: 'Generate sideloading APPX layout' + env: + TCL_LIBRARY: $(Build.BinariesDirectory)\tcltk_lib_$(Name)\tcl8 + APPX_DATA_PUBLISHER: $(APPX_DATA_PUBLISHER) + APPX_DATA_SHA256: $(APPX_DATA_SHA256) + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish Artifact: layout_appx_$(Name)' + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)\appx' + ArtifactName: layout_appx_$(Name) diff --git a/.azure-pipelines/windows-release/stage-layout-nuget.yml b/.azure-pipelines/windows-release/stage-layout-nuget.yml new file mode 100644 index 000000000000..ca4213d9e5c2 --- /dev/null +++ b/.azure-pipelines/windows-release/stage-layout-nuget.yml @@ -0,0 +1,44 @@ +jobs: +- job: Make_Nuget_Layout + displayName: Make Nuget layout + condition: and(succeeded(), eq(variables['DoNuget'], 'true')) + + pool: + vmName: win2016-vs2017 + + workspace: + clean: all + + strategy: + matrix: + win32: + Name: win32 + Python: $(Build.BinariesDirectory)\bin_$(Name)\python.exe + PYTHONHOME: $(Build.SourcesDirectory) + amd64: + Name: amd64 + Python: $(Build.BinariesDirectory)\bin_$(Name)\python.exe + PYTHONHOME: $(Build.SourcesDirectory) + + steps: + - template: ./checkout.yml + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: bin_$(Name)' + inputs: + artifactName: bin_$(Name) + downloadPath: $(Build.BinariesDirectory) + + - template: ./layout-command.yml + + - powershell: | + $(LayoutCmd) --copy "$(Build.ArtifactStagingDirectory)\nuget" --preset-nuget + displayName: 'Generate nuget layout' + env: + TCL_LIBRARY: $(Build.BinariesDirectory)\bin_$(Name)\tcl\tcl8 + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish Artifact: layout_nuget_$(Name)' + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)\nuget' + ArtifactName: layout_nuget_$(Name) diff --git a/.azure-pipelines/windows-release/stage-msi.yml b/.azure-pipelines/windows-release/stage-msi.yml new file mode 100644 index 000000000000..7afc816a0c6e --- /dev/null +++ b/.azure-pipelines/windows-release/stage-msi.yml @@ -0,0 +1,36 @@ +jobs: +- job: Make_MSI + displayName: Make MSI + condition: and(succeeded(), not(variables['SigningCertificate'])) + + pool: + vmName: win2016-vs2017 + + variables: + ReleaseUri: http://www.python.org/{arch} + DownloadUrl: https://www.python.org/ftp/python/{version}/{arch}{releasename}/{msi} + Py_OutDir: $(Build.BinariesDirectory) + + workspace: + clean: all + + steps: + - template: msi-steps.yml + +- job: Make_Signed_MSI + displayName: Make signed MSI + condition: and(succeeded(), variables['SigningCertificate']) + + pool: + name: 'Windows Release' + + variables: + ReleaseUri: http://www.python.org/{arch} + DownloadUrl: https://www.python.org/ftp/python/{version}/{arch}{releasename}/{msi} + Py_OutDir: $(Build.BinariesDirectory) + + workspace: + clean: all + + steps: + - template: msi-steps.yml diff --git a/.azure-pipelines/windows-release/stage-pack-msix.yml b/.azure-pipelines/windows-release/stage-pack-msix.yml new file mode 100644 index 000000000000..6f1846e581ef --- /dev/null +++ b/.azure-pipelines/windows-release/stage-pack-msix.yml @@ -0,0 +1,127 @@ +jobs: +- job: Pack_MSIX + displayName: Pack MSIX bundles + + pool: + vmName: win2016-vs2017 + + workspace: + clean: all + + strategy: + matrix: + amd64: + Name: amd64 + Artifact: appx + Suffix: + ShouldSign: true + amd64_store: + Name: amd64 + Artifact: appxstore + Suffix: -store + Upload: true + + steps: + - template: ./checkout.yml + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: layout_$(Artifact)_$(Name)' + inputs: + artifactName: layout_$(Artifact)_$(Name) + downloadPath: $(Build.BinariesDirectory) + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: symbols' + inputs: + artifactName: symbols + downloadPath: $(Build.BinariesDirectory) + + - powershell: | + $d = (.\PCbuild\build.bat -V) | %{ if($_ -match '\s+(\w+):\s*(.+)\s*$') { @{$Matches[1] = $Matches[2];} }}; + Write-Host "##vso[task.setvariable variable=VersionText]$($d.PythonVersion)" + Write-Host "##vso[task.setvariable variable=VersionNumber]$($d.PythonVersionNumber)" + Write-Host "##vso[task.setvariable variable=VersionHex]$($d.PythonVersionHex)" + Write-Host "##vso[task.setvariable variable=VersionUnique]$($d.PythonVersionUnique)" + Write-Host "##vso[task.setvariable variable=Filename]python-$($d.PythonVersion)-$(Name)$(Suffix)" + displayName: 'Extract version numbers' + + - powershell: | + ./Tools/msi/make_appx.ps1 -layout "$(Build.BinariesDirectory)\layout_$(Artifact)_$(Name)" -msix "$(Build.ArtifactStagingDirectory)\msix\$(Filename).msix" + displayName: 'Build msix' + + - powershell: | + 7z a -tzip "$(Build.ArtifactStagingDirectory)\msix\$(Filename).appxsym" *.pdb + displayName: 'Build appxsym' + workingDirectory: $(Build.BinariesDirectory)\symbols\$(Name) + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish Artifact: MSIX' + condition: and(succeeded(), or(ne(variables['ShouldSign'], 'true'), not(variables['SigningCertificate']))) + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)\msix' + ArtifactName: msix + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish Artifact: MSIX' + condition: and(succeeded(), and(eq(variables['ShouldSign'], 'true'), variables['SigningCertificate'])) + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)\msix' + ArtifactName: unsigned_msix + + - powershell: | + 7z a -tzip "$(Build.ArtifactStagingDirectory)\msixupload\$(Filename).msixupload" * + displayName: 'Build msixupload' + condition: and(succeeded(), eq(variables['Upload'], 'true')) + workingDirectory: $(Build.ArtifactStagingDirectory)\msix + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish Artifact: MSIXUpload' + condition: and(succeeded(), eq(variables['Upload'], 'true')) + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)\msixupload' + ArtifactName: msixupload + + +- job: Sign_MSIX + displayName: Sign side-loadable MSIX bundles + dependsOn: + - Pack_MSIX + condition: and(succeeded(), variables['SigningCertificate']) + + pool: + name: 'Windows Release' + + workspace: + clean: all + + steps: + - checkout: none + - template: ./find-sdk.yml + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download Artifact: unsigned_msix' + inputs: + artifactName: unsigned_msix + downloadPath: $(Build.BinariesDirectory) + + - powershell: | + $failed = $true + foreach ($retry in 1..3) { + signtool sign /a /n "$(SigningCertificate)" /fd sha256 /t http://timestamp.verisign.com/scripts/timestamp.dll /d "$(SigningDescription)" (gi *.msix) + if ($?) { + $failed = $false + break + } + sleep 1 + } + if ($failed) { + throw "Failed to sign MSIX" + } + displayName: 'Sign MSIX' + workingDirectory: $(Build.BinariesDirectory)\unsigned_msix + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish Artifact: MSIX' + inputs: + PathtoPublish: '$(Build.BinariesDirectory)\unsigned_msix' + ArtifactName: msix diff --git a/.azure-pipelines/windows-release/stage-pack-nuget.yml b/.azure-pipelines/windows-release/stage-pack-nuget.yml new file mode 100644 index 000000000000..5aa394fa48a1 --- /dev/null +++ b/.azure-pipelines/windows-release/stage-pack-nuget.yml @@ -0,0 +1,41 @@ +jobs: +- job: Pack_Nuget + displayName: Pack Nuget bundles + condition: and(succeeded(), eq(variables['DoNuget'], 'true')) + + pool: + vmName: win2016-vs2017 + + workspace: + clean: all + + strategy: + matrix: + amd64: + Name: amd64 + win32: + Name: win32 + + steps: + - checkout: none + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: layout_nuget_$(Name)' + inputs: + artifactName: layout_nuget_$(Name) + downloadPath: $(Build.BinariesDirectory) + + - task: NugetToolInstaller at 0 + displayName: 'Install Nuget' + inputs: + versionSpec: '>=5.0' + + - powershell: | + nuget pack "$(Build.BinariesDirectory)\layout_nuget_$(Name)\python.nuspec" -OutputDirectory $(Build.ArtifactStagingDirectory) -NoPackageAnalysis -NonInteractive + displayName: 'Create nuget package' + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish Artifact: nuget' + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)' + ArtifactName: nuget diff --git a/.azure-pipelines/windows-release/stage-publish-nugetorg.yml b/.azure-pipelines/windows-release/stage-publish-nugetorg.yml new file mode 100644 index 000000000000..7586d850f340 --- /dev/null +++ b/.azure-pipelines/windows-release/stage-publish-nugetorg.yml @@ -0,0 +1,28 @@ +jobs: +- job: Publish_Nuget + displayName: Publish Nuget packages + condition: and(succeeded(), eq(variables['DoNuget'], 'true')) + + pool: + vmName: win2016-vs2017 + + workspace: + clean: all + + steps: + - checkout: none + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: nuget' + inputs: + artifactName: nuget + downloadPath: $(Build.BinariesDirectory) + + - task: NuGetCommand at 2 + displayName: Push packages + condition: and(succeeded(), eq(variables['SigningCertificate'], 'Python Software Foundation')) + inputs: + command: push + packagesToPush: $(Build.BinariesDirectory)\nuget\*.nupkg' + nuGetFeedType: external + publishFeedCredentials: 'Python on Nuget' diff --git a/.azure-pipelines/windows-release/stage-publish-pythonorg.yml b/.azure-pipelines/windows-release/stage-publish-pythonorg.yml new file mode 100644 index 000000000000..2215a56d4bc2 --- /dev/null +++ b/.azure-pipelines/windows-release/stage-publish-pythonorg.yml @@ -0,0 +1,34 @@ +jobs: +- job: Publish_Python + displayName: Publish python.org packages + condition: and(succeeded(), and(eq(variables['DoMSI'], 'true'), eq(variables['DoEmbed'], 'true'))) + + pool: + vmName: win2016-vs2017 + + workspace: + clean: all + + steps: + - checkout: none + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: Doc' + inputs: + artifactName: Doc + downloadPath: $(Build.BinariesDirectory) + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: msi' + inputs: + artifactName: msi + downloadPath: $(Build.BinariesDirectory) + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: embed' + inputs: + artifactName: embed + downloadPath: $(Build.BinariesDirectory) + + # TODO: eq(variables['SigningCertificate'], 'Python Software Foundation') + # If we are not real-signed, DO NOT PUBLISH diff --git a/.azure-pipelines/windows-release/stage-publish-store.yml b/.azure-pipelines/windows-release/stage-publish-store.yml new file mode 100644 index 000000000000..06884c4f35b7 --- /dev/null +++ b/.azure-pipelines/windows-release/stage-publish-store.yml @@ -0,0 +1,22 @@ +jobs: +- job: Publish_Store + displayName: Publish Store packages + condition: and(succeeded(), eq(variables['DoMSIX'], 'true')) + + pool: + vmName: win2016-vs2017 + + workspace: + clean: all + + steps: + - checkout: none + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: msixupload' + inputs: + artifactName: msixupload + downloadPath: $(Build.BinariesDirectory) + + # TODO: eq(variables['SigningCertificate'], 'Python Software Foundation') + # If we are not real-signed, DO NOT PUBLISH diff --git a/.azure-pipelines/windows-release/stage-sign.yml b/.azure-pipelines/windows-release/stage-sign.yml new file mode 100644 index 000000000000..3d6ca9457f1c --- /dev/null +++ b/.azure-pipelines/windows-release/stage-sign.yml @@ -0,0 +1,113 @@ +jobs: +- job: Sign_Python + displayName: Sign Python binaries + condition: and(succeeded(), variables['SigningCertificate']) + + pool: + name: 'Windows Release' + + workspace: + clean: all + + strategy: + matrix: + win32: + Name: win32 + amd64: + Name: amd64 + + steps: + - checkout: none + - template: ./find-sdk.yml + + - powershell: | + Write-Host "##vso[build.addbuildtag]signed" + displayName: 'Add build tags' + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: unsigned_bin_$(Name)' + inputs: + artifactName: unsigned_bin_$(Name) + downloadPath: $(Build.BinariesDirectory) + + - powershell: | + $files = (gi *.exe, *.dll, *.pyd, *.cat -Exclude vcruntime*, libffi*, libcrypto*, libssl*) + signtool sign /a /n "$(SigningCertificate)" /fd sha256 /d "$(SigningDescription)" $files + displayName: 'Sign binaries' + workingDirectory: $(Build.BinariesDirectory)\unsigned_bin_$(Name) + + - powershell: | + $files = (gi *.exe, *.dll, *.pyd, *.cat -Exclude vcruntime*, libffi*, libcrypto*, libssl*) + $failed = $true + foreach ($retry in 1..10) { + signtool timestamp /t http://timestamp.verisign.com/scripts/timestamp.dll $files + if ($?) { + $failed = $false + break + } + sleep 5 + } + if ($failed) { + Write-Host "##vso[task.logissue type=error]Failed to timestamp files" + } + displayName: 'Timestamp binaries' + workingDirectory: $(Build.BinariesDirectory)\unsigned_bin_$(Name) + continueOnError: true + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish artifact: bin_$(Name)' + inputs: + PathtoPublish: '$(Build.BinariesDirectory)\unsigned_bin_$(Name)' + ArtifactName: bin_$(Name) + + +- job: Dump_CertInfo + displayName: Capture certificate info + condition: and(succeeded(), variables['SigningCertificate']) + + pool: + name: 'Windows Release' + + steps: + - checkout: none + + - powershell: | + $m = 'CN=$(SigningCertificate)' + $c = ((gci Cert:\CurrentUser\My), (gci Cert:\LocalMachine\My)) | %{ $_ } | ` + ?{ $_.Subject -match $m } | ` + select -First 1 + if (-not $c) { + Write-Host "Failed to find certificate for $(SigningCertificate)" + exit + } + $d = mkdir "$(Build.BinariesDirectory)\tmp" -Force + $cf = "$d\cert.cer" + [IO.File]::WriteAllBytes($cf, $c.Export("Cer")) + $csha = (certutil -dump $cf | sls "Cert Hash\(sha256\): (.+)").Matches.Groups[1].Value + + $info = @{ Subject=$c.Subject; SHA256=$csha; } + + $d = mkdir "$(Build.BinariesDirectory)\cert" -Force + $info | ConvertTo-JSON -Compress | Out-File -Encoding utf8 "$d\certinfo.json" + displayName: "Extract certificate info" + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish artifact: cert' + inputs: + PathtoPublish: '$(Build.BinariesDirectory)\cert' + ArtifactName: cert + + +- job: Mark_Unsigned + displayName: Tag unsigned build + condition: and(succeeded(), not(variables['SigningCertificate'])) + + pool: + vmName: win2016-vs2017 + + steps: + - checkout: none + + - powershell: | + Write-Host "##vso[build.addbuildtag]unsigned" + displayName: 'Add build tag' diff --git a/.azure-pipelines/windows-release/stage-test-embed.yml b/.azure-pipelines/windows-release/stage-test-embed.yml new file mode 100644 index 000000000000..ab377fdfa8c9 --- /dev/null +++ b/.azure-pipelines/windows-release/stage-test-embed.yml @@ -0,0 +1,40 @@ +jobs: +- job: Test_Embed + displayName: Test Embed + condition: and(succeeded(), eq(variables['DoEmbed'], 'true')) + + pool: + vmName: win2016-vs2017 + + workspace: + clean: all + + strategy: + matrix: + win32: + Name: win32 + amd64: + Name: amd64 + + steps: + - checkout: none + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: embed' + inputs: + artifactName: embed + downloadPath: $(Build.BinariesDirectory) + + - powershell: | + Expand-Archive -Path "$(Build.BinariesDirectory)\embed\embed-$(Name).zip" -DestinationPath "$(Build.BinariesDirectory)\Python" + $p = gi "$(Build.BinariesDirectory)\Python\python.exe" + Write-Host "##vso[task.prependpath]$(Split-Path -Parent $p)" + displayName: 'Install Python and add to PATH' + + - script: | + python -c "import sys; print(sys.version)" + displayName: 'Collect version number' + + - script: | + python -m site + displayName: 'Collect site' diff --git a/.azure-pipelines/windows-release/stage-test-msi.yml b/.azure-pipelines/windows-release/stage-test-msi.yml new file mode 100644 index 000000000000..10039295a184 --- /dev/null +++ b/.azure-pipelines/windows-release/stage-test-msi.yml @@ -0,0 +1,108 @@ +jobs: +- job: Test_MSI + displayName: Test MSI + + pool: + vmName: win2016-vs2017 + + workspace: + clean: all + + strategy: + matrix: + win32_User: + ExeMatch: 'python-[\dabrc.]+-webinstall\.exe' + Logs: $(Build.ArtifactStagingDirectory)\logs\win32_User + InstallAllUsers: 0 + win32_Machine: + ExeMatch: 'python-[\dabrc.]+-webinstall\.exe' + Logs: $(Build.ArtifactStagingDirectory)\logs\win32_Machine + InstallAllUsers: 1 + amd64_User: + ExeMatch: 'python-[\dabrc.]+-amd64-webinstall\.exe' + Logs: $(Build.ArtifactStagingDirectory)\logs\amd64_User + InstallAllUsers: 0 + amd64_Machine: + ExeMatch: 'python-[\dabrc.]+-amd64-webinstall\.exe' + Logs: $(Build.ArtifactStagingDirectory)\logs\amd64_Machine + InstallAllUsers: 1 + + steps: + - checkout: none + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: msi' + inputs: + artifactName: msi + downloadPath: $(Build.BinariesDirectory) + + - powershell: | + $p = (gci -r *.exe | ?{ $_.Name -match '$(ExeMatch)' } | select -First 1) + Write-Host "##vso[task.setvariable variable=SetupExe]$($p.FullName)" + Write-Host "##vso[task.setvariable variable=SetupExeName]$($p.Name)" + displayName: 'Find installer executable' + workingDirectory: $(Build.BinariesDirectory)\msi + + - script: > + "$(SetupExe)" + /passive + /log "$(Logs)\install\log.txt" + TargetDir="$(Build.BinariesDirectory)\Python" + Include_debug=1 + Include_symbols=1 + InstallAllUsers=$(InstallAllUsers) + displayName: 'Install Python' + + - powershell: | + $p = gi "$(Build.BinariesDirectory)\Python\python.exe" + Write-Host "##vso[task.prependpath]$(Split-Path -Parent $p)" + displayName: 'Add test Python to PATH' + + - script: | + python -c "import sys; print(sys.version)" + displayName: 'Collect version number' + + - script: | + python -m site + displayName: 'Collect site' + + - powershell: | + gci -r "${env:PROGRAMDATA}\Microsoft\Windows\Start Menu\Programs\Python*" + displayName: 'Capture per-machine Start Menu items' + - powershell: | + gci -r "${env:APPDATA}\Microsoft\Windows\Start Menu\Programs\Python*" + displayName: 'Capture per-user Start Menu items' + + - powershell: | + gci -r "HKLM:\Software\WOW6432Node\Python" + displayName: 'Capture per-machine 32-bit registry' + - powershell: | + gci -r "HKLM:\Software\Python" + displayName: 'Capture per-machine native registry' + - powershell: | + gci -r "HKCU:\Software\Python" + displayName: 'Capture current-user registry' + + - script: | + python -m pip install "azure<0.10" + python -m pip uninstall -y azure python-dateutil six + displayName: 'Test (un)install package' + + - script: | + python -m test -uall -v test_ttk_guionly test_tk test_idle + displayName: 'Test Tkinter and Idle' + + - script: > + "$(SetupExe)" + /passive + /uninstall + /log "$(Logs)\uninstall\log.txt" + displayName: 'Uninstall Python' + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish Artifact: logs' + condition: true + continueOnError: true + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)\logs' + ArtifactName: msi_testlogs diff --git a/.azure-pipelines/windows-release/stage-test-nuget.yml b/.azure-pipelines/windows-release/stage-test-nuget.yml new file mode 100644 index 000000000000..1f8b601d0d02 --- /dev/null +++ b/.azure-pipelines/windows-release/stage-test-nuget.yml @@ -0,0 +1,58 @@ +jobs: +- job: Test_Nuget + displayName: Test Nuget + condition: and(succeeded(), eq(variables['DoNuget'], 'true')) + + pool: + vmName: win2016-vs2017 + + workspace: + clean: all + + strategy: + matrix: + win32: + Package: pythonx86 + amd64: + Package: python + + steps: + - checkout: none + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: nuget' + inputs: + artifactName: nuget + downloadPath: $(Build.BinariesDirectory) + + - task: NugetToolInstaller at 0 + inputs: + versionSpec: '>= 5' + + - powershell: > + nuget install + $(Package) + -Source "$(Build.BinariesDirectory)\nuget" + -OutputDirectory "$(Build.BinariesDirectory)\install" + -Prerelease + -ExcludeVersion + -NonInteractive + displayName: 'Install Python' + + - powershell: | + $p = gi "$(Build.BinariesDirectory)\install\$(Package)\tools\python.exe" + Write-Host "##vso[task.prependpath]$(Split-Path -Parent $p)" + displayName: 'Add test Python to PATH' + + - script: | + python -c "import sys; print(sys.version)" + displayName: 'Collect version number' + + - script: | + python -m site + displayName: 'Collect site' + + - script: | + python -m pip install "azure<0.10" + python -m pip uninstall -y azure python-dateutil six + displayName: 'Test (un)install package' diff --git a/Doc/make.bat b/Doc/make.bat index e6604956ea91..dfc622f66615 100644 --- a/Doc/make.bat +++ b/Doc/make.bat @@ -117,13 +117,13 @@ if not exist "%BUILDDIR%" mkdir "%BUILDDIR%" rem PY_MISC_NEWS_DIR is also used by our Sphinx extension in tools/extensions/pyspecific.py if not defined PY_MISC_NEWS_DIR set PY_MISC_NEWS_DIR=%BUILDDIR%\%1 +if not exist "%PY_MISC_NEWS_DIR%" mkdir "%PY_MISC_NEWS_DIR%" if exist ..\Misc\NEWS ( echo.Copying Misc\NEWS to %PY_MISC_NEWS_DIR%\NEWS copy ..\Misc\NEWS "%PY_MISC_NEWS_DIR%\NEWS" > nul ) else if exist ..\Misc\NEWS.D ( if defined BLURB ( echo.Merging Misc/NEWS with %BLURB% - if not exist build mkdir build %BLURB% merge -f "%PY_MISC_NEWS_DIR%\NEWS" ) else ( echo.No Misc/NEWS file and Blurb is not available. diff --git a/Tools/msi/exe/crtlicense.txt b/PC/crtlicense.txt similarity index 100% rename from Tools/msi/exe/crtlicense.txt rename to PC/crtlicense.txt diff --git a/PC/layout/main.py b/PC/layout/main.py index 624033e721b7..c39aab208d35 100644 --- a/PC/layout/main.py +++ b/PC/layout/main.py @@ -31,6 +31,7 @@ from .support.options import * from .support.pip import * from .support.props import * +from .support.nuspec import * BDIST_WININST_FILES_ONLY = FileNameSet("wininst-*", "bdist_wininst.py") BDIST_WININST_STUB = "PC/layout/support/distutils.command.bdist_wininst.py" @@ -66,6 +67,7 @@ TOOLS_DIRS = FileNameSet("scripts", "i18n", "pynche", "demo", "parser") TOOLS_FILES = FileSuffixSet(".py", ".pyw", ".txt") + def copy_if_modified(src, dest): try: dest_stat = os.stat(dest) @@ -73,12 +75,15 @@ def copy_if_modified(src, dest): do_copy = True else: src_stat = os.stat(src) - do_copy = (src_stat.st_mtime != dest_stat.st_mtime or - src_stat.st_size != dest_stat.st_size) + do_copy = ( + src_stat.st_mtime != dest_stat.st_mtime + or src_stat.st_size != dest_stat.st_size + ) if do_copy: shutil.copy2(src, dest) + def get_lib_layout(ns): def _c(f): if f in EXCLUDE_FROM_LIB: @@ -119,7 +124,7 @@ def get_tcltk_lib(ns): except FileNotFoundError: pass if not tcl_lib or not os.path.isdir(tcl_lib): - warn("Failed to find TCL_LIBRARY") + log_warning("Failed to find TCL_LIBRARY") return for dest, src in rglob(Path(tcl_lib).parent, "**/*"): @@ -168,7 +173,7 @@ def in_build(f, dest="", new_name=None): for dest, src in rglob(ns.build, "vcruntime*.dll"): yield dest, src - yield "LICENSE.txt", ns.source / "LICENSE" + yield "LICENSE.txt", ns.build / "LICENSE.txt" for dest, src in rglob(ns.build, ("*.pyd", "*.dll")): if src.stem.endswith("_d") != bool(ns.debug) and src not in REQUIRED_DLLS: @@ -222,15 +227,12 @@ def _c(d): yield dest, src if ns.include_pip: - pip_dir = get_pip_dir(ns) - if not pip_dir.is_dir(): - log_warning("Failed to find {} - pip will not be included", pip_dir) - else: - pkg_root = "packages/{}" if ns.zip_lib else "Lib/site-packages/{}" - for dest, src in rglob(pip_dir, "**/*"): - if src in EXCLUDE_FROM_LIB or src in EXCLUDE_FROM_PACKAGED_LIB: - continue - yield pkg_root.format(dest), src + for dest, src in get_pip_layout(ns): + if isinstance(src, tuple) or not ( + src in EXCLUDE_FROM_LIB or src in EXCLUDE_FROM_PACKAGED_LIB + ): + continue + yield dest, src if ns.include_chm: for dest, src in rglob(ns.doc_build / "htmlhelp", PYTHON_CHM_NAME): @@ -244,6 +246,10 @@ def _c(d): for dest, src in get_props_layout(ns): yield dest, src + if ns.include_nuspec: + for dest, src in get_nuspec_layout(ns): + yield dest, src + for dest, src in get_appx_layout(ns): yield dest, src @@ -287,7 +293,9 @@ def _py_temp_compile(src, ns, dest_dir=None, checked=True): return None dest = (dest_dir or ns.temp) / (src.stem + ".py") - return _compile_one_py(src, dest.with_suffix(".pyc"), dest, optimize=2, checked=checked) + return _compile_one_py( + src, dest.with_suffix(".pyc"), dest, optimize=2, checked=checked + ) def _write_to_zip(zf, dest, src, ns, checked=True): @@ -361,28 +369,9 @@ def generate_source_files(ns): print("# Uncomment to run site.main() automatically", file=f) print("#import site", file=f) - if ns.include_appxmanifest: - log_info("Generating AppxManifest.xml in {}", ns.temp) - ns.temp.mkdir(parents=True, exist_ok=True) - - with open(ns.temp / "AppxManifest.xml", "wb") as f: - f.write(get_appxmanifest(ns)) - - with open(ns.temp / "_resources.xml", "wb") as f: - f.write(get_resources_xml(ns)) - if ns.include_pip: - pip_dir = get_pip_dir(ns) - if not (pip_dir / "pip").is_dir(): - log_info("Extracting pip to {}", pip_dir) - pip_dir.mkdir(parents=True, exist_ok=True) - extract_pip_files(ns) - - if ns.include_props: - log_info("Generating {} in {}", PYTHON_PROPS_NAME, ns.temp) - ns.temp.mkdir(parents=True, exist_ok=True) - with open(ns.temp / PYTHON_PROPS_NAME, "wb") as f: - f.write(get_props(ns)) + log_info("Extracting pip") + extract_pip_files(ns) def _create_zip_file(ns): @@ -427,6 +416,18 @@ def copy_files(files, ns): log_info("Processed {} files", count) log_debug("Processing {!s}", src) + if isinstance(src, tuple): + src, content = src + if ns.copy: + log_debug("Copy {} -> {}", src, ns.copy / dest) + (ns.copy / dest).parent.mkdir(parents=True, exist_ok=True) + with open(ns.copy / dest, "wb") as f: + f.write(content) + if ns.zip: + log_debug("Zip {} into {}", src, ns.zip) + zip_file.writestr(str(dest), content) + continue + if ( ns.precompile and src in PY_FILES diff --git a/PC/layout/support/appxmanifest.py b/PC/layout/support/appxmanifest.py index 49a35fa1f046..58fba8443f17 100644 --- a/PC/layout/support/appxmanifest.py +++ b/PC/layout/support/appxmanifest.py @@ -17,12 +17,7 @@ from .constants import * -__all__ = [] - - -def public(f): - __all__.append(f.__name__) - return f +__all__ = ["get_appx_layout"] APPX_DATA = dict( @@ -166,9 +161,7 @@ def public(f): "Help": { "Main Python Documentation": { "_condition": lambda ns: ns.include_chm, - "": "[{{AppVPackageRoot}}]\\Doc\\{}".format( - PYTHON_CHM_NAME - ), + "": "[{{AppVPackageRoot}}]\\Doc\\{}".format(PYTHON_CHM_NAME), }, "Local Python Documentation": { "_condition": lambda ns: ns.include_html_doc, @@ -239,31 +232,6 @@ def _fixup_sccd(ns, sccd, new_hash=None): return sccd - at public -def get_appx_layout(ns): - if not ns.include_appxmanifest: - return - - yield "AppxManifest.xml", ns.temp / "AppxManifest.xml" - yield "_resources.xml", ns.temp / "_resources.xml" - icons = ns.source / "PC" / "icons" - yield "_resources/pythonx44.png", icons / "pythonx44.png" - yield "_resources/pythonx44$targetsize-44_altform-unplated.png", icons / "pythonx44.png" - yield "_resources/pythonx50.png", icons / "pythonx50.png" - yield "_resources/pythonx50$targetsize-50_altform-unplated.png", icons / "pythonx50.png" - yield "_resources/pythonx150.png", icons / "pythonx150.png" - yield "_resources/pythonx150$targetsize-150_altform-unplated.png", icons / "pythonx150.png" - yield "_resources/pythonwx44.png", icons / "pythonwx44.png" - yield "_resources/pythonwx44$targetsize-44_altform-unplated.png", icons / "pythonwx44.png" - yield "_resources/pythonwx150.png", icons / "pythonwx150.png" - yield "_resources/pythonwx150$targetsize-150_altform-unplated.png", icons / "pythonwx150.png" - sccd = ns.source / SCCD_FILENAME - if sccd.is_file(): - # This should only be set for side-loading purposes. - sccd = _fixup_sccd(ns, sccd, os.getenv("APPX_DATA_SHA256")) - yield sccd.name, sccd - - def find_or_add(xml, element, attr=None, always_add=False): if always_add: e = None @@ -393,7 +361,6 @@ def disable_registry_virtualization(xml): e = find_or_add(e, "rescap:Capability", ("Name", "unvirtualizedResources")) - at public def get_appxmanifest(ns): for k, v in APPXMANIFEST_NS.items(): ET.register_namespace(k, v) @@ -481,6 +448,29 @@ def get_appxmanifest(ns): return buffer.getbuffer() - at public def get_resources_xml(ns): return RESOURCES_XML_TEMPLATE.encode("utf-8") + + +def get_appx_layout(ns): + if not ns.include_appxmanifest: + return + + yield "AppxManifest.xml", ("AppxManifest.xml", get_appxmanifest(ns)) + yield "_resources.xml", ("_resources.xml", get_resources_xml(ns)) + icons = ns.source / "PC" / "icons" + yield "_resources/pythonx44.png", icons / "pythonx44.png" + yield "_resources/pythonx44$targetsize-44_altform-unplated.png", icons / "pythonx44.png" + yield "_resources/pythonx50.png", icons / "pythonx50.png" + yield "_resources/pythonx50$targetsize-50_altform-unplated.png", icons / "pythonx50.png" + yield "_resources/pythonx150.png", icons / "pythonx150.png" + yield "_resources/pythonx150$targetsize-150_altform-unplated.png", icons / "pythonx150.png" + yield "_resources/pythonwx44.png", icons / "pythonwx44.png" + yield "_resources/pythonwx44$targetsize-44_altform-unplated.png", icons / "pythonwx44.png" + yield "_resources/pythonwx150.png", icons / "pythonwx150.png" + yield "_resources/pythonwx150$targetsize-150_altform-unplated.png", icons / "pythonwx150.png" + sccd = ns.source / SCCD_FILENAME + if sccd.is_file(): + # This should only be set for side-loading purposes. + sccd = _fixup_sccd(ns, sccd, os.getenv("APPX_DATA_SHA256")) + yield sccd.name, sccd diff --git a/PC/layout/support/nuspec.py b/PC/layout/support/nuspec.py new file mode 100644 index 000000000000..ba26ff337e91 --- /dev/null +++ b/PC/layout/support/nuspec.py @@ -0,0 +1,66 @@ +""" +Provides .props file. +""" + +import os + +from .constants import * + +__all__ = ["get_nuspec_layout"] + +PYTHON_NUSPEC_NAME = "python.nuspec" + +NUSPEC_DATA = { + "PYTHON_TAG": VER_DOT, + "PYTHON_VERSION": os.getenv("PYTHON_NUSPEC_VERSION"), + "PYTHON_BITNESS": "64-bit" if IS_X64 else "32-bit", + "PACKAGENAME": os.getenv("PYTHON_NUSPEC_PACKAGENAME"), + "PACKAGETITLE": os.getenv("PYTHON_NUSPEC_PACKAGETITLE"), + "FILELIST": r' ', +} + +if not NUSPEC_DATA["PYTHON_VERSION"]: + if VER_NAME: + NUSPEC_DATA["PYTHON_VERSION"] = "{}.{}-{}{}".format( + VER_DOT, VER_MICRO, VER_NAME, VER_SERIAL + ) + else: + NUSPEC_DATA["PYTHON_VERSION"] = "{}.{}".format(VER_DOT, VER_MICRO) + +if not NUSPEC_DATA["PACKAGETITLE"]: + NUSPEC_DATA["PACKAGETITLE"] = "Python" if IS_X64 else "Python (32-bit)" + +if not NUSPEC_DATA["PACKAGENAME"]: + NUSPEC_DATA["PACKAGENAME"] = "python" if IS_X64 else "pythonx86" + +FILELIST_WITH_PROPS = r""" + """ + +NUSPEC_TEMPLATE = r""" + + + {PACKAGENAME} + {PACKAGETITLE} + {PYTHON_VERSION} + Python Software Foundation + tools\LICENSE.txt + https://www.python.org/ + Installs {PYTHON_BITNESS} Python for use in build scenarios. + https://www.python.org/static/favicon.ico + python + + +{FILELIST} + + +""" + + +def get_nuspec_layout(ns): + if ns.include_all or ns.include_nuspec: + data = NUSPEC_DATA + if ns.include_all or ns.include_props: + data = dict(data) + data["FILELIST"] = FILELIST_WITH_PROPS + nuspec = NUSPEC_TEMPLATE.format_map(data) + yield "python.nuspec", ("python.nuspec", nuspec.encode("utf-8")) diff --git a/PC/layout/support/options.py b/PC/layout/support/options.py index 00f05667ebb7..c8ae4e30a8c4 100644 --- a/PC/layout/support/options.py +++ b/PC/layout/support/options.py @@ -30,6 +30,7 @@ def public(f): "launchers": {"help": "specific launchers"}, "appxmanifest": {"help": "an appxmanifest"}, "props": {"help": "a python.props file"}, + "nuspec": {"help": "a python.nuspec file"}, "chm": {"help": "the CHM documentation"}, "html-doc": {"help": "the HTML documentation"}, } @@ -60,13 +61,11 @@ def public(f): "stable", "distutils", "venv", - "props" + "props", + "nuspec", ], }, - "iot": { - "help": "Windows IoT Core", - "options": ["stable", "pip"], - }, + "iot": {"help": "Windows IoT Core", "options": ["stable", "pip"]}, "default": { "help": "development kit package", "options": [ diff --git a/PC/layout/support/pip.py b/PC/layout/support/pip.py index 369a923ce139..eada456655ec 100644 --- a/PC/layout/support/pip.py +++ b/PC/layout/support/pip.py @@ -11,15 +11,11 @@ import subprocess import sys -__all__ = [] +from .filesets import * +__all__ = ["extract_pip_files", "get_pip_layout"] -def public(f): - __all__.append(f.__name__) - return f - - at public def get_pip_dir(ns): if ns.copy: if ns.zip_lib: @@ -29,10 +25,23 @@ def get_pip_dir(ns): return ns.temp / "packages" - at public +def get_pip_layout(ns): + pip_dir = get_pip_dir(ns) + if not pip_dir.is_dir(): + log_warning("Failed to find {} - pip will not be included", pip_dir) + else: + pkg_root = "packages/{}" if ns.zip_lib else "Lib/site-packages/{}" + for dest, src in rglob(pip_dir, "**/*"): + yield pkg_root.format(dest), src + yield "pip.ini", ("pip.ini", b"[global]\nuser=yes") + + def extract_pip_files(ns): dest = get_pip_dir(ns) - dest.mkdir(parents=True, exist_ok=True) + try: + dest.mkdir(parents=True, exist_ok=False) + except IOError: + return src = ns.source / "Lib" / "ensurepip" / "_bundled" @@ -58,6 +67,7 @@ def extract_pip_files(ns): "--target", str(dest), "--no-index", + "--no-compile", "--no-cache-dir", "-f", str(src), diff --git a/PC/layout/support/props.py b/PC/layout/support/props.py index 3a047d215058..4d3b06195f6e 100644 --- a/PC/layout/support/props.py +++ b/PC/layout/support/props.py @@ -6,13 +6,7 @@ from .constants import * -__all__ = ["PYTHON_PROPS_NAME"] - - -def public(f): - __all__.append(f.__name__) - return f - +__all__ = ["get_props_layout"] PYTHON_PROPS_NAME = "python.props" @@ -97,14 +91,8 @@ def public(f): """ - at public def get_props_layout(ns): if ns.include_all or ns.include_props: - yield "python.props", ns.temp / "python.props" - - - at public -def get_props(ns): - # TODO: Filter contents of props file according to included/excluded items - props = PROPS_TEMPLATE.format_map(PROPS_DATA) - return props.encode("utf-8") + # TODO: Filter contents of props file according to included/excluded items + props = PROPS_TEMPLATE.format_map(PROPS_DATA) + yield "python.props", ("python.props", props.encode("utf-8")) diff --git a/PC/python_uwp.cpp b/PC/python_uwp.cpp index 5c8caa6666c4..dd1edde73092 100644 --- a/PC/python_uwp.cpp +++ b/PC/python_uwp.cpp @@ -182,9 +182,9 @@ wmain(int argc, wchar_t **argv) if (*p++ == L'\\') { if (wcsnicmp(p, L"pip", 3) == 0) { moduleName = L"pip"; + /* No longer required when pip 19.1 is added */ _wputenv_s(L"PIP_USER", L"true"); - } - else if (wcsnicmp(p, L"idle", 4) == 0) { + } else if (wcsnicmp(p, L"idle", 4) == 0) { moduleName = L"idlelib"; } } diff --git a/PCbuild/_tkinter.vcxproj b/PCbuild/_tkinter.vcxproj index fdfa59648aa9..af813b77c1d1 100644 --- a/PCbuild/_tkinter.vcxproj +++ b/PCbuild/_tkinter.vcxproj @@ -122,7 +122,7 @@ - + diff --git a/PCbuild/build.bat b/PCbuild/build.bat index 6f0c85e4a45a..bce599329e73 100644 --- a/PCbuild/build.bat +++ b/PCbuild/build.bat @@ -76,7 +76,7 @@ if "%~1"=="-k" (set kill=true) & shift & goto CheckOpts if "%~1"=="--pgo" (set do_pgo=true) & shift & goto CheckOpts if "%~1"=="--pgo-job" (set do_pgo=true) & (set pgo_job=%~2) & shift & shift & goto CheckOpts if "%~1"=="--test-marker" (set UseTestMarker=true) & shift & goto CheckOpts -if "%~1"=="-V" shift & goto Version +if "%~1"=="-V" shift & goto :Version rem These use the actual property names used by MSBuild. We could just let rem them in through the environment, but we specify them on the command line rem anyway for visibility so set defaults after this @@ -111,10 +111,16 @@ call "%dir%find_msbuild.bat" %MSBUILD% if ERRORLEVEL 1 (echo Cannot locate MSBuild.exe on PATH or as MSBUILD variable & exit /b 2) if "%kill%"=="true" call :Kill +if ERRORLEVEL 1 exit /B 3 if "%do_pgo%"=="true" ( set conf=PGInstrument call :Build %1 %2 %3 %4 %5 %6 %7 %8 %9 +) +rem %VARS% are evaluated eagerly, which would lose the ERRORLEVEL +rem value if we didn't split it out here. +if "%do_pgo%"=="true" if ERRORLEVEL 1 exit /B %ERRORLEVEL% +if "%do_pgo%"=="true" ( del /s "%dir%\*.pgc" del /s "%dir%\..\Lib\*.pyc" echo on @@ -124,7 +130,8 @@ if "%do_pgo%"=="true" ( set conf=PGUpdate set target=Build ) -goto Build +goto :Build + :Kill echo on %MSBUILD% "%dir%\pythoncore.vcxproj" /t:KillPython %verbose%^ @@ -132,7 +139,7 @@ echo on /p:KillPython=true @echo off -goto :eof +exit /B %ERRORLEVEL% :Build rem Call on MSBuild to do the work, echo the command. @@ -148,9 +155,11 @@ echo on %1 %2 %3 %4 %5 %6 %7 %8 %9 @echo off -goto :eof +exit /b %ERRORLEVEL% :Version rem Display the current build version information call "%dir%find_msbuild.bat" %MSBUILD% -if not ERRORLEVEL 1 %MSBUILD% "%dir%pythoncore.vcxproj" /t:ShowVersionInfo /v:m /nologo %1 %2 %3 %4 %5 %6 %7 %8 %9 +if ERRORLEVEL 1 (echo Cannot locate MSBuild.exe on PATH or as MSBUILD variable & exit /b 2) +%MSBUILD% "%dir%pythoncore.vcxproj" /t:ShowVersionInfo /v:m /nologo %1 %2 %3 %4 %5 %6 %7 %8 %9 +if ERRORLEVEL 1 exit /b 3 \ No newline at end of file diff --git a/PCbuild/pyproject.props b/PCbuild/pyproject.props index 12f07dd51287..7c0f50be9ea8 100644 --- a/PCbuild/pyproject.props +++ b/PCbuild/pyproject.props @@ -1,6 +1,8 @@ -? - + + + + <__PyProject_Props_Imported>true <_ProjectFileVersion>10.0.30319.1 10.0 $(BuildPath) @@ -29,7 +31,7 @@ $(PySourcePath)Include;$(PySourcePath)Include\internal;$(PySourcePath)PC;$(IntDir);%(AdditionalIncludeDirectories) WIN32;$(_PlatformPreprocessorDefinition)$(_DebugPreprocessorDefinition)$(_PydPreprocessorDefinition)%(PreprocessorDefinitions) - + MaxSpeed true true @@ -147,15 +149,15 @@ public override bool Execute() { - + - + @@ -189,8 +191,8 @@ public override bool Execute() { $(registry:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows Kits\Installed Roots at KitsRoot81)\bin\x86 $(registry:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows Kits\Installed Roots at KitsRoot)\bin\x86 $(registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1A at InstallationFolder)\Bin\ - <_SignCommand Condition="Exists($(SdkBinPath)) and '$(SigningCertificate)' != '' and $(SupportSigning)">"$(SdkBinPath)\signtool.exe" sign /q /a /n "$(SigningCertificate)" /fd sha256 /t http://timestamp.verisign.com/scripts/timestamp.dll /d "Python $(PythonVersion)" - <_SignCommand Condition="Exists($(SdkBinPath)) and '$(SigningCertificateSha1)' != '' and $(SupportSigning)">"$(SdkBinPath)\signtool.exe" sign /q /a /sha1 "$(SigningCertificateSha1)" /fd sha256 /t http://timestamp.verisign.com/scripts/timestamp.dll /d "Python $(PythonVersion)" + <_SignCommand Condition="Exists($(SdkBinPath)) and '$(SigningCertificate)' != '' and $(SupportSigning)">"$(SdkBinPath)\signtool.exe" sign /a /n "$(SigningCertificate)" /fd sha256 /t http://timestamp.verisign.com/scripts/timestamp.dll /d "Python $(PythonVersion)" + <_SignCommand Condition="Exists($(SdkBinPath)) and '$(SigningCertificateSha1)' != '' and $(SupportSigning)">"$(SdkBinPath)\signtool.exe" sign /a /sha1 "$(SigningCertificateSha1)" /fd sha256 /t http://timestamp.verisign.com/scripts/timestamp.dll /d "Python $(PythonVersion)" <_MakeCatCommand Condition="Exists($(SdkBinPath))">"$(SdkBinPath)\makecat.exe" diff --git a/PCbuild/python.props b/PCbuild/python.props index e6642fc4818a..b13837d394b1 100644 --- a/PCbuild/python.props +++ b/PCbuild/python.props @@ -1,6 +1,7 @@ - + + <__Python_Props_Imported>true Win32 Release + + + <_TclTkLib Include="$(tcltkdir)\lib\**\*" /> + + + diff --git a/Tools/msi/buildrelease.bat b/Tools/msi/buildrelease.bat index 45e189b537f6..b72eedecb23c 100644 --- a/Tools/msi/buildrelease.bat +++ b/Tools/msi/buildrelease.bat @@ -29,7 +29,7 @@ set DOWNLOAD_URL=https://www.python.org/ftp/python/{version}/{arch}{releasename} set D=%~dp0 set PCBUILD=%D%..\..\PCbuild\ -if "%Py_OutDir%"=="" set Py_OutDir=%PCBUILD% +if NOT DEFINED Py_OutDir set Py_OutDir=%PCBUILD% set EXTERNALS=%D%..\..\externals\windows-installer\ set BUILDX86= diff --git a/Tools/msi/exe/exe.wixproj b/Tools/msi/exe/exe.wixproj index 071501ce6e6f..326766bf2d47 100644 --- a/Tools/msi/exe/exe.wixproj +++ b/Tools/msi/exe/exe.wixproj @@ -21,25 +21,6 @@ - - - - <_LicenseFiles Include="@(LicenseFiles)"> - $([System.IO.File]::ReadAllText(%(FullPath))) - - - - - - diff --git a/Tools/msi/exe/exe_files.wxs b/Tools/msi/exe/exe_files.wxs index 394b4de47354..483d06c65b2e 100644 --- a/Tools/msi/exe/exe_files.wxs +++ b/Tools/msi/exe/exe_files.wxs @@ -3,7 +3,7 @@ - + diff --git a/Tools/msi/make_cat.ps1 b/Tools/msi/make_cat.ps1 index cc3cd4a2b50c..9ea3ddd49571 100644 --- a/Tools/msi/make_cat.ps1 +++ b/Tools/msi/make_cat.ps1 @@ -7,6 +7,8 @@ The path to the catalog definition file to compile and sign. It is assumed that the .cat file will be the same name with a new extension. +.Parameter outfile + The path to move the built .cat file to (optional). .Parameter description The description to add to the signature (optional). .Parameter certname @@ -16,6 +18,7 @@ #> param( [Parameter(Mandatory=$true)][string]$catalog, + [string]$outfile, [switch]$sign, [string]$description, [string]$certname, @@ -35,3 +38,8 @@ if (-not $?) { if ($sign) { Sign-File -certname $certname -certsha1 $certsha1 -certfile $certfile -description $description -files @($catalog -replace 'cdf$', 'cat') } + +if ($outfile) { + Split-Path -Parent $outfile | ?{ $_ } | %{ mkdir -Force $_; } + Move-Item ($catalog -replace 'cdf$', 'cat') $outfile +} diff --git a/Tools/msi/msi.props b/Tools/msi/msi.props index 5da901c0215a..3f14501446a1 100644 --- a/Tools/msi/msi.props +++ b/Tools/msi/msi.props @@ -56,6 +56,7 @@ true $(ExternalsDir)\windows-installer\redist-1\$(Platform) $([System.IO.Path]::GetFullPath($(CRTRedist))) + $(tcltkDir)lib python$(MajorVersionNumber)$(MinorVersionNumber)$(MicroVersionNumber)$(ReleaseLevelName).chm $(MajorVersionNumber).$(MinorVersionNumber).$(Field3Value).0 @@ -121,7 +122,7 @@ src - + tcltk diff --git a/Tools/msi/msi.targets b/Tools/msi/msi.targets index 9283a1ed6c30..4788a637a5d2 100644 --- a/Tools/msi/msi.targets +++ b/Tools/msi/msi.targets @@ -47,7 +47,7 @@ EncodingType= - @@ -76,18 +76,18 @@ EncodingType= - + - + - + - + \ No newline at end of file diff --git a/Tools/msi/sign_build.ps1 b/Tools/msi/sign_build.ps1 index 6668eb33a2d1..d3f750454f52 100644 --- a/Tools/msi/sign_build.ps1 +++ b/Tools/msi/sign_build.ps1 @@ -16,7 +16,7 @@ #> param( [Parameter(Mandatory=$true)][string]$root, - [string[]]$patterns=@("*.exe", "*.dll", "*.pyd"), + [string[]]$patterns=@("*.exe", "*.dll", "*.pyd", "*.cat"), [string]$description, [string]$certname, [string]$certsha1, diff --git a/Tools/msi/tcltk/tcltk.wixproj b/Tools/msi/tcltk/tcltk.wixproj index fae353f5f50a..218f3d15ec88 100644 --- a/Tools/msi/tcltk/tcltk.wixproj +++ b/Tools/msi/tcltk/tcltk.wixproj @@ -20,10 +20,10 @@ - - $(tcltkDir) + + $(TclTkLibraryDir) !(bindpath.tcltk) - $(tcltkDir)lib + $(TclTkLibraryDir) tcl\ tcltk_lib diff --git a/Tools/msi/uploadrelease.ps1 b/Tools/msi/uploadrelease.ps1 index 491df80be1e9..b6fbeea29810 100644 --- a/Tools/msi/uploadrelease.ps1 +++ b/Tools/msi/uploadrelease.ps1 @@ -15,6 +15,10 @@ The subdirectory on the host to copy files to. .Parameter tests The path to run download tests in. +.Parameter doc_htmlhelp + Optional path besides -build to locate CHM files. +.Parameter embed + Optional path besides -build to locate ZIP files. .Parameter skipupload Skip uploading .Parameter skippurge @@ -30,6 +34,8 @@ param( [string]$server="python-downloads", [string]$target="/srv/www.python.org/ftp/python", [string]$tests=${env:TEMP}, + [string]$doc_htmlhelp=$null, + [string]$embed=$null, [switch]$skipupload, [switch]$skippurge, [switch]$skiptest, @@ -73,32 +79,45 @@ if (-not $skipupload) { "Upload using $pscp and $plink" "" - pushd $build - $doc = gci python*.chm, python*.chm.asc + if ($doc_htmlhelp) { + pushd $doc_htmlhelp + } else { + pushd $build + } + $chm = gci python*.chm, python*.chm.asc popd $d = "$target/$($p[0])/" & $plink -batch $user@$server mkdir $d & $plink -batch $user@$server chgrp downloads $d & $plink -batch $user@$server chmod g-x,o+rx $d - & $pscp -batch $doc.FullName "$user@${server}:$d" + & $pscp -batch $chm.FullName "$user@${server}:$d" - foreach ($a in gci "$build" -Directory) { + $dirs = gci "$build" -Directory + if ($embed) { + $dirs = ($dirs, (gi $embed)) | %{ $_ } + } + + foreach ($a in $dirs) { "Uploading files from $($a.FullName)" pushd "$($a.FullName)" $exe = gci *.exe, *.exe.asc, *.zip, *.zip.asc $msi = gci *.msi, *.msi.asc, *.msu, *.msu.asc popd - & $pscp -batch $exe.FullName "$user@${server}:$d" + if ($exe) { + & $pscp -batch $exe.FullName "$user@${server}:$d" + } - $sd = "$d$($a.Name)$($p[1])/" - & $plink -batch $user@$server mkdir $sd - & $plink -batch $user@$server chgrp downloads $sd - & $plink -batch $user@$server chmod g-x,o+rx $sd - & $pscp -batch $msi.FullName "$user@${server}:$sd" - & $plink -batch $user@$server chgrp downloads $sd* - & $plink -batch $user@$server chmod g-x,o+r $sd* + if ($msi) { + $sd = "$d$($a.Name)$($p[1])/" + & $plink -batch $user@$server mkdir $sd + & $plink -batch $user@$server chgrp downloads $sd + & $plink -batch $user@$server chmod g-x,o+rx $sd + & $pscp -batch $msi.FullName "$user@${server}:$sd" + & $plink -batch $user@$server chgrp downloads $sd* + & $plink -batch $user@$server chmod g-x,o+r $sd* + } } & $plink -batch $user@$server chgrp downloads $d* @@ -128,7 +147,18 @@ if (-not $skiptest) { if (-not $skiphash) { # Display MD5 hash and size of each downloadable file pushd $build - $hashes = gci python*.chm, *\*.exe, *\*.zip | ` + $files = gci python*.chm, *\*.exe, *\*.zip + if ($doc_htmlhelp) { + cd $doc_htmlhelp + $files = ($files, (gci python*.chm)) | %{ $_ } + } + if ($embed) { + cd $embed + $files = ($files, (gci *.zip)) | %{ $_ } + } + popd + + $hashes = $files | ` Sort-Object Name | ` Format-Table Name, @{Label="MD5"; Expression={(Get-FileHash $_ -Algorithm MD5).Hash}}, Length -AutoSize | ` Out-String -Width 4096 From webhook-mailer at python.org Fri Jun 14 11:54:04 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 14 Jun 2019 15:54:04 -0000 Subject: [Python-checkins] bpo-19865: ctypes.create_unicode_buffer() supports non-BMP strings on Windows (GH-14081) Message-ID: https://github.com/python/cpython/commit/9765efcb39fc03d5b1abec3924388974470a8bd5 commit: 9765efcb39fc03d5b1abec3924388974470a8bd5 branch: master author: Zackery Spytz committer: Victor Stinner date: 2019-06-14T17:53:59+02:00 summary: bpo-19865: ctypes.create_unicode_buffer() supports non-BMP strings on Windows (GH-14081) files: A Misc/NEWS.d/next/Library/2019-06-14-08-30-16.bpo-19865.FRGH4I.rst M Lib/ctypes/__init__.py M Lib/ctypes/test/test_buffers.py diff --git a/Lib/ctypes/__init__.py b/Lib/ctypes/__init__.py index 4107db3e3972..128155dbf4f2 100644 --- a/Lib/ctypes/__init__.py +++ b/Lib/ctypes/__init__.py @@ -274,7 +274,15 @@ def create_unicode_buffer(init, size=None): """ if isinstance(init, str): if size is None: - size = len(init)+1 + if sizeof(c_wchar) == 2: + # UTF-16 requires a surrogate pair (2 wchar_t) for non-BMP + # characters (outside [U+0000; U+FFFF] range). +1 for trailing + # NUL character. + size = sum(2 if ord(c) > 0xFFFF else 1 for c in init) + 1 + else: + # 32-bit wchar_t (1 wchar_t per Unicode character). +1 for + # trailing NUL character. + size = len(init) + 1 buftype = c_wchar * size buf = buftype() buf.value = init diff --git a/Lib/ctypes/test/test_buffers.py b/Lib/ctypes/test/test_buffers.py index 166faaf4e4b8..15782be757c8 100644 --- a/Lib/ctypes/test/test_buffers.py +++ b/Lib/ctypes/test/test_buffers.py @@ -60,5 +60,14 @@ def test_unicode_conversion(self): self.assertEqual(b[::2], "ac") self.assertEqual(b[::5], "a") + @need_symbol('c_wchar') + def test_create_unicode_buffer_non_bmp(self): + expected = 5 if sizeof(c_wchar) == 2 else 3 + for s in '\U00010000\U00100000', '\U00010000\U0010ffff': + b = create_unicode_buffer(s) + self.assertEqual(len(b), expected) + self.assertEqual(b[-1], '\0') + + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Library/2019-06-14-08-30-16.bpo-19865.FRGH4I.rst b/Misc/NEWS.d/next/Library/2019-06-14-08-30-16.bpo-19865.FRGH4I.rst new file mode 100644 index 000000000000..efd1f55c0135 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-14-08-30-16.bpo-19865.FRGH4I.rst @@ -0,0 +1,2 @@ +:func:`ctypes.create_unicode_buffer()` now also supports non-BMP characters +on platforms with 16-bit :c:type:`wchar_t` (for example, Windows and AIX). From webhook-mailer at python.org Fri Jun 14 12:03:32 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 14 Jun 2019 16:03:32 -0000 Subject: [Python-checkins] bpo-37261: Document sys.unraisablehook corner cases (GH-14059) Message-ID: https://github.com/python/cpython/commit/212646cae6b7c4ddc8d98c8b9b6d39a5f259e864 commit: 212646cae6b7c4ddc8d98c8b9b6d39a5f259e864 branch: master author: Victor Stinner committer: GitHub date: 2019-06-14T18:03:22+02:00 summary: bpo-37261: Document sys.unraisablehook corner cases (GH-14059) Document reference cycle and resurrected objects issues in sys.unraisablehook() and threading.excepthook() documentation. Fix test.support.catch_unraisable_exception(): __exit__() no longer ignores unraisable exceptions. Fix test_io test_writer_close_error_on_close(): use a second catch_unraisable_exception() to catch the BufferedWriter unraisable exception. files: M Doc/library/sys.rst M Doc/library/test.rst M Doc/library/threading.rst M Lib/test/support/__init__.py M Lib/test/test_io.py diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index 5bde6870717c..817c3f1e56f9 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -1514,13 +1514,21 @@ always available. * *err_msg*: Error message, can be ``None``. * *object*: Object causing the exception, can be ``None``. - :func:`sys.unraisablehook` can be overridden to control how unraisable - exceptions are handled. - The default hook formats *err_msg* and *object* as: ``f'{err_msg}: {object!r}'``; use "Exception ignored in" error message if *err_msg* is ``None``. + :func:`sys.unraisablehook` can be overridden to control how unraisable + exceptions are handled. + + Storing *exc_value* using a custom hook can create a reference cycle. It + should be cleared explicitly to break the reference cycle when the + exception is no longer needed. + + Storing *object* using a custom hook can resurrect it if it is set to an + object which is being finalized. Avoid storing *object* after the custom + hook completes to avoid resurrecting objects. + See also :func:`excepthook` which handles uncaught exceptions. .. versionadded:: 3.8 diff --git a/Doc/library/test.rst b/Doc/library/test.rst index 0a98c882465d..920c018084b8 100644 --- a/Doc/library/test.rst +++ b/Doc/library/test.rst @@ -1086,17 +1086,13 @@ The :mod:`test.support` module defines the following functions: Context manager catching unraisable exception using :func:`sys.unraisablehook`. - If the *object* attribute of the unraisable hook is set and the object is - being finalized, the object is resurrected because the context manager - stores a strong reference to it (``cm.unraisable.object``). - Storing the exception value (``cm.unraisable.exc_value``) creates a reference cycle. The reference cycle is broken explicitly when the context manager exits. - Exiting the context manager clears the stored unraisable exception. It can - trigger a new unraisable exception (ex: the resurrected object is finalized - again and raises the same exception): it is silently ignored in this case. + Storing the object (``cm.unraisable.object``) can resurrect it if it is set + to an object which is being finalized. Exiting the context manager clears + the stored object. Usage:: diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst index 2907b65f5bca..9ffd5cd58179 100644 --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -58,6 +58,14 @@ This module defines the following functions: :func:`threading.excepthook` can be overridden to control how uncaught exceptions raised by :func:`Thread.run` are handled. + Storing *exc_value* using a custom hook can create a reference cycle. It + should be cleared explicitly to break the reference cycle when the + exception is no longer needed. + + Storing *object* using a custom hook can resurrect it if it is set to an + object which is being finalized. Avoid storing *object* after the custom + hook completes to avoid resurrecting objects. + .. seealso:: :func:`sys.excepthook` handles uncaught exceptions. diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index 174e0456dc71..7c0efc783edb 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -3040,17 +3040,13 @@ class catch_unraisable_exception: """ Context manager catching unraisable exception using sys.unraisablehook. - If the *object* attribute of the unraisable hook is set and the object is - being finalized, the object is resurrected because the context manager - stores a strong reference to it (cm.unraisable.object). - Storing the exception value (cm.unraisable.exc_value) creates a reference cycle. The reference cycle is broken explicitly when the context manager exits. - Exiting the context manager clears the stored unraisable exception. It can - trigger a new unraisable exception (ex: the resurrected object is finalized - again and raises the same exception): it is silently ignored in this case. + Storing the object (cm.unraisable.object) can resurrect it if it is set to + an object which is being finalized. Exiting the context manager clears the + stored object. Usage: @@ -3080,10 +3076,5 @@ def __enter__(self): return self def __exit__(self, *exc_info): - # Clear the unraisable exception to explicitly break a reference cycle. - # It can call _hook() again: ignore the new unraisable exception in - # this case. - self.unraisable = None - sys.unraisablehook = self._old_hook del self.unraisable diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 55686d743983..fc474c99053d 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -2072,8 +2072,12 @@ def writer_close(): writer.close = lambda: None writer = None + # Ignore BufferedWriter (of the BufferedRWPair) unraisable exception with support.catch_unraisable_exception(): - pair = None + # Ignore BufferedRWPair unraisable exception + with support.catch_unraisable_exception(): + pair = None + support.gc_collect() support.gc_collect() def test_reader_writer_close_error_on_close(self): From webhook-mailer at python.org Fri Jun 14 12:12:55 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 14 Jun 2019 16:12:55 -0000 Subject: [Python-checkins] bpo-35998: Avoid TimeoutError in test_asyncio: test_start_tls_server_1() (GH-14080) Message-ID: https://github.com/python/cpython/commit/0c2eb6d21013d77e1160250d3cf69ca80215d064 commit: 0c2eb6d21013d77e1160250d3cf69ca80215d064 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-14T09:12:48-07:00 summary: bpo-35998: Avoid TimeoutError in test_asyncio: test_start_tls_server_1() (GH-14080) (cherry picked from commit f0749da9a535375f05a2015e8960e8ae54877349) Co-authored-by: Andrew Svetlov files: A Misc/NEWS.d/next/Tests/2019-06-14-17-05-49.bpo-35998.yX82oD.rst M Lib/test/test_asyncio/test_sslproto.py diff --git a/Lib/test/test_asyncio/test_sslproto.py b/Lib/test/test_asyncio/test_sslproto.py index 4215abf5d863..5c861e92b7d6 100644 --- a/Lib/test/test_asyncio/test_sslproto.py +++ b/Lib/test/test_asyncio/test_sslproto.py @@ -494,17 +494,14 @@ def eof_received(self): def test_start_tls_server_1(self): HELLO_MSG = b'1' * self.PAYLOAD_SIZE + ANSWER = b'answer' server_context = test_utils.simple_server_sslcontext() client_context = test_utils.simple_client_sslcontext() - if sys.platform.startswith('freebsd') or sys.platform.startswith('win'): - # bpo-35031: Some FreeBSD and Windows buildbots fail to run this test - # as the eof was not being received by the server if the payload - # size is not big enough. This behaviour only appears if the - # client is using TLS1.3. - client_context.options |= ssl.OP_NO_TLSv1_3 + answer = None def client(sock, addr): + nonlocal answer sock.settimeout(self.TIMEOUT) sock.connect(addr) @@ -513,33 +510,36 @@ def client(sock, addr): sock.start_tls(client_context) sock.sendall(HELLO_MSG) - - sock.shutdown(socket.SHUT_RDWR) + answer = sock.recv_all(len(ANSWER)) sock.close() class ServerProto(asyncio.Protocol): - def __init__(self, on_con, on_eof, on_con_lost): + def __init__(self, on_con, on_con_lost): self.on_con = on_con - self.on_eof = on_eof self.on_con_lost = on_con_lost self.data = b'' + self.transport = None def connection_made(self, tr): + self.transport = tr self.on_con.set_result(tr) + def replace_transport(self, tr): + self.transport = tr + def data_received(self, data): self.data += data - - def eof_received(self): - self.on_eof.set_result(1) + if len(self.data) >= len(HELLO_MSG): + self.transport.write(ANSWER) def connection_lost(self, exc): + self.transport = None if exc is None: self.on_con_lost.set_result(None) else: self.on_con_lost.set_exception(exc) - async def main(proto, on_con, on_eof, on_con_lost): + async def main(proto, on_con, on_con_lost): tr = await on_con tr.write(HELLO_MSG) @@ -550,16 +550,16 @@ def connection_lost(self, exc): server_side=True, ssl_handshake_timeout=self.TIMEOUT) - await on_eof + proto.replace_transport(new_tr) + await on_con_lost self.assertEqual(proto.data, HELLO_MSG) new_tr.close() async def run_main(): on_con = self.loop.create_future() - on_eof = self.loop.create_future() on_con_lost = self.loop.create_future() - proto = ServerProto(on_con, on_eof, on_con_lost) + proto = ServerProto(on_con, on_con_lost) server = await self.loop.create_server( lambda: proto, '127.0.0.1', 0) @@ -568,11 +568,12 @@ def connection_lost(self, exc): with self.tcp_client(lambda sock: client(sock, addr), timeout=self.TIMEOUT): await asyncio.wait_for( - main(proto, on_con, on_eof, on_con_lost), + main(proto, on_con, on_con_lost), timeout=self.TIMEOUT) server.close() await server.wait_closed() + self.assertEqual(answer, ANSWER) self.loop.run_until_complete(run_main()) diff --git a/Misc/NEWS.d/next/Tests/2019-06-14-17-05-49.bpo-35998.yX82oD.rst b/Misc/NEWS.d/next/Tests/2019-06-14-17-05-49.bpo-35998.yX82oD.rst new file mode 100644 index 000000000000..23b6d00f42c5 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-06-14-17-05-49.bpo-35998.yX82oD.rst @@ -0,0 +1 @@ +Avoid TimeoutError in test_asyncio: test_start_tls_server_1() From webhook-mailer at python.org Fri Jun 14 12:26:44 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 14 Jun 2019 16:26:44 -0000 Subject: [Python-checkins] bpo-35998: Avoid TimeoutError in test_asyncio: test_start_tls_server_1() (GH-14080) (GH-14086) Message-ID: https://github.com/python/cpython/commit/33feb2e1a391cde91aefcb8d9cf5144b5fbc5d87 commit: 33feb2e1a391cde91aefcb8d9cf5144b5fbc5d87 branch: 3.7 author: Victor Stinner committer: GitHub date: 2019-06-14T18:26:37+02:00 summary: bpo-35998: Avoid TimeoutError in test_asyncio: test_start_tls_server_1() (GH-14080) (GH-14086) (cherry picked from commit f0749da9a535375f05a2015e8960e8ae54877349) files: A Misc/NEWS.d/next/Tests/2019-06-14-17-05-49.bpo-35998.yX82oD.rst M Lib/test/test_asyncio/test_sslproto.py diff --git a/Lib/test/test_asyncio/test_sslproto.py b/Lib/test/test_asyncio/test_sslproto.py index 6d085f303546..4d3c064eaf1f 100644 --- a/Lib/test/test_asyncio/test_sslproto.py +++ b/Lib/test/test_asyncio/test_sslproto.py @@ -491,17 +491,14 @@ def eof_received(self): def test_start_tls_server_1(self): HELLO_MSG = b'1' * self.PAYLOAD_SIZE + ANSWER = b'answer' server_context = test_utils.simple_server_sslcontext() client_context = test_utils.simple_client_sslcontext() - if sys.platform.startswith('freebsd') or sys.platform.startswith('win'): - # bpo-35031: Some FreeBSD and Windows buildbots fail to run this test - # as the eof was not being received by the server if the payload - # size is not big enough. This behaviour only appears if the - # client is using TLS1.3. - client_context.options |= ssl.OP_NO_TLSv1_3 + answer = None def client(sock, addr): + nonlocal answer sock.settimeout(self.TIMEOUT) sock.connect(addr) @@ -510,33 +507,36 @@ def client(sock, addr): sock.start_tls(client_context) sock.sendall(HELLO_MSG) - - sock.shutdown(socket.SHUT_RDWR) + answer = sock.recv_all(len(ANSWER)) sock.close() class ServerProto(asyncio.Protocol): - def __init__(self, on_con, on_eof, on_con_lost): + def __init__(self, on_con, on_con_lost): self.on_con = on_con - self.on_eof = on_eof self.on_con_lost = on_con_lost self.data = b'' + self.transport = None def connection_made(self, tr): + self.transport = tr self.on_con.set_result(tr) + def replace_transport(self, tr): + self.transport = tr + def data_received(self, data): self.data += data - - def eof_received(self): - self.on_eof.set_result(1) + if len(self.data) >= len(HELLO_MSG): + self.transport.write(ANSWER) def connection_lost(self, exc): + self.transport = None if exc is None: self.on_con_lost.set_result(None) else: self.on_con_lost.set_exception(exc) - async def main(proto, on_con, on_eof, on_con_lost): + async def main(proto, on_con, on_con_lost): tr = await on_con tr.write(HELLO_MSG) @@ -547,16 +547,16 @@ def connection_lost(self, exc): server_side=True, ssl_handshake_timeout=self.TIMEOUT) - await on_eof + proto.replace_transport(new_tr) + await on_con_lost self.assertEqual(proto.data, HELLO_MSG) new_tr.close() async def run_main(): on_con = self.loop.create_future() - on_eof = self.loop.create_future() on_con_lost = self.loop.create_future() - proto = ServerProto(on_con, on_eof, on_con_lost) + proto = ServerProto(on_con, on_con_lost) server = await self.loop.create_server( lambda: proto, '127.0.0.1', 0) @@ -565,11 +565,12 @@ def connection_lost(self, exc): with self.tcp_client(lambda sock: client(sock, addr), timeout=self.TIMEOUT): await asyncio.wait_for( - main(proto, on_con, on_eof, on_con_lost), + main(proto, on_con, on_con_lost), loop=self.loop, timeout=self.TIMEOUT) server.close() await server.wait_closed() + self.assertEqual(answer, ANSWER) self.loop.run_until_complete(run_main()) diff --git a/Misc/NEWS.d/next/Tests/2019-06-14-17-05-49.bpo-35998.yX82oD.rst b/Misc/NEWS.d/next/Tests/2019-06-14-17-05-49.bpo-35998.yX82oD.rst new file mode 100644 index 000000000000..23b6d00f42c5 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-06-14-17-05-49.bpo-35998.yX82oD.rst @@ -0,0 +1 @@ +Avoid TimeoutError in test_asyncio: test_start_tls_server_1() From webhook-mailer at python.org Fri Jun 14 12:30:31 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 14 Jun 2019 16:30:31 -0000 Subject: [Python-checkins] bpo-19865: ctypes.create_unicode_buffer() supports non-BMP strings on Windows (GH-14081) Message-ID: https://github.com/python/cpython/commit/0b592d513b073cd3a4ba7632907c25b8282f15ce commit: 0b592d513b073cd3a4ba7632907c25b8282f15ce branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-14T09:30:27-07:00 summary: bpo-19865: ctypes.create_unicode_buffer() supports non-BMP strings on Windows (GH-14081) (cherry picked from commit 9765efcb39fc03d5b1abec3924388974470a8bd5) Co-authored-by: Zackery Spytz files: A Misc/NEWS.d/next/Library/2019-06-14-08-30-16.bpo-19865.FRGH4I.rst M Lib/ctypes/__init__.py M Lib/ctypes/test/test_buffers.py diff --git a/Lib/ctypes/__init__.py b/Lib/ctypes/__init__.py index 614677398864..dae408a86724 100644 --- a/Lib/ctypes/__init__.py +++ b/Lib/ctypes/__init__.py @@ -279,7 +279,15 @@ def create_unicode_buffer(init, size=None): """ if isinstance(init, str): if size is None: - size = len(init)+1 + if sizeof(c_wchar) == 2: + # UTF-16 requires a surrogate pair (2 wchar_t) for non-BMP + # characters (outside [U+0000; U+FFFF] range). +1 for trailing + # NUL character. + size = sum(2 if ord(c) > 0xFFFF else 1 for c in init) + 1 + else: + # 32-bit wchar_t (1 wchar_t per Unicode character). +1 for + # trailing NUL character. + size = len(init) + 1 buftype = c_wchar * size buf = buftype() buf.value = init diff --git a/Lib/ctypes/test/test_buffers.py b/Lib/ctypes/test/test_buffers.py index 166faaf4e4b8..15782be757c8 100644 --- a/Lib/ctypes/test/test_buffers.py +++ b/Lib/ctypes/test/test_buffers.py @@ -60,5 +60,14 @@ def test_unicode_conversion(self): self.assertEqual(b[::2], "ac") self.assertEqual(b[::5], "a") + @need_symbol('c_wchar') + def test_create_unicode_buffer_non_bmp(self): + expected = 5 if sizeof(c_wchar) == 2 else 3 + for s in '\U00010000\U00100000', '\U00010000\U0010ffff': + b = create_unicode_buffer(s) + self.assertEqual(len(b), expected) + self.assertEqual(b[-1], '\0') + + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Library/2019-06-14-08-30-16.bpo-19865.FRGH4I.rst b/Misc/NEWS.d/next/Library/2019-06-14-08-30-16.bpo-19865.FRGH4I.rst new file mode 100644 index 000000000000..efd1f55c0135 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-14-08-30-16.bpo-19865.FRGH4I.rst @@ -0,0 +1,2 @@ +:func:`ctypes.create_unicode_buffer()` now also supports non-BMP characters +on platforms with 16-bit :c:type:`wchar_t` (for example, Windows and AIX). From webhook-mailer at python.org Fri Jun 14 12:43:26 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 14 Jun 2019 16:43:26 -0000 Subject: [Python-checkins] bpo-19865: ctypes.create_unicode_buffer() supports non-BMP strings on Windows (GH-14081) Message-ID: https://github.com/python/cpython/commit/b0f6fa8d7d4c6d8263094124df9ef9cf816bbed6 commit: b0f6fa8d7d4c6d8263094124df9ef9cf816bbed6 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-14T09:43:22-07:00 summary: bpo-19865: ctypes.create_unicode_buffer() supports non-BMP strings on Windows (GH-14081) (cherry picked from commit 9765efcb39fc03d5b1abec3924388974470a8bd5) Co-authored-by: Zackery Spytz files: A Misc/NEWS.d/next/Library/2019-06-14-08-30-16.bpo-19865.FRGH4I.rst M Lib/ctypes/__init__.py M Lib/ctypes/test/test_buffers.py diff --git a/Lib/ctypes/__init__.py b/Lib/ctypes/__init__.py index 4107db3e3972..128155dbf4f2 100644 --- a/Lib/ctypes/__init__.py +++ b/Lib/ctypes/__init__.py @@ -274,7 +274,15 @@ def create_unicode_buffer(init, size=None): """ if isinstance(init, str): if size is None: - size = len(init)+1 + if sizeof(c_wchar) == 2: + # UTF-16 requires a surrogate pair (2 wchar_t) for non-BMP + # characters (outside [U+0000; U+FFFF] range). +1 for trailing + # NUL character. + size = sum(2 if ord(c) > 0xFFFF else 1 for c in init) + 1 + else: + # 32-bit wchar_t (1 wchar_t per Unicode character). +1 for + # trailing NUL character. + size = len(init) + 1 buftype = c_wchar * size buf = buftype() buf.value = init diff --git a/Lib/ctypes/test/test_buffers.py b/Lib/ctypes/test/test_buffers.py index 166faaf4e4b8..15782be757c8 100644 --- a/Lib/ctypes/test/test_buffers.py +++ b/Lib/ctypes/test/test_buffers.py @@ -60,5 +60,14 @@ def test_unicode_conversion(self): self.assertEqual(b[::2], "ac") self.assertEqual(b[::5], "a") + @need_symbol('c_wchar') + def test_create_unicode_buffer_non_bmp(self): + expected = 5 if sizeof(c_wchar) == 2 else 3 + for s in '\U00010000\U00100000', '\U00010000\U0010ffff': + b = create_unicode_buffer(s) + self.assertEqual(len(b), expected) + self.assertEqual(b[-1], '\0') + + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Library/2019-06-14-08-30-16.bpo-19865.FRGH4I.rst b/Misc/NEWS.d/next/Library/2019-06-14-08-30-16.bpo-19865.FRGH4I.rst new file mode 100644 index 000000000000..efd1f55c0135 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-14-08-30-16.bpo-19865.FRGH4I.rst @@ -0,0 +1,2 @@ +:func:`ctypes.create_unicode_buffer()` now also supports non-BMP characters +on platforms with 16-bit :c:type:`wchar_t` (for example, Windows and AIX). From webhook-mailer at python.org Fri Jun 14 12:55:28 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 14 Jun 2019 16:55:28 -0000 Subject: [Python-checkins] bpo-37266: Daemon threads are now denied in subinterpreters (GH-14049) Message-ID: https://github.com/python/cpython/commit/066e5b1a917ec2134e8997d2cadd815724314252 commit: 066e5b1a917ec2134e8997d2cadd815724314252 branch: master author: Victor Stinner committer: GitHub date: 2019-06-14T18:55:22+02:00 summary: bpo-37266: Daemon threads are now denied in subinterpreters (GH-14049) In a subinterpreter, spawning a daemon thread now raises an exception. Daemon threads were never supported in subinterpreters. Previously, the subinterpreter finalization crashed with a Pyton fatal error if a daemon thread was still running. * Add _thread._is_main_interpreter() * threading.Thread.start() now raises RuntimeError if the thread is a daemon thread and the method is called from a subinterpreter. * The _thread module now uses Argument Clinic for the new function. * Use textwrap.dedent() in test_threading.SubinterpThreadingTests files: A Misc/NEWS.d/next/Library/2019-06-13-11-59-52.bpo-37266.goLjef.rst A Modules/clinic/_threadmodule.c.h M Doc/library/threading.rst M Doc/whatsnew/3.9.rst M Lib/_dummy_thread.py M Lib/test/test_threading.py M Lib/threading.py M Modules/_threadmodule.c diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst index 9ffd5cd58179..f80eb22e18fc 100644 --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -280,6 +280,8 @@ since it is impossible to detect the termination of alien threads. base class constructor (``Thread.__init__()``) before doing anything else to the thread. + Daemon threads must not be used in subinterpreters. + .. versionchanged:: 3.3 Added the *daemon* argument. @@ -294,6 +296,12 @@ since it is impossible to detect the termination of alien threads. This method will raise a :exc:`RuntimeError` if called more than once on the same thread object. + Raise a :exc:`RuntimeError` if the thread is a daemon thread and the + method is called from a subinterpreter. + + .. versionchanged:: 3.9 + In a subinterpreter, spawning a daemon thread now raises an exception. + .. method:: run() Method representing the thread's activity. diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 999519f0ce07..ef30743b708d 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -86,6 +86,14 @@ New Modules Improved Modules ================ +threading +--------- + +In a subinterpreter, spawning a daemon thread now raises an exception. Daemon +threads were never supported in subinterpreters. Previously, the subinterpreter +finalization crashed with a Pyton fatal error if a daemon thread was still +running. + Optimizations ============= diff --git a/Lib/_dummy_thread.py b/Lib/_dummy_thread.py index a2cae54b0580..2407f9bf5ddc 100644 --- a/Lib/_dummy_thread.py +++ b/Lib/_dummy_thread.py @@ -161,3 +161,7 @@ def interrupt_main(): else: global _interrupt _interrupt = True + + +def _is_main_interpreter(): + return True diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index 0a0a62bdf9bf..a04d496001e3 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -17,6 +17,7 @@ import os import subprocess import signal +import textwrap from test import lock_tests from test import support @@ -928,14 +929,19 @@ def test_clear_threads_states_after_fork(self): class SubinterpThreadingTests(BaseTestCase): + def pipe(self): + r, w = os.pipe() + self.addCleanup(os.close, r) + self.addCleanup(os.close, w) + if hasattr(os, 'set_blocking'): + os.set_blocking(r, False) + return (r, w) def test_threads_join(self): # Non-daemon threads should be joined at subinterpreter shutdown # (issue #18808) - r, w = os.pipe() - self.addCleanup(os.close, r) - self.addCleanup(os.close, w) - code = r"""if 1: + r, w = self.pipe() + code = textwrap.dedent(r""" import os import random import threading @@ -953,7 +959,7 @@ def f(): threading.Thread(target=f).start() random_sleep() - """ % (w,) + """ % (w,)) ret = test.support.run_in_subinterp(code) self.assertEqual(ret, 0) # The thread was joined properly. @@ -964,10 +970,8 @@ def test_threads_join_2(self): # Python code returned but before the thread state is deleted. # To achieve this, we register a thread-local object which sleeps # a bit when deallocated. - r, w = os.pipe() - self.addCleanup(os.close, r) - self.addCleanup(os.close, w) - code = r"""if 1: + r, w = self.pipe() + code = textwrap.dedent(r""" import os import random import threading @@ -992,34 +996,38 @@ def f(): threading.Thread(target=f).start() random_sleep() - """ % (w,) + """ % (w,)) ret = test.support.run_in_subinterp(code) self.assertEqual(ret, 0) # The thread was joined properly. self.assertEqual(os.read(r, 1), b"x") - @cpython_only - def test_daemon_threads_fatal_error(self): - subinterp_code = r"""if 1: - import os + def test_daemon_thread(self): + r, w = self.pipe() + code = textwrap.dedent(f""" import threading - import time + import sys - def f(): - # Make sure the daemon thread is still running when - # Py_EndInterpreter is called. - time.sleep(10) - threading.Thread(target=f, daemon=True).start() - """ - script = r"""if 1: - import _testcapi + channel = open({w}, "w", closefd=False) + + def func(): + pass + + thread = threading.Thread(target=func, daemon=True) + try: + thread.start() + except RuntimeError as exc: + print("ok: %s" % exc, file=channel, flush=True) + else: + thread.join() + print("fail: RuntimeError not raised", file=channel, flush=True) + """) + ret = test.support.run_in_subinterp(code) + self.assertEqual(ret, 0) - _testcapi.run_in_subinterp(%r) - """ % (subinterp_code,) - with test.support.SuppressCrashReport(): - rc, out, err = assert_python_failure("-c", script) - self.assertIn("Fatal Python error: Py_EndInterpreter: " - "not the last thread", err.decode()) + msg = os.read(r, 100).decode().rstrip() + self.assertEqual("ok: daemon thread are not supported " + "in subinterpreters", msg) class ThreadingExceptionTests(BaseTestCase): diff --git a/Lib/threading.py b/Lib/threading.py index 7c6d404bcd10..01a15a6fc075 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -34,6 +34,7 @@ _allocate_lock = _thread.allocate_lock _set_sentinel = _thread._set_sentinel get_ident = _thread.get_ident +_is_main_interpreter = _thread._is_main_interpreter try: get_native_id = _thread.get_native_id _HAVE_THREAD_NATIVE_ID = True @@ -846,6 +847,11 @@ def start(self): if self._started.is_set(): raise RuntimeError("threads can only be started once") + + if self.daemon and not _is_main_interpreter(): + raise RuntimeError("daemon thread are not supported " + "in subinterpreters") + with _active_limbo_lock: _limbo[self] = self try: diff --git a/Misc/NEWS.d/next/Library/2019-06-13-11-59-52.bpo-37266.goLjef.rst b/Misc/NEWS.d/next/Library/2019-06-13-11-59-52.bpo-37266.goLjef.rst new file mode 100644 index 000000000000..f41918185213 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-13-11-59-52.bpo-37266.goLjef.rst @@ -0,0 +1,4 @@ +In a subinterpreter, spawning a daemon thread now raises an exception. Daemon +threads were never supported in subinterpreters. Previously, the subinterpreter +finalization crashed with a Pyton fatal error if a daemon thread was still +running. diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index d5e40ef999e3..9ab8e7a0ceb3 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -8,6 +8,14 @@ #include "structmember.h" /* offsetof */ #include "pythread.h" +#include "clinic/_threadmodule.c.h" + +/*[clinic input] +module _thread +[clinic start generated code]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=be8dbe5cc4b16df7]*/ + + static PyObject *ThreadError; static PyObject *str_dict; @@ -1442,6 +1450,21 @@ PyDoc_STRVAR(excepthook_doc, \n\ Handle uncaught Thread.run() exception."); +/*[clinic input] +_thread._is_main_interpreter + +Return True if the current interpreter is the main Python interpreter. +[clinic start generated code]*/ + +static PyObject * +_thread__is_main_interpreter_impl(PyObject *module) +/*[clinic end generated code: output=7dd82e1728339adc input=cc1eb00fd4598915]*/ +{ + _PyRuntimeState *runtime = &_PyRuntime; + PyInterpreterState *interp = _PyRuntimeState_GetThreadState(runtime)->interp; + return PyBool_FromLong(interp == runtime->interpreters.main); +} + static PyMethodDef thread_methods[] = { {"start_new_thread", (PyCFunction)thread_PyThread_start_new_thread, METH_VARARGS, start_new_doc}, @@ -1471,6 +1494,7 @@ static PyMethodDef thread_methods[] = { METH_NOARGS, _set_sentinel_doc}, {"_excepthook", thread_excepthook, METH_O, excepthook_doc}, + _THREAD__IS_MAIN_INTERPRETER_METHODDEF {NULL, NULL} /* sentinel */ }; diff --git a/Modules/clinic/_threadmodule.c.h b/Modules/clinic/_threadmodule.c.h new file mode 100644 index 000000000000..07ea08b1750d --- /dev/null +++ b/Modules/clinic/_threadmodule.c.h @@ -0,0 +1,22 @@ +/*[clinic input] +preserve +[clinic start generated code]*/ + +PyDoc_STRVAR(_thread__is_main_interpreter__doc__, +"_is_main_interpreter($module, /)\n" +"--\n" +"\n" +"Return True if the current interpreter is the main Python interpreter."); + +#define _THREAD__IS_MAIN_INTERPRETER_METHODDEF \ + {"_is_main_interpreter", (PyCFunction)_thread__is_main_interpreter, METH_NOARGS, _thread__is_main_interpreter__doc__}, + +static PyObject * +_thread__is_main_interpreter_impl(PyObject *module); + +static PyObject * +_thread__is_main_interpreter(PyObject *module, PyObject *Py_UNUSED(ignored)) +{ + return _thread__is_main_interpreter_impl(module); +} +/*[clinic end generated code: output=505840d1b9101789 input=a9049054013a1b77]*/ From webhook-mailer at python.org Fri Jun 14 12:59:58 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 14 Jun 2019 16:59:58 -0000 Subject: [Python-checkins] bpo-37261: Document sys.unraisablehook corner cases (GH-14059) Message-ID: https://github.com/python/cpython/commit/3b976d19c8c09e83eec63a5b62daf4d55bfd6aeb commit: 3b976d19c8c09e83eec63a5b62daf4d55bfd6aeb branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-14T09:59:54-07:00 summary: bpo-37261: Document sys.unraisablehook corner cases (GH-14059) Document reference cycle and resurrected objects issues in sys.unraisablehook() and threading.excepthook() documentation. Fix test.support.catch_unraisable_exception(): __exit__() no longer ignores unraisable exceptions. Fix test_io test_writer_close_error_on_close(): use a second catch_unraisable_exception() to catch the BufferedWriter unraisable exception. (cherry picked from commit 212646cae6b7c4ddc8d98c8b9b6d39a5f259e864) Co-authored-by: Victor Stinner files: M Doc/library/sys.rst M Doc/library/test.rst M Doc/library/threading.rst M Lib/test/support/__init__.py M Lib/test/test_io.py diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index 5bde6870717c..817c3f1e56f9 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -1514,13 +1514,21 @@ always available. * *err_msg*: Error message, can be ``None``. * *object*: Object causing the exception, can be ``None``. - :func:`sys.unraisablehook` can be overridden to control how unraisable - exceptions are handled. - The default hook formats *err_msg* and *object* as: ``f'{err_msg}: {object!r}'``; use "Exception ignored in" error message if *err_msg* is ``None``. + :func:`sys.unraisablehook` can be overridden to control how unraisable + exceptions are handled. + + Storing *exc_value* using a custom hook can create a reference cycle. It + should be cleared explicitly to break the reference cycle when the + exception is no longer needed. + + Storing *object* using a custom hook can resurrect it if it is set to an + object which is being finalized. Avoid storing *object* after the custom + hook completes to avoid resurrecting objects. + See also :func:`excepthook` which handles uncaught exceptions. .. versionadded:: 3.8 diff --git a/Doc/library/test.rst b/Doc/library/test.rst index 0a98c882465d..920c018084b8 100644 --- a/Doc/library/test.rst +++ b/Doc/library/test.rst @@ -1086,17 +1086,13 @@ The :mod:`test.support` module defines the following functions: Context manager catching unraisable exception using :func:`sys.unraisablehook`. - If the *object* attribute of the unraisable hook is set and the object is - being finalized, the object is resurrected because the context manager - stores a strong reference to it (``cm.unraisable.object``). - Storing the exception value (``cm.unraisable.exc_value``) creates a reference cycle. The reference cycle is broken explicitly when the context manager exits. - Exiting the context manager clears the stored unraisable exception. It can - trigger a new unraisable exception (ex: the resurrected object is finalized - again and raises the same exception): it is silently ignored in this case. + Storing the object (``cm.unraisable.object``) can resurrect it if it is set + to an object which is being finalized. Exiting the context manager clears + the stored object. Usage:: diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst index 2907b65f5bca..9ffd5cd58179 100644 --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -58,6 +58,14 @@ This module defines the following functions: :func:`threading.excepthook` can be overridden to control how uncaught exceptions raised by :func:`Thread.run` are handled. + Storing *exc_value* using a custom hook can create a reference cycle. It + should be cleared explicitly to break the reference cycle when the + exception is no longer needed. + + Storing *object* using a custom hook can resurrect it if it is set to an + object which is being finalized. Avoid storing *object* after the custom + hook completes to avoid resurrecting objects. + .. seealso:: :func:`sys.excepthook` handles uncaught exceptions. diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index 174e0456dc71..7c0efc783edb 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -3040,17 +3040,13 @@ class catch_unraisable_exception: """ Context manager catching unraisable exception using sys.unraisablehook. - If the *object* attribute of the unraisable hook is set and the object is - being finalized, the object is resurrected because the context manager - stores a strong reference to it (cm.unraisable.object). - Storing the exception value (cm.unraisable.exc_value) creates a reference cycle. The reference cycle is broken explicitly when the context manager exits. - Exiting the context manager clears the stored unraisable exception. It can - trigger a new unraisable exception (ex: the resurrected object is finalized - again and raises the same exception): it is silently ignored in this case. + Storing the object (cm.unraisable.object) can resurrect it if it is set to + an object which is being finalized. Exiting the context manager clears the + stored object. Usage: @@ -3080,10 +3076,5 @@ def __enter__(self): return self def __exit__(self, *exc_info): - # Clear the unraisable exception to explicitly break a reference cycle. - # It can call _hook() again: ignore the new unraisable exception in - # this case. - self.unraisable = None - sys.unraisablehook = self._old_hook del self.unraisable diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 55686d743983..fc474c99053d 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -2072,8 +2072,12 @@ def writer_close(): writer.close = lambda: None writer = None + # Ignore BufferedWriter (of the BufferedRWPair) unraisable exception with support.catch_unraisable_exception(): - pair = None + # Ignore BufferedRWPair unraisable exception + with support.catch_unraisable_exception(): + pair = None + support.gc_collect() support.gc_collect() def test_reader_writer_close_error_on_close(self): From webhook-mailer at python.org Fri Jun 14 13:31:48 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 14 Jun 2019 17:31:48 -0000 Subject: [Python-checkins] bpo-35537: Rewrite setsid test for os.posix_spawn (GH-11721) Message-ID: https://github.com/python/cpython/commit/5884043252473ac733aba1d3251d4debe72511e5 commit: 5884043252473ac733aba1d3251d4debe72511e5 branch: master author: Victor Stinner committer: GitHub date: 2019-06-14T19:31:43+02:00 summary: bpo-35537: Rewrite setsid test for os.posix_spawn (GH-11721) bpo-35537, bpo-35876: Fix also test_start_new_session() of test_subprocess: use os.getsid() rather than os.getpgid(). files: M Lib/test/test_posix.py M Lib/test/test_subprocess.py diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py index 0f07a8f2e68d..afa1398d4edc 100644 --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -1639,23 +1639,35 @@ def test_setsigmask_wrong_type(self): os.environ, setsigmask=[signal.NSIG, signal.NSIG+1]) - @unittest.skipIf(True, - "FIXME: bpo-35537: test fails is setsid is supported") - def test_start_new_session(self): - # For code coverage of calling setsid(). We don't care if we get an - # EPERM error from it depending on the test execution environment, that - # still indicates that it was called. - code = "import os; print(os.getpgid(os.getpid()))" + def test_setsid(self): + rfd, wfd = os.pipe() + self.addCleanup(os.close, rfd) try: - self.spawn_func(sys.executable, - [sys.executable, "-c", code], - os.environ, setsid=True) - except NotImplementedError as exc: - self.skipTest("setsid is not supported: %s" % exc) - else: - parent_pgid = os.getpgid(os.getpid()) - child_pgid = int(output) - self.assertNotEqual(parent_pgid, child_pgid) + os.set_inheritable(wfd, True) + + code = textwrap.dedent(f""" + import os + fd = {wfd} + sid = os.getsid(0) + os.write(fd, str(sid).encode()) + """) + + try: + pid = self.spawn_func(sys.executable, + [sys.executable, "-c", code], + os.environ, setsid=True) + except NotImplementedError as exc: + self.skipTest(f"setsid is not supported: {exc!r}") + except PermissionError as exc: + self.skipTest(f"setsid failed with: {exc!r}") + finally: + os.close(wfd) + + self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + output = os.read(rfd, 100) + child_sid = int(output) + parent_sid = os.getsid(os.getpid()) + self.assertNotEqual(parent_sid, child_sid) @unittest.skipUnless(hasattr(signal, 'pthread_sigmask'), 'need signal.pthread_sigmask()') diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index fca3ed62099b..97d21904b9ce 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -1705,16 +1705,15 @@ def test_start_new_session(self): # still indicates that it was called. try: output = subprocess.check_output( - [sys.executable, "-c", - "import os; print(os.getpgid(os.getpid()))"], + [sys.executable, "-c", "import os; print(os.getsid(0))"], start_new_session=True) except OSError as e: if e.errno != errno.EPERM: raise else: - parent_pgid = os.getpgid(os.getpid()) - child_pgid = int(output) - self.assertNotEqual(parent_pgid, child_pgid) + parent_sid = os.getsid(0) + child_sid = int(output) + self.assertNotEqual(parent_sid, child_sid) def test_run_abort(self): # returncode handles signal termination From webhook-mailer at python.org Fri Jun 14 13:43:47 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Fri, 14 Jun 2019 17:43:47 -0000 Subject: [Python-checkins] Document C API changes in What's New in Python 3.8 (GH-14092) Message-ID: https://github.com/python/cpython/commit/bd5798f6d4f6960fd6b49976bdf4326be77f4277 commit: bd5798f6d4f6960fd6b49976bdf4326be77f4277 branch: master author: Victor Stinner committer: GitHub date: 2019-06-14T19:43:43+02:00 summary: Document C API changes in What's New in Python 3.8 (GH-14092) files: M Doc/whatsnew/3.8.rst diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 3e607130743d..b63bcef5de47 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -955,6 +955,33 @@ Optimizations Build and C API Changes ======================= +* The header files have been reorganized to better separate the different kinds + of APIs: + + * ``Include/*.h`` should be the portable public stable C API. + * ``Include/cpython/*.h`` should be the unstable C API specific to CPython; + public API, with some private API prefixed by ``_Py`` or ``_PY``. + * ``Include/internal/*.h`` is the private internal C API very specific to + CPython. This API comes with no backward compatibility warranty and should + not be used outside CPython. It is only exposed for very specific needs + like debuggers and profiles which has to access to CPython internals + without calling functions. This API is now installed by ``make install``. + + (Contributed by Victor Stinner in :issue:`35134` and :issue:`35081`, + work initiated by Eric Snow in Python 3.7) + +* Some macros have been converted to static inline functions: parameter types + and return type are well defined, they don't have issues specific to macros, + variables have a local scopes. Examples: + + * :c:func:`Py_INCREF`, :c:func:`Py_DECREF` + * :c:func:`Py_XINCREF`, :c:func:`Py_XDECREF` + * :c:func:`PyObject_INIT`, :c:func:`PyObject_INIT_VAR` + * Private functions: :c:func:`_PyObject_GC_TRACK`, + :c:func:`_PyObject_GC_UNTRACK`, :c:func:`_Py_Dealloc` + + (Contributed by Victor Stinner in :issue:`35059`.) + * The :c:func:`PyByteArray_Init` and :c:func:`PyByteArray_Fini` functions have been removed. They did nothing since Python 2.7.4 and Python 3.2.0, were excluded from the limited API (stable ABI), and were not documented. From webhook-mailer at python.org Fri Jun 14 13:49:27 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 14 Jun 2019 17:49:27 -0000 Subject: [Python-checkins] bpo-35537: Rewrite setsid test for os.posix_spawn (GH-11721) Message-ID: https://github.com/python/cpython/commit/e696b15a62dd0c85fe6ed3c9698b5f889c0bb1b3 commit: e696b15a62dd0c85fe6ed3c9698b5f889c0bb1b3 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-14T10:49:22-07:00 summary: bpo-35537: Rewrite setsid test for os.posix_spawn (GH-11721) bpo-35537, bpo-35876: Fix also test_start_new_session() of test_subprocess: use os.getsid() rather than os.getpgid(). (cherry picked from commit 5884043252473ac733aba1d3251d4debe72511e5) Co-authored-by: Victor Stinner files: M Lib/test/test_posix.py M Lib/test/test_subprocess.py diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py index 0f07a8f2e68d..afa1398d4edc 100644 --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -1639,23 +1639,35 @@ def test_setsigmask_wrong_type(self): os.environ, setsigmask=[signal.NSIG, signal.NSIG+1]) - @unittest.skipIf(True, - "FIXME: bpo-35537: test fails is setsid is supported") - def test_start_new_session(self): - # For code coverage of calling setsid(). We don't care if we get an - # EPERM error from it depending on the test execution environment, that - # still indicates that it was called. - code = "import os; print(os.getpgid(os.getpid()))" + def test_setsid(self): + rfd, wfd = os.pipe() + self.addCleanup(os.close, rfd) try: - self.spawn_func(sys.executable, - [sys.executable, "-c", code], - os.environ, setsid=True) - except NotImplementedError as exc: - self.skipTest("setsid is not supported: %s" % exc) - else: - parent_pgid = os.getpgid(os.getpid()) - child_pgid = int(output) - self.assertNotEqual(parent_pgid, child_pgid) + os.set_inheritable(wfd, True) + + code = textwrap.dedent(f""" + import os + fd = {wfd} + sid = os.getsid(0) + os.write(fd, str(sid).encode()) + """) + + try: + pid = self.spawn_func(sys.executable, + [sys.executable, "-c", code], + os.environ, setsid=True) + except NotImplementedError as exc: + self.skipTest(f"setsid is not supported: {exc!r}") + except PermissionError as exc: + self.skipTest(f"setsid failed with: {exc!r}") + finally: + os.close(wfd) + + self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + output = os.read(rfd, 100) + child_sid = int(output) + parent_sid = os.getsid(os.getpid()) + self.assertNotEqual(parent_sid, child_sid) @unittest.skipUnless(hasattr(signal, 'pthread_sigmask'), 'need signal.pthread_sigmask()') diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index fca3ed62099b..97d21904b9ce 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -1705,16 +1705,15 @@ def test_start_new_session(self): # still indicates that it was called. try: output = subprocess.check_output( - [sys.executable, "-c", - "import os; print(os.getpgid(os.getpid()))"], + [sys.executable, "-c", "import os; print(os.getsid(0))"], start_new_session=True) except OSError as e: if e.errno != errno.EPERM: raise else: - parent_pgid = os.getpgid(os.getpid()) - child_pgid = int(output) - self.assertNotEqual(parent_pgid, child_pgid) + parent_sid = os.getsid(0) + child_sid = int(output) + self.assertNotEqual(parent_sid, child_sid) def test_run_abort(self): # returncode handles signal termination From webhook-mailer at python.org Fri Jun 14 13:51:36 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Fri, 14 Jun 2019 17:51:36 -0000 Subject: [Python-checkins] Document C API changes in What's New in Python 3.8 (GH-14092) Message-ID: https://github.com/python/cpython/commit/322281e7caa161d5b9c0f3fbf79efd15299f3594 commit: 322281e7caa161d5b9c0f3fbf79efd15299f3594 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-14T10:51:32-07:00 summary: Document C API changes in What's New in Python 3.8 (GH-14092) (cherry picked from commit bd5798f6d4f6960fd6b49976bdf4326be77f4277) Co-authored-by: Victor Stinner files: M Doc/whatsnew/3.8.rst diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 9989a0917434..05d2ecc698b4 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -936,6 +936,33 @@ Optimizations Build and C API Changes ======================= +* The header files have been reorganized to better separate the different kinds + of APIs: + + * ``Include/*.h`` should be the portable public stable C API. + * ``Include/cpython/*.h`` should be the unstable C API specific to CPython; + public API, with some private API prefixed by ``_Py`` or ``_PY``. + * ``Include/internal/*.h`` is the private internal C API very specific to + CPython. This API comes with no backward compatibility warranty and should + not be used outside CPython. It is only exposed for very specific needs + like debuggers and profiles which has to access to CPython internals + without calling functions. This API is now installed by ``make install``. + + (Contributed by Victor Stinner in :issue:`35134` and :issue:`35081`, + work initiated by Eric Snow in Python 3.7) + +* Some macros have been converted to static inline functions: parameter types + and return type are well defined, they don't have issues specific to macros, + variables have a local scopes. Examples: + + * :c:func:`Py_INCREF`, :c:func:`Py_DECREF` + * :c:func:`Py_XINCREF`, :c:func:`Py_XDECREF` + * :c:func:`PyObject_INIT`, :c:func:`PyObject_INIT_VAR` + * Private functions: :c:func:`_PyObject_GC_TRACK`, + :c:func:`_PyObject_GC_UNTRACK`, :c:func:`_Py_Dealloc` + + (Contributed by Victor Stinner in :issue:`35059`.) + * The :c:func:`PyByteArray_Init` and :c:func:`PyByteArray_Fini` functions have been removed. They did nothing since Python 2.7.4 and Python 3.2.0, were excluded from the limited API (stable ABI), and were not documented. From webhook-mailer at python.org Fri Jun 14 17:19:28 2019 From: webhook-mailer at python.org (Steve Dower) Date: Fri, 14 Jun 2019 21:19:28 -0000 Subject: [Python-checkins] Fix Windows release build issues (GH-14091) Message-ID: https://github.com/python/cpython/commit/749e73065dea1cc3a6d39a830380a2c124f568c2 commit: 749e73065dea1cc3a6d39a830380a2c124f568c2 branch: master author: Steve Dower committer: GitHub date: 2019-06-14T14:19:25-07:00 summary: Fix Windows release build issues (GH-14091) * Increase timeout for PGO builds in Windows release * Fix test step failures * Disable MinGW step properly * Fix embeddable distro name files: M .azure-pipelines/windows-release/msi-steps.yml M .azure-pipelines/windows-release/stage-build.yml M .azure-pipelines/windows-release/stage-layout-embed.yml M .azure-pipelines/windows-release/stage-test-embed.yml M Tools/msi/dev/dev.wixproj diff --git a/.azure-pipelines/windows-release/msi-steps.yml b/.azure-pipelines/windows-release/msi-steps.yml index 2f80c34eeb7d..153408271c71 100644 --- a/.azure-pipelines/windows-release/msi-steps.yml +++ b/.azure-pipelines/windows-release/msi-steps.yml @@ -94,8 +94,8 @@ steps: Py_OutDir: $(Build.BinariesDirectory) - script: | - %MSBUILD% Tools\msi\bundle\releaselocal.wixproj /t:Rebuild /p:RebuildAll=true /p:BuildForRelease=true - %MSBUILD% Tools\msi\bundle\releaseweb.wixproj /t:Rebuild /p:RebuildAll=false /p:BuildForRelease=true + %MSBUILD% Tools\msi\bundle\releaselocal.wixproj /t:Rebuild /p:RebuildAll=true + %MSBUILD% Tools\msi\bundle\releaseweb.wixproj /t:Rebuild /p:RebuildAll=false displayName: 'Build win32 installer' env: Platform: x86 @@ -103,10 +103,12 @@ steps: PYTHON: $(Build.BinariesDirectory)\win32\python.exe PYTHONHOME: $(Build.SourcesDirectory) TclTkLibraryDir: $(Build.BinariesDirectory)\tcltk_lib_win32 + BuildForRelease: true + SuppressMinGWLib: true - script: | - %MSBUILD% Tools\msi\bundle\releaselocal.wixproj /t:Rebuild /p:RebuildAll=true /p:BuildForRelease=true - %MSBUILD% Tools\msi\bundle\releaseweb.wixproj /t:Rebuild /p:RebuildAll=false /p:BuildForRelease=true + %MSBUILD% Tools\msi\bundle\releaselocal.wixproj /t:Rebuild /p:RebuildAll=true + %MSBUILD% Tools\msi\bundle\releaseweb.wixproj /t:Rebuild /p:RebuildAll=false displayName: 'Build amd64 installer' env: Platform: x64 @@ -114,6 +116,8 @@ steps: PYTHON: $(Build.BinariesDirectory)\amd64\python.exe PYTHONHOME: $(Build.SourcesDirectory) TclTkLibraryDir: $(Build.BinariesDirectory)\tcltk_lib_amd64 + BuildForRelease: true + SuppressMinGWLib: true - task: CopyFiles at 2 displayName: 'Assemble artifact: msi (1/2)' diff --git a/.azure-pipelines/windows-release/stage-build.yml b/.azure-pipelines/windows-release/stage-build.yml index 121e4b1a278e..a5093a04f087 100644 --- a/.azure-pipelines/windows-release/stage-build.yml +++ b/.azure-pipelines/windows-release/stage-build.yml @@ -95,6 +95,9 @@ jobs: displayName: Python PGO build condition: and(succeeded(), eq(variables['DoPGO'], 'true')) + # Allow up to five hours for PGO + timeoutInMinutes: 300 + pool: name: 'Windows Release' diff --git a/.azure-pipelines/windows-release/stage-layout-embed.yml b/.azure-pipelines/windows-release/stage-layout-embed.yml index c9d58b6b30a2..e2689dbb603d 100644 --- a/.azure-pipelines/windows-release/stage-layout-embed.yml +++ b/.azure-pipelines/windows-release/stage-layout-embed.yml @@ -39,7 +39,7 @@ jobs: - powershell: > $(LayoutCmd) --copy "$(Build.ArtifactStagingDirectory)\layout" - --zip "$(Build.ArtifactStagingDirectory)\embed\$(VersionText)-embed-$(Name).zip" + --zip "$(Build.ArtifactStagingDirectory)\embed\python-$(VersionText)-embed-$(Name).zip" --preset-embed displayName: 'Generate embeddable layout' diff --git a/.azure-pipelines/windows-release/stage-test-embed.yml b/.azure-pipelines/windows-release/stage-test-embed.yml index ab377fdfa8c9..b33176266a20 100644 --- a/.azure-pipelines/windows-release/stage-test-embed.yml +++ b/.azure-pipelines/windows-release/stage-test-embed.yml @@ -26,7 +26,8 @@ jobs: downloadPath: $(Build.BinariesDirectory) - powershell: | - Expand-Archive -Path "$(Build.BinariesDirectory)\embed\embed-$(Name).zip" -DestinationPath "$(Build.BinariesDirectory)\Python" + $p = gi "$(Build.BinariesDirectory)\embed\python*embed-$(Name).zip" + Expand-Archive -Path $p -DestinationPath "$(Build.BinariesDirectory)\Python" $p = gi "$(Build.BinariesDirectory)\Python\python.exe" Write-Host "##vso[task.prependpath]$(Split-Path -Parent $p)" displayName: 'Install Python and add to PATH' diff --git a/Tools/msi/dev/dev.wixproj b/Tools/msi/dev/dev.wixproj index 4a56cec35722..c6e3bcf709c6 100644 --- a/Tools/msi/dev/dev.wixproj +++ b/Tools/msi/dev/dev.wixproj @@ -8,7 +8,7 @@ - + $(DefineConstants); IncludeMinGWLib=1; @@ -35,7 +35,7 @@ Inputs="$(BuildPath)$(PyDllName).dll" Outputs="$(BuildPath)lib$(PyDllName).a" AfterTargets="PrepareForBuild" - Condition="$(BuildForRelease)"> + Condition="$(BuildForRelease) and $(SuppressMinGWLib) == ''"> <_DllToolOpts>-m i386 --as-flags=--32 From webhook-mailer at python.org Fri Jun 14 17:20:20 2019 From: webhook-mailer at python.org (Steve Dower) Date: Fri, 14 Jun 2019 21:20:20 -0000 Subject: [Python-checkins] Implement Windows release builds in Azure Pipelines (GH-14065) Message-ID: https://github.com/python/cpython/commit/f78e66c3c9cd3a65cedba8d35f8e715e0535d8bf commit: f78e66c3c9cd3a65cedba8d35f8e715e0535d8bf branch: 3.8 author: Steve Dower committer: GitHub date: 2019-06-14T14:20:16-07:00 summary: Implement Windows release builds in Azure Pipelines (GH-14065) Includes backported fixes from GH-14091 files: A .azure-pipelines/windows-release.yml A .azure-pipelines/windows-release/build-steps.yml A .azure-pipelines/windows-release/checkout.yml A .azure-pipelines/windows-release/find-sdk.yml A .azure-pipelines/windows-release/layout-command.yml A .azure-pipelines/windows-release/mingw-lib.yml A .azure-pipelines/windows-release/msi-steps.yml A .azure-pipelines/windows-release/stage-build.yml A .azure-pipelines/windows-release/stage-layout-embed.yml A .azure-pipelines/windows-release/stage-layout-full.yml A .azure-pipelines/windows-release/stage-layout-msix.yml A .azure-pipelines/windows-release/stage-layout-nuget.yml A .azure-pipelines/windows-release/stage-msi.yml A .azure-pipelines/windows-release/stage-pack-msix.yml A .azure-pipelines/windows-release/stage-pack-nuget.yml A .azure-pipelines/windows-release/stage-publish-nugetorg.yml A .azure-pipelines/windows-release/stage-publish-pythonorg.yml A .azure-pipelines/windows-release/stage-publish-store.yml A .azure-pipelines/windows-release/stage-sign.yml A .azure-pipelines/windows-release/stage-test-embed.yml A .azure-pipelines/windows-release/stage-test-msi.yml A .azure-pipelines/windows-release/stage-test-nuget.yml A PC/crtlicense.txt A PC/layout/support/nuspec.py D Tools/msi/exe/crtlicense.txt M Doc/make.bat M PC/layout/main.py M PC/layout/support/appxmanifest.py M PC/layout/support/options.py M PC/layout/support/pip.py M PC/layout/support/props.py M PC/python_uwp.cpp M PCbuild/_tkinter.vcxproj M PCbuild/build.bat M PCbuild/pyproject.props M PCbuild/python.props M PCbuild/python.vcxproj M PCbuild/tcltk.props M Tools/msi/buildrelease.bat M Tools/msi/dev/dev.wixproj M Tools/msi/exe/exe.wixproj M Tools/msi/exe/exe_files.wxs M Tools/msi/make_cat.ps1 M Tools/msi/msi.props M Tools/msi/msi.targets M Tools/msi/sign_build.ps1 M Tools/msi/tcltk/tcltk.wixproj M Tools/msi/uploadrelease.ps1 diff --git a/.azure-pipelines/windows-release.yml b/.azure-pipelines/windows-release.yml new file mode 100644 index 000000000000..774585792484 --- /dev/null +++ b/.azure-pipelines/windows-release.yml @@ -0,0 +1,96 @@ +name: Release_$(Build.SourceBranchName)_$(SourceTag)_$(Date:yyyyMMdd)$(Rev:.rr) + +# QUEUE TIME VARIABLES +# variables: +# GitRemote: python +# SourceTag: +# DoPGO: true +# SigningCertificate: 'Python Software Foundation' +# SigningDescription: 'Built: $(Build.BuildNumber)' +# DoLayout: true +# DoMSIX: true +# DoNuget: true +# DoEmbed: true +# DoMSI: true +# DoPublish: false + +trigger: none +pr: none + +stages: +- stage: Build + displayName: Build binaries + jobs: + - template: windows-release/stage-build.yml + +- stage: Sign + displayName: Sign binaries + dependsOn: Build + jobs: + - template: windows-release/stage-sign.yml + +- stage: Layout + displayName: Generate layouts + dependsOn: Sign + jobs: + - template: windows-release/stage-layout-full.yml + - template: windows-release/stage-layout-embed.yml + - template: windows-release/stage-layout-nuget.yml + +- stage: Pack + dependsOn: Layout + jobs: + - template: windows-release/stage-pack-nuget.yml + +- stage: Test + dependsOn: Pack + jobs: + - template: windows-release/stage-test-embed.yml + - template: windows-release/stage-test-nuget.yml + +- stage: Layout_MSIX + displayName: Generate MSIX layouts + dependsOn: Sign + condition: and(succeeded(), eq(variables['DoMSIX'], 'true')) + jobs: + - template: windows-release/stage-layout-msix.yml + +- stage: Pack_MSIX + displayName: Package MSIX + dependsOn: Layout_MSIX + jobs: + - template: windows-release/stage-pack-msix.yml + +- stage: Build_MSI + displayName: Build MSI installer + dependsOn: Sign + condition: and(succeeded(), eq(variables['DoMSI'], 'true')) + jobs: + - template: windows-release/stage-msi.yml + +- stage: Test_MSI + displayName: Test MSI installer + dependsOn: Build_MSI + jobs: + - template: windows-release/stage-test-msi.yml + +- stage: PublishPyDotOrg + displayName: Publish to python.org + dependsOn: ['Test_MSI', 'Test'] + condition: and(succeeded(), eq(variables['DoPublish'], 'true')) + jobs: + - template: windows-release/stage-publish-pythonorg.yml + +- stage: PublishNuget + displayName: Publish to nuget.org + dependsOn: Test + condition: and(succeeded(), eq(variables['DoPublish'], 'true')) + jobs: + - template: windows-release/stage-publish-nugetorg.yml + +- stage: PublishStore + displayName: Publish to Store + dependsOn: Pack_MSIX + condition: and(succeeded(), eq(variables['DoPublish'], 'true')) + jobs: + - template: windows-release/stage-publish-store.yml diff --git a/.azure-pipelines/windows-release/build-steps.yml b/.azure-pipelines/windows-release/build-steps.yml new file mode 100644 index 000000000000..508d73b0865f --- /dev/null +++ b/.azure-pipelines/windows-release/build-steps.yml @@ -0,0 +1,83 @@ +parameters: + ShouldPGO: false + +steps: +- template: ./checkout.yml + +- powershell: | + $d = (.\PCbuild\build.bat -V) | %{ if($_ -match '\s+(\w+):\s*(.+)\s*$') { @{$Matches[1] = $Matches[2];} }}; + Write-Host "##vso[task.setvariable variable=VersionText]$($d.PythonVersion)" + Write-Host "##vso[task.setvariable variable=VersionNumber]$($d.PythonVersionNumber)" + Write-Host "##vso[task.setvariable variable=VersionHex]$($d.PythonVersionHex)" + Write-Host "##vso[task.setvariable variable=VersionUnique]$($d.PythonVersionUnique)" + Write-Host "##vso[build.addbuildtag]$($d.PythonVersion)" + Write-Host "##vso[build.addbuildtag]$($d.PythonVersion)-$(Name)" + displayName: 'Extract version numbers' + +- ${{ if eq(parameters.ShouldPGO, 'false') }}: + - powershell: | + $env:SigningCertificate = $null + .\PCbuild\build.bat -v -p $(Platform) -c $(Configuration) + displayName: 'Run build' + env: + IncludeUwp: true + Py_OutDir: '$(Build.BinariesDirectory)\bin' + +- ${{ if eq(parameters.ShouldPGO, 'true') }}: + - powershell: | + $env:SigningCertificate = $null + .\PCbuild\build.bat -v -p $(Platform) --pgo + displayName: 'Run build with PGO' + env: + IncludeUwp: true + Py_OutDir: '$(Build.BinariesDirectory)\bin' + +- powershell: | + $kitroot = (gp 'HKLM:\SOFTWARE\Microsoft\Windows Kits\Installed Roots\').KitsRoot10 + $tool = (gci -r "$kitroot\Bin\*\x64\signtool.exe" | sort FullName -Desc | select -First 1) + if (-not $tool) { + throw "SDK is not available" + } + Write-Host "##vso[task.prependpath]$($tool.Directory)" + displayName: 'Add WinSDK tools to path' + +- powershell: | + $env:SigningCertificate = $null + .\python.bat PC\layout -vv -t "$(Build.BinariesDirectory)\catalog" --catalog "${env:CAT}.cdf" --preset-default + makecat "${env:CAT}.cdf" + del "${env:CAT}.cdf" + if (-not (Test-Path "${env:CAT}.cat")) { + throw "Failed to build catalog file" + } + displayName: 'Generate catalog' + env: + CAT: $(Build.BinariesDirectory)\bin\$(Arch)\python + +- task: PublishBuildArtifacts at 1 + displayName: 'Publish binaries' + condition: and(succeeded(), not(and(eq(variables['Configuration'], 'Release'), variables['SigningCertificate']))) + inputs: + PathtoPublish: '$(Build.BinariesDirectory)\bin\$(Arch)' + ArtifactName: bin_$(Name) + +- task: PublishBuildArtifacts at 1 + displayName: 'Publish binaries for signing' + condition: and(succeeded(), and(eq(variables['Configuration'], 'Release'), variables['SigningCertificate'])) + inputs: + PathtoPublish: '$(Build.BinariesDirectory)\bin\$(Arch)' + ArtifactName: unsigned_bin_$(Name) + +- task: CopyFiles at 2 + displayName: 'Layout Artifact: symbols' + inputs: + sourceFolder: $(Build.BinariesDirectory)\bin\$(Arch) + targetFolder: $(Build.ArtifactStagingDirectory)\symbols\$(Name) + flatten: true + contents: | + **\*.pdb + +- task: PublishBuildArtifacts at 1 + displayName: 'Publish Artifact: symbols' + inputs: + PathToPublish: '$(Build.ArtifactStagingDirectory)\symbols' + ArtifactName: symbols diff --git a/.azure-pipelines/windows-release/checkout.yml b/.azure-pipelines/windows-release/checkout.yml new file mode 100644 index 000000000000..d42d55fff08d --- /dev/null +++ b/.azure-pipelines/windows-release/checkout.yml @@ -0,0 +1,21 @@ +parameters: + depth: 3 + +steps: +- checkout: none + +- script: git clone --progress -v --depth ${{ parameters.depth }} --branch $(SourceTag) --single-branch https://github.com/$(GitRemote)/cpython.git . + displayName: 'git clone ($(GitRemote)/$(SourceTag))' + condition: and(succeeded(), and(variables['GitRemote'], variables['SourceTag'])) + +- script: git clone --progress -v --depth ${{ parameters.depth }} --branch $(SourceTag) --single-branch $(Build.Repository.Uri) . + displayName: 'git clone (/$(SourceTag))' + condition: and(succeeded(), and(not(variables['GitRemote']), variables['SourceTag'])) + +- script: git clone --progress -v --depth ${{ parameters.depth }} --branch $(Build.SourceBranchName) --single-branch https://github.com/$(GitRemote)/cpython.git . + displayName: 'git clone ($(GitRemote)/)' + condition: and(succeeded(), and(variables['GitRemote'], not(variables['SourceTag']))) + +- script: git clone --progress -v --depth ${{ parameters.depth }} --branch $(Build.SourceBranchName) --single-branch $(Build.Repository.Uri) . + displayName: 'git clone' + condition: and(succeeded(), and(not(variables['GitRemote']), not(variables['SourceTag']))) diff --git a/.azure-pipelines/windows-release/find-sdk.yml b/.azure-pipelines/windows-release/find-sdk.yml new file mode 100644 index 000000000000..e4de78555b3f --- /dev/null +++ b/.azure-pipelines/windows-release/find-sdk.yml @@ -0,0 +1,17 @@ +# Locate the Windows SDK and add its binaries directory to PATH +# +# `toolname` can be overridden to use a different marker file. + +parameters: + toolname: signtool.exe + +steps: + - powershell: | + $kitroot = (gp 'HKLM:\SOFTWARE\Microsoft\Windows Kits\Installed Roots\').KitsRoot10 + $tool = (gci -r "$kitroot\Bin\*\${{ parameters.toolname }}" | sort FullName -Desc | select -First 1) + if (-not $tool) { + throw "SDK is not available" + } + Write-Host "##vso[task.prependpath]$($tool.Directory)" + Write-Host "Adding $($tool.Directory) to PATH" + displayName: 'Add WinSDK tools to path' diff --git a/.azure-pipelines/windows-release/layout-command.yml b/.azure-pipelines/windows-release/layout-command.yml new file mode 100644 index 000000000000..3ec9b69ad712 --- /dev/null +++ b/.azure-pipelines/windows-release/layout-command.yml @@ -0,0 +1,20 @@ +steps: +- powershell: > + Write-Host ( + '##vso[task.setvariable variable=LayoutCmd]& + "{0}" + "{1}\PC\layout" + -vv + --source "{1}" + --build "{2}" + --temp "{3}" + --include-cat "{2}\python.cat" + --doc-build "{4}"' + -f ( + "$(PYTHON)", + "$(Build.SourcesDirectory)", + (Split-Path -Parent "$(PYTHON)"), + "$(Build.BinariesDirectory)\layout-temp", + "$(Build.BinariesDirectory)\doc" + )) + displayName: 'Set LayoutCmd' diff --git a/.azure-pipelines/windows-release/mingw-lib.yml b/.azure-pipelines/windows-release/mingw-lib.yml new file mode 100644 index 000000000000..30f7d34fa61d --- /dev/null +++ b/.azure-pipelines/windows-release/mingw-lib.yml @@ -0,0 +1,13 @@ +parameters: + DllToolOpt: -m i386:x86-64 + #DllToolOpt: -m i386 --as-flags=--32 + +steps: +- powershell: | + git clone https://github.com/python/cpython-bin-deps --branch binutils --single-branch --depth 1 --progress -v "binutils" + gci "bin\$(Arch)\python*.dll" | %{ + & "binutils\gendef.exe" $_ | Out-File -Encoding ascii tmp.def + & "binutils\dlltool.exe" --dllname $($_.BaseName).dll --def tmp.def --output-lib "$($_.Directory)\lib$($_.BaseName).a" ${{ parameters.DllToolOpt }} + } + displayName: 'Generate MinGW import library' + workingDirectory: $(Build.BinariesDirectory) diff --git a/.azure-pipelines/windows-release/msi-steps.yml b/.azure-pipelines/windows-release/msi-steps.yml new file mode 100644 index 000000000000..153408271c71 --- /dev/null +++ b/.azure-pipelines/windows-release/msi-steps.yml @@ -0,0 +1,146 @@ +steps: + - template: ./checkout.yml + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: doc' + inputs: + artifactName: doc + downloadPath: $(Build.BinariesDirectory) + + - task: CopyFiles at 2 + displayName: 'Merge documentation files' + inputs: + sourceFolder: $(Build.BinariesDirectory)\doc + targetFolder: $(Build.SourcesDirectory)\Doc\build + contents: | + htmlhelp\*.chm + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: bin_win32' + inputs: + artifactName: bin_win32 + downloadPath: $(Build.BinariesDirectory) + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: bin_win32_d' + inputs: + artifactName: bin_win32_d + downloadPath: $(Build.BinariesDirectory) + + - task: CopyFiles at 2 + displayName: 'Merge win32 debug files' + inputs: + sourceFolder: $(Build.BinariesDirectory)\bin_win32_d + targetFolder: $(Build.BinariesDirectory)\bin_win32 + contents: | + **\*_d.* + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: bin_amd64' + inputs: + artifactName: bin_amd64 + downloadPath: $(Build.BinariesDirectory) + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: bin_amd64_d' + inputs: + artifactName: bin_amd64_d + downloadPath: $(Build.BinariesDirectory) + + - task: CopyFiles at 2 + displayName: 'Merge amd64 debug files' + inputs: + sourceFolder: $(Build.BinariesDirectory)\bin_amd64_d + targetFolder: $(Build.BinariesDirectory)\bin_amd64 + contents: | + **\*_d.* + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: tcltk_lib_win32' + inputs: + artifactName: tcltk_lib_win32 + downloadPath: $(Build.BinariesDirectory) + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: tcltk_lib_amd64' + inputs: + artifactName: tcltk_lib_amd64 + downloadPath: $(Build.BinariesDirectory) + + - script: | + ren bin_win32 win32 + ren bin_amd64 amd64 + displayName: 'Correct artifact directory names' + workingDirectory: $(Build.BinariesDirectory) + + - script: | + call Tools\msi\get_externals.bat + call PCbuild\find_python.bat + echo ##vso[task.setvariable variable=PYTHON]%PYTHON% + call PCbuild/find_msbuild.bat + echo ##vso[task.setvariable variable=MSBUILD]%MSBUILD% + displayName: 'Get external dependencies' + + - script: | + %PYTHON% -m pip install blurb + %PYTHON% -m blurb merge -f Misc\NEWS + displayName: 'Merge NEWS file' + + - script: | + %MSBUILD% Tools\msi\launcher\launcher.wixproj + displayName: 'Build launcher installer' + env: + Platform: x86 + Py_OutDir: $(Build.BinariesDirectory) + + - script: | + %MSBUILD% Tools\msi\bundle\releaselocal.wixproj /t:Rebuild /p:RebuildAll=true + %MSBUILD% Tools\msi\bundle\releaseweb.wixproj /t:Rebuild /p:RebuildAll=false + displayName: 'Build win32 installer' + env: + Platform: x86 + Py_OutDir: $(Build.BinariesDirectory) + PYTHON: $(Build.BinariesDirectory)\win32\python.exe + PYTHONHOME: $(Build.SourcesDirectory) + TclTkLibraryDir: $(Build.BinariesDirectory)\tcltk_lib_win32 + BuildForRelease: true + SuppressMinGWLib: true + + - script: | + %MSBUILD% Tools\msi\bundle\releaselocal.wixproj /t:Rebuild /p:RebuildAll=true + %MSBUILD% Tools\msi\bundle\releaseweb.wixproj /t:Rebuild /p:RebuildAll=false + displayName: 'Build amd64 installer' + env: + Platform: x64 + Py_OutDir: $(Build.BinariesDirectory) + PYTHON: $(Build.BinariesDirectory)\amd64\python.exe + PYTHONHOME: $(Build.SourcesDirectory) + TclTkLibraryDir: $(Build.BinariesDirectory)\tcltk_lib_amd64 + BuildForRelease: true + SuppressMinGWLib: true + + - task: CopyFiles at 2 + displayName: 'Assemble artifact: msi (1/2)' + inputs: + sourceFolder: $(Build.BinariesDirectory)\win32\en-us + targetFolder: $(Build.ArtifactStagingDirectory)\msi\win32 + contents: | + *.msi + *.cab + *.exe + + - task: CopyFiles at 2 + displayName: 'Assemble artifact: msi (2/2)' + inputs: + sourceFolder: $(Build.BinariesDirectory)\amd64\en-us + targetFolder: $(Build.ArtifactStagingDirectory)\msi\amd64 + contents: | + *.msi + *.cab + *.exe + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish MSI' + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)\msi' + ArtifactName: msi diff --git a/.azure-pipelines/windows-release/stage-build.yml b/.azure-pipelines/windows-release/stage-build.yml new file mode 100644 index 000000000000..a5093a04f087 --- /dev/null +++ b/.azure-pipelines/windows-release/stage-build.yml @@ -0,0 +1,160 @@ +jobs: +- job: Build_Docs + displayName: Docs build + pool: + name: 'Windows Release' + #vmName: win2016-vs2017 + + workspace: + clean: all + + steps: + - template: ./checkout.yml + + - script: Doc\make.bat html + displayName: 'Build HTML docs' + env: + BUILDDIR: $(Build.BinariesDirectory)\Doc + + #- powershell: iwr "https://www.python.org/ftp/python/3.7.3/python373.chm" -OutFile "$(Build.BinariesDirectory)\python390a0.chm" + # displayName: 'Cheat at building CHM docs' + + - script: Doc\make.bat htmlhelp + displayName: 'Build CHM docs' + env: + BUILDDIR: $(Build.BinariesDirectory)\Doc + + - task: CopyFiles at 2 + displayName: 'Assemble artifact: Doc' + inputs: + sourceFolder: $(Build.BinariesDirectory)\Doc + targetFolder: $(Build.ArtifactStagingDirectory)\Doc + contents: | + html\**\* + htmlhelp\*.chm + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish artifact: doc' + inputs: + PathtoPublish: $(Build.ArtifactStagingDirectory)\Doc + ArtifactName: doc + +- job: Build_Python + displayName: Python build + + pool: + vmName: win2016-vs2017 + + workspace: + clean: all + + strategy: + matrix: + win32: + Name: win32 + Arch: win32 + Platform: x86 + Configuration: Release + win32_d: + Name: win32_d + Arch: win32 + Platform: x86 + Configuration: Debug + amd64_d: + Name: amd64_d + Arch: amd64 + Platform: x64 + Configuration: Debug + + steps: + - template: ./build-steps.yml + +- job: Build_Python_NonPGO + displayName: Python non-PGO build + condition: and(succeeded(), ne(variables['DoPGO'], 'true')) + + pool: + vmName: win2016-vs2017 + + workspace: + clean: all + + strategy: + matrix: + amd64: + Name: amd64 + Arch: amd64 + Platform: x64 + Configuration: Release + + steps: + - template: ./build-steps.yml + + +- job: Build_Python_PGO + displayName: Python PGO build + condition: and(succeeded(), eq(variables['DoPGO'], 'true')) + + # Allow up to five hours for PGO + timeoutInMinutes: 300 + + pool: + name: 'Windows Release' + + workspace: + clean: all + + strategy: + matrix: + amd64: + Name: amd64 + Arch: amd64 + Platform: x64 + Configuration: Release + + steps: + - template: ./build-steps.yml + parameters: + ShouldPGO: true + + +- job: TclTk_Lib + displayName: Publish Tcl/Tk Library + + pool: + vmName: win2016-vs2017 + + workspace: + clean: all + + steps: + - template: ./checkout.yml + + - script: PCbuild\get_externals.bat --no-openssl --no-libffi + displayName: 'Get external dependencies' + + - task: MSBuild at 1 + displayName: 'Copy Tcl/Tk lib for publish' + inputs: + solution: PCbuild\tcltk.props + platform: x86 + msbuildArguments: /t:CopyTclTkLib /p:OutDir="$(Build.ArtifactStagingDirectory)\tcl_win32" + + - task: MSBuild at 1 + displayName: 'Copy Tcl/Tk lib for publish' + inputs: + solution: PCbuild\tcltk.props + platform: x64 + msbuildArguments: /t:CopyTclTkLib /p:OutDir="$(Build.ArtifactStagingDirectory)\tcl_amd64" + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish artifact: tcltk_lib_win32' + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)\tcl_win32' + ArtifactName: tcltk_lib_win32 + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish artifact: tcltk_lib_amd64' + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)\tcl_amd64' + ArtifactName: tcltk_lib_amd64 diff --git a/.azure-pipelines/windows-release/stage-layout-embed.yml b/.azure-pipelines/windows-release/stage-layout-embed.yml new file mode 100644 index 000000000000..e2689dbb603d --- /dev/null +++ b/.azure-pipelines/windows-release/stage-layout-embed.yml @@ -0,0 +1,56 @@ +jobs: +- job: Make_Embed_Layout + displayName: Make embeddable layout + condition: and(succeeded(), eq(variables['DoEmbed'], 'true')) + + pool: + vmName: win2016-vs2017 + + workspace: + clean: all + + strategy: + matrix: + win32: + Name: win32 + Python: $(Build.BinariesDirectory)\bin_$(Name)\python.exe + PYTHONHOME: $(Build.SourcesDirectory) + amd64: + Name: amd64 + Python: $(Build.BinariesDirectory)\bin_$(Name)\python.exe + PYTHONHOME: $(Build.SourcesDirectory) + + steps: + - template: ./checkout.yml + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: bin_$(Name)' + inputs: + artifactName: bin_$(Name) + downloadPath: $(Build.BinariesDirectory) + + - template: ./layout-command.yml + + - powershell: | + $d = (.\PCbuild\build.bat -V) | %{ if($_ -match '\s+(\w+):\s*(.+)\s*$') { @{$Matches[1] = $Matches[2];} }}; + Write-Host "##vso[task.setvariable variable=VersionText]$($d.PythonVersion)" + displayName: 'Extract version numbers' + + - powershell: > + $(LayoutCmd) + --copy "$(Build.ArtifactStagingDirectory)\layout" + --zip "$(Build.ArtifactStagingDirectory)\embed\python-$(VersionText)-embed-$(Name).zip" + --preset-embed + displayName: 'Generate embeddable layout' + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish Artifact: layout_embed_$(Name)' + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)\layout' + ArtifactName: layout_embed_$(Name) + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish Artifact: embed' + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)\embed' + ArtifactName: embed diff --git a/.azure-pipelines/windows-release/stage-layout-full.yml b/.azure-pipelines/windows-release/stage-layout-full.yml new file mode 100644 index 000000000000..3593cf0a3f69 --- /dev/null +++ b/.azure-pipelines/windows-release/stage-layout-full.yml @@ -0,0 +1,62 @@ +jobs: +- job: Make_Layouts + displayName: Make layouts + condition: and(succeeded(), eq(variables['DoLayout'], 'true')) + + pool: + vmName: win2016-vs2017 + + workspace: + clean: all + + strategy: + matrix: + win32: + Name: win32 + Python: $(Build.BinariesDirectory)\bin_$(Name)\python.exe + PYTHONHOME: $(Build.SourcesDirectory) + amd64: + Name: amd64 + Python: $(Build.BinariesDirectory)\bin_$(Name)\python.exe + PYTHONHOME: $(Build.SourcesDirectory) + + steps: + - template: ./checkout.yml + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: bin_$(Name)' + inputs: + artifactName: bin_$(Name) + downloadPath: $(Build.BinariesDirectory) + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: bin_$(Name)_d' + inputs: + artifactName: bin_$(Name)_d + downloadPath: $(Build.BinariesDirectory) + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: doc' + inputs: + artifactName: doc + downloadPath: $(Build.BinariesDirectory) + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: tcltk_lib_$(Name)' + inputs: + artifactName: tcltk_lib_$(Name) + downloadPath: $(Build.BinariesDirectory) + + - template: ./layout-command.yml + + - powershell: | + $(LayoutCmd) --copy "$(Build.ArtifactStagingDirectory)\layout" --preset-default + displayName: 'Generate full layout' + env: + TCL_LIBRARY: $(Build.BinariesDirectory)\tcltk_lib_$(Name)\tcl8 + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish Artifact: layout_full_$(Name)' + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)\layout' + ArtifactName: layout_full_$(Name) diff --git a/.azure-pipelines/windows-release/stage-layout-msix.yml b/.azure-pipelines/windows-release/stage-layout-msix.yml new file mode 100644 index 000000000000..1a1e0a2fd685 --- /dev/null +++ b/.azure-pipelines/windows-release/stage-layout-msix.yml @@ -0,0 +1,86 @@ +jobs: +- job: Make_MSIX_Layout + displayName: Make MSIX layout + + pool: + vmName: win2016-vs2017 + + workspace: + clean: all + + strategy: + matrix: + #win32: + # Name: win32 + # Python: $(Build.BinariesDirectory)\bin_$(Name)\python.exe + # PYTHONHOME: $(Build.SourcesDirectory) + amd64: + Name: amd64 + Python: $(Build.BinariesDirectory)\bin_$(Name)\python.exe + PYTHONHOME: $(Build.SourcesDirectory) + + steps: + - template: ./checkout.yml + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: bin_$(Name)' + inputs: + artifactName: bin_$(Name) + downloadPath: $(Build.BinariesDirectory) + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: bin_$(Name)_d' + inputs: + artifactName: bin_$(Name)_d + downloadPath: $(Build.BinariesDirectory) + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: tcltk_lib_$(Name)' + inputs: + artifactName: tcltk_lib_$(Name) + downloadPath: $(Build.BinariesDirectory) + + - template: ./layout-command.yml + + - powershell: | + Remove-Item "$(Build.ArtifactStagingDirectory)\appx-store" -Recurse -Force -EA 0 + $(LayoutCmd) --copy "$(Build.ArtifactStagingDirectory)\appx-store" --preset-appx --precompile + displayName: 'Generate store APPX layout' + env: + TCL_LIBRARY: $(Build.BinariesDirectory)\tcltk_lib_$(Name)\tcl8 + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish Artifact: layout_appxstore_$(Name)' + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)\appx-store' + ArtifactName: layout_appxstore_$(Name) + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: cert' + condition: and(succeeded(), variables['SigningCertificate']) + inputs: + artifactName: cert + downloadPath: $(Build.BinariesDirectory) + + - powershell: | + $info = (gc "$(Build.BinariesDirectory)\cert\certinfo.json" | ConvertFrom-JSON) + Write-Host "Side-loadable APPX must be signed with '$($info.Subject)'" + Write-Host "##vso[task.setvariable variable=APPX_DATA_PUBLISHER]$($info.Subject)" + Write-Host "##vso[task.setvariable variable=APPX_DATA_SHA256]$($info.SHA256)" + displayName: 'Override signing parameters' + condition: and(succeeded(), variables['SigningCertificate']) + + - powershell: | + Remove-Item "$(Build.ArtifactStagingDirectory)\appx" -Recurse -Force -EA 0 + $(LayoutCmd) --copy "$(Build.ArtifactStagingDirectory)\appx" --preset-appx --precompile --include-symbols --include-tests + displayName: 'Generate sideloading APPX layout' + env: + TCL_LIBRARY: $(Build.BinariesDirectory)\tcltk_lib_$(Name)\tcl8 + APPX_DATA_PUBLISHER: $(APPX_DATA_PUBLISHER) + APPX_DATA_SHA256: $(APPX_DATA_SHA256) + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish Artifact: layout_appx_$(Name)' + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)\appx' + ArtifactName: layout_appx_$(Name) diff --git a/.azure-pipelines/windows-release/stage-layout-nuget.yml b/.azure-pipelines/windows-release/stage-layout-nuget.yml new file mode 100644 index 000000000000..ca4213d9e5c2 --- /dev/null +++ b/.azure-pipelines/windows-release/stage-layout-nuget.yml @@ -0,0 +1,44 @@ +jobs: +- job: Make_Nuget_Layout + displayName: Make Nuget layout + condition: and(succeeded(), eq(variables['DoNuget'], 'true')) + + pool: + vmName: win2016-vs2017 + + workspace: + clean: all + + strategy: + matrix: + win32: + Name: win32 + Python: $(Build.BinariesDirectory)\bin_$(Name)\python.exe + PYTHONHOME: $(Build.SourcesDirectory) + amd64: + Name: amd64 + Python: $(Build.BinariesDirectory)\bin_$(Name)\python.exe + PYTHONHOME: $(Build.SourcesDirectory) + + steps: + - template: ./checkout.yml + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: bin_$(Name)' + inputs: + artifactName: bin_$(Name) + downloadPath: $(Build.BinariesDirectory) + + - template: ./layout-command.yml + + - powershell: | + $(LayoutCmd) --copy "$(Build.ArtifactStagingDirectory)\nuget" --preset-nuget + displayName: 'Generate nuget layout' + env: + TCL_LIBRARY: $(Build.BinariesDirectory)\bin_$(Name)\tcl\tcl8 + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish Artifact: layout_nuget_$(Name)' + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)\nuget' + ArtifactName: layout_nuget_$(Name) diff --git a/.azure-pipelines/windows-release/stage-msi.yml b/.azure-pipelines/windows-release/stage-msi.yml new file mode 100644 index 000000000000..7afc816a0c6e --- /dev/null +++ b/.azure-pipelines/windows-release/stage-msi.yml @@ -0,0 +1,36 @@ +jobs: +- job: Make_MSI + displayName: Make MSI + condition: and(succeeded(), not(variables['SigningCertificate'])) + + pool: + vmName: win2016-vs2017 + + variables: + ReleaseUri: http://www.python.org/{arch} + DownloadUrl: https://www.python.org/ftp/python/{version}/{arch}{releasename}/{msi} + Py_OutDir: $(Build.BinariesDirectory) + + workspace: + clean: all + + steps: + - template: msi-steps.yml + +- job: Make_Signed_MSI + displayName: Make signed MSI + condition: and(succeeded(), variables['SigningCertificate']) + + pool: + name: 'Windows Release' + + variables: + ReleaseUri: http://www.python.org/{arch} + DownloadUrl: https://www.python.org/ftp/python/{version}/{arch}{releasename}/{msi} + Py_OutDir: $(Build.BinariesDirectory) + + workspace: + clean: all + + steps: + - template: msi-steps.yml diff --git a/.azure-pipelines/windows-release/stage-pack-msix.yml b/.azure-pipelines/windows-release/stage-pack-msix.yml new file mode 100644 index 000000000000..6f1846e581ef --- /dev/null +++ b/.azure-pipelines/windows-release/stage-pack-msix.yml @@ -0,0 +1,127 @@ +jobs: +- job: Pack_MSIX + displayName: Pack MSIX bundles + + pool: + vmName: win2016-vs2017 + + workspace: + clean: all + + strategy: + matrix: + amd64: + Name: amd64 + Artifact: appx + Suffix: + ShouldSign: true + amd64_store: + Name: amd64 + Artifact: appxstore + Suffix: -store + Upload: true + + steps: + - template: ./checkout.yml + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: layout_$(Artifact)_$(Name)' + inputs: + artifactName: layout_$(Artifact)_$(Name) + downloadPath: $(Build.BinariesDirectory) + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: symbols' + inputs: + artifactName: symbols + downloadPath: $(Build.BinariesDirectory) + + - powershell: | + $d = (.\PCbuild\build.bat -V) | %{ if($_ -match '\s+(\w+):\s*(.+)\s*$') { @{$Matches[1] = $Matches[2];} }}; + Write-Host "##vso[task.setvariable variable=VersionText]$($d.PythonVersion)" + Write-Host "##vso[task.setvariable variable=VersionNumber]$($d.PythonVersionNumber)" + Write-Host "##vso[task.setvariable variable=VersionHex]$($d.PythonVersionHex)" + Write-Host "##vso[task.setvariable variable=VersionUnique]$($d.PythonVersionUnique)" + Write-Host "##vso[task.setvariable variable=Filename]python-$($d.PythonVersion)-$(Name)$(Suffix)" + displayName: 'Extract version numbers' + + - powershell: | + ./Tools/msi/make_appx.ps1 -layout "$(Build.BinariesDirectory)\layout_$(Artifact)_$(Name)" -msix "$(Build.ArtifactStagingDirectory)\msix\$(Filename).msix" + displayName: 'Build msix' + + - powershell: | + 7z a -tzip "$(Build.ArtifactStagingDirectory)\msix\$(Filename).appxsym" *.pdb + displayName: 'Build appxsym' + workingDirectory: $(Build.BinariesDirectory)\symbols\$(Name) + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish Artifact: MSIX' + condition: and(succeeded(), or(ne(variables['ShouldSign'], 'true'), not(variables['SigningCertificate']))) + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)\msix' + ArtifactName: msix + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish Artifact: MSIX' + condition: and(succeeded(), and(eq(variables['ShouldSign'], 'true'), variables['SigningCertificate'])) + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)\msix' + ArtifactName: unsigned_msix + + - powershell: | + 7z a -tzip "$(Build.ArtifactStagingDirectory)\msixupload\$(Filename).msixupload" * + displayName: 'Build msixupload' + condition: and(succeeded(), eq(variables['Upload'], 'true')) + workingDirectory: $(Build.ArtifactStagingDirectory)\msix + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish Artifact: MSIXUpload' + condition: and(succeeded(), eq(variables['Upload'], 'true')) + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)\msixupload' + ArtifactName: msixupload + + +- job: Sign_MSIX + displayName: Sign side-loadable MSIX bundles + dependsOn: + - Pack_MSIX + condition: and(succeeded(), variables['SigningCertificate']) + + pool: + name: 'Windows Release' + + workspace: + clean: all + + steps: + - checkout: none + - template: ./find-sdk.yml + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download Artifact: unsigned_msix' + inputs: + artifactName: unsigned_msix + downloadPath: $(Build.BinariesDirectory) + + - powershell: | + $failed = $true + foreach ($retry in 1..3) { + signtool sign /a /n "$(SigningCertificate)" /fd sha256 /t http://timestamp.verisign.com/scripts/timestamp.dll /d "$(SigningDescription)" (gi *.msix) + if ($?) { + $failed = $false + break + } + sleep 1 + } + if ($failed) { + throw "Failed to sign MSIX" + } + displayName: 'Sign MSIX' + workingDirectory: $(Build.BinariesDirectory)\unsigned_msix + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish Artifact: MSIX' + inputs: + PathtoPublish: '$(Build.BinariesDirectory)\unsigned_msix' + ArtifactName: msix diff --git a/.azure-pipelines/windows-release/stage-pack-nuget.yml b/.azure-pipelines/windows-release/stage-pack-nuget.yml new file mode 100644 index 000000000000..5aa394fa48a1 --- /dev/null +++ b/.azure-pipelines/windows-release/stage-pack-nuget.yml @@ -0,0 +1,41 @@ +jobs: +- job: Pack_Nuget + displayName: Pack Nuget bundles + condition: and(succeeded(), eq(variables['DoNuget'], 'true')) + + pool: + vmName: win2016-vs2017 + + workspace: + clean: all + + strategy: + matrix: + amd64: + Name: amd64 + win32: + Name: win32 + + steps: + - checkout: none + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: layout_nuget_$(Name)' + inputs: + artifactName: layout_nuget_$(Name) + downloadPath: $(Build.BinariesDirectory) + + - task: NugetToolInstaller at 0 + displayName: 'Install Nuget' + inputs: + versionSpec: '>=5.0' + + - powershell: | + nuget pack "$(Build.BinariesDirectory)\layout_nuget_$(Name)\python.nuspec" -OutputDirectory $(Build.ArtifactStagingDirectory) -NoPackageAnalysis -NonInteractive + displayName: 'Create nuget package' + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish Artifact: nuget' + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)' + ArtifactName: nuget diff --git a/.azure-pipelines/windows-release/stage-publish-nugetorg.yml b/.azure-pipelines/windows-release/stage-publish-nugetorg.yml new file mode 100644 index 000000000000..7586d850f340 --- /dev/null +++ b/.azure-pipelines/windows-release/stage-publish-nugetorg.yml @@ -0,0 +1,28 @@ +jobs: +- job: Publish_Nuget + displayName: Publish Nuget packages + condition: and(succeeded(), eq(variables['DoNuget'], 'true')) + + pool: + vmName: win2016-vs2017 + + workspace: + clean: all + + steps: + - checkout: none + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: nuget' + inputs: + artifactName: nuget + downloadPath: $(Build.BinariesDirectory) + + - task: NuGetCommand at 2 + displayName: Push packages + condition: and(succeeded(), eq(variables['SigningCertificate'], 'Python Software Foundation')) + inputs: + command: push + packagesToPush: $(Build.BinariesDirectory)\nuget\*.nupkg' + nuGetFeedType: external + publishFeedCredentials: 'Python on Nuget' diff --git a/.azure-pipelines/windows-release/stage-publish-pythonorg.yml b/.azure-pipelines/windows-release/stage-publish-pythonorg.yml new file mode 100644 index 000000000000..2215a56d4bc2 --- /dev/null +++ b/.azure-pipelines/windows-release/stage-publish-pythonorg.yml @@ -0,0 +1,34 @@ +jobs: +- job: Publish_Python + displayName: Publish python.org packages + condition: and(succeeded(), and(eq(variables['DoMSI'], 'true'), eq(variables['DoEmbed'], 'true'))) + + pool: + vmName: win2016-vs2017 + + workspace: + clean: all + + steps: + - checkout: none + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: Doc' + inputs: + artifactName: Doc + downloadPath: $(Build.BinariesDirectory) + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: msi' + inputs: + artifactName: msi + downloadPath: $(Build.BinariesDirectory) + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: embed' + inputs: + artifactName: embed + downloadPath: $(Build.BinariesDirectory) + + # TODO: eq(variables['SigningCertificate'], 'Python Software Foundation') + # If we are not real-signed, DO NOT PUBLISH diff --git a/.azure-pipelines/windows-release/stage-publish-store.yml b/.azure-pipelines/windows-release/stage-publish-store.yml new file mode 100644 index 000000000000..06884c4f35b7 --- /dev/null +++ b/.azure-pipelines/windows-release/stage-publish-store.yml @@ -0,0 +1,22 @@ +jobs: +- job: Publish_Store + displayName: Publish Store packages + condition: and(succeeded(), eq(variables['DoMSIX'], 'true')) + + pool: + vmName: win2016-vs2017 + + workspace: + clean: all + + steps: + - checkout: none + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: msixupload' + inputs: + artifactName: msixupload + downloadPath: $(Build.BinariesDirectory) + + # TODO: eq(variables['SigningCertificate'], 'Python Software Foundation') + # If we are not real-signed, DO NOT PUBLISH diff --git a/.azure-pipelines/windows-release/stage-sign.yml b/.azure-pipelines/windows-release/stage-sign.yml new file mode 100644 index 000000000000..3d6ca9457f1c --- /dev/null +++ b/.azure-pipelines/windows-release/stage-sign.yml @@ -0,0 +1,113 @@ +jobs: +- job: Sign_Python + displayName: Sign Python binaries + condition: and(succeeded(), variables['SigningCertificate']) + + pool: + name: 'Windows Release' + + workspace: + clean: all + + strategy: + matrix: + win32: + Name: win32 + amd64: + Name: amd64 + + steps: + - checkout: none + - template: ./find-sdk.yml + + - powershell: | + Write-Host "##vso[build.addbuildtag]signed" + displayName: 'Add build tags' + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: unsigned_bin_$(Name)' + inputs: + artifactName: unsigned_bin_$(Name) + downloadPath: $(Build.BinariesDirectory) + + - powershell: | + $files = (gi *.exe, *.dll, *.pyd, *.cat -Exclude vcruntime*, libffi*, libcrypto*, libssl*) + signtool sign /a /n "$(SigningCertificate)" /fd sha256 /d "$(SigningDescription)" $files + displayName: 'Sign binaries' + workingDirectory: $(Build.BinariesDirectory)\unsigned_bin_$(Name) + + - powershell: | + $files = (gi *.exe, *.dll, *.pyd, *.cat -Exclude vcruntime*, libffi*, libcrypto*, libssl*) + $failed = $true + foreach ($retry in 1..10) { + signtool timestamp /t http://timestamp.verisign.com/scripts/timestamp.dll $files + if ($?) { + $failed = $false + break + } + sleep 5 + } + if ($failed) { + Write-Host "##vso[task.logissue type=error]Failed to timestamp files" + } + displayName: 'Timestamp binaries' + workingDirectory: $(Build.BinariesDirectory)\unsigned_bin_$(Name) + continueOnError: true + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish artifact: bin_$(Name)' + inputs: + PathtoPublish: '$(Build.BinariesDirectory)\unsigned_bin_$(Name)' + ArtifactName: bin_$(Name) + + +- job: Dump_CertInfo + displayName: Capture certificate info + condition: and(succeeded(), variables['SigningCertificate']) + + pool: + name: 'Windows Release' + + steps: + - checkout: none + + - powershell: | + $m = 'CN=$(SigningCertificate)' + $c = ((gci Cert:\CurrentUser\My), (gci Cert:\LocalMachine\My)) | %{ $_ } | ` + ?{ $_.Subject -match $m } | ` + select -First 1 + if (-not $c) { + Write-Host "Failed to find certificate for $(SigningCertificate)" + exit + } + $d = mkdir "$(Build.BinariesDirectory)\tmp" -Force + $cf = "$d\cert.cer" + [IO.File]::WriteAllBytes($cf, $c.Export("Cer")) + $csha = (certutil -dump $cf | sls "Cert Hash\(sha256\): (.+)").Matches.Groups[1].Value + + $info = @{ Subject=$c.Subject; SHA256=$csha; } + + $d = mkdir "$(Build.BinariesDirectory)\cert" -Force + $info | ConvertTo-JSON -Compress | Out-File -Encoding utf8 "$d\certinfo.json" + displayName: "Extract certificate info" + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish artifact: cert' + inputs: + PathtoPublish: '$(Build.BinariesDirectory)\cert' + ArtifactName: cert + + +- job: Mark_Unsigned + displayName: Tag unsigned build + condition: and(succeeded(), not(variables['SigningCertificate'])) + + pool: + vmName: win2016-vs2017 + + steps: + - checkout: none + + - powershell: | + Write-Host "##vso[build.addbuildtag]unsigned" + displayName: 'Add build tag' diff --git a/.azure-pipelines/windows-release/stage-test-embed.yml b/.azure-pipelines/windows-release/stage-test-embed.yml new file mode 100644 index 000000000000..b33176266a20 --- /dev/null +++ b/.azure-pipelines/windows-release/stage-test-embed.yml @@ -0,0 +1,41 @@ +jobs: +- job: Test_Embed + displayName: Test Embed + condition: and(succeeded(), eq(variables['DoEmbed'], 'true')) + + pool: + vmName: win2016-vs2017 + + workspace: + clean: all + + strategy: + matrix: + win32: + Name: win32 + amd64: + Name: amd64 + + steps: + - checkout: none + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: embed' + inputs: + artifactName: embed + downloadPath: $(Build.BinariesDirectory) + + - powershell: | + $p = gi "$(Build.BinariesDirectory)\embed\python*embed-$(Name).zip" + Expand-Archive -Path $p -DestinationPath "$(Build.BinariesDirectory)\Python" + $p = gi "$(Build.BinariesDirectory)\Python\python.exe" + Write-Host "##vso[task.prependpath]$(Split-Path -Parent $p)" + displayName: 'Install Python and add to PATH' + + - script: | + python -c "import sys; print(sys.version)" + displayName: 'Collect version number' + + - script: | + python -m site + displayName: 'Collect site' diff --git a/.azure-pipelines/windows-release/stage-test-msi.yml b/.azure-pipelines/windows-release/stage-test-msi.yml new file mode 100644 index 000000000000..10039295a184 --- /dev/null +++ b/.azure-pipelines/windows-release/stage-test-msi.yml @@ -0,0 +1,108 @@ +jobs: +- job: Test_MSI + displayName: Test MSI + + pool: + vmName: win2016-vs2017 + + workspace: + clean: all + + strategy: + matrix: + win32_User: + ExeMatch: 'python-[\dabrc.]+-webinstall\.exe' + Logs: $(Build.ArtifactStagingDirectory)\logs\win32_User + InstallAllUsers: 0 + win32_Machine: + ExeMatch: 'python-[\dabrc.]+-webinstall\.exe' + Logs: $(Build.ArtifactStagingDirectory)\logs\win32_Machine + InstallAllUsers: 1 + amd64_User: + ExeMatch: 'python-[\dabrc.]+-amd64-webinstall\.exe' + Logs: $(Build.ArtifactStagingDirectory)\logs\amd64_User + InstallAllUsers: 0 + amd64_Machine: + ExeMatch: 'python-[\dabrc.]+-amd64-webinstall\.exe' + Logs: $(Build.ArtifactStagingDirectory)\logs\amd64_Machine + InstallAllUsers: 1 + + steps: + - checkout: none + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: msi' + inputs: + artifactName: msi + downloadPath: $(Build.BinariesDirectory) + + - powershell: | + $p = (gci -r *.exe | ?{ $_.Name -match '$(ExeMatch)' } | select -First 1) + Write-Host "##vso[task.setvariable variable=SetupExe]$($p.FullName)" + Write-Host "##vso[task.setvariable variable=SetupExeName]$($p.Name)" + displayName: 'Find installer executable' + workingDirectory: $(Build.BinariesDirectory)\msi + + - script: > + "$(SetupExe)" + /passive + /log "$(Logs)\install\log.txt" + TargetDir="$(Build.BinariesDirectory)\Python" + Include_debug=1 + Include_symbols=1 + InstallAllUsers=$(InstallAllUsers) + displayName: 'Install Python' + + - powershell: | + $p = gi "$(Build.BinariesDirectory)\Python\python.exe" + Write-Host "##vso[task.prependpath]$(Split-Path -Parent $p)" + displayName: 'Add test Python to PATH' + + - script: | + python -c "import sys; print(sys.version)" + displayName: 'Collect version number' + + - script: | + python -m site + displayName: 'Collect site' + + - powershell: | + gci -r "${env:PROGRAMDATA}\Microsoft\Windows\Start Menu\Programs\Python*" + displayName: 'Capture per-machine Start Menu items' + - powershell: | + gci -r "${env:APPDATA}\Microsoft\Windows\Start Menu\Programs\Python*" + displayName: 'Capture per-user Start Menu items' + + - powershell: | + gci -r "HKLM:\Software\WOW6432Node\Python" + displayName: 'Capture per-machine 32-bit registry' + - powershell: | + gci -r "HKLM:\Software\Python" + displayName: 'Capture per-machine native registry' + - powershell: | + gci -r "HKCU:\Software\Python" + displayName: 'Capture current-user registry' + + - script: | + python -m pip install "azure<0.10" + python -m pip uninstall -y azure python-dateutil six + displayName: 'Test (un)install package' + + - script: | + python -m test -uall -v test_ttk_guionly test_tk test_idle + displayName: 'Test Tkinter and Idle' + + - script: > + "$(SetupExe)" + /passive + /uninstall + /log "$(Logs)\uninstall\log.txt" + displayName: 'Uninstall Python' + + - task: PublishBuildArtifacts at 1 + displayName: 'Publish Artifact: logs' + condition: true + continueOnError: true + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)\logs' + ArtifactName: msi_testlogs diff --git a/.azure-pipelines/windows-release/stage-test-nuget.yml b/.azure-pipelines/windows-release/stage-test-nuget.yml new file mode 100644 index 000000000000..1f8b601d0d02 --- /dev/null +++ b/.azure-pipelines/windows-release/stage-test-nuget.yml @@ -0,0 +1,58 @@ +jobs: +- job: Test_Nuget + displayName: Test Nuget + condition: and(succeeded(), eq(variables['DoNuget'], 'true')) + + pool: + vmName: win2016-vs2017 + + workspace: + clean: all + + strategy: + matrix: + win32: + Package: pythonx86 + amd64: + Package: python + + steps: + - checkout: none + + - task: DownloadBuildArtifacts at 0 + displayName: 'Download artifact: nuget' + inputs: + artifactName: nuget + downloadPath: $(Build.BinariesDirectory) + + - task: NugetToolInstaller at 0 + inputs: + versionSpec: '>= 5' + + - powershell: > + nuget install + $(Package) + -Source "$(Build.BinariesDirectory)\nuget" + -OutputDirectory "$(Build.BinariesDirectory)\install" + -Prerelease + -ExcludeVersion + -NonInteractive + displayName: 'Install Python' + + - powershell: | + $p = gi "$(Build.BinariesDirectory)\install\$(Package)\tools\python.exe" + Write-Host "##vso[task.prependpath]$(Split-Path -Parent $p)" + displayName: 'Add test Python to PATH' + + - script: | + python -c "import sys; print(sys.version)" + displayName: 'Collect version number' + + - script: | + python -m site + displayName: 'Collect site' + + - script: | + python -m pip install "azure<0.10" + python -m pip uninstall -y azure python-dateutil six + displayName: 'Test (un)install package' diff --git a/Doc/make.bat b/Doc/make.bat index e6604956ea91..dfc622f66615 100644 --- a/Doc/make.bat +++ b/Doc/make.bat @@ -117,13 +117,13 @@ if not exist "%BUILDDIR%" mkdir "%BUILDDIR%" rem PY_MISC_NEWS_DIR is also used by our Sphinx extension in tools/extensions/pyspecific.py if not defined PY_MISC_NEWS_DIR set PY_MISC_NEWS_DIR=%BUILDDIR%\%1 +if not exist "%PY_MISC_NEWS_DIR%" mkdir "%PY_MISC_NEWS_DIR%" if exist ..\Misc\NEWS ( echo.Copying Misc\NEWS to %PY_MISC_NEWS_DIR%\NEWS copy ..\Misc\NEWS "%PY_MISC_NEWS_DIR%\NEWS" > nul ) else if exist ..\Misc\NEWS.D ( if defined BLURB ( echo.Merging Misc/NEWS with %BLURB% - if not exist build mkdir build %BLURB% merge -f "%PY_MISC_NEWS_DIR%\NEWS" ) else ( echo.No Misc/NEWS file and Blurb is not available. diff --git a/Tools/msi/exe/crtlicense.txt b/PC/crtlicense.txt similarity index 100% rename from Tools/msi/exe/crtlicense.txt rename to PC/crtlicense.txt diff --git a/PC/layout/main.py b/PC/layout/main.py index 624033e721b7..c39aab208d35 100644 --- a/PC/layout/main.py +++ b/PC/layout/main.py @@ -31,6 +31,7 @@ from .support.options import * from .support.pip import * from .support.props import * +from .support.nuspec import * BDIST_WININST_FILES_ONLY = FileNameSet("wininst-*", "bdist_wininst.py") BDIST_WININST_STUB = "PC/layout/support/distutils.command.bdist_wininst.py" @@ -66,6 +67,7 @@ TOOLS_DIRS = FileNameSet("scripts", "i18n", "pynche", "demo", "parser") TOOLS_FILES = FileSuffixSet(".py", ".pyw", ".txt") + def copy_if_modified(src, dest): try: dest_stat = os.stat(dest) @@ -73,12 +75,15 @@ def copy_if_modified(src, dest): do_copy = True else: src_stat = os.stat(src) - do_copy = (src_stat.st_mtime != dest_stat.st_mtime or - src_stat.st_size != dest_stat.st_size) + do_copy = ( + src_stat.st_mtime != dest_stat.st_mtime + or src_stat.st_size != dest_stat.st_size + ) if do_copy: shutil.copy2(src, dest) + def get_lib_layout(ns): def _c(f): if f in EXCLUDE_FROM_LIB: @@ -119,7 +124,7 @@ def get_tcltk_lib(ns): except FileNotFoundError: pass if not tcl_lib or not os.path.isdir(tcl_lib): - warn("Failed to find TCL_LIBRARY") + log_warning("Failed to find TCL_LIBRARY") return for dest, src in rglob(Path(tcl_lib).parent, "**/*"): @@ -168,7 +173,7 @@ def in_build(f, dest="", new_name=None): for dest, src in rglob(ns.build, "vcruntime*.dll"): yield dest, src - yield "LICENSE.txt", ns.source / "LICENSE" + yield "LICENSE.txt", ns.build / "LICENSE.txt" for dest, src in rglob(ns.build, ("*.pyd", "*.dll")): if src.stem.endswith("_d") != bool(ns.debug) and src not in REQUIRED_DLLS: @@ -222,15 +227,12 @@ def _c(d): yield dest, src if ns.include_pip: - pip_dir = get_pip_dir(ns) - if not pip_dir.is_dir(): - log_warning("Failed to find {} - pip will not be included", pip_dir) - else: - pkg_root = "packages/{}" if ns.zip_lib else "Lib/site-packages/{}" - for dest, src in rglob(pip_dir, "**/*"): - if src in EXCLUDE_FROM_LIB or src in EXCLUDE_FROM_PACKAGED_LIB: - continue - yield pkg_root.format(dest), src + for dest, src in get_pip_layout(ns): + if isinstance(src, tuple) or not ( + src in EXCLUDE_FROM_LIB or src in EXCLUDE_FROM_PACKAGED_LIB + ): + continue + yield dest, src if ns.include_chm: for dest, src in rglob(ns.doc_build / "htmlhelp", PYTHON_CHM_NAME): @@ -244,6 +246,10 @@ def _c(d): for dest, src in get_props_layout(ns): yield dest, src + if ns.include_nuspec: + for dest, src in get_nuspec_layout(ns): + yield dest, src + for dest, src in get_appx_layout(ns): yield dest, src @@ -287,7 +293,9 @@ def _py_temp_compile(src, ns, dest_dir=None, checked=True): return None dest = (dest_dir or ns.temp) / (src.stem + ".py") - return _compile_one_py(src, dest.with_suffix(".pyc"), dest, optimize=2, checked=checked) + return _compile_one_py( + src, dest.with_suffix(".pyc"), dest, optimize=2, checked=checked + ) def _write_to_zip(zf, dest, src, ns, checked=True): @@ -361,28 +369,9 @@ def generate_source_files(ns): print("# Uncomment to run site.main() automatically", file=f) print("#import site", file=f) - if ns.include_appxmanifest: - log_info("Generating AppxManifest.xml in {}", ns.temp) - ns.temp.mkdir(parents=True, exist_ok=True) - - with open(ns.temp / "AppxManifest.xml", "wb") as f: - f.write(get_appxmanifest(ns)) - - with open(ns.temp / "_resources.xml", "wb") as f: - f.write(get_resources_xml(ns)) - if ns.include_pip: - pip_dir = get_pip_dir(ns) - if not (pip_dir / "pip").is_dir(): - log_info("Extracting pip to {}", pip_dir) - pip_dir.mkdir(parents=True, exist_ok=True) - extract_pip_files(ns) - - if ns.include_props: - log_info("Generating {} in {}", PYTHON_PROPS_NAME, ns.temp) - ns.temp.mkdir(parents=True, exist_ok=True) - with open(ns.temp / PYTHON_PROPS_NAME, "wb") as f: - f.write(get_props(ns)) + log_info("Extracting pip") + extract_pip_files(ns) def _create_zip_file(ns): @@ -427,6 +416,18 @@ def copy_files(files, ns): log_info("Processed {} files", count) log_debug("Processing {!s}", src) + if isinstance(src, tuple): + src, content = src + if ns.copy: + log_debug("Copy {} -> {}", src, ns.copy / dest) + (ns.copy / dest).parent.mkdir(parents=True, exist_ok=True) + with open(ns.copy / dest, "wb") as f: + f.write(content) + if ns.zip: + log_debug("Zip {} into {}", src, ns.zip) + zip_file.writestr(str(dest), content) + continue + if ( ns.precompile and src in PY_FILES diff --git a/PC/layout/support/appxmanifest.py b/PC/layout/support/appxmanifest.py index 49a35fa1f046..58fba8443f17 100644 --- a/PC/layout/support/appxmanifest.py +++ b/PC/layout/support/appxmanifest.py @@ -17,12 +17,7 @@ from .constants import * -__all__ = [] - - -def public(f): - __all__.append(f.__name__) - return f +__all__ = ["get_appx_layout"] APPX_DATA = dict( @@ -166,9 +161,7 @@ def public(f): "Help": { "Main Python Documentation": { "_condition": lambda ns: ns.include_chm, - "": "[{{AppVPackageRoot}}]\\Doc\\{}".format( - PYTHON_CHM_NAME - ), + "": "[{{AppVPackageRoot}}]\\Doc\\{}".format(PYTHON_CHM_NAME), }, "Local Python Documentation": { "_condition": lambda ns: ns.include_html_doc, @@ -239,31 +232,6 @@ def _fixup_sccd(ns, sccd, new_hash=None): return sccd - at public -def get_appx_layout(ns): - if not ns.include_appxmanifest: - return - - yield "AppxManifest.xml", ns.temp / "AppxManifest.xml" - yield "_resources.xml", ns.temp / "_resources.xml" - icons = ns.source / "PC" / "icons" - yield "_resources/pythonx44.png", icons / "pythonx44.png" - yield "_resources/pythonx44$targetsize-44_altform-unplated.png", icons / "pythonx44.png" - yield "_resources/pythonx50.png", icons / "pythonx50.png" - yield "_resources/pythonx50$targetsize-50_altform-unplated.png", icons / "pythonx50.png" - yield "_resources/pythonx150.png", icons / "pythonx150.png" - yield "_resources/pythonx150$targetsize-150_altform-unplated.png", icons / "pythonx150.png" - yield "_resources/pythonwx44.png", icons / "pythonwx44.png" - yield "_resources/pythonwx44$targetsize-44_altform-unplated.png", icons / "pythonwx44.png" - yield "_resources/pythonwx150.png", icons / "pythonwx150.png" - yield "_resources/pythonwx150$targetsize-150_altform-unplated.png", icons / "pythonwx150.png" - sccd = ns.source / SCCD_FILENAME - if sccd.is_file(): - # This should only be set for side-loading purposes. - sccd = _fixup_sccd(ns, sccd, os.getenv("APPX_DATA_SHA256")) - yield sccd.name, sccd - - def find_or_add(xml, element, attr=None, always_add=False): if always_add: e = None @@ -393,7 +361,6 @@ def disable_registry_virtualization(xml): e = find_or_add(e, "rescap:Capability", ("Name", "unvirtualizedResources")) - at public def get_appxmanifest(ns): for k, v in APPXMANIFEST_NS.items(): ET.register_namespace(k, v) @@ -481,6 +448,29 @@ def get_appxmanifest(ns): return buffer.getbuffer() - at public def get_resources_xml(ns): return RESOURCES_XML_TEMPLATE.encode("utf-8") + + +def get_appx_layout(ns): + if not ns.include_appxmanifest: + return + + yield "AppxManifest.xml", ("AppxManifest.xml", get_appxmanifest(ns)) + yield "_resources.xml", ("_resources.xml", get_resources_xml(ns)) + icons = ns.source / "PC" / "icons" + yield "_resources/pythonx44.png", icons / "pythonx44.png" + yield "_resources/pythonx44$targetsize-44_altform-unplated.png", icons / "pythonx44.png" + yield "_resources/pythonx50.png", icons / "pythonx50.png" + yield "_resources/pythonx50$targetsize-50_altform-unplated.png", icons / "pythonx50.png" + yield "_resources/pythonx150.png", icons / "pythonx150.png" + yield "_resources/pythonx150$targetsize-150_altform-unplated.png", icons / "pythonx150.png" + yield "_resources/pythonwx44.png", icons / "pythonwx44.png" + yield "_resources/pythonwx44$targetsize-44_altform-unplated.png", icons / "pythonwx44.png" + yield "_resources/pythonwx150.png", icons / "pythonwx150.png" + yield "_resources/pythonwx150$targetsize-150_altform-unplated.png", icons / "pythonwx150.png" + sccd = ns.source / SCCD_FILENAME + if sccd.is_file(): + # This should only be set for side-loading purposes. + sccd = _fixup_sccd(ns, sccd, os.getenv("APPX_DATA_SHA256")) + yield sccd.name, sccd diff --git a/PC/layout/support/nuspec.py b/PC/layout/support/nuspec.py new file mode 100644 index 000000000000..ba26ff337e91 --- /dev/null +++ b/PC/layout/support/nuspec.py @@ -0,0 +1,66 @@ +""" +Provides .props file. +""" + +import os + +from .constants import * + +__all__ = ["get_nuspec_layout"] + +PYTHON_NUSPEC_NAME = "python.nuspec" + +NUSPEC_DATA = { + "PYTHON_TAG": VER_DOT, + "PYTHON_VERSION": os.getenv("PYTHON_NUSPEC_VERSION"), + "PYTHON_BITNESS": "64-bit" if IS_X64 else "32-bit", + "PACKAGENAME": os.getenv("PYTHON_NUSPEC_PACKAGENAME"), + "PACKAGETITLE": os.getenv("PYTHON_NUSPEC_PACKAGETITLE"), + "FILELIST": r' ', +} + +if not NUSPEC_DATA["PYTHON_VERSION"]: + if VER_NAME: + NUSPEC_DATA["PYTHON_VERSION"] = "{}.{}-{}{}".format( + VER_DOT, VER_MICRO, VER_NAME, VER_SERIAL + ) + else: + NUSPEC_DATA["PYTHON_VERSION"] = "{}.{}".format(VER_DOT, VER_MICRO) + +if not NUSPEC_DATA["PACKAGETITLE"]: + NUSPEC_DATA["PACKAGETITLE"] = "Python" if IS_X64 else "Python (32-bit)" + +if not NUSPEC_DATA["PACKAGENAME"]: + NUSPEC_DATA["PACKAGENAME"] = "python" if IS_X64 else "pythonx86" + +FILELIST_WITH_PROPS = r""" + """ + +NUSPEC_TEMPLATE = r""" + + + {PACKAGENAME} + {PACKAGETITLE} + {PYTHON_VERSION} + Python Software Foundation + tools\LICENSE.txt + https://www.python.org/ + Installs {PYTHON_BITNESS} Python for use in build scenarios. + https://www.python.org/static/favicon.ico + python + + +{FILELIST} + + +""" + + +def get_nuspec_layout(ns): + if ns.include_all or ns.include_nuspec: + data = NUSPEC_DATA + if ns.include_all or ns.include_props: + data = dict(data) + data["FILELIST"] = FILELIST_WITH_PROPS + nuspec = NUSPEC_TEMPLATE.format_map(data) + yield "python.nuspec", ("python.nuspec", nuspec.encode("utf-8")) diff --git a/PC/layout/support/options.py b/PC/layout/support/options.py index 00f05667ebb7..c8ae4e30a8c4 100644 --- a/PC/layout/support/options.py +++ b/PC/layout/support/options.py @@ -30,6 +30,7 @@ def public(f): "launchers": {"help": "specific launchers"}, "appxmanifest": {"help": "an appxmanifest"}, "props": {"help": "a python.props file"}, + "nuspec": {"help": "a python.nuspec file"}, "chm": {"help": "the CHM documentation"}, "html-doc": {"help": "the HTML documentation"}, } @@ -60,13 +61,11 @@ def public(f): "stable", "distutils", "venv", - "props" + "props", + "nuspec", ], }, - "iot": { - "help": "Windows IoT Core", - "options": ["stable", "pip"], - }, + "iot": {"help": "Windows IoT Core", "options": ["stable", "pip"]}, "default": { "help": "development kit package", "options": [ diff --git a/PC/layout/support/pip.py b/PC/layout/support/pip.py index 369a923ce139..eada456655ec 100644 --- a/PC/layout/support/pip.py +++ b/PC/layout/support/pip.py @@ -11,15 +11,11 @@ import subprocess import sys -__all__ = [] +from .filesets import * +__all__ = ["extract_pip_files", "get_pip_layout"] -def public(f): - __all__.append(f.__name__) - return f - - at public def get_pip_dir(ns): if ns.copy: if ns.zip_lib: @@ -29,10 +25,23 @@ def get_pip_dir(ns): return ns.temp / "packages" - at public +def get_pip_layout(ns): + pip_dir = get_pip_dir(ns) + if not pip_dir.is_dir(): + log_warning("Failed to find {} - pip will not be included", pip_dir) + else: + pkg_root = "packages/{}" if ns.zip_lib else "Lib/site-packages/{}" + for dest, src in rglob(pip_dir, "**/*"): + yield pkg_root.format(dest), src + yield "pip.ini", ("pip.ini", b"[global]\nuser=yes") + + def extract_pip_files(ns): dest = get_pip_dir(ns) - dest.mkdir(parents=True, exist_ok=True) + try: + dest.mkdir(parents=True, exist_ok=False) + except IOError: + return src = ns.source / "Lib" / "ensurepip" / "_bundled" @@ -58,6 +67,7 @@ def extract_pip_files(ns): "--target", str(dest), "--no-index", + "--no-compile", "--no-cache-dir", "-f", str(src), diff --git a/PC/layout/support/props.py b/PC/layout/support/props.py index 3a047d215058..4d3b06195f6e 100644 --- a/PC/layout/support/props.py +++ b/PC/layout/support/props.py @@ -6,13 +6,7 @@ from .constants import * -__all__ = ["PYTHON_PROPS_NAME"] - - -def public(f): - __all__.append(f.__name__) - return f - +__all__ = ["get_props_layout"] PYTHON_PROPS_NAME = "python.props" @@ -97,14 +91,8 @@ def public(f): """ - at public def get_props_layout(ns): if ns.include_all or ns.include_props: - yield "python.props", ns.temp / "python.props" - - - at public -def get_props(ns): - # TODO: Filter contents of props file according to included/excluded items - props = PROPS_TEMPLATE.format_map(PROPS_DATA) - return props.encode("utf-8") + # TODO: Filter contents of props file according to included/excluded items + props = PROPS_TEMPLATE.format_map(PROPS_DATA) + yield "python.props", ("python.props", props.encode("utf-8")) diff --git a/PC/python_uwp.cpp b/PC/python_uwp.cpp index 5c8caa6666c4..dd1edde73092 100644 --- a/PC/python_uwp.cpp +++ b/PC/python_uwp.cpp @@ -182,9 +182,9 @@ wmain(int argc, wchar_t **argv) if (*p++ == L'\\') { if (wcsnicmp(p, L"pip", 3) == 0) { moduleName = L"pip"; + /* No longer required when pip 19.1 is added */ _wputenv_s(L"PIP_USER", L"true"); - } - else if (wcsnicmp(p, L"idle", 4) == 0) { + } else if (wcsnicmp(p, L"idle", 4) == 0) { moduleName = L"idlelib"; } } diff --git a/PCbuild/_tkinter.vcxproj b/PCbuild/_tkinter.vcxproj index fdfa59648aa9..af813b77c1d1 100644 --- a/PCbuild/_tkinter.vcxproj +++ b/PCbuild/_tkinter.vcxproj @@ -122,7 +122,7 @@ - + diff --git a/PCbuild/build.bat b/PCbuild/build.bat index 6f0c85e4a45a..bce599329e73 100644 --- a/PCbuild/build.bat +++ b/PCbuild/build.bat @@ -76,7 +76,7 @@ if "%~1"=="-k" (set kill=true) & shift & goto CheckOpts if "%~1"=="--pgo" (set do_pgo=true) & shift & goto CheckOpts if "%~1"=="--pgo-job" (set do_pgo=true) & (set pgo_job=%~2) & shift & shift & goto CheckOpts if "%~1"=="--test-marker" (set UseTestMarker=true) & shift & goto CheckOpts -if "%~1"=="-V" shift & goto Version +if "%~1"=="-V" shift & goto :Version rem These use the actual property names used by MSBuild. We could just let rem them in through the environment, but we specify them on the command line rem anyway for visibility so set defaults after this @@ -111,10 +111,16 @@ call "%dir%find_msbuild.bat" %MSBUILD% if ERRORLEVEL 1 (echo Cannot locate MSBuild.exe on PATH or as MSBUILD variable & exit /b 2) if "%kill%"=="true" call :Kill +if ERRORLEVEL 1 exit /B 3 if "%do_pgo%"=="true" ( set conf=PGInstrument call :Build %1 %2 %3 %4 %5 %6 %7 %8 %9 +) +rem %VARS% are evaluated eagerly, which would lose the ERRORLEVEL +rem value if we didn't split it out here. +if "%do_pgo%"=="true" if ERRORLEVEL 1 exit /B %ERRORLEVEL% +if "%do_pgo%"=="true" ( del /s "%dir%\*.pgc" del /s "%dir%\..\Lib\*.pyc" echo on @@ -124,7 +130,8 @@ if "%do_pgo%"=="true" ( set conf=PGUpdate set target=Build ) -goto Build +goto :Build + :Kill echo on %MSBUILD% "%dir%\pythoncore.vcxproj" /t:KillPython %verbose%^ @@ -132,7 +139,7 @@ echo on /p:KillPython=true @echo off -goto :eof +exit /B %ERRORLEVEL% :Build rem Call on MSBuild to do the work, echo the command. @@ -148,9 +155,11 @@ echo on %1 %2 %3 %4 %5 %6 %7 %8 %9 @echo off -goto :eof +exit /b %ERRORLEVEL% :Version rem Display the current build version information call "%dir%find_msbuild.bat" %MSBUILD% -if not ERRORLEVEL 1 %MSBUILD% "%dir%pythoncore.vcxproj" /t:ShowVersionInfo /v:m /nologo %1 %2 %3 %4 %5 %6 %7 %8 %9 +if ERRORLEVEL 1 (echo Cannot locate MSBuild.exe on PATH or as MSBUILD variable & exit /b 2) +%MSBUILD% "%dir%pythoncore.vcxproj" /t:ShowVersionInfo /v:m /nologo %1 %2 %3 %4 %5 %6 %7 %8 %9 +if ERRORLEVEL 1 exit /b 3 \ No newline at end of file diff --git a/PCbuild/pyproject.props b/PCbuild/pyproject.props index 12f07dd51287..7c0f50be9ea8 100644 --- a/PCbuild/pyproject.props +++ b/PCbuild/pyproject.props @@ -1,6 +1,8 @@ -? - + + + + <__PyProject_Props_Imported>true <_ProjectFileVersion>10.0.30319.1 10.0 $(BuildPath) @@ -29,7 +31,7 @@ $(PySourcePath)Include;$(PySourcePath)Include\internal;$(PySourcePath)PC;$(IntDir);%(AdditionalIncludeDirectories) WIN32;$(_PlatformPreprocessorDefinition)$(_DebugPreprocessorDefinition)$(_PydPreprocessorDefinition)%(PreprocessorDefinitions) - + MaxSpeed true true @@ -147,15 +149,15 @@ public override bool Execute() { - + - + @@ -189,8 +191,8 @@ public override bool Execute() { $(registry:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows Kits\Installed Roots at KitsRoot81)\bin\x86 $(registry:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows Kits\Installed Roots at KitsRoot)\bin\x86 $(registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1A at InstallationFolder)\Bin\ - <_SignCommand Condition="Exists($(SdkBinPath)) and '$(SigningCertificate)' != '' and $(SupportSigning)">"$(SdkBinPath)\signtool.exe" sign /q /a /n "$(SigningCertificate)" /fd sha256 /t http://timestamp.verisign.com/scripts/timestamp.dll /d "Python $(PythonVersion)" - <_SignCommand Condition="Exists($(SdkBinPath)) and '$(SigningCertificateSha1)' != '' and $(SupportSigning)">"$(SdkBinPath)\signtool.exe" sign /q /a /sha1 "$(SigningCertificateSha1)" /fd sha256 /t http://timestamp.verisign.com/scripts/timestamp.dll /d "Python $(PythonVersion)" + <_SignCommand Condition="Exists($(SdkBinPath)) and '$(SigningCertificate)' != '' and $(SupportSigning)">"$(SdkBinPath)\signtool.exe" sign /a /n "$(SigningCertificate)" /fd sha256 /t http://timestamp.verisign.com/scripts/timestamp.dll /d "Python $(PythonVersion)" + <_SignCommand Condition="Exists($(SdkBinPath)) and '$(SigningCertificateSha1)' != '' and $(SupportSigning)">"$(SdkBinPath)\signtool.exe" sign /a /sha1 "$(SigningCertificateSha1)" /fd sha256 /t http://timestamp.verisign.com/scripts/timestamp.dll /d "Python $(PythonVersion)" <_MakeCatCommand Condition="Exists($(SdkBinPath))">"$(SdkBinPath)\makecat.exe" diff --git a/PCbuild/python.props b/PCbuild/python.props index e6642fc4818a..b13837d394b1 100644 --- a/PCbuild/python.props +++ b/PCbuild/python.props @@ -1,6 +1,7 @@ - + + <__Python_Props_Imported>true Win32 Release + + + <_TclTkLib Include="$(tcltkdir)\lib\**\*" /> + + + diff --git a/Tools/msi/buildrelease.bat b/Tools/msi/buildrelease.bat index 45e189b537f6..b72eedecb23c 100644 --- a/Tools/msi/buildrelease.bat +++ b/Tools/msi/buildrelease.bat @@ -29,7 +29,7 @@ set DOWNLOAD_URL=https://www.python.org/ftp/python/{version}/{arch}{releasename} set D=%~dp0 set PCBUILD=%D%..\..\PCbuild\ -if "%Py_OutDir%"=="" set Py_OutDir=%PCBUILD% +if NOT DEFINED Py_OutDir set Py_OutDir=%PCBUILD% set EXTERNALS=%D%..\..\externals\windows-installer\ set BUILDX86= diff --git a/Tools/msi/dev/dev.wixproj b/Tools/msi/dev/dev.wixproj index 4a56cec35722..c6e3bcf709c6 100644 --- a/Tools/msi/dev/dev.wixproj +++ b/Tools/msi/dev/dev.wixproj @@ -8,7 +8,7 @@ - + $(DefineConstants); IncludeMinGWLib=1; @@ -35,7 +35,7 @@ Inputs="$(BuildPath)$(PyDllName).dll" Outputs="$(BuildPath)lib$(PyDllName).a" AfterTargets="PrepareForBuild" - Condition="$(BuildForRelease)"> + Condition="$(BuildForRelease) and $(SuppressMinGWLib) == ''"> <_DllToolOpts>-m i386 --as-flags=--32 diff --git a/Tools/msi/exe/exe.wixproj b/Tools/msi/exe/exe.wixproj index 071501ce6e6f..326766bf2d47 100644 --- a/Tools/msi/exe/exe.wixproj +++ b/Tools/msi/exe/exe.wixproj @@ -21,25 +21,6 @@ - - - - <_LicenseFiles Include="@(LicenseFiles)"> - $([System.IO.File]::ReadAllText(%(FullPath))) - - - - - - diff --git a/Tools/msi/exe/exe_files.wxs b/Tools/msi/exe/exe_files.wxs index 394b4de47354..483d06c65b2e 100644 --- a/Tools/msi/exe/exe_files.wxs +++ b/Tools/msi/exe/exe_files.wxs @@ -3,7 +3,7 @@ - + diff --git a/Tools/msi/make_cat.ps1 b/Tools/msi/make_cat.ps1 index cc3cd4a2b50c..9ea3ddd49571 100644 --- a/Tools/msi/make_cat.ps1 +++ b/Tools/msi/make_cat.ps1 @@ -7,6 +7,8 @@ The path to the catalog definition file to compile and sign. It is assumed that the .cat file will be the same name with a new extension. +.Parameter outfile + The path to move the built .cat file to (optional). .Parameter description The description to add to the signature (optional). .Parameter certname @@ -16,6 +18,7 @@ #> param( [Parameter(Mandatory=$true)][string]$catalog, + [string]$outfile, [switch]$sign, [string]$description, [string]$certname, @@ -35,3 +38,8 @@ if (-not $?) { if ($sign) { Sign-File -certname $certname -certsha1 $certsha1 -certfile $certfile -description $description -files @($catalog -replace 'cdf$', 'cat') } + +if ($outfile) { + Split-Path -Parent $outfile | ?{ $_ } | %{ mkdir -Force $_; } + Move-Item ($catalog -replace 'cdf$', 'cat') $outfile +} diff --git a/Tools/msi/msi.props b/Tools/msi/msi.props index 5da901c0215a..3f14501446a1 100644 --- a/Tools/msi/msi.props +++ b/Tools/msi/msi.props @@ -56,6 +56,7 @@ true $(ExternalsDir)\windows-installer\redist-1\$(Platform) $([System.IO.Path]::GetFullPath($(CRTRedist))) + $(tcltkDir)lib python$(MajorVersionNumber)$(MinorVersionNumber)$(MicroVersionNumber)$(ReleaseLevelName).chm $(MajorVersionNumber).$(MinorVersionNumber).$(Field3Value).0 @@ -121,7 +122,7 @@ src - + tcltk diff --git a/Tools/msi/msi.targets b/Tools/msi/msi.targets index 9283a1ed6c30..4788a637a5d2 100644 --- a/Tools/msi/msi.targets +++ b/Tools/msi/msi.targets @@ -47,7 +47,7 @@ EncodingType= - @@ -76,18 +76,18 @@ EncodingType= - + - + - + - + \ No newline at end of file diff --git a/Tools/msi/sign_build.ps1 b/Tools/msi/sign_build.ps1 index 6668eb33a2d1..d3f750454f52 100644 --- a/Tools/msi/sign_build.ps1 +++ b/Tools/msi/sign_build.ps1 @@ -16,7 +16,7 @@ #> param( [Parameter(Mandatory=$true)][string]$root, - [string[]]$patterns=@("*.exe", "*.dll", "*.pyd"), + [string[]]$patterns=@("*.exe", "*.dll", "*.pyd", "*.cat"), [string]$description, [string]$certname, [string]$certsha1, diff --git a/Tools/msi/tcltk/tcltk.wixproj b/Tools/msi/tcltk/tcltk.wixproj index fae353f5f50a..218f3d15ec88 100644 --- a/Tools/msi/tcltk/tcltk.wixproj +++ b/Tools/msi/tcltk/tcltk.wixproj @@ -20,10 +20,10 @@ - - $(tcltkDir) + + $(TclTkLibraryDir) !(bindpath.tcltk) - $(tcltkDir)lib + $(TclTkLibraryDir) tcl\ tcltk_lib diff --git a/Tools/msi/uploadrelease.ps1 b/Tools/msi/uploadrelease.ps1 index 491df80be1e9..b6fbeea29810 100644 --- a/Tools/msi/uploadrelease.ps1 +++ b/Tools/msi/uploadrelease.ps1 @@ -15,6 +15,10 @@ The subdirectory on the host to copy files to. .Parameter tests The path to run download tests in. +.Parameter doc_htmlhelp + Optional path besides -build to locate CHM files. +.Parameter embed + Optional path besides -build to locate ZIP files. .Parameter skipupload Skip uploading .Parameter skippurge @@ -30,6 +34,8 @@ param( [string]$server="python-downloads", [string]$target="/srv/www.python.org/ftp/python", [string]$tests=${env:TEMP}, + [string]$doc_htmlhelp=$null, + [string]$embed=$null, [switch]$skipupload, [switch]$skippurge, [switch]$skiptest, @@ -73,32 +79,45 @@ if (-not $skipupload) { "Upload using $pscp and $plink" "" - pushd $build - $doc = gci python*.chm, python*.chm.asc + if ($doc_htmlhelp) { + pushd $doc_htmlhelp + } else { + pushd $build + } + $chm = gci python*.chm, python*.chm.asc popd $d = "$target/$($p[0])/" & $plink -batch $user@$server mkdir $d & $plink -batch $user@$server chgrp downloads $d & $plink -batch $user@$server chmod g-x,o+rx $d - & $pscp -batch $doc.FullName "$user@${server}:$d" + & $pscp -batch $chm.FullName "$user@${server}:$d" - foreach ($a in gci "$build" -Directory) { + $dirs = gci "$build" -Directory + if ($embed) { + $dirs = ($dirs, (gi $embed)) | %{ $_ } + } + + foreach ($a in $dirs) { "Uploading files from $($a.FullName)" pushd "$($a.FullName)" $exe = gci *.exe, *.exe.asc, *.zip, *.zip.asc $msi = gci *.msi, *.msi.asc, *.msu, *.msu.asc popd - & $pscp -batch $exe.FullName "$user@${server}:$d" + if ($exe) { + & $pscp -batch $exe.FullName "$user@${server}:$d" + } - $sd = "$d$($a.Name)$($p[1])/" - & $plink -batch $user@$server mkdir $sd - & $plink -batch $user@$server chgrp downloads $sd - & $plink -batch $user@$server chmod g-x,o+rx $sd - & $pscp -batch $msi.FullName "$user@${server}:$sd" - & $plink -batch $user@$server chgrp downloads $sd* - & $plink -batch $user@$server chmod g-x,o+r $sd* + if ($msi) { + $sd = "$d$($a.Name)$($p[1])/" + & $plink -batch $user@$server mkdir $sd + & $plink -batch $user@$server chgrp downloads $sd + & $plink -batch $user@$server chmod g-x,o+rx $sd + & $pscp -batch $msi.FullName "$user@${server}:$sd" + & $plink -batch $user@$server chgrp downloads $sd* + & $plink -batch $user@$server chmod g-x,o+r $sd* + } } & $plink -batch $user@$server chgrp downloads $d* @@ -128,7 +147,18 @@ if (-not $skiptest) { if (-not $skiphash) { # Display MD5 hash and size of each downloadable file pushd $build - $hashes = gci python*.chm, *\*.exe, *\*.zip | ` + $files = gci python*.chm, *\*.exe, *\*.zip + if ($doc_htmlhelp) { + cd $doc_htmlhelp + $files = ($files, (gci python*.chm)) | %{ $_ } + } + if ($embed) { + cd $embed + $files = ($files, (gci *.zip)) | %{ $_ } + } + popd + + $hashes = $files | ` Sort-Object Name | ` Format-Table Name, @{Label="MD5"; Expression={(Get-FileHash $_ -Algorithm MD5).Hash}}, Length -AutoSize | ` Out-String -Width 4096 From webhook-mailer at python.org Fri Jun 14 21:24:45 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Sat, 15 Jun 2019 01:24:45 -0000 Subject: [Python-checkins] bpo-36707: Document "m" removal from sys.abiflags (GH-14090) Message-ID: https://github.com/python/cpython/commit/7efc526e5cfb929a79c192ac2dcf7eb78d3a4401 commit: 7efc526e5cfb929a79c192ac2dcf7eb78d3a4401 branch: master author: Victor Stinner committer: GitHub date: 2019-06-15T03:24:41+02:00 summary: bpo-36707: Document "m" removal from sys.abiflags (GH-14090) files: M Doc/library/sys.rst M Doc/whatsnew/3.8.rst diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index 817c3f1e56f9..c073431c8948 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -16,6 +16,10 @@ always available. On POSIX systems where Python was built with the standard ``configure`` script, this contains the ABI flags as specified by :pep:`3149`. + .. versionchanged:: 3.8 + Default flags became an empty string (``m`` flag for pymalloc has been + removed). + .. versionadded:: 3.2 diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index b63bcef5de47..cc3fb76e9c55 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -955,6 +955,22 @@ Optimizations Build and C API Changes ======================= +* Default :data:`sys.abiflags` became an empty string: the ``m`` flag for + pymalloc became useless (builds with and without pymalloc are ABI compatible) + and so has been removed. (Contributed by Victor Stinner in :issue:`36707`.) + + Example of changes: + + * Only ``python3.8`` program is installed, ``python3.8m`` program is gone. + * Only ``python3.8-config`` script is installed, ``python3.8m-config`` script + is gone. + * The ``m`` flag has been removed from the suffix of dynamic library + filenames: extension modules in the standard library as well as those + produced and installed by third-party packages, like those downloaded from + PyPI. On Linux, for example, the Python 3.7 suffix + ``.cpython-37m-x86_64-linux-gnu.so`` became + ``.cpython-38-x86_64-linux-gnu.so`` in Python 3.8. + * The header files have been reorganized to better separate the different kinds of APIs: From webhook-mailer at python.org Fri Jun 14 21:31:48 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 15 Jun 2019 01:31:48 -0000 Subject: [Python-checkins] bpo-36707: Document "m" removal from sys.abiflags (GH-14090) Message-ID: https://github.com/python/cpython/commit/3fde750cc4e4057076650a92946ec1d492464799 commit: 3fde750cc4e4057076650a92946ec1d492464799 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-14T18:31:44-07:00 summary: bpo-36707: Document "m" removal from sys.abiflags (GH-14090) (cherry picked from commit 7efc526e5cfb929a79c192ac2dcf7eb78d3a4401) Co-authored-by: Victor Stinner files: M Doc/library/sys.rst M Doc/whatsnew/3.8.rst diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index 817c3f1e56f9..c073431c8948 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -16,6 +16,10 @@ always available. On POSIX systems where Python was built with the standard ``configure`` script, this contains the ABI flags as specified by :pep:`3149`. + .. versionchanged:: 3.8 + Default flags became an empty string (``m`` flag for pymalloc has been + removed). + .. versionadded:: 3.2 diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 05d2ecc698b4..21ad11254730 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -936,6 +936,22 @@ Optimizations Build and C API Changes ======================= +* Default :data:`sys.abiflags` became an empty string: the ``m`` flag for + pymalloc became useless (builds with and without pymalloc are ABI compatible) + and so has been removed. (Contributed by Victor Stinner in :issue:`36707`.) + + Example of changes: + + * Only ``python3.8`` program is installed, ``python3.8m`` program is gone. + * Only ``python3.8-config`` script is installed, ``python3.8m-config`` script + is gone. + * The ``m`` flag has been removed from the suffix of dynamic library + filenames: extension modules in the standard library as well as those + produced and installed by third-party packages, like those downloaded from + PyPI. On Linux, for example, the Python 3.7 suffix + ``.cpython-37m-x86_64-linux-gnu.so`` became + ``.cpython-38-x86_64-linux-gnu.so`` in Python 3.8. + * The header files have been reorganized to better separate the different kinds of APIs: From webhook-mailer at python.org Sat Jun 15 07:05:25 2019 From: webhook-mailer at python.org (Andrew Svetlov) Date: Sat, 15 Jun 2019 11:05:25 -0000 Subject: [Python-checkins] bpo-37279: Fix asyncio sendfile support when extra data are sent in fallback mode. (GH-14075) Message-ID: https://github.com/python/cpython/commit/ef2152354f03a165c5e3adb53e2276934fabd50a commit: ef2152354f03a165c5e3adb53e2276934fabd50a branch: master author: Andrew Svetlov committer: GitHub date: 2019-06-15T14:05:08+03:00 summary: bpo-37279: Fix asyncio sendfile support when extra data are sent in fallback mode. (GH-14075) files: A Misc/NEWS.d/next/Library/2019-06-14-13-25-56.bpo-37279.OHlW6l.rst M Lib/asyncio/base_events.py M Lib/test/test_asyncio/test_sendfile.py diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index e0025397fa8a..90de8587a3bb 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -861,7 +861,7 @@ def _getaddrinfo_debug(self, host, port, family, type, proto, flags): read = await self.run_in_executor(None, file.readinto, view) if not read: break # EOF - await self.sock_sendall(sock, view) + await self.sock_sendall(sock, view[:read]) total_sent += read return total_sent finally: @@ -1145,7 +1145,7 @@ def _check_sendfile_params(self, sock, file, offset, count): if not read: return total_sent # EOF await proto.drain() - transp.write(view) + transp.write(view[:read]) total_sent += read finally: if total_sent > 0 and hasattr(file, 'seek'): diff --git a/Lib/test/test_asyncio/test_sendfile.py b/Lib/test/test_asyncio/test_sendfile.py index f148fe27e6ad..3b7f784c5ee3 100644 --- a/Lib/test/test_asyncio/test_sendfile.py +++ b/Lib/test/test_asyncio/test_sendfile.py @@ -86,7 +86,8 @@ def connection_lost(self, exc): class SendfileBase: - DATA = b"SendfileBaseData" * (1024 * 8) # 128 KiB + # 128 KiB plus small unaligned to buffer chunk + DATA = b"SendfileBaseData" * (1024 * 8 + 1) # Reduce socket buffer size to test on relative small data sets. BUF_SIZE = 4 * 1024 # 4 KiB diff --git a/Misc/NEWS.d/next/Library/2019-06-14-13-25-56.bpo-37279.OHlW6l.rst b/Misc/NEWS.d/next/Library/2019-06-14-13-25-56.bpo-37279.OHlW6l.rst new file mode 100644 index 000000000000..d740b9b62b08 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-14-13-25-56.bpo-37279.OHlW6l.rst @@ -0,0 +1,2 @@ +Fix asyncio sendfile support when sendfile sends extra data in fallback +mode. From webhook-mailer at python.org Sat Jun 15 07:05:39 2019 From: webhook-mailer at python.org (Andrew Svetlov) Date: Sat, 15 Jun 2019 11:05:39 -0000 Subject: [Python-checkins] Use threadpool for reading from file in sendfile fallback mode (#14076) Message-ID: https://github.com/python/cpython/commit/0237265e8287141c40faa8719da3a2d21d511d0d commit: 0237265e8287141c40faa8719da3a2d21d511d0d branch: master author: Andrew Svetlov committer: GitHub date: 2019-06-15T14:05:35+03:00 summary: Use threadpool for reading from file in sendfile fallback mode (#14076) files: A Misc/NEWS.d/next/Library/2019-06-14-13-30-47.bpo-37280.Fxur0F.rst M Lib/asyncio/base_events.py diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index 90de8587a3bb..14b80bdda9c0 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -1141,7 +1141,7 @@ def _check_sendfile_params(self, sock, file, offset, count): if blocksize <= 0: return total_sent view = memoryview(buf)[:blocksize] - read = file.readinto(view) + read = await self.run_in_executor(None, file.readinto, view) if not read: return total_sent # EOF await proto.drain() diff --git a/Misc/NEWS.d/next/Library/2019-06-14-13-30-47.bpo-37280.Fxur0F.rst b/Misc/NEWS.d/next/Library/2019-06-14-13-30-47.bpo-37280.Fxur0F.rst new file mode 100644 index 000000000000..7cdc56a72ce4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-14-13-30-47.bpo-37280.Fxur0F.rst @@ -0,0 +1 @@ +Use threadpool for reading from file for sendfile fallback mode. From webhook-mailer at python.org Sat Jun 15 07:24:20 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 15 Jun 2019 11:24:20 -0000 Subject: [Python-checkins] bpo-37279: Fix asyncio sendfile support when extra data are sent in fallback mode. (GH-14075) Message-ID: https://github.com/python/cpython/commit/bb07321c6a7e1cbe597c3fc5fa275a85d0f50acb commit: bb07321c6a7e1cbe597c3fc5fa275a85d0f50acb branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-15T04:24:16-07:00 summary: bpo-37279: Fix asyncio sendfile support when extra data are sent in fallback mode. (GH-14075) (cherry picked from commit ef2152354f03a165c5e3adb53e2276934fabd50a) Co-authored-by: Andrew Svetlov files: A Misc/NEWS.d/next/Library/2019-06-14-13-25-56.bpo-37279.OHlW6l.rst M Lib/asyncio/base_events.py M Lib/test/test_asyncio/test_sendfile.py diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index e0025397fa8a..90de8587a3bb 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -861,7 +861,7 @@ def _getaddrinfo_debug(self, host, port, family, type, proto, flags): read = await self.run_in_executor(None, file.readinto, view) if not read: break # EOF - await self.sock_sendall(sock, view) + await self.sock_sendall(sock, view[:read]) total_sent += read return total_sent finally: @@ -1145,7 +1145,7 @@ def _check_sendfile_params(self, sock, file, offset, count): if not read: return total_sent # EOF await proto.drain() - transp.write(view) + transp.write(view[:read]) total_sent += read finally: if total_sent > 0 and hasattr(file, 'seek'): diff --git a/Lib/test/test_asyncio/test_sendfile.py b/Lib/test/test_asyncio/test_sendfile.py index f148fe27e6ad..3b7f784c5ee3 100644 --- a/Lib/test/test_asyncio/test_sendfile.py +++ b/Lib/test/test_asyncio/test_sendfile.py @@ -86,7 +86,8 @@ def connection_lost(self, exc): class SendfileBase: - DATA = b"SendfileBaseData" * (1024 * 8) # 128 KiB + # 128 KiB plus small unaligned to buffer chunk + DATA = b"SendfileBaseData" * (1024 * 8 + 1) # Reduce socket buffer size to test on relative small data sets. BUF_SIZE = 4 * 1024 # 4 KiB diff --git a/Misc/NEWS.d/next/Library/2019-06-14-13-25-56.bpo-37279.OHlW6l.rst b/Misc/NEWS.d/next/Library/2019-06-14-13-25-56.bpo-37279.OHlW6l.rst new file mode 100644 index 000000000000..d740b9b62b08 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-14-13-25-56.bpo-37279.OHlW6l.rst @@ -0,0 +1,2 @@ +Fix asyncio sendfile support when sendfile sends extra data in fallback +mode. From webhook-mailer at python.org Sat Jun 15 07:27:14 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 15 Jun 2019 11:27:14 -0000 Subject: [Python-checkins] Use threadpool for reading from file in sendfile fallback mode (GH-14076) Message-ID: https://github.com/python/cpython/commit/5e97450d83d4f4240315f46419686ec193273e13 commit: 5e97450d83d4f4240315f46419686ec193273e13 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-15T04:27:10-07:00 summary: Use threadpool for reading from file in sendfile fallback mode (GH-14076) (cherry picked from commit 0237265e8287141c40faa8719da3a2d21d511d0d) Co-authored-by: Andrew Svetlov files: A Misc/NEWS.d/next/Library/2019-06-14-13-30-47.bpo-37280.Fxur0F.rst M Lib/asyncio/base_events.py diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index a736d01d6f37..a9660ca1089c 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -1078,7 +1078,7 @@ def _check_sendfile_params(self, sock, file, offset, count): if blocksize <= 0: return total_sent view = memoryview(buf)[:blocksize] - read = file.readinto(view) + read = await self.run_in_executor(None, file.readinto, view) if not read: return total_sent # EOF await proto.drain() diff --git a/Misc/NEWS.d/next/Library/2019-06-14-13-30-47.bpo-37280.Fxur0F.rst b/Misc/NEWS.d/next/Library/2019-06-14-13-30-47.bpo-37280.Fxur0F.rst new file mode 100644 index 000000000000..7cdc56a72ce4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-14-13-30-47.bpo-37280.Fxur0F.rst @@ -0,0 +1 @@ +Use threadpool for reading from file for sendfile fallback mode. From webhook-mailer at python.org Sat Jun 15 07:33:27 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 15 Jun 2019 11:33:27 -0000 Subject: [Python-checkins] Update weakref.rst (GH-14098) Message-ID: https://github.com/python/cpython/commit/f475729a714a9fb13672f8989c4abbafb783e09b commit: f475729a714a9fb13672f8989c4abbafb783e09b branch: master author: G?ry Ogam committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-06-15T04:33:23-07:00 summary: Update weakref.rst (GH-14098) files: M Doc/library/weakref.rst diff --git a/Doc/library/weakref.rst b/Doc/library/weakref.rst index a5c4295ef1fa..c3519e45beb6 100644 --- a/Doc/library/weakref.rst +++ b/Doc/library/weakref.rst @@ -65,8 +65,8 @@ exposed by the :mod:`weakref` module for the benefit of advanced uses. Not all objects can be weakly referenced; those objects which can include class instances, functions written in Python (but not in C), instance methods, sets, -frozensets, some :term:`file objects `, :term:`generator`\s, type -objects, sockets, arrays, deques, regular expression pattern objects, and code +frozensets, some :term:`file objects `, :term:`generators `, +type objects, sockets, arrays, deques, regular expression pattern objects, and code objects. .. versionchanged:: 3.2 @@ -80,9 +80,10 @@ support weak references but can add support through subclassing:: obj = Dict(red=1, green=2, blue=3) # this object is weak referenceable -Other built-in types such as :class:`tuple` and :class:`int` do not support weak -references even when subclassed (This is an implementation detail and may be -different across various Python implementations.). +.. impl-detail:: + + Other built-in types such as :class:`tuple` and :class:`int` do not support weak + references even when subclassed. Extension types can easily be made to support weak references; see :ref:`weakref-support`. From webhook-mailer at python.org Sat Jun 15 07:43:14 2019 From: webhook-mailer at python.org (Cheryl Sabella) Date: Sat, 15 Jun 2019 11:43:14 -0000 Subject: [Python-checkins] Fix typo in Lib/concurrent/futures/thread.py (GH-13953) Message-ID: https://github.com/python/cpython/commit/552ace7498722f1add9f3782751b0d365f4c24c8 commit: 552ace7498722f1add9f3782751b0d365f4c24c8 branch: master author: ubordignon <48903745+ubordignon at users.noreply.github.com> committer: Cheryl Sabella date: 2019-06-15T07:43:10-04:00 summary: Fix typo in Lib/concurrent/futures/thread.py (GH-13953) files: M Lib/concurrent/futures/process.py M Lib/concurrent/futures/thread.py diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py index cfdcd3ed7ea9..9e2ab9db64f6 100644 --- a/Lib/concurrent/futures/process.py +++ b/Lib/concurrent/futures/process.py @@ -505,7 +505,7 @@ def __init__(self, max_workers=None, mp_context=None, worker processes will be created as the machine has processors. mp_context: A multiprocessing context to launch the workers. This object should provide SimpleQueue, Queue and Process. - initializer: An callable used to initialize worker processes. + initializer: A callable used to initialize worker processes. initargs: A tuple of arguments to pass to the initializer. """ _check_system_limits() diff --git a/Lib/concurrent/futures/thread.py b/Lib/concurrent/futures/thread.py index 75d05a76be3f..d84b3aa7da0c 100644 --- a/Lib/concurrent/futures/thread.py +++ b/Lib/concurrent/futures/thread.py @@ -125,7 +125,7 @@ def __init__(self, max_workers=None, thread_name_prefix='', max_workers: The maximum number of threads that can be used to execute the given calls. thread_name_prefix: An optional name prefix to give our threads. - initializer: An callable used to initialize worker threads. + initializer: A callable used to initialize worker threads. initargs: A tuple of arguments to pass to the initializer. """ if max_workers is None: From webhook-mailer at python.org Sat Jun 15 07:49:47 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 15 Jun 2019 11:49:47 -0000 Subject: [Python-checkins] Update weakref.rst (GH-14098) Message-ID: https://github.com/python/cpython/commit/68878140694faa8dc53daeb5d9fee4d60ed2b672 commit: 68878140694faa8dc53daeb5d9fee4d60ed2b672 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-15T04:49:43-07:00 summary: Update weakref.rst (GH-14098) (cherry picked from commit f475729a714a9fb13672f8989c4abbafb783e09b) Co-authored-by: G?ry Ogam files: M Doc/library/weakref.rst diff --git a/Doc/library/weakref.rst b/Doc/library/weakref.rst index a28d71060f38..b3c8e3545533 100644 --- a/Doc/library/weakref.rst +++ b/Doc/library/weakref.rst @@ -65,8 +65,8 @@ exposed by the :mod:`weakref` module for the benefit of advanced uses. Not all objects can be weakly referenced; those objects which can include class instances, functions written in Python (but not in C), instance methods, sets, -frozensets, some :term:`file objects `, :term:`generator`\s, type -objects, sockets, arrays, deques, regular expression pattern objects, and code +frozensets, some :term:`file objects `, :term:`generators `, +type objects, sockets, arrays, deques, regular expression pattern objects, and code objects. .. versionchanged:: 3.2 @@ -80,9 +80,10 @@ support weak references but can add support through subclassing:: obj = Dict(red=1, green=2, blue=3) # this object is weak referenceable -Other built-in types such as :class:`tuple` and :class:`int` do not support weak -references even when subclassed (This is an implementation detail and may be -different across various Python implementations.). +.. impl-detail:: + + Other built-in types such as :class:`tuple` and :class:`int` do not support weak + references even when subclassed. Extension types can easily be made to support weak references; see :ref:`weakref-support`. From webhook-mailer at python.org Sat Jun 15 07:50:15 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 15 Jun 2019 11:50:15 -0000 Subject: [Python-checkins] Update weakref.rst (GH-14098) Message-ID: https://github.com/python/cpython/commit/30cac20101717e7cbb13db470787f8437bd98b04 commit: 30cac20101717e7cbb13db470787f8437bd98b04 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-15T04:50:11-07:00 summary: Update weakref.rst (GH-14098) (cherry picked from commit f475729a714a9fb13672f8989c4abbafb783e09b) Co-authored-by: G?ry Ogam files: M Doc/library/weakref.rst diff --git a/Doc/library/weakref.rst b/Doc/library/weakref.rst index 7f3d267d74c2..8d8a0b5df268 100644 --- a/Doc/library/weakref.rst +++ b/Doc/library/weakref.rst @@ -65,8 +65,8 @@ exposed by the :mod:`weakref` module for the benefit of advanced uses. Not all objects can be weakly referenced; those objects which can include class instances, functions written in Python (but not in C), instance methods, sets, -frozensets, some :term:`file objects `, :term:`generator`\s, type -objects, sockets, arrays, deques, regular expression pattern objects, and code +frozensets, some :term:`file objects `, :term:`generators `, +type objects, sockets, arrays, deques, regular expression pattern objects, and code objects. .. versionchanged:: 3.2 @@ -80,9 +80,10 @@ support weak references but can add support through subclassing:: obj = Dict(red=1, green=2, blue=3) # this object is weak referenceable -Other built-in types such as :class:`tuple` and :class:`int` do not support weak -references even when subclassed (This is an implementation detail and may be -different across various Python implementations.). +.. impl-detail:: + + Other built-in types such as :class:`tuple` and :class:`int` do not support weak + references even when subclassed. Extension types can easily be made to support weak references; see :ref:`weakref-support`. From webhook-mailer at python.org Sat Jun 15 07:55:57 2019 From: webhook-mailer at python.org (Andrew Svetlov) Date: Sat, 15 Jun 2019 11:55:57 -0000 Subject: [Python-checkins] [3.8] Use threadpool for reading from file in sendfile fallback mode (GH-14076) (GH-14102) Message-ID: https://github.com/python/cpython/commit/b6ff2cd8c5bc1d4e4e61b9138436b507b31c6c7a commit: b6ff2cd8c5bc1d4e4e61b9138436b507b31c6c7a branch: 3.8 author: Andrew Svetlov committer: GitHub date: 2019-06-15T14:55:52+03:00 summary: [3.8] Use threadpool for reading from file in sendfile fallback mode (GH-14076) (GH-14102) (cherry picked from commit 0237265e8287141c40faa8719da3a2d21d511d0d) Co-authored-by: Andrew Svetlov files: A Misc/NEWS.d/next/Library/2019-06-14-13-30-47.bpo-37280.Fxur0F.rst M Lib/asyncio/base_events.py diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index 90de8587a3bb..14b80bdda9c0 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -1141,7 +1141,7 @@ def _check_sendfile_params(self, sock, file, offset, count): if blocksize <= 0: return total_sent view = memoryview(buf)[:blocksize] - read = file.readinto(view) + read = await self.run_in_executor(None, file.readinto, view) if not read: return total_sent # EOF await proto.drain() diff --git a/Misc/NEWS.d/next/Library/2019-06-14-13-30-47.bpo-37280.Fxur0F.rst b/Misc/NEWS.d/next/Library/2019-06-14-13-30-47.bpo-37280.Fxur0F.rst new file mode 100644 index 000000000000..7cdc56a72ce4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-14-13-30-47.bpo-37280.Fxur0F.rst @@ -0,0 +1 @@ +Use threadpool for reading from file for sendfile fallback mode. From webhook-mailer at python.org Sat Jun 15 07:56:31 2019 From: webhook-mailer at python.org (Andrew Svetlov) Date: Sat, 15 Jun 2019 11:56:31 -0000 Subject: [Python-checkins] [3.7] bpo-37279: Fix asyncio sendfile support when extra data are sent in fallback mode. (GH-14075). (GH-14103) Message-ID: https://github.com/python/cpython/commit/e5d67f1e31381d28b24f6e1c0f8388d9bf0bfc5f commit: e5d67f1e31381d28b24f6e1c0f8388d9bf0bfc5f branch: 3.7 author: Andrew Svetlov committer: GitHub date: 2019-06-15T14:56:27+03:00 summary: [3.7] bpo-37279: Fix asyncio sendfile support when extra data are sent in fallback mode. (GH-14075). (GH-14103) (cherry picked from commit ef2152354f03a165c5e3adb53e2276934fabd50a) Co-authored-by: Andrew Svetlov files: A Misc/NEWS.d/next/Library/2019-06-14-13-25-56.bpo-37279.OHlW6l.rst M Lib/asyncio/base_events.py M Lib/test/test_asyncio/test_events.py diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index a9660ca1089c..52134372fa9f 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -827,7 +827,7 @@ def _getaddrinfo_debug(self, host, port, family, type, proto, flags): read = await self.run_in_executor(None, file.readinto, view) if not read: break # EOF - await self.sock_sendall(sock, view) + await self.sock_sendall(sock, view[:read]) total_sent += read return total_sent finally: @@ -1082,7 +1082,7 @@ def _check_sendfile_params(self, sock, file, offset, count): if not read: return total_sent # EOF await proto.drain() - transp.write(view) + transp.write(view[:read]) total_sent += read finally: if total_sent > 0 and hasattr(file, 'seek'): diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py index 9466111b8ef7..d2c1d7c8a671 100644 --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -2117,7 +2117,8 @@ def test_subprocess_shell_invalid_args(self): class SendfileBase: - DATA = b"SendfileBaseData" * (1024 * 8) # 128 KiB + # 128 KiB plus small unaligned to buffer chunk + DATA = b"SendfileBaseData" * (1024 * 8 + 1) # Reduce socket buffer size to test on relative small data sets. BUF_SIZE = 4 * 1024 # 4 KiB diff --git a/Misc/NEWS.d/next/Library/2019-06-14-13-25-56.bpo-37279.OHlW6l.rst b/Misc/NEWS.d/next/Library/2019-06-14-13-25-56.bpo-37279.OHlW6l.rst new file mode 100644 index 000000000000..d740b9b62b08 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-14-13-25-56.bpo-37279.OHlW6l.rst @@ -0,0 +1,2 @@ +Fix asyncio sendfile support when sendfile sends extra data in fallback +mode. From webhook-mailer at python.org Sat Jun 15 08:02:38 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 15 Jun 2019 12:02:38 -0000 Subject: [Python-checkins] Fix typo in Lib/concurrent/futures/thread.py (GH-13953) Message-ID: https://github.com/python/cpython/commit/687af44df8caa69312b65d1bd7bf1f05dd1e5778 commit: 687af44df8caa69312b65d1bd7bf1f05dd1e5778 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-15T05:02:34-07:00 summary: Fix typo in Lib/concurrent/futures/thread.py (GH-13953) (cherry picked from commit 552ace7498722f1add9f3782751b0d365f4c24c8) Co-authored-by: ubordignon <48903745+ubordignon at users.noreply.github.com> files: M Lib/concurrent/futures/process.py M Lib/concurrent/futures/thread.py diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py index dd14eaec907d..2b2b78eedd78 100644 --- a/Lib/concurrent/futures/process.py +++ b/Lib/concurrent/futures/process.py @@ -505,7 +505,7 @@ def __init__(self, max_workers=None, mp_context=None, worker processes will be created as the machine has processors. mp_context: A multiprocessing context to launch the workers. This object should provide SimpleQueue, Queue and Process. - initializer: An callable used to initialize worker processes. + initializer: A callable used to initialize worker processes. initargs: A tuple of arguments to pass to the initializer. """ _check_system_limits() diff --git a/Lib/concurrent/futures/thread.py b/Lib/concurrent/futures/thread.py index 2426e94de91f..9e669b21962a 100644 --- a/Lib/concurrent/futures/thread.py +++ b/Lib/concurrent/futures/thread.py @@ -125,7 +125,7 @@ def __init__(self, max_workers=None, thread_name_prefix='', max_workers: The maximum number of threads that can be used to execute the given calls. thread_name_prefix: An optional name prefix to give our threads. - initializer: An callable used to initialize worker threads. + initializer: A callable used to initialize worker threads. initargs: A tuple of arguments to pass to the initializer. """ if max_workers is None: From webhook-mailer at python.org Sat Jun 15 08:11:19 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 15 Jun 2019 12:11:19 -0000 Subject: [Python-checkins] Fix typo in Lib/concurrent/futures/thread.py (GH-13953) Message-ID: https://github.com/python/cpython/commit/d799fd34689f61560891339677200c225176796e commit: d799fd34689f61560891339677200c225176796e branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-15T05:11:15-07:00 summary: Fix typo in Lib/concurrent/futures/thread.py (GH-13953) (cherry picked from commit 552ace7498722f1add9f3782751b0d365f4c24c8) Co-authored-by: ubordignon <48903745+ubordignon at users.noreply.github.com> files: M Lib/concurrent/futures/process.py M Lib/concurrent/futures/thread.py diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py index 6c6905380eff..9106552c5d06 100644 --- a/Lib/concurrent/futures/process.py +++ b/Lib/concurrent/futures/process.py @@ -504,7 +504,7 @@ def __init__(self, max_workers=None, mp_context=None, worker processes will be created as the machine has processors. mp_context: A multiprocessing context to launch the workers. This object should provide SimpleQueue, Queue and Process. - initializer: An callable used to initialize worker processes. + initializer: A callable used to initialize worker processes. initargs: A tuple of arguments to pass to the initializer. """ _check_system_limits() diff --git a/Lib/concurrent/futures/thread.py b/Lib/concurrent/futures/thread.py index c7c9ef44c60b..9e3fb8b69294 100644 --- a/Lib/concurrent/futures/thread.py +++ b/Lib/concurrent/futures/thread.py @@ -118,7 +118,7 @@ def __init__(self, max_workers=None, thread_name_prefix='', max_workers: The maximum number of threads that can be used to execute the given calls. thread_name_prefix: An optional name prefix to give our threads. - initializer: An callable used to initialize worker threads. + initializer: A callable used to initialize worker threads. initargs: A tuple of arguments to pass to the initializer. """ if max_workers is None: From webhook-mailer at python.org Sat Jun 15 09:42:02 2019 From: webhook-mailer at python.org (Julien Palard) Date: Sat, 15 Jun 2019 13:42:02 -0000 Subject: [Python-checkins] Doc: Bump Sphinx verison. (#13785) Message-ID: https://github.com/python/cpython/commit/7d23dbe6d17bb872da5b89a5674cb32a7a1a2b9c commit: 7d23dbe6d17bb872da5b89a5674cb32a7a1a2b9c branch: master author: Julien Palard committer: GitHub date: 2019-06-15T15:41:58+02:00 summary: Doc: Bump Sphinx verison. (#13785) To reflect the one we're using in production. files: M .azure-pipelines/docs-steps.yml M .travis.yml M Doc/Makefile diff --git a/.azure-pipelines/docs-steps.yml b/.azure-pipelines/docs-steps.yml index 492e4e34bb2d..96361961ea75 100644 --- a/.azure-pipelines/docs-steps.yml +++ b/.azure-pipelines/docs-steps.yml @@ -12,7 +12,7 @@ steps: inputs: versionSpec: '>=3.6' -- script: python -m pip install sphinx==1.8.2 blurb python-docs-theme +- script: python -m pip install sphinx==2.0.1 blurb python-docs-theme displayName: 'Install build dependencies' - ${{ if ne(parameters.latex, 'true') }}: diff --git a/.travis.yml b/.travis.yml index 02de997750ab..addff7733479 100644 --- a/.travis.yml +++ b/.travis.yml @@ -55,7 +55,7 @@ matrix: # Sphinx is pinned so that new versions that introduce new warnings won't suddenly cause build failures. # (Updating the version is fine as long as no warnings are raised by doing so.) # The theme used by the docs is stored separately, so we need to install that as well. - - python -m pip install sphinx==1.8.2 blurb python-docs-theme + - python -m pip install sphinx==2.0.1 blurb python-docs-theme script: - make check suspicious html SPHINXOPTS="-q -W -j4" - name: "Documentation tests" diff --git a/Doc/Makefile b/Doc/Makefile index 6f86728ea834..3bcd9f23752b 100644 --- a/Doc/Makefile +++ b/Doc/Makefile @@ -133,7 +133,7 @@ clean: venv: $(PYTHON) -m venv $(VENVDIR) $(VENVDIR)/bin/python3 -m pip install -U pip setuptools - $(VENVDIR)/bin/python3 -m pip install -U Sphinx blurb python-docs-theme + $(VENVDIR)/bin/python3 -m pip install -U Sphinx==2.0.1 blurb python-docs-theme @echo "The venv has been created in the $(VENVDIR) directory" dist: From webhook-mailer at python.org Sat Jun 15 10:09:41 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 15 Jun 2019 14:09:41 -0000 Subject: [Python-checkins] Update link in colorsys docs to be https (GH-14062) Message-ID: https://github.com/python/cpython/commit/6ef4d323bdb0f910d6e5e4d81a654253d4d1bcd5 commit: 6ef4d323bdb0f910d6e5e4d81a654253d4d1bcd5 branch: master author: Alex Gaynor committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-06-15T07:09:36-07:00 summary: Update link in colorsys docs to be https (GH-14062) files: M Doc/library/colorsys.rst diff --git a/Doc/library/colorsys.rst b/Doc/library/colorsys.rst index 1360c7cc9f1d..b672a05b3914 100644 --- a/Doc/library/colorsys.rst +++ b/Doc/library/colorsys.rst @@ -21,7 +21,7 @@ spaces, the coordinates are all between 0 and 1. .. seealso:: More information about color spaces can be found at - http://poynton.ca/ColorFAQ.html and + https://poynton.ca/ColorFAQ.html and https://www.cambridgeincolour.com/tutorials/color-spaces.htm. The :mod:`colorsys` module defines the following functions: From webhook-mailer at python.org Sat Jun 15 10:21:41 2019 From: webhook-mailer at python.org (Carol Willing) Date: Sat, 15 Jun 2019 14:21:41 -0000 Subject: [Python-checkins] Doc: Deprecation header: More precise wording. (GH-14109) Message-ID: https://github.com/python/cpython/commit/cfa0394b9760941bbdd089913a6420d2af54314a commit: cfa0394b9760941bbdd089913a6420d2af54314a branch: master author: Julien Palard committer: Carol Willing date: 2019-06-15T10:21:37-04:00 summary: Doc: Deprecation header: More precise wording. (GH-14109) files: M Doc/tools/templates/layout.html diff --git a/Doc/tools/templates/layout.html b/Doc/tools/templates/layout.html index a765a5de8a2d..77915c8431b6 100644 --- a/Doc/tools/templates/layout.html +++ b/Doc/tools/templates/layout.html @@ -5,7 +5,7 @@
            {% trans %}This document is for an old version of Python that is no longer supported. You should upgrade, and read the {% endtrans %} - {% trans %} Python documentation for the last stable release {% endtrans %}. + {% trans %} Python documentation for the current stable release {% endtrans %}.
            {%- endif %} {% endblock %} From webhook-mailer at python.org Sat Jun 15 10:58:04 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Sat, 15 Jun 2019 14:58:04 -0000 Subject: [Python-checkins] bpo-37289: Remove 'if False' handling in the peephole optimizer (GH-14099) Message-ID: https://github.com/python/cpython/commit/7a68f8c28bb78d957555a5001dac4df6345434a0 commit: 7a68f8c28bb78d957555a5001dac4df6345434a0 branch: master author: Pablo Galindo committer: GitHub date: 2019-06-15T15:58:00+01:00 summary: bpo-37289: Remove 'if False' handling in the peephole optimizer (GH-14099) files: M Python/peephole.c diff --git a/Python/peephole.c b/Python/peephole.c index d7b1dfc4d9c1..3e56e788b007 100644 --- a/Python/peephole.c +++ b/Python/peephole.c @@ -311,18 +311,12 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, } PyObject* cnt = PyList_GET_ITEM(consts, get_arg(codestr, i)); int is_true = PyObject_IsTrue(cnt); + if (is_true == -1) { + goto exitError; + } if (is_true == 1) { fill_nops(codestr, op_start, nexti + 1); cumlc = 0; - } else if (is_true == 0) { - if (i > 1 && - (_Py_OPCODE(codestr[i - 1]) == POP_JUMP_IF_TRUE || - _Py_OPCODE(codestr[i - 1]) == POP_JUMP_IF_FALSE)) { - break; - } - h = get_arg(codestr, nexti) / sizeof(_Py_CODEUNIT); - tgt = find_op(codestr, codelen, h); - fill_nops(codestr, op_start, tgt); } break; From webhook-mailer at python.org Sat Jun 15 11:22:12 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Sat, 15 Jun 2019 15:22:12 -0000 Subject: [Python-checkins] bpo-37289: Remove 'if False' handling in the peephole optimizer (GH-14099) (GH-14112) Message-ID: https://github.com/python/cpython/commit/284daeade210d3aac049f4278a1fb76d19e6d78a commit: 284daeade210d3aac049f4278a1fb76d19e6d78a branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Pablo Galindo date: 2019-06-15T16:22:08+01:00 summary: bpo-37289: Remove 'if False' handling in the peephole optimizer (GH-14099) (GH-14112) (cherry picked from commit 7a68f8c28bb78d957555a5001dac4df6345434a0) Co-authored-by: Pablo Galindo files: M Python/peephole.c diff --git a/Python/peephole.c b/Python/peephole.c index d7b1dfc4d9c1..3e56e788b007 100644 --- a/Python/peephole.c +++ b/Python/peephole.c @@ -311,18 +311,12 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, } PyObject* cnt = PyList_GET_ITEM(consts, get_arg(codestr, i)); int is_true = PyObject_IsTrue(cnt); + if (is_true == -1) { + goto exitError; + } if (is_true == 1) { fill_nops(codestr, op_start, nexti + 1); cumlc = 0; - } else if (is_true == 0) { - if (i > 1 && - (_Py_OPCODE(codestr[i - 1]) == POP_JUMP_IF_TRUE || - _Py_OPCODE(codestr[i - 1]) == POP_JUMP_IF_FALSE)) { - break; - } - h = get_arg(codestr, nexti) / sizeof(_Py_CODEUNIT); - tgt = find_op(codestr, codelen, h); - fill_nops(codestr, op_start, tgt); } break; From webhook-mailer at python.org Sat Jun 15 11:22:38 2019 From: webhook-mailer at python.org (Pablo Galindo) Date: Sat, 15 Jun 2019 15:22:38 -0000 Subject: [Python-checkins] bpo-37289: Remove 'if False' handling in the peephole optimizer (GH-14099) (GH-14111) Message-ID: https://github.com/python/cpython/commit/81fecf7b7a6e766a213c6e670219c1da52461589 commit: 81fecf7b7a6e766a213c6e670219c1da52461589 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Pablo Galindo date: 2019-06-15T16:22:34+01:00 summary: bpo-37289: Remove 'if False' handling in the peephole optimizer (GH-14099) (GH-14111) (cherry picked from commit 7a68f8c28bb78d957555a5001dac4df6345434a0) Co-authored-by: Pablo Galindo files: M Python/peephole.c diff --git a/Python/peephole.c b/Python/peephole.c index f1b71ed1a730..277a216ae075 100644 --- a/Python/peephole.c +++ b/Python/peephole.c @@ -309,18 +309,12 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, } PyObject* cnt = PyList_GET_ITEM(consts, get_arg(codestr, i)); int is_true = PyObject_IsTrue(cnt); + if (is_true == -1) { + goto exitError; + } if (is_true == 1) { fill_nops(codestr, op_start, nexti + 1); cumlc = 0; - } else if (is_true == 0) { - if (i > 1 && - (_Py_OPCODE(codestr[i - 1]) == POP_JUMP_IF_TRUE || - _Py_OPCODE(codestr[i - 1]) == POP_JUMP_IF_FALSE)) { - break; - } - h = get_arg(codestr, nexti) / sizeof(_Py_CODEUNIT); - tgt = find_op(codestr, codelen, h); - fill_nops(codestr, op_start, tgt); } break; From webhook-mailer at python.org Sat Jun 15 11:29:47 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 15 Jun 2019 15:29:47 -0000 Subject: [Python-checkins] [2.7] bpo-35121: prefix dot in domain for proper subdomain validation (GH-10258) (GH-13426) Message-ID: https://github.com/python/cpython/commit/979daae300916adb399ab5b51410b6ebd0888f13 commit: 979daae300916adb399ab5b51410b6ebd0888f13 branch: 2.7 author: Xtreak committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> date: 2019-06-15T08:29:43-07:00 summary: [2.7] bpo-35121: prefix dot in domain for proper subdomain validation (GH-10258) (GH-13426) This is a manual backport of ca7fe5063593958e5efdf90f068582837f07bd14 since 2.7 has `http.cookiejar` in `cookielib` https://bugs.python.org/issue35121 files: A Misc/NEWS.d/next/Security/2019-05-20-00-35-12.bpo-35121.RRi-HU.rst M Lib/cookielib.py M Lib/test/test_cookielib.py diff --git a/Lib/cookielib.py b/Lib/cookielib.py index 2dd7c48728e0..0b471a42f296 100644 --- a/Lib/cookielib.py +++ b/Lib/cookielib.py @@ -1139,6 +1139,11 @@ def return_ok_domain(self, cookie, request): req_host, erhn = eff_request_host(request) domain = cookie.domain + if domain and not domain.startswith("."): + dotdomain = "." + domain + else: + dotdomain = domain + # strict check of non-domain cookies: Mozilla does this, MSIE5 doesn't if (cookie.version == 0 and (self.strict_ns_domain & self.DomainStrictNonDomain) and @@ -1151,7 +1156,7 @@ def return_ok_domain(self, cookie, request): _debug(" effective request-host name %s does not domain-match " "RFC 2965 cookie domain %s", erhn, domain) return False - if cookie.version == 0 and not ("."+erhn).endswith(domain): + if cookie.version == 0 and not ("."+erhn).endswith(dotdomain): _debug(" request-host %s does not match Netscape cookie domain " "%s", req_host, domain) return False @@ -1165,7 +1170,11 @@ def domain_return_ok(self, domain, request): req_host = "."+req_host if not erhn.startswith("."): erhn = "."+erhn - if not (req_host.endswith(domain) or erhn.endswith(domain)): + if domain and not domain.startswith("."): + dotdomain = "." + domain + else: + dotdomain = domain + if not (req_host.endswith(dotdomain) or erhn.endswith(dotdomain)): #_debug(" request domain %s does not match cookie domain %s", # req_host, domain) return False diff --git a/Lib/test/test_cookielib.py b/Lib/test/test_cookielib.py index f2dd9727d137..7f7ff614d61d 100644 --- a/Lib/test/test_cookielib.py +++ b/Lib/test/test_cookielib.py @@ -368,6 +368,7 @@ def test_domain_return_ok(self): ("http://foo.bar.com/", ".foo.bar.com", True), ("http://foo.bar.com/", "foo.bar.com", True), ("http://foo.bar.com/", ".bar.com", True), + ("http://foo.bar.com/", "bar.com", True), ("http://foo.bar.com/", "com", True), ("http://foo.com/", "rhubarb.foo.com", False), ("http://foo.com/", ".foo.com", True), @@ -378,6 +379,8 @@ def test_domain_return_ok(self): ("http://foo/", "foo", True), ("http://foo/", "foo.local", True), ("http://foo/", ".local", True), + ("http://barfoo.com", ".foo.com", False), + ("http://barfoo.com", "foo.com", False), ]: request = urllib2.Request(url) r = pol.domain_return_ok(domain, request) @@ -938,6 +941,33 @@ def test_domain_block(self): c.add_cookie_header(req) self.assertFalse(req.has_header("Cookie")) + c.clear() + + pol.set_blocked_domains([]) + req = Request("http://acme.com/") + res = FakeResponse(headers, "http://acme.com/") + cookies = c.make_cookies(res, req) + c.extract_cookies(res, req) + self.assertEqual(len(c), 1) + + req = Request("http://acme.com/") + c.add_cookie_header(req) + self.assertTrue(req.has_header("Cookie")) + + req = Request("http://badacme.com/") + c.add_cookie_header(req) + self.assertFalse(pol.return_ok(cookies[0], req)) + self.assertFalse(req.has_header("Cookie")) + + p = pol.set_blocked_domains(["acme.com"]) + req = Request("http://acme.com/") + c.add_cookie_header(req) + self.assertFalse(req.has_header("Cookie")) + + req = Request("http://badacme.com/") + c.add_cookie_header(req) + self.assertFalse(req.has_header("Cookie")) + def test_secure(self): from cookielib import CookieJar, DefaultCookiePolicy diff --git a/Misc/NEWS.d/next/Security/2019-05-20-00-35-12.bpo-35121.RRi-HU.rst b/Misc/NEWS.d/next/Security/2019-05-20-00-35-12.bpo-35121.RRi-HU.rst new file mode 100644 index 000000000000..77251806163b --- /dev/null +++ b/Misc/NEWS.d/next/Security/2019-05-20-00-35-12.bpo-35121.RRi-HU.rst @@ -0,0 +1,4 @@ +Don't send cookies of domain A without Domain attribute to domain B when +domain A is a suffix match of domain B while using a cookiejar with +:class:`cookielib.DefaultCookiePolicy` policy. Patch by Karthikeyan +Singaravelan. From webhook-mailer at python.org Sat Jun 15 11:52:32 2019 From: webhook-mailer at python.org (Nick Coghlan) Date: Sat, 15 Jun 2019 15:52:32 -0000 Subject: [Python-checkins] bpo-28009: Fix uuid SkipUnless logic to be based on platform programs capable of introspection (GH-12777) Message-ID: https://github.com/python/cpython/commit/3a1d50e7e573efb577714146bed5c03b9c95f466 commit: 3a1d50e7e573efb577714146bed5c03b9c95f466 branch: master author: Michael Felt committer: Nick Coghlan date: 2019-06-16T01:52:29+10:00 summary: bpo-28009: Fix uuid SkipUnless logic to be based on platform programs capable of introspection (GH-12777) uuid could try fallback methods that had no chance of working on a particular platform, and this could cause spurious test failures, as well as degraded performance as fallback options were tried and failed. This fixes both the uuid module and its test's SkipUnless logic to use a prefiltered list of techniques that may at least potentially work on that platform. Patch by Michael Felt (aixtools). files: A Misc/NEWS.d/next/Tests/2019-04-11-07-59-43.bpo-28009.s85urF.rst M Lib/test/test_uuid.py M Lib/uuid.py diff --git a/Lib/test/test_uuid.py b/Lib/test/test_uuid.py index 992ef0cbf804..92642d239b92 100644 --- a/Lib/test/test_uuid.py +++ b/Lib/test/test_uuid.py @@ -462,8 +462,7 @@ def test_uuid1_eui64(self): with unittest.mock.patch.multiple( self.uuid, _node=None, # Ignore any cached node value. - _NODE_GETTERS_WIN32=[too_large_getter], - _NODE_GETTERS_UNIX=[too_large_getter], + _GETTERS=[too_large_getter], ): node = self.uuid.getnode() self.assertTrue(0 < node < (1 << 48), '%012x' % node) @@ -673,7 +672,7 @@ class TestUUIDWithExtModule(BaseTestUUID, unittest.TestCase): class BaseTestInternals: - uuid = None + _uuid = py_uuid @unittest.skipUnless(os.name == 'posix', 'requires Posix') def test_find_mac(self): @@ -708,27 +707,32 @@ def check_node(self, node, requires=None): self.assertTrue(0 < node < (1 << 48), "%s is not an RFC 4122 node ID" % hex) - @unittest.skipUnless(os.name == 'posix', 'requires Posix') + @unittest.skipUnless(_uuid._ifconfig_getnode in _uuid._GETTERS, + "ifconfig is not used for introspection on this platform") def test_ifconfig_getnode(self): node = self.uuid._ifconfig_getnode() self.check_node(node, 'ifconfig') - @unittest.skipUnless(os.name == 'posix', 'requires Posix') + @unittest.skipUnless(_uuid._ip_getnode in _uuid._GETTERS, + "ip is not used for introspection on this platform") def test_ip_getnode(self): node = self.uuid._ip_getnode() self.check_node(node, 'ip') - @unittest.skipUnless(os.name == 'posix', 'requires Posix') + @unittest.skipUnless(_uuid._arp_getnode in _uuid._GETTERS, + "arp is not used for introspection on this platform") def test_arp_getnode(self): node = self.uuid._arp_getnode() self.check_node(node, 'arp') - @unittest.skipUnless(os.name == 'posix', 'requires Posix') + @unittest.skipUnless(_uuid._lanscan_getnode in _uuid._GETTERS, + "lanscan is not used for introspection on this platform") def test_lanscan_getnode(self): node = self.uuid._lanscan_getnode() self.check_node(node, 'lanscan') - @unittest.skipUnless(os.name == 'posix', 'requires Posix') + @unittest.skipUnless(_uuid._netstat_getnode in _uuid._GETTERS, + "netstat is not used for introspection on this platform") def test_netstat_getnode(self): node = self.uuid._netstat_getnode() self.check_node(node, 'netstat') diff --git a/Lib/uuid.py b/Lib/uuid.py index ddc63ccd082c..7aa01bb5c355 100644 --- a/Lib/uuid.py +++ b/Lib/uuid.py @@ -45,6 +45,7 @@ """ import os +import platform import sys from enum import Enum @@ -52,6 +53,12 @@ __author__ = 'Ka-Ping Yee ' +# The recognized platforms - known behaviors +_AIX = platform.system() == 'AIX' +_DARWIN = platform.system() == 'Darwin' +_LINUX = platform.system() == 'Linux' +_WINDOWS = platform.system() == 'Windows' + RESERVED_NCS, RFC_4122, RESERVED_MICROSOFT, RESERVED_FUTURE = [ 'reserved for NCS compatibility', 'specified in RFC 4122', 'reserved for Microsoft compatibility', 'reserved for future definition'] @@ -673,12 +680,31 @@ def _random_getnode(): return random.getrandbits(48) | (1 << 40) -_node = None - -_NODE_GETTERS_WIN32 = [_windll_getnode, _netbios_getnode, _ipconfig_getnode] +# _OS_GETTERS, when known, are targetted for a specific OS or platform. +# The order is by 'common practice' on the specified platform. +# Note: 'posix' and 'windows' _OS_GETTERS are prefixed by a dll/dlload() method +# which, when successful, means none of these "external" methods are called. +# _GETTERS is (also) used by test_uuid.py to SkipUnless(), e.g., +# @unittest.skipUnless(_uuid._ifconfig_getnode in _uuid._GETTERS, ...) +if _LINUX: + _OS_GETTERS = [_ip_getnode, _ifconfig_getnode] +elif _DARWIN: + _OS_GETTERS = [_ifconfig_getnode, _arp_getnode, _netstat_getnode] +elif _WINDOWS: + _OS_GETTERS = [_netbios_getnode, _ipconfig_getnode] +elif _AIX: + _OS_GETTERS = [_netstat_getnode] +else: + _OS_GETTERS = [_ifconfig_getnode, _ip_getnode, _arp_getnode, + _netstat_getnode, _lanscan_getnode] +if os.name == 'posix': + _GETTERS = [_unix_getnode] + _OS_GETTERS +elif os.name == 'nt': + _GETTERS = [_windll_getnode] + _OS_GETTERS +else: + _GETTERS = _OS_GETTERS -_NODE_GETTERS_UNIX = [_unix_getnode, _ifconfig_getnode, _ip_getnode, - _arp_getnode, _lanscan_getnode, _netstat_getnode] +_node = None def getnode(*, getters=None): """Get the hardware address as a 48-bit positive integer. @@ -692,12 +718,7 @@ def getnode(*, getters=None): if _node is not None: return _node - if sys.platform == 'win32': - getters = _NODE_GETTERS_WIN32 - else: - getters = _NODE_GETTERS_UNIX - - for getter in getters + [_random_getnode]: + for getter in _GETTERS + [_random_getnode]: try: _node = getter() except: diff --git a/Misc/NEWS.d/next/Tests/2019-04-11-07-59-43.bpo-28009.s85urF.rst b/Misc/NEWS.d/next/Tests/2019-04-11-07-59-43.bpo-28009.s85urF.rst new file mode 100644 index 000000000000..233640716d15 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-04-11-07-59-43.bpo-28009.s85urF.rst @@ -0,0 +1,3 @@ +Modify the test_uuid logic to test when a program is available +AND can be used to obtain a MACADDR as basis for an UUID. +Patch by M. Felt From webhook-mailer at python.org Sat Jun 15 12:03:01 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 15 Jun 2019 16:03:01 -0000 Subject: [Python-checkins] bpo-36785: PEP 574 What's New entry (GH-13931) Message-ID: https://github.com/python/cpython/commit/298023633fde5cd60926a2923a01d896550cbf84 commit: 298023633fde5cd60926a2923a01d896550cbf84 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-15T09:02:57-07:00 summary: bpo-36785: PEP 574 What's New entry (GH-13931) (cherry picked from commit c879ff247ae1b67a790ff98d2d59145302cd4e4e) Co-authored-by: Antoine Pitrou files: M Doc/whatsnew/3.8.rst diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 21ad11254730..1312a7433022 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -54,7 +54,6 @@ For full details, see the :ref:`changelog `. Some notable items not yet covered here: - * :pep:`574` - Pickle protocol 5 with out-of-band data buffer support * :pep:`578` - Runtime audit hooks for potentially sensitive operations * ``python -m asyncio`` runs a natively async REPL * ... @@ -261,6 +260,23 @@ See :pep:`590` for a full description. (Contributed by Jeroen Demeyer and Mark Shannon in :issue:`36974`.) +Pickle protocol 5 with out-of-band data buffers +----------------------------------------------- + +When :mod:`pickle` is used to transfer large data between Python processes +in order to take advantage of multi-core or multi-machine processing, +it is important to optimize the transfer by reducing memory copies, and +possibly by applying custom techniques such as data-dependent compression. + +The :mod:`pickle` protocol 5 introduces support for out-of-band buffers +where :pep:`3118`-compatible data can be transmitted separately from the +main pickle stream, at the discretion of the communication layer. + +See :pep:`574` for a full description. + +(Contributed by Antoine Pitrou in :issue:`36785`.) + + Other Language Changes ====================== From webhook-mailer at python.org Sat Jun 15 12:10:38 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 15 Jun 2019 16:10:38 -0000 Subject: [Python-checkins] bpo-28009: Fix uuid SkipUnless logic to be based on platform programs capable of introspection (GH-12777) Message-ID: https://github.com/python/cpython/commit/f0e5c01182daefa20c624383c8a37c25eacfde43 commit: f0e5c01182daefa20c624383c8a37c25eacfde43 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-15T09:10:34-07:00 summary: bpo-28009: Fix uuid SkipUnless logic to be based on platform programs capable of introspection (GH-12777) uuid could try fallback methods that had no chance of working on a particular platform, and this could cause spurious test failures, as well as degraded performance as fallback options were tried and failed. This fixes both the uuid module and its test's SkipUnless logic to use a prefiltered list of techniques that may at least potentially work on that platform. Patch by Michael Felt (aixtools). (cherry picked from commit 3a1d50e7e573efb577714146bed5c03b9c95f466) Co-authored-by: Michael Felt files: A Misc/NEWS.d/next/Tests/2019-04-11-07-59-43.bpo-28009.s85urF.rst M Lib/test/test_uuid.py M Lib/uuid.py diff --git a/Lib/test/test_uuid.py b/Lib/test/test_uuid.py index 992ef0cbf804..92642d239b92 100644 --- a/Lib/test/test_uuid.py +++ b/Lib/test/test_uuid.py @@ -462,8 +462,7 @@ def test_uuid1_eui64(self): with unittest.mock.patch.multiple( self.uuid, _node=None, # Ignore any cached node value. - _NODE_GETTERS_WIN32=[too_large_getter], - _NODE_GETTERS_UNIX=[too_large_getter], + _GETTERS=[too_large_getter], ): node = self.uuid.getnode() self.assertTrue(0 < node < (1 << 48), '%012x' % node) @@ -673,7 +672,7 @@ class TestUUIDWithExtModule(BaseTestUUID, unittest.TestCase): class BaseTestInternals: - uuid = None + _uuid = py_uuid @unittest.skipUnless(os.name == 'posix', 'requires Posix') def test_find_mac(self): @@ -708,27 +707,32 @@ def check_node(self, node, requires=None): self.assertTrue(0 < node < (1 << 48), "%s is not an RFC 4122 node ID" % hex) - @unittest.skipUnless(os.name == 'posix', 'requires Posix') + @unittest.skipUnless(_uuid._ifconfig_getnode in _uuid._GETTERS, + "ifconfig is not used for introspection on this platform") def test_ifconfig_getnode(self): node = self.uuid._ifconfig_getnode() self.check_node(node, 'ifconfig') - @unittest.skipUnless(os.name == 'posix', 'requires Posix') + @unittest.skipUnless(_uuid._ip_getnode in _uuid._GETTERS, + "ip is not used for introspection on this platform") def test_ip_getnode(self): node = self.uuid._ip_getnode() self.check_node(node, 'ip') - @unittest.skipUnless(os.name == 'posix', 'requires Posix') + @unittest.skipUnless(_uuid._arp_getnode in _uuid._GETTERS, + "arp is not used for introspection on this platform") def test_arp_getnode(self): node = self.uuid._arp_getnode() self.check_node(node, 'arp') - @unittest.skipUnless(os.name == 'posix', 'requires Posix') + @unittest.skipUnless(_uuid._lanscan_getnode in _uuid._GETTERS, + "lanscan is not used for introspection on this platform") def test_lanscan_getnode(self): node = self.uuid._lanscan_getnode() self.check_node(node, 'lanscan') - @unittest.skipUnless(os.name == 'posix', 'requires Posix') + @unittest.skipUnless(_uuid._netstat_getnode in _uuid._GETTERS, + "netstat is not used for introspection on this platform") def test_netstat_getnode(self): node = self.uuid._netstat_getnode() self.check_node(node, 'netstat') diff --git a/Lib/uuid.py b/Lib/uuid.py index ddc63ccd082c..7aa01bb5c355 100644 --- a/Lib/uuid.py +++ b/Lib/uuid.py @@ -45,6 +45,7 @@ """ import os +import platform import sys from enum import Enum @@ -52,6 +53,12 @@ __author__ = 'Ka-Ping Yee ' +# The recognized platforms - known behaviors +_AIX = platform.system() == 'AIX' +_DARWIN = platform.system() == 'Darwin' +_LINUX = platform.system() == 'Linux' +_WINDOWS = platform.system() == 'Windows' + RESERVED_NCS, RFC_4122, RESERVED_MICROSOFT, RESERVED_FUTURE = [ 'reserved for NCS compatibility', 'specified in RFC 4122', 'reserved for Microsoft compatibility', 'reserved for future definition'] @@ -673,12 +680,31 @@ def _random_getnode(): return random.getrandbits(48) | (1 << 40) -_node = None - -_NODE_GETTERS_WIN32 = [_windll_getnode, _netbios_getnode, _ipconfig_getnode] +# _OS_GETTERS, when known, are targetted for a specific OS or platform. +# The order is by 'common practice' on the specified platform. +# Note: 'posix' and 'windows' _OS_GETTERS are prefixed by a dll/dlload() method +# which, when successful, means none of these "external" methods are called. +# _GETTERS is (also) used by test_uuid.py to SkipUnless(), e.g., +# @unittest.skipUnless(_uuid._ifconfig_getnode in _uuid._GETTERS, ...) +if _LINUX: + _OS_GETTERS = [_ip_getnode, _ifconfig_getnode] +elif _DARWIN: + _OS_GETTERS = [_ifconfig_getnode, _arp_getnode, _netstat_getnode] +elif _WINDOWS: + _OS_GETTERS = [_netbios_getnode, _ipconfig_getnode] +elif _AIX: + _OS_GETTERS = [_netstat_getnode] +else: + _OS_GETTERS = [_ifconfig_getnode, _ip_getnode, _arp_getnode, + _netstat_getnode, _lanscan_getnode] +if os.name == 'posix': + _GETTERS = [_unix_getnode] + _OS_GETTERS +elif os.name == 'nt': + _GETTERS = [_windll_getnode] + _OS_GETTERS +else: + _GETTERS = _OS_GETTERS -_NODE_GETTERS_UNIX = [_unix_getnode, _ifconfig_getnode, _ip_getnode, - _arp_getnode, _lanscan_getnode, _netstat_getnode] +_node = None def getnode(*, getters=None): """Get the hardware address as a 48-bit positive integer. @@ -692,12 +718,7 @@ def getnode(*, getters=None): if _node is not None: return _node - if sys.platform == 'win32': - getters = _NODE_GETTERS_WIN32 - else: - getters = _NODE_GETTERS_UNIX - - for getter in getters + [_random_getnode]: + for getter in _GETTERS + [_random_getnode]: try: _node = getter() except: diff --git a/Misc/NEWS.d/next/Tests/2019-04-11-07-59-43.bpo-28009.s85urF.rst b/Misc/NEWS.d/next/Tests/2019-04-11-07-59-43.bpo-28009.s85urF.rst new file mode 100644 index 000000000000..233640716d15 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-04-11-07-59-43.bpo-28009.s85urF.rst @@ -0,0 +1,3 @@ +Modify the test_uuid logic to test when a program is available +AND can be used to obtain a MACADDR as basis for an UUID. +Patch by M. Felt From webhook-mailer at python.org Sat Jun 15 12:29:32 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Sat, 15 Jun 2019 16:29:32 -0000 Subject: [Python-checkins] [2.7] bpo-35647: Fix path check in cookiejar. (GH-11436) (GH-13427) Message-ID: https://github.com/python/cpython/commit/ee15aa2b8501718cb77e339381f72409a416f801 commit: ee15aa2b8501718cb77e339381f72409a416f801 branch: 2.7 author: Xtreak committer: Serhiy Storchaka date: 2019-06-15T19:29:29+03:00 summary: [2.7] bpo-35647: Fix path check in cookiejar. (GH-11436) (GH-13427) files: A Misc/NEWS.d/next/Security/2019-05-20-00-49-29.bpo-35647.oWmiGU.rst M Lib/cookielib.py M Lib/test/test_cookielib.py diff --git a/Lib/cookielib.py b/Lib/cookielib.py index 0b471a42f296..1d56d3fe4c0a 100644 --- a/Lib/cookielib.py +++ b/Lib/cookielib.py @@ -984,7 +984,7 @@ def set_ok_path(self, cookie, request): req_path = request_path(request) if ((cookie.version > 0 or (cookie.version == 0 and self.strict_ns_set_path)) and - not req_path.startswith(cookie.path)): + not self.path_return_ok(cookie.path, request)): _debug(" path attribute %s is not a prefix of request " "path %s", cookie.path, req_path) return False @@ -1191,11 +1191,15 @@ def domain_return_ok(self, domain, request): def path_return_ok(self, path, request): _debug("- checking cookie path=%s", path) req_path = request_path(request) - if not req_path.startswith(path): - _debug(" %s does not path-match %s", req_path, path) - return False - return True + pathlen = len(path) + if req_path == path: + return True + elif (req_path.startswith(path) and + (path.endswith("/") or req_path[pathlen:pathlen+1] == "/")): + return True + _debug(" %s does not path-match %s", req_path, path) + return False def vals_sorted_by_key(adict): keys = adict.keys() diff --git a/Lib/test/test_cookielib.py b/Lib/test/test_cookielib.py index 7f7ff614d61d..a93bbfb640b6 100644 --- a/Lib/test/test_cookielib.py +++ b/Lib/test/test_cookielib.py @@ -649,6 +649,35 @@ def test_request_path(self): req = Request("http://www.example.com") self.assertEqual(request_path(req), "/") + def test_path_prefix_match(self): + from cookielib import CookieJar, DefaultCookiePolicy + from urllib2 import Request + + pol = DefaultCookiePolicy() + strict_ns_path_pol = DefaultCookiePolicy(strict_ns_set_path=True) + + c = CookieJar(pol) + base_url = "http://bar.com" + interact_netscape(c, base_url, 'spam=eggs; Path=/foo') + cookie = c._cookies['bar.com']['/foo']['spam'] + + for path, ok in [('/foo', True), + ('/foo/', True), + ('/foo/bar', True), + ('/', False), + ('/foobad/foo', False)]: + url = '{0}{1}'.format(base_url, path) + req = Request(url) + h = interact_netscape(c, url) + if ok: + self.assertIn('spam=eggs', h, + "cookie not set for {0}".format(path)) + self.assertTrue(strict_ns_path_pol.set_ok_path(cookie, req)) + else: + self.assertNotIn('spam=eggs', h, + "cookie set for {0}".format(path)) + self.assertFalse(strict_ns_path_pol.set_ok_path(cookie, req)) + def test_request_port(self): from urllib2 import Request from cookielib import request_port, DEFAULT_HTTP_PORT diff --git a/Misc/NEWS.d/next/Security/2019-05-20-00-49-29.bpo-35647.oWmiGU.rst b/Misc/NEWS.d/next/Security/2019-05-20-00-49-29.bpo-35647.oWmiGU.rst new file mode 100644 index 000000000000..032e1e2c00bc --- /dev/null +++ b/Misc/NEWS.d/next/Security/2019-05-20-00-49-29.bpo-35647.oWmiGU.rst @@ -0,0 +1,3 @@ +Don't set cookie for a request when the request path is a prefix match of +the cookie's path attribute but doesn't end with "/". Patch by Karthikeyan +Singaravelan. From webhook-mailer at python.org Sat Jun 15 14:25:15 2019 From: webhook-mailer at python.org (Ned Deily) Date: Sat, 15 Jun 2019 18:25:15 -0000 Subject: [Python-checkins] [3.6] Doc: Add an optional obsolete header. (GH-13638). (GH-13657) Message-ID: https://github.com/python/cpython/commit/78309c9a09c896b30918ef1732df910e33cdaee1 commit: 78309c9a09c896b30918ef1732df910e33cdaee1 branch: 3.6 author: Julien Palard committer: Ned Deily date: 2019-06-15T14:25:02-04:00 summary: [3.6] Doc: Add an optional obsolete header. (GH-13638). (GH-13657) (cherry picked from commit 46ed90dd014010703c7a3b2a61c4927644fa8210) Co-authored-by: Julien Palard files: M Doc/README.rst M Doc/tools/templates/layout.html diff --git a/Doc/README.rst b/Doc/README.rst index d7bcc5ba7919..9fc39834f8b5 100644 --- a/Doc/README.rst +++ b/Doc/README.rst @@ -113,6 +113,15 @@ Then, from the ``Doc`` directory, run :: where ```` is one of html, text, latex, or htmlhelp (for explanations see the make targets above). +Deprecation header +================== + +You can define the ``outdated`` variable in ``html_context`` to show a +red banner on each page redirecting to the "latest" version. + +The link points to the same page on ``/3/``, sadly for the moment the +language is lost during the process. + Contributing ============ diff --git a/Doc/tools/templates/layout.html b/Doc/tools/templates/layout.html index c2106678ac60..e7c5d92c888f 100644 --- a/Doc/tools/templates/layout.html +++ b/Doc/tools/templates/layout.html @@ -1,4 +1,15 @@ {% extends "!layout.html" %} + +{% block header %} +{%- if outdated %} +
            + {% trans %}This document is for an old version of Python that is no longer supported. + You should upgrade, and read the {% endtrans %} + {% trans %} Python documentation for the current stable release {% endtrans %}. +
            +{%- endif %} +{% endblock %} + {% block rootrellink %}
          • From webhook-mailer at python.org Sat Jun 15 14:27:14 2019 From: webhook-mailer at python.org (Ned Deily) Date: Sat, 15 Jun 2019 18:27:14 -0000 Subject: [Python-checkins] [3.7] Doc: Add an optional obsolete header. (GH-13638). (GH-13655) Message-ID: https://github.com/python/cpython/commit/159ae24895272dce5fd53dd8e54809743e4f394f commit: 159ae24895272dce5fd53dd8e54809743e4f394f branch: 3.7 author: Julien Palard committer: Ned Deily date: 2019-06-15T14:27:10-04:00 summary: [3.7] Doc: Add an optional obsolete header. (GH-13638). (GH-13655) * [3.7] Doc: Add an optional obsolete header. (GH-13638). (cherry picked from commit 46ed90dd014010703c7a3b2a61c4927644fa8210) Co-authored-by: Julien Palard files: M Doc/README.rst M Doc/tools/templates/layout.html diff --git a/Doc/README.rst b/Doc/README.rst index d7bcc5ba7919..9fc39834f8b5 100644 --- a/Doc/README.rst +++ b/Doc/README.rst @@ -113,6 +113,15 @@ Then, from the ``Doc`` directory, run :: where ```` is one of html, text, latex, or htmlhelp (for explanations see the make targets above). +Deprecation header +================== + +You can define the ``outdated`` variable in ``html_context`` to show a +red banner on each page redirecting to the "latest" version. + +The link points to the same page on ``/3/``, sadly for the moment the +language is lost during the process. + Contributing ============ diff --git a/Doc/tools/templates/layout.html b/Doc/tools/templates/layout.html index 8cf903dec6ef..1ea681cdcf2e 100644 --- a/Doc/tools/templates/layout.html +++ b/Doc/tools/templates/layout.html @@ -1,4 +1,15 @@ {% extends "!layout.html" %} + +{% block header %} +{%- if outdated %} +
            + {% trans %}This document is for an old version of Python that is no longer supported. + You should upgrade, and read the {% endtrans %} + {% trans %} Python documentation for the current stable release {% endtrans %}. +
            +{%- endif %} +{% endblock %} + {% block rootrellink %}
          • From webhook-mailer at python.org Sat Jun 15 14:42:49 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sat, 15 Jun 2019 18:42:49 -0000 Subject: [Python-checkins] Doc: Deprecation header: More precise wording. (GH-14109) Message-ID: https://github.com/python/cpython/commit/a8e7ebe2880f4c1d3b91d40b9730bb4032d514d0 commit: a8e7ebe2880f4c1d3b91d40b9730bb4032d514d0 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-15T11:42:45-07:00 summary: Doc: Deprecation header: More precise wording. (GH-14109) (cherry picked from commit cfa0394b9760941bbdd089913a6420d2af54314a) Co-authored-by: Julien Palard files: M Doc/tools/templates/layout.html diff --git a/Doc/tools/templates/layout.html b/Doc/tools/templates/layout.html index a765a5de8a2d..77915c8431b6 100644 --- a/Doc/tools/templates/layout.html +++ b/Doc/tools/templates/layout.html @@ -5,7 +5,7 @@
            {% trans %}This document is for an old version of Python that is no longer supported. You should upgrade, and read the {% endtrans %} - {% trans %} Python documentation for the last stable release {% endtrans %}. + {% trans %} Python documentation for the current stable release {% endtrans %}.
            {%- endif %} {% endblock %} From webhook-mailer at python.org Sun Jun 16 02:49:03 2019 From: webhook-mailer at python.org (Tal Einat) Date: Sun, 16 Jun 2019 06:49:03 -0000 Subject: [Python-checkins] bpo-35922: Fix RobotFileParser when robots.txt has no relevant crawl delay or request rate (GH-11791) Message-ID: https://github.com/python/cpython/commit/8047e0e1c620f69cc21f9ca48b24bf2cdd5c3668 commit: 8047e0e1c620f69cc21f9ca48b24bf2cdd5c3668 branch: master author: R?mi Lapeyre committer: Tal Einat date: 2019-06-16T09:48:57+03:00 summary: bpo-35922: Fix RobotFileParser when robots.txt has no relevant crawl delay or request rate (GH-11791) Co-Authored-By: Tal Einat files: A Misc/NEWS.d/next/Library/2019-06-11-19-34-29.bpo-35922.rxpzWr.rst M Lib/test/test_robotparser.py M Lib/urllib/robotparser.py diff --git a/Lib/test/test_robotparser.py b/Lib/test/test_robotparser.py index 84a267ad9567..77cd7c4d29df 100644 --- a/Lib/test/test_robotparser.py +++ b/Lib/test/test_robotparser.py @@ -97,30 +97,38 @@ class RejectAllRobotsTest(BaseRobotTest, unittest.TestCase): class BaseRequestRateTest(BaseRobotTest): + request_rate = None + crawl_delay = None def test_request_rate(self): + parser = self.parser for url in self.good + self.bad: agent, url = self.get_agent_and_url(url) with self.subTest(url=url, agent=agent): - if self.crawl_delay: - self.assertEqual( - self.parser.crawl_delay(agent), self.crawl_delay - ) - if self.request_rate: + self.assertEqual(parser.crawl_delay(agent), self.crawl_delay) + + parsed_request_rate = parser.request_rate(agent) + self.assertEqual(parsed_request_rate, self.request_rate) + if self.request_rate is not None: self.assertIsInstance( - self.parser.request_rate(agent), + parsed_request_rate, urllib.robotparser.RequestRate ) self.assertEqual( - self.parser.request_rate(agent).requests, + parsed_request_rate.requests, self.request_rate.requests ) self.assertEqual( - self.parser.request_rate(agent).seconds, + parsed_request_rate.seconds, self.request_rate.seconds ) +class EmptyFileTest(BaseRequestRateTest, unittest.TestCase): + robots_txt = '' + good = ['/foo'] + + class CrawlDelayAndRequestRateTest(BaseRequestRateTest, unittest.TestCase): robots_txt = """\ User-agent: figtree @@ -141,10 +149,6 @@ class CrawlDelayAndRequestRateTest(BaseRequestRateTest, unittest.TestCase): class DifferentAgentTest(CrawlDelayAndRequestRateTest): agent = 'FigTree Robot libwww-perl/5.04' - # these are not actually tested, but we still need to parse it - # in order to accommodate the input parameters - request_rate = None - crawl_delay = None class InvalidRequestRateTest(BaseRobotTest, unittest.TestCase): diff --git a/Lib/urllib/robotparser.py b/Lib/urllib/robotparser.py index 7089916a4f81..c58565e39451 100644 --- a/Lib/urllib/robotparser.py +++ b/Lib/urllib/robotparser.py @@ -186,7 +186,9 @@ def crawl_delay(self, useragent): for entry in self.entries: if entry.applies_to(useragent): return entry.delay - return self.default_entry.delay + if self.default_entry: + return self.default_entry.delay + return None def request_rate(self, useragent): if not self.mtime(): @@ -194,7 +196,9 @@ def request_rate(self, useragent): for entry in self.entries: if entry.applies_to(useragent): return entry.req_rate - return self.default_entry.req_rate + if self.default_entry: + return self.default_entry.req_rate + return None def site_maps(self): if not self.sitemaps: diff --git a/Misc/NEWS.d/next/Library/2019-06-11-19-34-29.bpo-35922.rxpzWr.rst b/Misc/NEWS.d/next/Library/2019-06-11-19-34-29.bpo-35922.rxpzWr.rst new file mode 100644 index 000000000000..5271a495624d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-11-19-34-29.bpo-35922.rxpzWr.rst @@ -0,0 +1,4 @@ +Fix :meth:`RobotFileParser.crawl_delay` and +:meth:`RobotFileParser.request_rate` to return ``None`` rather than +raise :exc:`AttributeError` when no relevant rule is defined in the +robots.txt file. Patch by R?mi Lapeyre. From webhook-mailer at python.org Sun Jun 16 03:07:58 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 16 Jun 2019 07:07:58 -0000 Subject: [Python-checkins] bpo-35922: Fix RobotFileParser when robots.txt has no relevant crawl delay or request rate (GH-11791) Message-ID: https://github.com/python/cpython/commit/58a1a76baefc92d9e2392a5dbf65e39e44fb8f55 commit: 58a1a76baefc92d9e2392a5dbf65e39e44fb8f55 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-16T00:07:54-07:00 summary: bpo-35922: Fix RobotFileParser when robots.txt has no relevant crawl delay or request rate (GH-11791) Co-Authored-By: Tal Einat (cherry picked from commit 8047e0e1c620f69cc21f9ca48b24bf2cdd5c3668) Co-authored-by: R?mi Lapeyre files: A Misc/NEWS.d/next/Library/2019-06-11-19-34-29.bpo-35922.rxpzWr.rst M Lib/test/test_robotparser.py M Lib/urllib/robotparser.py diff --git a/Lib/test/test_robotparser.py b/Lib/test/test_robotparser.py index 84a267ad9567..77cd7c4d29df 100644 --- a/Lib/test/test_robotparser.py +++ b/Lib/test/test_robotparser.py @@ -97,30 +97,38 @@ class RejectAllRobotsTest(BaseRobotTest, unittest.TestCase): class BaseRequestRateTest(BaseRobotTest): + request_rate = None + crawl_delay = None def test_request_rate(self): + parser = self.parser for url in self.good + self.bad: agent, url = self.get_agent_and_url(url) with self.subTest(url=url, agent=agent): - if self.crawl_delay: - self.assertEqual( - self.parser.crawl_delay(agent), self.crawl_delay - ) - if self.request_rate: + self.assertEqual(parser.crawl_delay(agent), self.crawl_delay) + + parsed_request_rate = parser.request_rate(agent) + self.assertEqual(parsed_request_rate, self.request_rate) + if self.request_rate is not None: self.assertIsInstance( - self.parser.request_rate(agent), + parsed_request_rate, urllib.robotparser.RequestRate ) self.assertEqual( - self.parser.request_rate(agent).requests, + parsed_request_rate.requests, self.request_rate.requests ) self.assertEqual( - self.parser.request_rate(agent).seconds, + parsed_request_rate.seconds, self.request_rate.seconds ) +class EmptyFileTest(BaseRequestRateTest, unittest.TestCase): + robots_txt = '' + good = ['/foo'] + + class CrawlDelayAndRequestRateTest(BaseRequestRateTest, unittest.TestCase): robots_txt = """\ User-agent: figtree @@ -141,10 +149,6 @@ class CrawlDelayAndRequestRateTest(BaseRequestRateTest, unittest.TestCase): class DifferentAgentTest(CrawlDelayAndRequestRateTest): agent = 'FigTree Robot libwww-perl/5.04' - # these are not actually tested, but we still need to parse it - # in order to accommodate the input parameters - request_rate = None - crawl_delay = None class InvalidRequestRateTest(BaseRobotTest, unittest.TestCase): diff --git a/Lib/urllib/robotparser.py b/Lib/urllib/robotparser.py index 7089916a4f81..c58565e39451 100644 --- a/Lib/urllib/robotparser.py +++ b/Lib/urllib/robotparser.py @@ -186,7 +186,9 @@ def crawl_delay(self, useragent): for entry in self.entries: if entry.applies_to(useragent): return entry.delay - return self.default_entry.delay + if self.default_entry: + return self.default_entry.delay + return None def request_rate(self, useragent): if not self.mtime(): @@ -194,7 +196,9 @@ def request_rate(self, useragent): for entry in self.entries: if entry.applies_to(useragent): return entry.req_rate - return self.default_entry.req_rate + if self.default_entry: + return self.default_entry.req_rate + return None def site_maps(self): if not self.sitemaps: diff --git a/Misc/NEWS.d/next/Library/2019-06-11-19-34-29.bpo-35922.rxpzWr.rst b/Misc/NEWS.d/next/Library/2019-06-11-19-34-29.bpo-35922.rxpzWr.rst new file mode 100644 index 000000000000..5271a495624d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-11-19-34-29.bpo-35922.rxpzWr.rst @@ -0,0 +1,4 @@ +Fix :meth:`RobotFileParser.crawl_delay` and +:meth:`RobotFileParser.request_rate` to return ``None`` rather than +raise :exc:`AttributeError` when no relevant rule is defined in the +robots.txt file. Patch by R?mi Lapeyre. From webhook-mailer at python.org Sun Jun 16 03:10:10 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 16 Jun 2019 07:10:10 -0000 Subject: [Python-checkins] bpo-35922: Fix RobotFileParser when robots.txt has no relevant crawl delay or request rate (GH-11791) Message-ID: https://github.com/python/cpython/commit/45d6547acfb9ae1639adbe03dd14f38cd0642ca2 commit: 45d6547acfb9ae1639adbe03dd14f38cd0642ca2 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-16T00:10:06-07:00 summary: bpo-35922: Fix RobotFileParser when robots.txt has no relevant crawl delay or request rate (GH-11791) Co-Authored-By: Tal Einat (cherry picked from commit 8047e0e1c620f69cc21f9ca48b24bf2cdd5c3668) Co-authored-by: R?mi Lapeyre files: A Misc/NEWS.d/next/Library/2019-06-11-19-34-29.bpo-35922.rxpzWr.rst M Lib/test/test_robotparser.py M Lib/urllib/robotparser.py diff --git a/Lib/test/test_robotparser.py b/Lib/test/test_robotparser.py index 140636590aa8..d478e7f127fd 100644 --- a/Lib/test/test_robotparser.py +++ b/Lib/test/test_robotparser.py @@ -76,30 +76,38 @@ class RejectAllRobotsTest(BaseRobotTest, unittest.TestCase): class BaseRequestRateTest(BaseRobotTest): + request_rate = None + crawl_delay = None def test_request_rate(self): + parser = self.parser for url in self.good + self.bad: agent, url = self.get_agent_and_url(url) with self.subTest(url=url, agent=agent): - if self.crawl_delay: - self.assertEqual( - self.parser.crawl_delay(agent), self.crawl_delay - ) - if self.request_rate: + self.assertEqual(parser.crawl_delay(agent), self.crawl_delay) + + parsed_request_rate = parser.request_rate(agent) + self.assertEqual(parsed_request_rate, self.request_rate) + if self.request_rate is not None: self.assertIsInstance( - self.parser.request_rate(agent), + parsed_request_rate, urllib.robotparser.RequestRate ) self.assertEqual( - self.parser.request_rate(agent).requests, + parsed_request_rate.requests, self.request_rate.requests ) self.assertEqual( - self.parser.request_rate(agent).seconds, + parsed_request_rate.seconds, self.request_rate.seconds ) +class EmptyFileTest(BaseRequestRateTest, unittest.TestCase): + robots_txt = '' + good = ['/foo'] + + class CrawlDelayAndRequestRateTest(BaseRequestRateTest, unittest.TestCase): robots_txt = """\ User-agent: figtree @@ -120,10 +128,6 @@ class CrawlDelayAndRequestRateTest(BaseRequestRateTest, unittest.TestCase): class DifferentAgentTest(CrawlDelayAndRequestRateTest): agent = 'FigTree Robot libwww-perl/5.04' - # these are not actually tested, but we still need to parse it - # in order to accommodate the input parameters - request_rate = None - crawl_delay = None class InvalidRequestRateTest(BaseRobotTest, unittest.TestCase): diff --git a/Lib/urllib/robotparser.py b/Lib/urllib/robotparser.py index 883ef249210e..f3bd806f0726 100644 --- a/Lib/urllib/robotparser.py +++ b/Lib/urllib/robotparser.py @@ -179,7 +179,9 @@ def crawl_delay(self, useragent): for entry in self.entries: if entry.applies_to(useragent): return entry.delay - return self.default_entry.delay + if self.default_entry: + return self.default_entry.delay + return None def request_rate(self, useragent): if not self.mtime(): @@ -187,7 +189,9 @@ def request_rate(self, useragent): for entry in self.entries: if entry.applies_to(useragent): return entry.req_rate - return self.default_entry.req_rate + if self.default_entry: + return self.default_entry.req_rate + return None def __str__(self): entries = self.entries diff --git a/Misc/NEWS.d/next/Library/2019-06-11-19-34-29.bpo-35922.rxpzWr.rst b/Misc/NEWS.d/next/Library/2019-06-11-19-34-29.bpo-35922.rxpzWr.rst new file mode 100644 index 000000000000..5271a495624d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-11-19-34-29.bpo-35922.rxpzWr.rst @@ -0,0 +1,4 @@ +Fix :meth:`RobotFileParser.crawl_delay` and +:meth:`RobotFileParser.request_rate` to return ``None`` rather than +raise :exc:`AttributeError` when no relevant rule is defined in the +robots.txt file. Patch by R?mi Lapeyre. From webhook-mailer at python.org Sun Jun 16 04:25:11 2019 From: webhook-mailer at python.org (Julien Palard) Date: Sun, 16 Jun 2019 08:25:11 -0000 Subject: [Python-checkins] Doc: Remove an ugly space before a dot. (GH-14123) Message-ID: https://github.com/python/cpython/commit/552951563cd5968d25e95306362e41f07d661a88 commit: 552951563cd5968d25e95306362e41f07d661a88 branch: master author: Julien Palard committer: GitHub date: 2019-06-16T10:25:05+02:00 summary: Doc: Remove an ugly space before a dot. (GH-14123) files: M Doc/tools/templates/layout.html diff --git a/Doc/tools/templates/layout.html b/Doc/tools/templates/layout.html index 77915c8431b6..17592d74a4eb 100644 --- a/Doc/tools/templates/layout.html +++ b/Doc/tools/templates/layout.html @@ -5,7 +5,7 @@
            {% trans %}This document is for an old version of Python that is no longer supported. You should upgrade, and read the {% endtrans %} - {% trans %} Python documentation for the current stable release {% endtrans %}. + {% trans %} Python documentation for the current stable release{% endtrans %}.
            {%- endif %} {% endblock %} From webhook-mailer at python.org Sun Jun 16 04:32:34 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 16 Jun 2019 08:32:34 -0000 Subject: [Python-checkins] Doc: Remove an ugly space before a dot. (GH-14123) Message-ID: https://github.com/python/cpython/commit/b0cb988420d7f1fa8e09fd44d053c0af05c635f3 commit: b0cb988420d7f1fa8e09fd44d053c0af05c635f3 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-16T01:32:30-07:00 summary: Doc: Remove an ugly space before a dot. (GH-14123) (cherry picked from commit 552951563cd5968d25e95306362e41f07d661a88) Co-authored-by: Julien Palard files: M Doc/tools/templates/layout.html diff --git a/Doc/tools/templates/layout.html b/Doc/tools/templates/layout.html index 77915c8431b6..17592d74a4eb 100644 --- a/Doc/tools/templates/layout.html +++ b/Doc/tools/templates/layout.html @@ -5,7 +5,7 @@
            {% trans %}This document is for an old version of Python that is no longer supported. You should upgrade, and read the {% endtrans %} - {% trans %} Python documentation for the current stable release {% endtrans %}. + {% trans %} Python documentation for the current stable release{% endtrans %}.
            {%- endif %} {% endblock %} From webhook-mailer at python.org Sun Jun 16 06:06:10 2019 From: webhook-mailer at python.org (Mark Dickinson) Date: Sun, 16 Jun 2019 10:06:10 -0000 Subject: [Python-checkins] Simplify negativity checks in math.comb and math.perm. (GH-13870) Message-ID: https://github.com/python/cpython/commit/45e0411eee023b21acf1615e995d26058d66c0f1 commit: 45e0411eee023b21acf1615e995d26058d66c0f1 branch: master author: Mark Dickinson committer: GitHub date: 2019-06-16T11:06:06+01:00 summary: Simplify negativity checks in math.comb and math.perm. (GH-13870) files: M Modules/mathmodule.c diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index ed1147675308..76d821c65b4c 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -3056,6 +3056,12 @@ math_perm_impl(PyObject *module, PyObject *n, PyObject *k) "n must be a non-negative integer"); goto error; } + if (Py_SIZE(k) < 0) { + PyErr_SetString(PyExc_ValueError, + "k must be a non-negative integer"); + goto error; + } + cmp = PyObject_RichCompareBool(n, k, Py_LT); if (cmp != 0) { if (cmp > 0) { @@ -3072,11 +3078,8 @@ math_perm_impl(PyObject *module, PyObject *n, PyObject *k) LLONG_MAX); goto error; } - else if (overflow < 0 || factors < 0) { - if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_ValueError, - "k must be a non-negative integer"); - } + else if (factors == -1) { + /* k is nonnegative, so a return value of -1 can only indicate error */ goto error; } @@ -3176,6 +3179,12 @@ math_comb_impl(PyObject *module, PyObject *n, PyObject *k) "n must be a non-negative integer"); goto error; } + if (Py_SIZE(k) < 0) { + PyErr_SetString(PyExc_ValueError, + "k must be a non-negative integer"); + goto error; + } + /* k = min(k, n - k) */ temp = PyNumber_Subtract(n, k); if (temp == NULL) { @@ -3204,11 +3213,8 @@ math_comb_impl(PyObject *module, PyObject *n, PyObject *k) LLONG_MAX); goto error; } - else if (overflow < 0 || factors < 0) { - if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_ValueError, - "k must be a non-negative integer"); - } + if (factors == -1) { + /* k is nonnegative, so a return value of -1 can only indicate error */ goto error; } From webhook-mailer at python.org Sun Jun 16 07:38:11 2019 From: webhook-mailer at python.org (Mark Dickinson) Date: Sun, 16 Jun 2019 11:38:11 -0000 Subject: [Python-checkins] Simplify negativity checks in math.comb and math.perm. (GH-13870) (#14125) Message-ID: https://github.com/python/cpython/commit/599f7ecb70f1b9714c702322b235b4d8155205ae commit: 599f7ecb70f1b9714c702322b235b4d8155205ae branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Mark Dickinson date: 2019-06-16T12:38:07+01:00 summary: Simplify negativity checks in math.comb and math.perm. (GH-13870) (#14125) (cherry picked from commit 45e0411eee023b21acf1615e995d26058d66c0f1) Co-authored-by: Mark Dickinson files: M Modules/mathmodule.c diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index ed1147675308..76d821c65b4c 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -3056,6 +3056,12 @@ math_perm_impl(PyObject *module, PyObject *n, PyObject *k) "n must be a non-negative integer"); goto error; } + if (Py_SIZE(k) < 0) { + PyErr_SetString(PyExc_ValueError, + "k must be a non-negative integer"); + goto error; + } + cmp = PyObject_RichCompareBool(n, k, Py_LT); if (cmp != 0) { if (cmp > 0) { @@ -3072,11 +3078,8 @@ math_perm_impl(PyObject *module, PyObject *n, PyObject *k) LLONG_MAX); goto error; } - else if (overflow < 0 || factors < 0) { - if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_ValueError, - "k must be a non-negative integer"); - } + else if (factors == -1) { + /* k is nonnegative, so a return value of -1 can only indicate error */ goto error; } @@ -3176,6 +3179,12 @@ math_comb_impl(PyObject *module, PyObject *n, PyObject *k) "n must be a non-negative integer"); goto error; } + if (Py_SIZE(k) < 0) { + PyErr_SetString(PyExc_ValueError, + "k must be a non-negative integer"); + goto error; + } + /* k = min(k, n - k) */ temp = PyNumber_Subtract(n, k); if (temp == NULL) { @@ -3204,11 +3213,8 @@ math_comb_impl(PyObject *module, PyObject *n, PyObject *k) LLONG_MAX); goto error; } - else if (overflow < 0 || factors < 0) { - if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_ValueError, - "k must be a non-negative integer"); - } + if (factors == -1) { + /* k is nonnegative, so a return value of -1 can only indicate error */ goto error; } From webhook-mailer at python.org Sun Jun 16 10:37:07 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 16 Jun 2019 14:37:07 -0000 Subject: [Python-checkins] Doc: Remove an ugly space before a dot. (GH-14123) Message-ID: https://github.com/python/cpython/commit/c289588905daac804ef9c4ebaf51fc13f93b4a01 commit: c289588905daac804ef9c4ebaf51fc13f93b4a01 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-16T07:37:02-07:00 summary: Doc: Remove an ugly space before a dot. (GH-14123) (cherry picked from commit 552951563cd5968d25e95306362e41f07d661a88) Co-authored-by: Julien Palard files: M Doc/tools/templates/layout.html diff --git a/Doc/tools/templates/layout.html b/Doc/tools/templates/layout.html index 1ea681cdcf2e..32e178b38eb8 100644 --- a/Doc/tools/templates/layout.html +++ b/Doc/tools/templates/layout.html @@ -5,7 +5,7 @@
            {% trans %}This document is for an old version of Python that is no longer supported. You should upgrade, and read the {% endtrans %} - {% trans %} Python documentation for the current stable release {% endtrans %}. + {% trans %} Python documentation for the current stable release{% endtrans %}.
            {%- endif %} {% endblock %} From webhook-mailer at python.org Sun Jun 16 12:53:27 2019 From: webhook-mailer at python.org (Mark Dickinson) Date: Sun, 16 Jun 2019 16:53:27 -0000 Subject: [Python-checkins] Turn math.isqrt assertion into a comment to clarify its purpose. (GH-14131) Message-ID: https://github.com/python/cpython/commit/2dfeaa9222e2ed6b6e32faaf08e5b0f77318f0a7 commit: 2dfeaa9222e2ed6b6e32faaf08e5b0f77318f0a7 branch: master author: Mark Dickinson committer: GitHub date: 2019-06-16T17:53:21+01:00 summary: Turn math.isqrt assertion into a comment to clarify its purpose. (GH-14131) files: M Modules/mathmodule.c diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index 76d821c65b4c..82a9a14724f5 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -1527,10 +1527,10 @@ Here's Python code equivalent to the C implementation below: a = 1 d = 0 for s in reversed(range(c.bit_length())): + # Loop invariant: (a-1)**2 < (n >> 2*(c - d)) < (a+1)**2 e = d d = c >> s a = (a << d - e - 1) + (n >> 2*c - e - d + 1) // a - assert (a-1)**2 < n >> 2*(c - d) < (a+1)**2 return a - (a*a > n) From webhook-mailer at python.org Sun Jun 16 13:03:27 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Sun, 16 Jun 2019 17:03:27 -0000 Subject: [Python-checkins] bpo-28805: document METH_FASTCALL (GH-14079) Message-ID: https://github.com/python/cpython/commit/5600b5e1b24a3491e83f1b3038a7ea047a34c0bf commit: 5600b5e1b24a3491e83f1b3038a7ea047a34c0bf branch: master author: Jeroen Demeyer committer: Inada Naoki date: 2019-06-17T02:03:22+09:00 summary: bpo-28805: document METH_FASTCALL (GH-14079) files: A Misc/NEWS.d/next/C API/2019-06-14-14-03-51.bpo-28805.qZC0N_.rst M Doc/c-api/structures.rst diff --git a/Doc/c-api/structures.rst b/Doc/c-api/structures.rst index 5e0cfd0264f9..5184ad511cd9 100644 --- a/Doc/c-api/structures.rst +++ b/Doc/c-api/structures.rst @@ -114,10 +114,20 @@ the definition of all other Python objects. .. c:type:: PyCFunctionWithKeywords - Type of the functions used to implement Python callables in C that take - keyword arguments: they take three :c:type:`PyObject\*` parameters and return - one such value. See :c:type:`PyCFunction` above for the meaning of the return - value. + Type of the functions used to implement Python callables in C + with signature :const:`METH_VARARGS | METH_KEYWORDS`. + + +.. c:type:: _PyCFunctionFast + + Type of the functions used to implement Python callables in C + with signature :const:`METH_FASTCALL`. + + +.. c:type:: _PyCFunctionFastWithKeywords + + Type of the functions used to implement Python callables in C + with signature :const:`METH_FASTCALL | METH_KEYWORDS`. .. c:type:: PyMethodDef @@ -149,10 +159,11 @@ specific C type of the *self* object. The :attr:`ml_flags` field is a bitfield which can include the following flags. The individual flags indicate either a calling convention or a binding -convention. Of the calling convention flags, only :const:`METH_VARARGS` and -:const:`METH_KEYWORDS` can be combined. Any of the calling convention flags -can be combined with a binding flag. +convention. +There are four basic calling conventions for positional arguments +and two of them can be combined with :const:`METH_KEYWORDS` to support +also keyword arguments. So there are a total of 6 calling conventions: .. data:: METH_VARARGS @@ -164,13 +175,41 @@ can be combined with a binding flag. using :c:func:`PyArg_ParseTuple` or :c:func:`PyArg_UnpackTuple`. -.. data:: METH_KEYWORDS +.. data:: METH_VARARGS | METH_KEYWORDS Methods with these flags must be of type :c:type:`PyCFunctionWithKeywords`. - The function expects three parameters: *self*, *args*, and a dictionary of - all the keyword arguments. The flag must be combined with - :const:`METH_VARARGS`, and the parameters are typically processed using - :c:func:`PyArg_ParseTupleAndKeywords`. + The function expects three parameters: *self*, *args*, *kwargs* where + *kwargs* is a dictionary of all the keyword arguments or possibly *NULL* + if there are no keyword arguments. The parameters are typically processed + using :c:func:`PyArg_ParseTupleAndKeywords`. + + +.. data:: METH_FASTCALL + + Fast calling convention supporting only positional arguments. + The methods have the type :c:type:`_PyCFunctionFast`. + The first parameter is *self*, the second parameter is a C array + of :c:type:`PyObject\*` values indicating the arguments and the third + parameter is the number of arguments (the length of the array). + + This is not part of the :ref:`limited API `. + + .. versionadded:: 3.7 + + +.. data:: METH_FASTCALL | METH_KEYWORDS + + Extension of :const:`METH_FASTCALL` supporting also keyword arguments, + with methods of type :c:type:`_PyCFunctionFastWithKeywords`. + Keyword arguments are passed the same way as in the vectorcall protocol: + there is an additional fourth :c:type:`PyObject\*` parameter + which is a tuple representing the names of the keyword arguments + or possibly *NULL* if there are no keywords. The values of the keyword + arguments are stored in the *args* array, after the positional arguments. + + This is not part of the :ref:`limited API `. + + .. versionadded:: 3.7 .. data:: METH_NOARGS diff --git a/Misc/NEWS.d/next/C API/2019-06-14-14-03-51.bpo-28805.qZC0N_.rst b/Misc/NEWS.d/next/C API/2019-06-14-14-03-51.bpo-28805.qZC0N_.rst new file mode 100644 index 000000000000..6d6c4ad4af60 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2019-06-14-14-03-51.bpo-28805.qZC0N_.rst @@ -0,0 +1 @@ +The :const:`METH_FASTCALL` calling convention has been documented. From webhook-mailer at python.org Sun Jun 16 13:14:06 2019 From: webhook-mailer at python.org (Mark Dickinson) Date: Sun, 16 Jun 2019 17:14:06 -0000 Subject: [Python-checkins] Turn math.isqrt assertion into a comment to clarify its purpose. (GH-14131) Message-ID: https://github.com/python/cpython/commit/3f3efed3315f06ca3412bc8f4506e994ab84a8b3 commit: 3f3efed3315f06ca3412bc8f4506e994ab84a8b3 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Mark Dickinson date: 2019-06-16T18:14:02+01:00 summary: Turn math.isqrt assertion into a comment to clarify its purpose. (GH-14131) (cherry picked from commit 2dfeaa9222e2ed6b6e32faaf08e5b0f77318f0a7) Co-authored-by: Mark Dickinson files: M Modules/mathmodule.c diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index 76d821c65b4c..82a9a14724f5 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -1527,10 +1527,10 @@ Here's Python code equivalent to the C implementation below: a = 1 d = 0 for s in reversed(range(c.bit_length())): + # Loop invariant: (a-1)**2 < (n >> 2*(c - d)) < (a+1)**2 e = d d = c >> s a = (a << d - e - 1) + (n >> 2*c - e - d + 1) // a - assert (a-1)**2 < n >> 2*(c - d) < (a+1)**2 return a - (a*a > n) From webhook-mailer at python.org Sun Jun 16 14:56:09 2019 From: webhook-mailer at python.org (Ned Deily) Date: Sun, 16 Jun 2019 18:56:09 -0000 Subject: [Python-checkins] Doc: Remove an ugly space before a dot. (GH-14123) (GH-14130) Message-ID: https://github.com/python/cpython/commit/ecafe8e42464b2c91a507fd26de06ce1203dd654 commit: ecafe8e42464b2c91a507fd26de06ce1203dd654 branch: 3.6 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Ned Deily date: 2019-06-16T14:55:59-04:00 summary: Doc: Remove an ugly space before a dot. (GH-14123) (GH-14130) (cherry picked from commit 552951563cd5968d25e95306362e41f07d661a88) Co-authored-by: Julien Palard files: M Doc/tools/templates/layout.html diff --git a/Doc/tools/templates/layout.html b/Doc/tools/templates/layout.html index e7c5d92c888f..7a7feb52e1a3 100644 --- a/Doc/tools/templates/layout.html +++ b/Doc/tools/templates/layout.html @@ -5,7 +5,7 @@
            {% trans %}This document is for an old version of Python that is no longer supported. You should upgrade, and read the {% endtrans %} - {% trans %} Python documentation for the current stable release {% endtrans %}. + {% trans %} Python documentation for the current stable release{% endtrans %}.
            {%- endif %} {% endblock %} From webhook-mailer at python.org Sun Jun 16 16:19:34 2019 From: webhook-mailer at python.org (Benjamin Peterson) Date: Sun, 16 Jun 2019 20:19:34 -0000 Subject: [Python-checkins] closes bpo-37300: Remove unnecessary Py_XINCREF in classobject.c. (GH-14120) Message-ID: https://github.com/python/cpython/commit/c83356cae2e375324ff4a3fb5d574ebde5c827a9 commit: c83356cae2e375324ff4a3fb5d574ebde5c827a9 branch: master author: Hai Shi committer: Benjamin Peterson date: 2019-06-16T13:19:19-07:00 summary: closes bpo-37300: Remove unnecessary Py_XINCREF in classobject.c. (GH-14120) files: A Misc/NEWS.d/next/Core and Builtins/2019-06-16-02-38-25.bpo-37300.WJkgKV.rst M Objects/classobject.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-06-16-02-38-25.bpo-37300.WJkgKV.rst b/Misc/NEWS.d/next/Core and Builtins/2019-06-16-02-38-25.bpo-37300.WJkgKV.rst new file mode 100644 index 000000000000..aae278e84981 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-06-16-02-38-25.bpo-37300.WJkgKV.rst @@ -0,0 +1 @@ +Remove an unnecssary Py_XINCREF in classobject.c. diff --git a/Objects/classobject.c b/Objects/classobject.c index 2415ed14cb15..f26a85c62371 100644 --- a/Objects/classobject.c +++ b/Objects/classobject.c @@ -110,7 +110,7 @@ PyMethod_New(PyObject *func, PyObject *self) im->im_weakreflist = NULL; Py_INCREF(func); im->im_func = func; - Py_XINCREF(self); + Py_INCREF(self); im->im_self = self; im->vectorcall = method_vectorcall; _PyObject_GC_TRACK(im); From webhook-mailer at python.org Sun Jun 16 16:34:17 2019 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Sun, 16 Jun 2019 20:34:17 -0000 Subject: [Python-checkins] bpo-37220: Fix 2.7 test -R crash on Windows. (GH-13957) Message-ID: https://github.com/python/cpython/commit/66d47da86aff15be34adbec02596bb3188684c0d commit: 66d47da86aff15be34adbec02596bb3188684c0d branch: master author: Terry Jan Reedy committer: GitHub date: 2019-06-16T16:33:56-04:00 summary: bpo-37220: Fix 2.7 test -R crash on Windows. (GH-13957) The patch needed for 2.7 should make the test more stable on 3.x also. files: M Lib/idlelib/idle_test/test_searchbase.py diff --git a/Lib/idlelib/idle_test/test_searchbase.py b/Lib/idlelib/idle_test/test_searchbase.py index e08268fde257..aee0c4c69929 100644 --- a/Lib/idlelib/idle_test/test_searchbase.py +++ b/Lib/idlelib/idle_test/test_searchbase.py @@ -48,7 +48,6 @@ def test_open_and_close(self): self.dialog.default_command = None toplevel = Toplevel(self.root) - self.addCleanup(toplevel.destroy) text = Text(toplevel) self.dialog.open(text) self.assertEqual(self.dialog.top.state(), 'normal') @@ -57,7 +56,8 @@ def test_open_and_close(self): self.dialog.open(text, searchphrase="hello") self.assertEqual(self.dialog.ent.get(), 'hello') - self.dialog.close() + toplevel.update_idletasks() + toplevel.destroy() def test_create_widgets(self): self.dialog.create_entries = Func() From webhook-mailer at python.org Sun Jun 16 16:36:27 2019 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Sun, 16 Jun 2019 20:36:27 -0000 Subject: [Python-checkins] [2.7] Fix 2.7 test -R test_IDLE failure on Windows (GH-13958) Message-ID: https://github.com/python/cpython/commit/722733e940199ce8957254236e2aa7c453044fde commit: 722733e940199ce8957254236e2aa7c453044fde branch: 2.7 author: Terry Jan Reedy committer: GitHub date: 2019-06-16T16:36:23-04:00 summary: [2.7] Fix 2.7 test -R test_IDLE failure on Windows (GH-13958) Cherry-picked from 66d47da. files: M Lib/idlelib/idle_test/test_searchdialogbase.py diff --git a/Lib/idlelib/idle_test/test_searchdialogbase.py b/Lib/idlelib/idle_test/test_searchdialogbase.py index 7ca6bbf69347..59b9bbf30f2e 100644 --- a/Lib/idlelib/idle_test/test_searchdialogbase.py +++ b/Lib/idlelib/idle_test/test_searchdialogbase.py @@ -46,7 +46,6 @@ def test_open_and_close(self): self.dialog.default_command = None toplevel = Toplevel(self.root) - self.addCleanup(toplevel.destroy) text = Text(toplevel) self.dialog.open(text) self.assertEqual(self.dialog.top.state(), 'normal') @@ -55,7 +54,8 @@ def test_open_and_close(self): self.dialog.open(text, searchphrase="hello") self.assertEqual(self.dialog.ent.get(), 'hello') - self.dialog.close() + toplevel.update_idletasks() + toplevel.destroy() def test_create_widgets(self): self.dialog.create_entries = Func() From webhook-mailer at python.org Sun Jun 16 16:52:35 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 16 Jun 2019 20:52:35 -0000 Subject: [Python-checkins] bpo-37220: Fix 2.7 test -R crash on Windows. (GH-13957) Message-ID: https://github.com/python/cpython/commit/0c45aee8036a27fb76d6d8d4bac61c3715aec22d commit: 0c45aee8036a27fb76d6d8d4bac61c3715aec22d branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-16T13:52:25-07:00 summary: bpo-37220: Fix 2.7 test -R crash on Windows. (GH-13957) The patch needed for 2.7 should make the test more stable on 3.x also. (cherry picked from commit 66d47da86aff15be34adbec02596bb3188684c0d) Co-authored-by: Terry Jan Reedy files: M Lib/idlelib/idle_test/test_searchbase.py diff --git a/Lib/idlelib/idle_test/test_searchbase.py b/Lib/idlelib/idle_test/test_searchbase.py index e08268fde257..aee0c4c69929 100644 --- a/Lib/idlelib/idle_test/test_searchbase.py +++ b/Lib/idlelib/idle_test/test_searchbase.py @@ -48,7 +48,6 @@ def test_open_and_close(self): self.dialog.default_command = None toplevel = Toplevel(self.root) - self.addCleanup(toplevel.destroy) text = Text(toplevel) self.dialog.open(text) self.assertEqual(self.dialog.top.state(), 'normal') @@ -57,7 +56,8 @@ def test_open_and_close(self): self.dialog.open(text, searchphrase="hello") self.assertEqual(self.dialog.ent.get(), 'hello') - self.dialog.close() + toplevel.update_idletasks() + toplevel.destroy() def test_create_widgets(self): self.dialog.create_entries = Func() From webhook-mailer at python.org Sun Jun 16 17:10:53 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 16 Jun 2019 21:10:53 -0000 Subject: [Python-checkins] bpo-37220: Fix 2.7 test -R crash on Windows. (GH-13957) Message-ID: https://github.com/python/cpython/commit/2acaf496b71224ff6d170ea12b0876d65195be7b commit: 2acaf496b71224ff6d170ea12b0876d65195be7b branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-16T14:10:49-07:00 summary: bpo-37220: Fix 2.7 test -R crash on Windows. (GH-13957) The patch needed for 2.7 should make the test more stable on 3.x also. (cherry picked from commit 66d47da86aff15be34adbec02596bb3188684c0d) Co-authored-by: Terry Jan Reedy files: M Lib/idlelib/idle_test/test_searchbase.py diff --git a/Lib/idlelib/idle_test/test_searchbase.py b/Lib/idlelib/idle_test/test_searchbase.py index e08268fde257..aee0c4c69929 100644 --- a/Lib/idlelib/idle_test/test_searchbase.py +++ b/Lib/idlelib/idle_test/test_searchbase.py @@ -48,7 +48,6 @@ def test_open_and_close(self): self.dialog.default_command = None toplevel = Toplevel(self.root) - self.addCleanup(toplevel.destroy) text = Text(toplevel) self.dialog.open(text) self.assertEqual(self.dialog.top.state(), 'normal') @@ -57,7 +56,8 @@ def test_open_and_close(self): self.dialog.open(text, searchphrase="hello") self.assertEqual(self.dialog.ent.get(), 'hello') - self.dialog.close() + toplevel.update_idletasks() + toplevel.destroy() def test_create_widgets(self): self.dialog.create_entries = Func() From webhook-mailer at python.org Sun Jun 16 19:24:11 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 16 Jun 2019 23:24:11 -0000 Subject: [Python-checkins] bpo-28805: document METH_FASTCALL (GH-14079) Message-ID: https://github.com/python/cpython/commit/b101fa7783615051a89500e488708b955eac94c5 commit: b101fa7783615051a89500e488708b955eac94c5 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-16T16:24:06-07:00 summary: bpo-28805: document METH_FASTCALL (GH-14079) (cherry picked from commit 5600b5e1b24a3491e83f1b3038a7ea047a34c0bf) Co-authored-by: Jeroen Demeyer files: A Misc/NEWS.d/next/C API/2019-06-14-14-03-51.bpo-28805.qZC0N_.rst M Doc/c-api/structures.rst diff --git a/Doc/c-api/structures.rst b/Doc/c-api/structures.rst index da45da1d3c70..274beeef5d5b 100644 --- a/Doc/c-api/structures.rst +++ b/Doc/c-api/structures.rst @@ -114,10 +114,20 @@ the definition of all other Python objects. .. c:type:: PyCFunctionWithKeywords - Type of the functions used to implement Python callables in C that take - keyword arguments: they take three :c:type:`PyObject\*` parameters and return - one such value. See :c:type:`PyCFunction` above for the meaning of the return - value. + Type of the functions used to implement Python callables in C + with signature :const:`METH_VARARGS | METH_KEYWORDS`. + + +.. c:type:: _PyCFunctionFast + + Type of the functions used to implement Python callables in C + with signature :const:`METH_FASTCALL`. + + +.. c:type:: _PyCFunctionFastWithKeywords + + Type of the functions used to implement Python callables in C + with signature :const:`METH_FASTCALL | METH_KEYWORDS`. .. c:type:: PyMethodDef @@ -149,10 +159,11 @@ specific C type of the *self* object. The :attr:`ml_flags` field is a bitfield which can include the following flags. The individual flags indicate either a calling convention or a binding -convention. Of the calling convention flags, only :const:`METH_VARARGS` and -:const:`METH_KEYWORDS` can be combined. Any of the calling convention flags -can be combined with a binding flag. +convention. +There are four basic calling conventions for positional arguments +and two of them can be combined with :const:`METH_KEYWORDS` to support +also keyword arguments. So there are a total of 6 calling conventions: .. data:: METH_VARARGS @@ -164,13 +175,41 @@ can be combined with a binding flag. using :c:func:`PyArg_ParseTuple` or :c:func:`PyArg_UnpackTuple`. -.. data:: METH_KEYWORDS +.. data:: METH_VARARGS | METH_KEYWORDS Methods with these flags must be of type :c:type:`PyCFunctionWithKeywords`. - The function expects three parameters: *self*, *args*, and a dictionary of - all the keyword arguments. The flag must be combined with - :const:`METH_VARARGS`, and the parameters are typically processed using - :c:func:`PyArg_ParseTupleAndKeywords`. + The function expects three parameters: *self*, *args*, *kwargs* where + *kwargs* is a dictionary of all the keyword arguments or possibly *NULL* + if there are no keyword arguments. The parameters are typically processed + using :c:func:`PyArg_ParseTupleAndKeywords`. + + +.. data:: METH_FASTCALL + + Fast calling convention supporting only positional arguments. + The methods have the type :c:type:`_PyCFunctionFast`. + The first parameter is *self*, the second parameter is a C array + of :c:type:`PyObject\*` values indicating the arguments and the third + parameter is the number of arguments (the length of the array). + + This is not part of the :ref:`limited API `. + + .. versionadded:: 3.7 + + +.. data:: METH_FASTCALL | METH_KEYWORDS + + Extension of :const:`METH_FASTCALL` supporting also keyword arguments, + with methods of type :c:type:`_PyCFunctionFastWithKeywords`. + Keyword arguments are passed the same way as in the vectorcall protocol: + there is an additional fourth :c:type:`PyObject\*` parameter + which is a tuple representing the names of the keyword arguments + or possibly *NULL* if there are no keywords. The values of the keyword + arguments are stored in the *args* array, after the positional arguments. + + This is not part of the :ref:`limited API `. + + .. versionadded:: 3.7 .. data:: METH_NOARGS diff --git a/Misc/NEWS.d/next/C API/2019-06-14-14-03-51.bpo-28805.qZC0N_.rst b/Misc/NEWS.d/next/C API/2019-06-14-14-03-51.bpo-28805.qZC0N_.rst new file mode 100644 index 000000000000..6d6c4ad4af60 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2019-06-14-14-03-51.bpo-28805.qZC0N_.rst @@ -0,0 +1 @@ +The :const:`METH_FASTCALL` calling convention has been documented. From webhook-mailer at python.org Sun Jun 16 19:25:41 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Sun, 16 Jun 2019 23:25:41 -0000 Subject: [Python-checkins] bpo-28805: document METH_FASTCALL (GH-14079) Message-ID: https://github.com/python/cpython/commit/e784f9f1c3fdd2102aae3fc0fe226408ff3a6029 commit: e784f9f1c3fdd2102aae3fc0fe226408ff3a6029 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-16T16:25:37-07:00 summary: bpo-28805: document METH_FASTCALL (GH-14079) (cherry picked from commit 5600b5e1b24a3491e83f1b3038a7ea047a34c0bf) Co-authored-by: Jeroen Demeyer files: A Misc/NEWS.d/next/C API/2019-06-14-14-03-51.bpo-28805.qZC0N_.rst M Doc/c-api/structures.rst diff --git a/Doc/c-api/structures.rst b/Doc/c-api/structures.rst index 5e0cfd0264f9..5184ad511cd9 100644 --- a/Doc/c-api/structures.rst +++ b/Doc/c-api/structures.rst @@ -114,10 +114,20 @@ the definition of all other Python objects. .. c:type:: PyCFunctionWithKeywords - Type of the functions used to implement Python callables in C that take - keyword arguments: they take three :c:type:`PyObject\*` parameters and return - one such value. See :c:type:`PyCFunction` above for the meaning of the return - value. + Type of the functions used to implement Python callables in C + with signature :const:`METH_VARARGS | METH_KEYWORDS`. + + +.. c:type:: _PyCFunctionFast + + Type of the functions used to implement Python callables in C + with signature :const:`METH_FASTCALL`. + + +.. c:type:: _PyCFunctionFastWithKeywords + + Type of the functions used to implement Python callables in C + with signature :const:`METH_FASTCALL | METH_KEYWORDS`. .. c:type:: PyMethodDef @@ -149,10 +159,11 @@ specific C type of the *self* object. The :attr:`ml_flags` field is a bitfield which can include the following flags. The individual flags indicate either a calling convention or a binding -convention. Of the calling convention flags, only :const:`METH_VARARGS` and -:const:`METH_KEYWORDS` can be combined. Any of the calling convention flags -can be combined with a binding flag. +convention. +There are four basic calling conventions for positional arguments +and two of them can be combined with :const:`METH_KEYWORDS` to support +also keyword arguments. So there are a total of 6 calling conventions: .. data:: METH_VARARGS @@ -164,13 +175,41 @@ can be combined with a binding flag. using :c:func:`PyArg_ParseTuple` or :c:func:`PyArg_UnpackTuple`. -.. data:: METH_KEYWORDS +.. data:: METH_VARARGS | METH_KEYWORDS Methods with these flags must be of type :c:type:`PyCFunctionWithKeywords`. - The function expects three parameters: *self*, *args*, and a dictionary of - all the keyword arguments. The flag must be combined with - :const:`METH_VARARGS`, and the parameters are typically processed using - :c:func:`PyArg_ParseTupleAndKeywords`. + The function expects three parameters: *self*, *args*, *kwargs* where + *kwargs* is a dictionary of all the keyword arguments or possibly *NULL* + if there are no keyword arguments. The parameters are typically processed + using :c:func:`PyArg_ParseTupleAndKeywords`. + + +.. data:: METH_FASTCALL + + Fast calling convention supporting only positional arguments. + The methods have the type :c:type:`_PyCFunctionFast`. + The first parameter is *self*, the second parameter is a C array + of :c:type:`PyObject\*` values indicating the arguments and the third + parameter is the number of arguments (the length of the array). + + This is not part of the :ref:`limited API `. + + .. versionadded:: 3.7 + + +.. data:: METH_FASTCALL | METH_KEYWORDS + + Extension of :const:`METH_FASTCALL` supporting also keyword arguments, + with methods of type :c:type:`_PyCFunctionFastWithKeywords`. + Keyword arguments are passed the same way as in the vectorcall protocol: + there is an additional fourth :c:type:`PyObject\*` parameter + which is a tuple representing the names of the keyword arguments + or possibly *NULL* if there are no keywords. The values of the keyword + arguments are stored in the *args* array, after the positional arguments. + + This is not part of the :ref:`limited API `. + + .. versionadded:: 3.7 .. data:: METH_NOARGS diff --git a/Misc/NEWS.d/next/C API/2019-06-14-14-03-51.bpo-28805.qZC0N_.rst b/Misc/NEWS.d/next/C API/2019-06-14-14-03-51.bpo-28805.qZC0N_.rst new file mode 100644 index 000000000000..6d6c4ad4af60 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2019-06-14-14-03-51.bpo-28805.qZC0N_.rst @@ -0,0 +1 @@ +The :const:`METH_FASTCALL` calling convention has been documented. From webhook-mailer at python.org Mon Jun 17 03:17:19 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 17 Jun 2019 07:17:19 -0000 Subject: [Python-checkins] bpo-37267: Do not check for FILE_TYPE_CHAR in os.dup() on Windows (GH-14051) Message-ID: https://github.com/python/cpython/commit/28fca0c422b425a6be43be31add0a5328c16b0b8 commit: 28fca0c422b425a6be43be31add0a5328c16b0b8 branch: master author: Zackery Spytz committer: Victor Stinner date: 2019-06-17T09:17:14+02:00 summary: bpo-37267: Do not check for FILE_TYPE_CHAR in os.dup() on Windows (GH-14051) On Windows, os.dup() no longer creates an inheritable fd when handling a character file. files: A Misc/NEWS.d/next/Windows/2019-06-13-04-15-51.bpo-37267.Ygo5ef.rst M Lib/test/test_os.py M Python/fileutils.c diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index a8eae6162057..b540fcbd4d73 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -3382,6 +3382,15 @@ def test_dup(self): self.addCleanup(os.close, fd2) self.assertEqual(os.get_inheritable(fd2), False) + @unittest.skipUnless(sys.platform == 'win32', 'win32-specific test') + def test_dup_nul(self): + # os.dup() was creating inheritable fds for character files. + fd1 = os.open('NUL', os.O_RDONLY) + self.addCleanup(os.close, fd1) + fd2 = os.dup(fd1) + self.addCleanup(os.close, fd2) + self.assertFalse(os.get_inheritable(fd2)) + @unittest.skipUnless(hasattr(os, 'dup2'), "need os.dup2()") def test_dup2(self): fd = os.open(__file__, os.O_RDONLY) diff --git a/Misc/NEWS.d/next/Windows/2019-06-13-04-15-51.bpo-37267.Ygo5ef.rst b/Misc/NEWS.d/next/Windows/2019-06-13-04-15-51.bpo-37267.Ygo5ef.rst new file mode 100644 index 000000000000..a4dcfcde35b0 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2019-06-13-04-15-51.bpo-37267.Ygo5ef.rst @@ -0,0 +1,2 @@ +On Windows, :func:`os.dup` no longer creates an inheritable fd when handling +a character file. diff --git a/Python/fileutils.c b/Python/fileutils.c index 178e2f1268f8..93c093f89b4b 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -1776,7 +1776,6 @@ _Py_dup(int fd) { #ifdef MS_WINDOWS HANDLE handle; - DWORD ftype; #endif assert(PyGILState_Check()); @@ -1790,9 +1789,6 @@ _Py_dup(int fd) return -1; } - /* get the file type, ignore the error if it failed */ - ftype = GetFileType(handle); - Py_BEGIN_ALLOW_THREADS _Py_BEGIN_SUPPRESS_IPH fd = dup(fd); @@ -1803,14 +1799,11 @@ _Py_dup(int fd) return -1; } - /* Character files like console cannot be make non-inheritable */ - if (ftype != FILE_TYPE_CHAR) { - if (_Py_set_inheritable(fd, 0, NULL) < 0) { - _Py_BEGIN_SUPPRESS_IPH - close(fd); - _Py_END_SUPPRESS_IPH - return -1; - } + if (_Py_set_inheritable(fd, 0, NULL) < 0) { + _Py_BEGIN_SUPPRESS_IPH + close(fd); + _Py_END_SUPPRESS_IPH + return -1; } #elif defined(HAVE_FCNTL_H) && defined(F_DUPFD_CLOEXEC) Py_BEGIN_ALLOW_THREADS From webhook-mailer at python.org Mon Jun 17 04:10:23 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 17 Jun 2019 08:10:23 -0000 Subject: [Python-checkins] bpo-36688: Adding an implementation of RLock in _dummy_thread (GH-12943) Message-ID: https://github.com/python/cpython/commit/c5905f39bcf4ef895d42eede41bb5a2f071a501d commit: c5905f39bcf4ef895d42eede41bb5a2f071a501d branch: master author: Joost Lek committer: Victor Stinner date: 2019-06-17T10:10:17+02:00 summary: bpo-36688: Adding an implementation of RLock in _dummy_thread (GH-12943) files: M Lib/_dummy_thread.py M Lib/test/test_dummy_thread.py diff --git a/Lib/_dummy_thread.py b/Lib/_dummy_thread.py index 2407f9bf5ddc..6af68e53a335 100644 --- a/Lib/_dummy_thread.py +++ b/Lib/_dummy_thread.py @@ -14,7 +14,7 @@ # Exports only things specified by thread documentation; # skipping obsolete synonyms allocate(), start_new(), exit_thread(). __all__ = ['error', 'start_new_thread', 'exit', 'get_ident', 'allocate_lock', - 'interrupt_main', 'LockType'] + 'interrupt_main', 'LockType', 'RLock'] # A dummy value TIMEOUT_MAX = 2**31 @@ -148,6 +148,36 @@ def __repr__(self): hex(id(self)) ) + +class RLock(LockType): + """Dummy implementation of threading._RLock. + + Re-entrant lock can be aquired multiple times and needs to be released + just as many times. This dummy implemention does not check wheter the + current thread actually owns the lock, but does accounting on the call + counts. + """ + def __init__(self): + super().__init__() + self._levels = 0 + + def acquire(self, waitflag=None, timeout=-1): + """Aquire the lock, can be called multiple times in succession. + """ + locked = super().acquire(waitflag, timeout) + if locked: + self._levels += 1 + return locked + + def release(self): + """Release needs to be called once for every call to acquire(). + """ + if self._levels == 0: + raise error + if self._levels == 1: + super().release() + self._levels -= 1 + # Used to signal that interrupt_main was called in a "thread" _interrupt = False # True when not executing in a "thread" diff --git a/Lib/test/test_dummy_thread.py b/Lib/test/test_dummy_thread.py index da512167834f..0f56fcf97336 100644 --- a/Lib/test/test_dummy_thread.py +++ b/Lib/test/test_dummy_thread.py @@ -102,6 +102,24 @@ def test_lock_representation(self): self.assertIn("unlocked", repr(self.lock)) +class RLockTests(unittest.TestCase): + """Test dummy RLock objects.""" + + def setUp(self): + self.rlock = _thread.RLock() + + def test_multiple_acquire(self): + self.assertIn("unlocked", repr(self.rlock)) + self.rlock.acquire() + self.rlock.acquire() + self.assertIn("locked", repr(self.rlock)) + self.rlock.release() + self.assertIn("locked", repr(self.rlock)) + self.rlock.release() + self.assertIn("unlocked", repr(self.rlock)) + self.assertRaises(RuntimeError, self.rlock.release) + + class MiscTests(unittest.TestCase): """Miscellaneous tests.""" @@ -253,3 +271,6 @@ def test_RaiseException(self, mock_print_exc): func = mock.Mock(side_effect=Exception) _thread.start_new_thread(func, tuple()) self.assertTrue(mock_print_exc.called) + +if __name__ == '__main__': + unittest.main() From webhook-mailer at python.org Mon Jun 17 04:28:50 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 17 Jun 2019 08:28:50 -0000 Subject: [Python-checkins] bpo-36688: Adding an implementation of RLock in _dummy_thread (GH-12943) Message-ID: https://github.com/python/cpython/commit/351b0e793e35510e8cbbcbb455a1b9544e808cdd commit: 351b0e793e35510e8cbbcbb455a1b9544e808cdd branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-17T01:28:43-07:00 summary: bpo-36688: Adding an implementation of RLock in _dummy_thread (GH-12943) (cherry picked from commit c5905f39bcf4ef895d42eede41bb5a2f071a501d) Co-authored-by: Joost Lek files: M Lib/_dummy_thread.py M Lib/test/test_dummy_thread.py diff --git a/Lib/_dummy_thread.py b/Lib/_dummy_thread.py index a2cae54b0580..2e46a07603be 100644 --- a/Lib/_dummy_thread.py +++ b/Lib/_dummy_thread.py @@ -14,7 +14,7 @@ # Exports only things specified by thread documentation; # skipping obsolete synonyms allocate(), start_new(), exit_thread(). __all__ = ['error', 'start_new_thread', 'exit', 'get_ident', 'allocate_lock', - 'interrupt_main', 'LockType'] + 'interrupt_main', 'LockType', 'RLock'] # A dummy value TIMEOUT_MAX = 2**31 @@ -148,6 +148,36 @@ def __repr__(self): hex(id(self)) ) + +class RLock(LockType): + """Dummy implementation of threading._RLock. + + Re-entrant lock can be aquired multiple times and needs to be released + just as many times. This dummy implemention does not check wheter the + current thread actually owns the lock, but does accounting on the call + counts. + """ + def __init__(self): + super().__init__() + self._levels = 0 + + def acquire(self, waitflag=None, timeout=-1): + """Aquire the lock, can be called multiple times in succession. + """ + locked = super().acquire(waitflag, timeout) + if locked: + self._levels += 1 + return locked + + def release(self): + """Release needs to be called once for every call to acquire(). + """ + if self._levels == 0: + raise error + if self._levels == 1: + super().release() + self._levels -= 1 + # Used to signal that interrupt_main was called in a "thread" _interrupt = False # True when not executing in a "thread" diff --git a/Lib/test/test_dummy_thread.py b/Lib/test/test_dummy_thread.py index da512167834f..0f56fcf97336 100644 --- a/Lib/test/test_dummy_thread.py +++ b/Lib/test/test_dummy_thread.py @@ -102,6 +102,24 @@ def test_lock_representation(self): self.assertIn("unlocked", repr(self.lock)) +class RLockTests(unittest.TestCase): + """Test dummy RLock objects.""" + + def setUp(self): + self.rlock = _thread.RLock() + + def test_multiple_acquire(self): + self.assertIn("unlocked", repr(self.rlock)) + self.rlock.acquire() + self.rlock.acquire() + self.assertIn("locked", repr(self.rlock)) + self.rlock.release() + self.assertIn("locked", repr(self.rlock)) + self.rlock.release() + self.assertIn("unlocked", repr(self.rlock)) + self.assertRaises(RuntimeError, self.rlock.release) + + class MiscTests(unittest.TestCase): """Miscellaneous tests.""" @@ -253,3 +271,6 @@ def test_RaiseException(self, mock_print_exc): func = mock.Mock(side_effect=Exception) _thread.start_new_thread(func, tuple()) self.assertTrue(mock_print_exc.called) + +if __name__ == '__main__': + unittest.main() From webhook-mailer at python.org Mon Jun 17 04:34:31 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 17 Jun 2019 08:34:31 -0000 Subject: [Python-checkins] bpo-36688: Adding an implementation of RLock in _dummy_thread (GH-12943) Message-ID: https://github.com/python/cpython/commit/ad505918a1829e6fa2a48a7665234d60a9377e98 commit: ad505918a1829e6fa2a48a7665234d60a9377e98 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-17T01:34:27-07:00 summary: bpo-36688: Adding an implementation of RLock in _dummy_thread (GH-12943) (cherry picked from commit c5905f39bcf4ef895d42eede41bb5a2f071a501d) Co-authored-by: Joost Lek files: M Lib/_dummy_thread.py M Lib/test/test_dummy_thread.py diff --git a/Lib/_dummy_thread.py b/Lib/_dummy_thread.py index a2cae54b0580..2e46a07603be 100644 --- a/Lib/_dummy_thread.py +++ b/Lib/_dummy_thread.py @@ -14,7 +14,7 @@ # Exports only things specified by thread documentation; # skipping obsolete synonyms allocate(), start_new(), exit_thread(). __all__ = ['error', 'start_new_thread', 'exit', 'get_ident', 'allocate_lock', - 'interrupt_main', 'LockType'] + 'interrupt_main', 'LockType', 'RLock'] # A dummy value TIMEOUT_MAX = 2**31 @@ -148,6 +148,36 @@ def __repr__(self): hex(id(self)) ) + +class RLock(LockType): + """Dummy implementation of threading._RLock. + + Re-entrant lock can be aquired multiple times and needs to be released + just as many times. This dummy implemention does not check wheter the + current thread actually owns the lock, but does accounting on the call + counts. + """ + def __init__(self): + super().__init__() + self._levels = 0 + + def acquire(self, waitflag=None, timeout=-1): + """Aquire the lock, can be called multiple times in succession. + """ + locked = super().acquire(waitflag, timeout) + if locked: + self._levels += 1 + return locked + + def release(self): + """Release needs to be called once for every call to acquire(). + """ + if self._levels == 0: + raise error + if self._levels == 1: + super().release() + self._levels -= 1 + # Used to signal that interrupt_main was called in a "thread" _interrupt = False # True when not executing in a "thread" diff --git a/Lib/test/test_dummy_thread.py b/Lib/test/test_dummy_thread.py index da512167834f..0f56fcf97336 100644 --- a/Lib/test/test_dummy_thread.py +++ b/Lib/test/test_dummy_thread.py @@ -102,6 +102,24 @@ def test_lock_representation(self): self.assertIn("unlocked", repr(self.lock)) +class RLockTests(unittest.TestCase): + """Test dummy RLock objects.""" + + def setUp(self): + self.rlock = _thread.RLock() + + def test_multiple_acquire(self): + self.assertIn("unlocked", repr(self.rlock)) + self.rlock.acquire() + self.rlock.acquire() + self.assertIn("locked", repr(self.rlock)) + self.rlock.release() + self.assertIn("locked", repr(self.rlock)) + self.rlock.release() + self.assertIn("unlocked", repr(self.rlock)) + self.assertRaises(RuntimeError, self.rlock.release) + + class MiscTests(unittest.TestCase): """Miscellaneous tests.""" @@ -253,3 +271,6 @@ def test_RaiseException(self, mock_print_exc): func = mock.Mock(side_effect=Exception) _thread.start_new_thread(func, tuple()) self.assertTrue(mock_print_exc.called) + +if __name__ == '__main__': + unittest.main() From webhook-mailer at python.org Mon Jun 17 04:45:08 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 17 Jun 2019 08:45:08 -0000 Subject: [Python-checkins] bpo-37267: Do not check for FILE_TYPE_CHAR in os.dup() on Windows (GH-14051) (GH-14141) Message-ID: https://github.com/python/cpython/commit/71589491ad0da27f57789b97354f6094a91e2eb3 commit: 71589491ad0da27f57789b97354f6094a91e2eb3 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Victor Stinner date: 2019-06-17T10:45:04+02:00 summary: bpo-37267: Do not check for FILE_TYPE_CHAR in os.dup() on Windows (GH-14051) (GH-14141) On Windows, os.dup() no longer creates an inheritable fd when handling a character file. (cherry picked from commit 28fca0c422b425a6be43be31add0a5328c16b0b8) Co-authored-by: Zackery Spytz files: A Misc/NEWS.d/next/Windows/2019-06-13-04-15-51.bpo-37267.Ygo5ef.rst M Lib/test/test_os.py M Python/fileutils.c diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index fd9f70e30dba..a9170504004d 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -3240,6 +3240,15 @@ def test_dup(self): self.addCleanup(os.close, fd2) self.assertEqual(os.get_inheritable(fd2), False) + @unittest.skipUnless(sys.platform == 'win32', 'win32-specific test') + def test_dup_nul(self): + # os.dup() was creating inheritable fds for character files. + fd1 = os.open('NUL', os.O_RDONLY) + self.addCleanup(os.close, fd1) + fd2 = os.dup(fd1) + self.addCleanup(os.close, fd2) + self.assertFalse(os.get_inheritable(fd2)) + @unittest.skipUnless(hasattr(os, 'dup2'), "need os.dup2()") def test_dup2(self): fd = os.open(__file__, os.O_RDONLY) diff --git a/Misc/NEWS.d/next/Windows/2019-06-13-04-15-51.bpo-37267.Ygo5ef.rst b/Misc/NEWS.d/next/Windows/2019-06-13-04-15-51.bpo-37267.Ygo5ef.rst new file mode 100644 index 000000000000..a4dcfcde35b0 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2019-06-13-04-15-51.bpo-37267.Ygo5ef.rst @@ -0,0 +1,2 @@ +On Windows, :func:`os.dup` no longer creates an inheritable fd when handling +a character file. diff --git a/Python/fileutils.c b/Python/fileutils.c index 5e71d375260a..868fbf910312 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -1659,7 +1659,6 @@ _Py_dup(int fd) { #ifdef MS_WINDOWS HANDLE handle; - DWORD ftype; #endif assert(PyGILState_Check()); @@ -1673,9 +1672,6 @@ _Py_dup(int fd) return -1; } - /* get the file type, ignore the error if it failed */ - ftype = GetFileType(handle); - Py_BEGIN_ALLOW_THREADS _Py_BEGIN_SUPPRESS_IPH fd = dup(fd); @@ -1686,14 +1682,11 @@ _Py_dup(int fd) return -1; } - /* Character files like console cannot be make non-inheritable */ - if (ftype != FILE_TYPE_CHAR) { - if (_Py_set_inheritable(fd, 0, NULL) < 0) { - _Py_BEGIN_SUPPRESS_IPH - close(fd); - _Py_END_SUPPRESS_IPH - return -1; - } + if (_Py_set_inheritable(fd, 0, NULL) < 0) { + _Py_BEGIN_SUPPRESS_IPH + close(fd); + _Py_END_SUPPRESS_IPH + return -1; } #elif defined(HAVE_FCNTL_H) && defined(F_DUPFD_CLOEXEC) Py_BEGIN_ALLOW_THREADS From webhook-mailer at python.org Mon Jun 17 04:45:30 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 17 Jun 2019 08:45:30 -0000 Subject: [Python-checkins] bpo-37267: Do not check for FILE_TYPE_CHAR in os.dup() on Windows (GH-14051) (GH-14140) Message-ID: https://github.com/python/cpython/commit/693945d45dfe50c843970cab3e3aa1fa3a3eddbe commit: 693945d45dfe50c843970cab3e3aa1fa3a3eddbe branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: Victor Stinner date: 2019-06-17T10:45:26+02:00 summary: bpo-37267: Do not check for FILE_TYPE_CHAR in os.dup() on Windows (GH-14051) (GH-14140) On Windows, os.dup() no longer creates an inheritable fd when handling a character file. (cherry picked from commit 28fca0c422b425a6be43be31add0a5328c16b0b8) Co-authored-by: Zackery Spytz files: A Misc/NEWS.d/next/Windows/2019-06-13-04-15-51.bpo-37267.Ygo5ef.rst M Lib/test/test_os.py M Python/fileutils.c diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index a8eae6162057..b540fcbd4d73 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -3382,6 +3382,15 @@ def test_dup(self): self.addCleanup(os.close, fd2) self.assertEqual(os.get_inheritable(fd2), False) + @unittest.skipUnless(sys.platform == 'win32', 'win32-specific test') + def test_dup_nul(self): + # os.dup() was creating inheritable fds for character files. + fd1 = os.open('NUL', os.O_RDONLY) + self.addCleanup(os.close, fd1) + fd2 = os.dup(fd1) + self.addCleanup(os.close, fd2) + self.assertFalse(os.get_inheritable(fd2)) + @unittest.skipUnless(hasattr(os, 'dup2'), "need os.dup2()") def test_dup2(self): fd = os.open(__file__, os.O_RDONLY) diff --git a/Misc/NEWS.d/next/Windows/2019-06-13-04-15-51.bpo-37267.Ygo5ef.rst b/Misc/NEWS.d/next/Windows/2019-06-13-04-15-51.bpo-37267.Ygo5ef.rst new file mode 100644 index 000000000000..a4dcfcde35b0 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2019-06-13-04-15-51.bpo-37267.Ygo5ef.rst @@ -0,0 +1,2 @@ +On Windows, :func:`os.dup` no longer creates an inheritable fd when handling +a character file. diff --git a/Python/fileutils.c b/Python/fileutils.c index 178e2f1268f8..93c093f89b4b 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -1776,7 +1776,6 @@ _Py_dup(int fd) { #ifdef MS_WINDOWS HANDLE handle; - DWORD ftype; #endif assert(PyGILState_Check()); @@ -1790,9 +1789,6 @@ _Py_dup(int fd) return -1; } - /* get the file type, ignore the error if it failed */ - ftype = GetFileType(handle); - Py_BEGIN_ALLOW_THREADS _Py_BEGIN_SUPPRESS_IPH fd = dup(fd); @@ -1803,14 +1799,11 @@ _Py_dup(int fd) return -1; } - /* Character files like console cannot be make non-inheritable */ - if (ftype != FILE_TYPE_CHAR) { - if (_Py_set_inheritable(fd, 0, NULL) < 0) { - _Py_BEGIN_SUPPRESS_IPH - close(fd); - _Py_END_SUPPRESS_IPH - return -1; - } + if (_Py_set_inheritable(fd, 0, NULL) < 0) { + _Py_BEGIN_SUPPRESS_IPH + close(fd); + _Py_END_SUPPRESS_IPH + return -1; } #elif defined(HAVE_FCNTL_H) && defined(F_DUPFD_CLOEXEC) Py_BEGIN_ALLOW_THREADS From webhook-mailer at python.org Mon Jun 17 05:47:56 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 17 Jun 2019 09:47:56 -0000 Subject: [Python-checkins] bpo-35031, test_asycio: disable TLS 1.3 in test_start_tls_server_1() (GH-14148) Message-ID: https://github.com/python/cpython/commit/c034b7824f5a7c50f2946ab3931633200e31d903 commit: c034b7824f5a7c50f2946ab3931633200e31d903 branch: master author: Victor Stinner committer: GitHub date: 2019-06-17T11:47:49+02:00 summary: bpo-35031, test_asycio: disable TLS 1.3 in test_start_tls_server_1() (GH-14148) bpo-35031, bpo-35998: Reintroduce workaround on Windows and FreeBSD in test_start_tls_server_1() of test_asyncio: disable TLS v1.3 on the client context. files: M Lib/test/test_asyncio/test_sslproto.py diff --git a/Lib/test/test_asyncio/test_sslproto.py b/Lib/test/test_asyncio/test_sslproto.py index 5c861e92b7d6..4645cc044a59 100644 --- a/Lib/test/test_asyncio/test_sslproto.py +++ b/Lib/test/test_asyncio/test_sslproto.py @@ -498,6 +498,12 @@ def test_start_tls_server_1(self): server_context = test_utils.simple_server_sslcontext() client_context = test_utils.simple_client_sslcontext() + if sys.platform.startswith('freebsd') or sys.platform.startswith('win'): + # bpo-35031: Some FreeBSD and Windows buildbots fail to run this test + # as the eof was not being received by the server if the payload + # size is not big enough. This behaviour only appears if the + # client is using TLS1.3. + client_context.options |= ssl.OP_NO_TLSv1_3 answer = None def client(sock, addr): From webhook-mailer at python.org Mon Jun 17 06:06:57 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 17 Jun 2019 10:06:57 -0000 Subject: [Python-checkins] bpo-35031, test_asycio: disable TLS 1.3 in test_start_tls_server_1() (GH-14148) Message-ID: https://github.com/python/cpython/commit/a5ddbfbf50715e3d4b90ad367ed6827c6cbcc52f commit: a5ddbfbf50715e3d4b90ad367ed6827c6cbcc52f branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-17T03:06:41-07:00 summary: bpo-35031, test_asycio: disable TLS 1.3 in test_start_tls_server_1() (GH-14148) bpo-35031, bpo-35998: Reintroduce workaround on Windows and FreeBSD in test_start_tls_server_1() of test_asyncio: disable TLS v1.3 on the client context. (cherry picked from commit c034b7824f5a7c50f2946ab3931633200e31d903) Co-authored-by: Victor Stinner files: M Lib/test/test_asyncio/test_sslproto.py diff --git a/Lib/test/test_asyncio/test_sslproto.py b/Lib/test/test_asyncio/test_sslproto.py index 5c861e92b7d6..4645cc044a59 100644 --- a/Lib/test/test_asyncio/test_sslproto.py +++ b/Lib/test/test_asyncio/test_sslproto.py @@ -498,6 +498,12 @@ def test_start_tls_server_1(self): server_context = test_utils.simple_server_sslcontext() client_context = test_utils.simple_client_sslcontext() + if sys.platform.startswith('freebsd') or sys.platform.startswith('win'): + # bpo-35031: Some FreeBSD and Windows buildbots fail to run this test + # as the eof was not being received by the server if the payload + # size is not big enough. This behaviour only appears if the + # client is using TLS1.3. + client_context.options |= ssl.OP_NO_TLSv1_3 answer = None def client(sock, addr): From webhook-mailer at python.org Mon Jun 17 06:10:53 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 17 Jun 2019 10:10:53 -0000 Subject: [Python-checkins] bpo-35031, test_asycio: disable TLS 1.3 in test_start_tls_server_1() (GH-14148) Message-ID: https://github.com/python/cpython/commit/0040903bbae043225499babae23649d896ea2eec commit: 0040903bbae043225499babae23649d896ea2eec branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-17T03:10:48-07:00 summary: bpo-35031, test_asycio: disable TLS 1.3 in test_start_tls_server_1() (GH-14148) bpo-35031, bpo-35998: Reintroduce workaround on Windows and FreeBSD in test_start_tls_server_1() of test_asyncio: disable TLS v1.3 on the client context. (cherry picked from commit c034b7824f5a7c50f2946ab3931633200e31d903) Co-authored-by: Victor Stinner files: M Lib/test/test_asyncio/test_sslproto.py diff --git a/Lib/test/test_asyncio/test_sslproto.py b/Lib/test/test_asyncio/test_sslproto.py index 4d3c064eaf1f..685e3dc58e9a 100644 --- a/Lib/test/test_asyncio/test_sslproto.py +++ b/Lib/test/test_asyncio/test_sslproto.py @@ -495,6 +495,12 @@ def test_start_tls_server_1(self): server_context = test_utils.simple_server_sslcontext() client_context = test_utils.simple_client_sslcontext() + if sys.platform.startswith('freebsd') or sys.platform.startswith('win'): + # bpo-35031: Some FreeBSD and Windows buildbots fail to run this test + # as the eof was not being received by the server if the payload + # size is not big enough. This behaviour only appears if the + # client is using TLS1.3. + client_context.options |= ssl.OP_NO_TLSv1_3 answer = None def client(sock, addr): From webhook-mailer at python.org Mon Jun 17 07:41:49 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Mon, 17 Jun 2019 11:41:49 -0000 Subject: [Python-checkins] bpo-37231: remove _PyObject_FastCall_Prepend (GH-14153) Message-ID: https://github.com/python/cpython/commit/0456df4a55ec9a4e8f4425df92bbe63a290f3f2f commit: 0456df4a55ec9a4e8f4425df92bbe63a290f3f2f branch: master author: Jeroen Demeyer committer: Inada Naoki date: 2019-06-17T20:41:32+09:00 summary: bpo-37231: remove _PyObject_FastCall_Prepend (GH-14153) files: M Include/cpython/abstract.h M Objects/call.c diff --git a/Include/cpython/abstract.h b/Include/cpython/abstract.h index 7ab2045923d8..d0369122287b 100644 --- a/Include/cpython/abstract.h +++ b/Include/cpython/abstract.h @@ -156,12 +156,6 @@ PyAPI_FUNC(PyObject *) _PyObject_Call_Prepend( PyObject *args, PyObject *kwargs); -PyAPI_FUNC(PyObject *) _PyObject_FastCall_Prepend( - PyObject *callable, - PyObject *obj, - PyObject *const *args, - Py_ssize_t nargs); - /* Like PyObject_CallMethod(), but expect a _Py_Identifier* as the method name. */ PyAPI_FUNC(PyObject *) _PyObject_CallMethodId(PyObject *obj, diff --git a/Objects/call.c b/Objects/call.c index 8eae1e10d8c5..5bef9f566e8f 100644 --- a/Objects/call.c +++ b/Objects/call.c @@ -837,42 +837,6 @@ PyObject_CallObject(PyObject *callable, PyObject *args) } -/* Positional arguments are obj followed by args: - call callable(obj, *args, **kwargs) */ -PyObject * -_PyObject_FastCall_Prepend(PyObject *callable, PyObject *obj, - PyObject *const *args, Py_ssize_t nargs) -{ - PyObject *small_stack[_PY_FASTCALL_SMALL_STACK]; - PyObject **args2; - PyObject *result; - - nargs++; - if (nargs <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) { - args2 = small_stack; - } - else { - args2 = PyMem_Malloc(nargs * sizeof(PyObject *)); - if (args2 == NULL) { - PyErr_NoMemory(); - return NULL; - } - } - - /* use borrowed references */ - args2[0] = obj; - if (nargs > 1) { - memcpy(&args2[1], args, (nargs - 1) * sizeof(PyObject *)); - } - - result = _PyObject_FastCall(callable, args2, nargs); - if (args2 != small_stack) { - PyMem_Free(args2); - } - return result; -} - - /* Call callable(obj, *args, **kwargs). */ PyObject * _PyObject_Call_Prepend(PyObject *callable, From webhook-mailer at python.org Mon Jun 17 07:53:27 2019 From: webhook-mailer at python.org (Inada Naoki) Date: Mon, 17 Jun 2019 11:53:27 -0000 Subject: [Python-checkins] bpo-36922: use Py_TPFLAGS_METHOD_DESCRIPTOR in lookup_maybe_method() (GH-13865) Message-ID: https://github.com/python/cpython/commit/2e9954d3472a23919b96323fcd5bb6c1d6927155 commit: 2e9954d3472a23919b96323fcd5bb6c1d6927155 branch: master author: Jeroen Demeyer committer: Inada Naoki date: 2019-06-17T20:53:20+09:00 summary: bpo-36922: use Py_TPFLAGS_METHOD_DESCRIPTOR in lookup_maybe_method() (GH-13865) files: A Misc/NEWS.d/next/Core and Builtins/2019-06-06-13-59-52.bpo-36922.EMZ3TF.rst M Lib/test/test_descr.py M Objects/typeobject.c diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 301a2d2a0fd2..0b43549efb83 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -4647,9 +4647,11 @@ class Foo: def test_mixing_slot_wrappers(self): class X(dict): __setattr__ = dict.__setitem__ + __neg__ = dict.copy x = X() x.y = 42 self.assertEqual(x["y"], 42) + self.assertEqual(x, -x) def test_slot_shadows_class_variable(self): with self.assertRaises(ValueError) as cm: diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-06-06-13-59-52.bpo-36922.EMZ3TF.rst b/Misc/NEWS.d/next/Core and Builtins/2019-06-06-13-59-52.bpo-36922.EMZ3TF.rst new file mode 100644 index 000000000000..c2a2ad4e8e73 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-06-06-13-59-52.bpo-36922.EMZ3TF.rst @@ -0,0 +1 @@ +Slot functions optimize any callable with ``Py_TPFLAGS_METHOD_DESCRIPTOR`` instead of only instances of ``function``. \ No newline at end of file diff --git a/Objects/typeobject.c b/Objects/typeobject.c index ba128a90778c..e4952511e33a 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -1412,7 +1412,7 @@ lookup_maybe_method(PyObject *self, _Py_Identifier *attrid, int *unbound) return NULL; } - if (PyFunction_Check(res)) { + if (PyType_HasFeature(Py_TYPE(res), Py_TPFLAGS_METHOD_DESCRIPTOR)) { /* Avoid temporary PyMethodObject */ *unbound = 1; Py_INCREF(res); From webhook-mailer at python.org Mon Jun 17 08:12:56 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 17 Jun 2019 12:12:56 -0000 Subject: [Python-checkins] bpo-36922: use Py_TPFLAGS_METHOD_DESCRIPTOR in lookup_maybe_method() (GH-13865) Message-ID: https://github.com/python/cpython/commit/988fff5d0e7fccecbf776c08ec56695820b3b4a8 commit: 988fff5d0e7fccecbf776c08ec56695820b3b4a8 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-17T05:12:42-07:00 summary: bpo-36922: use Py_TPFLAGS_METHOD_DESCRIPTOR in lookup_maybe_method() (GH-13865) (cherry picked from commit 2e9954d3472a23919b96323fcd5bb6c1d6927155) Co-authored-by: Jeroen Demeyer files: A Misc/NEWS.d/next/Core and Builtins/2019-06-06-13-59-52.bpo-36922.EMZ3TF.rst M Lib/test/test_descr.py M Objects/typeobject.c diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 6b018ccc56fa..9998a3cc77a2 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -4647,9 +4647,11 @@ class Foo: def test_mixing_slot_wrappers(self): class X(dict): __setattr__ = dict.__setitem__ + __neg__ = dict.copy x = X() x.y = 42 self.assertEqual(x["y"], 42) + self.assertEqual(x, -x) def test_slot_shadows_class_variable(self): with self.assertRaises(ValueError) as cm: diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-06-06-13-59-52.bpo-36922.EMZ3TF.rst b/Misc/NEWS.d/next/Core and Builtins/2019-06-06-13-59-52.bpo-36922.EMZ3TF.rst new file mode 100644 index 000000000000..c2a2ad4e8e73 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-06-06-13-59-52.bpo-36922.EMZ3TF.rst @@ -0,0 +1 @@ +Slot functions optimize any callable with ``Py_TPFLAGS_METHOD_DESCRIPTOR`` instead of only instances of ``function``. \ No newline at end of file diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 006df8d1f090..01e95aea61af 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -1412,7 +1412,7 @@ lookup_maybe_method(PyObject *self, _Py_Identifier *attrid, int *unbound) return NULL; } - if (PyFunction_Check(res)) { + if (PyType_HasFeature(Py_TYPE(res), Py_TPFLAGS_METHOD_DESCRIPTOR)) { /* Avoid temporary PyMethodObject */ *unbound = 1; Py_INCREF(res); From webhook-mailer at python.org Mon Jun 17 08:18:48 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 17 Jun 2019 12:18:48 -0000 Subject: [Python-checkins] bpo-37312: Remove _dummy_thread and dummy_threading modules (GH-14143) Message-ID: https://github.com/python/cpython/commit/8bf08ee45b7c2341f0d0175b91892843a37c23da commit: 8bf08ee45b7c2341f0d0175b91892843a37c23da branch: master author: Victor Stinner committer: GitHub date: 2019-06-17T14:18:43+02:00 summary: bpo-37312: Remove _dummy_thread and dummy_threading modules (GH-14143) Remove _dummy_thread and dummy_threading modules. These modules were deprecated since Python 3.7 which requires threading support. files: A Misc/NEWS.d/next/Library/2019-06-17-10-03-52.bpo-37312.qKvBfF.rst D Doc/library/_dummy_thread.rst D Doc/library/dummy_threading.rst D Lib/_dummy_thread.py D Lib/dummy_threading.py D Lib/test/test_dummy_thread.py D Lib/test/test_dummy_threading.py M Doc/library/concurrency.rst M Doc/whatsnew/3.9.rst M PCbuild/lib.pyproj diff --git a/Doc/library/_dummy_thread.rst b/Doc/library/_dummy_thread.rst deleted file mode 100644 index 7dccbc55475a..000000000000 --- a/Doc/library/_dummy_thread.rst +++ /dev/null @@ -1,22 +0,0 @@ -:mod:`_dummy_thread` --- Drop-in replacement for the :mod:`_thread` module -========================================================================== - -.. module:: _dummy_thread - :synopsis: Drop-in replacement for the _thread module. - -**Source code:** :source:`Lib/_dummy_thread.py` - -.. deprecated:: 3.7 - Python now always has threading enabled. Please use :mod:`_thread` - (or, better, :mod:`threading`) instead. - --------------- - -This module provides a duplicate interface to the :mod:`_thread` module. -It was meant to be imported when the :mod:`_thread` module was not provided -on a platform. - -Be careful to not use this module where deadlock might occur from a thread being -created that blocks waiting for another thread to be created. This often occurs -with blocking I/O. - diff --git a/Doc/library/concurrency.rst b/Doc/library/concurrency.rst index 39cd9ff48265..b150990b83b7 100644 --- a/Doc/library/concurrency.rst +++ b/Doc/library/concurrency.rst @@ -28,5 +28,3 @@ The following are support modules for some of the above services: .. toctree:: _thread.rst - _dummy_thread.rst - dummy_threading.rst diff --git a/Doc/library/dummy_threading.rst b/Doc/library/dummy_threading.rst deleted file mode 100644 index dfc3289abb15..000000000000 --- a/Doc/library/dummy_threading.rst +++ /dev/null @@ -1,20 +0,0 @@ -:mod:`dummy_threading` --- Drop-in replacement for the :mod:`threading` module -============================================================================== - -.. module:: dummy_threading - :synopsis: Drop-in replacement for the threading module. - -**Source code:** :source:`Lib/dummy_threading.py` - -.. deprecated:: 3.7 - Python now always has threading enabled. Please use :mod:`threading` instead. - --------------- - -This module provides a duplicate interface to the :mod:`threading` module. -It was meant to be imported when the :mod:`_thread` module was not provided -on a platform. - -Be careful to not use this module where deadlock might occur from a thread being -created that blocks waiting for another thread to be created. This often occurs -with blocking I/O. diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index ef30743b708d..ed558385464a 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -112,6 +112,9 @@ Deprecated Removed ======= +``_dummy_thread`` and ``dummy_threading`` modules have been removed. These +modules were deprecated since Python 3.7 which requires threading support. +(Contributed by Victor Stinner in :issue:`37312`.) Porting to Python 3.9 diff --git a/Lib/_dummy_thread.py b/Lib/_dummy_thread.py deleted file mode 100644 index 6af68e53a335..000000000000 --- a/Lib/_dummy_thread.py +++ /dev/null @@ -1,197 +0,0 @@ -"""Drop-in replacement for the thread module. - -Meant to be used as a brain-dead substitute so that threaded code does -not need to be rewritten for when the thread module is not present. - -Suggested usage is:: - - try: - import _thread - except ImportError: - import _dummy_thread as _thread - -""" -# Exports only things specified by thread documentation; -# skipping obsolete synonyms allocate(), start_new(), exit_thread(). -__all__ = ['error', 'start_new_thread', 'exit', 'get_ident', 'allocate_lock', - 'interrupt_main', 'LockType', 'RLock'] - -# A dummy value -TIMEOUT_MAX = 2**31 - -# NOTE: this module can be imported early in the extension building process, -# and so top level imports of other modules should be avoided. Instead, all -# imports are done when needed on a function-by-function basis. Since threads -# are disabled, the import lock should not be an issue anyway (??). - -error = RuntimeError - -def start_new_thread(function, args, kwargs={}): - """Dummy implementation of _thread.start_new_thread(). - - Compatibility is maintained by making sure that ``args`` is a - tuple and ``kwargs`` is a dictionary. If an exception is raised - and it is SystemExit (which can be done by _thread.exit()) it is - caught and nothing is done; all other exceptions are printed out - by using traceback.print_exc(). - - If the executed function calls interrupt_main the KeyboardInterrupt will be - raised when the function returns. - - """ - if type(args) != type(tuple()): - raise TypeError("2nd arg must be a tuple") - if type(kwargs) != type(dict()): - raise TypeError("3rd arg must be a dict") - global _main - _main = False - try: - function(*args, **kwargs) - except SystemExit: - pass - except: - import traceback - traceback.print_exc() - _main = True - global _interrupt - if _interrupt: - _interrupt = False - raise KeyboardInterrupt - -def exit(): - """Dummy implementation of _thread.exit().""" - raise SystemExit - -def get_ident(): - """Dummy implementation of _thread.get_ident(). - - Since this module should only be used when _threadmodule is not - available, it is safe to assume that the current process is the - only thread. Thus a constant can be safely returned. - """ - return 1 - -def allocate_lock(): - """Dummy implementation of _thread.allocate_lock().""" - return LockType() - -def stack_size(size=None): - """Dummy implementation of _thread.stack_size().""" - if size is not None: - raise error("setting thread stack size not supported") - return 0 - -def _set_sentinel(): - """Dummy implementation of _thread._set_sentinel().""" - return LockType() - -class LockType(object): - """Class implementing dummy implementation of _thread.LockType. - - Compatibility is maintained by maintaining self.locked_status - which is a boolean that stores the state of the lock. Pickling of - the lock, though, should not be done since if the _thread module is - then used with an unpickled ``lock()`` from here problems could - occur from this class not having atomic methods. - - """ - - def __init__(self): - self.locked_status = False - - def acquire(self, waitflag=None, timeout=-1): - """Dummy implementation of acquire(). - - For blocking calls, self.locked_status is automatically set to - True and returned appropriately based on value of - ``waitflag``. If it is non-blocking, then the value is - actually checked and not set if it is already acquired. This - is all done so that threading.Condition's assert statements - aren't triggered and throw a little fit. - - """ - if waitflag is None or waitflag: - self.locked_status = True - return True - else: - if not self.locked_status: - self.locked_status = True - return True - else: - if timeout > 0: - import time - time.sleep(timeout) - return False - - __enter__ = acquire - - def __exit__(self, typ, val, tb): - self.release() - - def release(self): - """Release the dummy lock.""" - # XXX Perhaps shouldn't actually bother to test? Could lead - # to problems for complex, threaded code. - if not self.locked_status: - raise error - self.locked_status = False - return True - - def locked(self): - return self.locked_status - - def __repr__(self): - return "<%s %s.%s object at %s>" % ( - "locked" if self.locked_status else "unlocked", - self.__class__.__module__, - self.__class__.__qualname__, - hex(id(self)) - ) - - -class RLock(LockType): - """Dummy implementation of threading._RLock. - - Re-entrant lock can be aquired multiple times and needs to be released - just as many times. This dummy implemention does not check wheter the - current thread actually owns the lock, but does accounting on the call - counts. - """ - def __init__(self): - super().__init__() - self._levels = 0 - - def acquire(self, waitflag=None, timeout=-1): - """Aquire the lock, can be called multiple times in succession. - """ - locked = super().acquire(waitflag, timeout) - if locked: - self._levels += 1 - return locked - - def release(self): - """Release needs to be called once for every call to acquire(). - """ - if self._levels == 0: - raise error - if self._levels == 1: - super().release() - self._levels -= 1 - -# Used to signal that interrupt_main was called in a "thread" -_interrupt = False -# True when not executing in a "thread" -_main = True - -def interrupt_main(): - """Set _interrupt flag to True to have start_new_thread raise - KeyboardInterrupt upon exiting.""" - if _main: - raise KeyboardInterrupt - else: - global _interrupt - _interrupt = True - - -def _is_main_interpreter(): - return True diff --git a/Lib/dummy_threading.py b/Lib/dummy_threading.py deleted file mode 100644 index 1bb7eee338af..000000000000 --- a/Lib/dummy_threading.py +++ /dev/null @@ -1,78 +0,0 @@ -"""Faux ``threading`` version using ``dummy_thread`` instead of ``thread``. - -The module ``_dummy_threading`` is added to ``sys.modules`` in order -to not have ``threading`` considered imported. Had ``threading`` been -directly imported it would have made all subsequent imports succeed -regardless of whether ``_thread`` was available which is not desired. - -""" -from sys import modules as sys_modules - -import _dummy_thread - -# Declaring now so as to not have to nest ``try``s to get proper clean-up. -holding_thread = False -holding_threading = False -holding__threading_local = False - -try: - # Could have checked if ``_thread`` was not in sys.modules and gone - # a different route, but decided to mirror technique used with - # ``threading`` below. - if '_thread' in sys_modules: - held_thread = sys_modules['_thread'] - holding_thread = True - # Must have some module named ``_thread`` that implements its API - # in order to initially import ``threading``. - sys_modules['_thread'] = sys_modules['_dummy_thread'] - - if 'threading' in sys_modules: - # If ``threading`` is already imported, might as well prevent - # trying to import it more than needed by saving it if it is - # already imported before deleting it. - held_threading = sys_modules['threading'] - holding_threading = True - del sys_modules['threading'] - - if '_threading_local' in sys_modules: - # If ``_threading_local`` is already imported, might as well prevent - # trying to import it more than needed by saving it if it is - # already imported before deleting it. - held__threading_local = sys_modules['_threading_local'] - holding__threading_local = True - del sys_modules['_threading_local'] - - import threading - # Need a copy of the code kept somewhere... - sys_modules['_dummy_threading'] = sys_modules['threading'] - del sys_modules['threading'] - sys_modules['_dummy__threading_local'] = sys_modules['_threading_local'] - del sys_modules['_threading_local'] - from _dummy_threading import * - from _dummy_threading import __all__ - -finally: - # Put back ``threading`` if we overwrote earlier - - if holding_threading: - sys_modules['threading'] = held_threading - del held_threading - del holding_threading - - # Put back ``_threading_local`` if we overwrote earlier - - if holding__threading_local: - sys_modules['_threading_local'] = held__threading_local - del held__threading_local - del holding__threading_local - - # Put back ``thread`` if we overwrote, else del the entry we made - if holding_thread: - sys_modules['_thread'] = held_thread - del held_thread - else: - del sys_modules['_thread'] - del holding_thread - - del _dummy_thread - del sys_modules diff --git a/Lib/test/test_dummy_thread.py b/Lib/test/test_dummy_thread.py deleted file mode 100644 index 0f56fcf97336..000000000000 --- a/Lib/test/test_dummy_thread.py +++ /dev/null @@ -1,276 +0,0 @@ -import _dummy_thread as _thread -import time -import queue -import random -import unittest -from test import support -from unittest import mock - -DELAY = 0 - - -class LockTests(unittest.TestCase): - """Test lock objects.""" - - def setUp(self): - # Create a lock - self.lock = _thread.allocate_lock() - - def test_initlock(self): - #Make sure locks start locked - self.assertFalse(self.lock.locked(), - "Lock object is not initialized unlocked.") - - def test_release(self): - # Test self.lock.release() - self.lock.acquire() - self.lock.release() - self.assertFalse(self.lock.locked(), - "Lock object did not release properly.") - - def test_LockType_context_manager(self): - with _thread.LockType(): - pass - self.assertFalse(self.lock.locked(), - "Acquired Lock was not released") - - def test_improper_release(self): - #Make sure release of an unlocked thread raises RuntimeError - self.assertRaises(RuntimeError, self.lock.release) - - def test_cond_acquire_success(self): - #Make sure the conditional acquiring of the lock works. - self.assertTrue(self.lock.acquire(0), - "Conditional acquiring of the lock failed.") - - def test_cond_acquire_fail(self): - #Test acquiring locked lock returns False - self.lock.acquire(0) - self.assertFalse(self.lock.acquire(0), - "Conditional acquiring of a locked lock incorrectly " - "succeeded.") - - def test_uncond_acquire_success(self): - #Make sure unconditional acquiring of a lock works. - self.lock.acquire() - self.assertTrue(self.lock.locked(), - "Uncondional locking failed.") - - def test_uncond_acquire_return_val(self): - #Make sure that an unconditional locking returns True. - self.assertIs(self.lock.acquire(1), True, - "Unconditional locking did not return True.") - self.assertIs(self.lock.acquire(), True) - - def test_uncond_acquire_blocking(self): - #Make sure that unconditional acquiring of a locked lock blocks. - def delay_unlock(to_unlock, delay): - """Hold on to lock for a set amount of time before unlocking.""" - time.sleep(delay) - to_unlock.release() - - self.lock.acquire() - start_time = int(time.monotonic()) - _thread.start_new_thread(delay_unlock,(self.lock, DELAY)) - if support.verbose: - print() - print("*** Waiting for thread to release the lock "\ - "(approx. %s sec.) ***" % DELAY) - self.lock.acquire() - end_time = int(time.monotonic()) - if support.verbose: - print("done") - self.assertGreaterEqual(end_time - start_time, DELAY, - "Blocking by unconditional acquiring failed.") - - @mock.patch('time.sleep') - def test_acquire_timeout(self, mock_sleep): - """Test invoking acquire() with a positive timeout when the lock is - already acquired. Ensure that time.sleep() is invoked with the given - timeout and that False is returned.""" - - self.lock.acquire() - retval = self.lock.acquire(waitflag=0, timeout=1) - self.assertTrue(mock_sleep.called) - mock_sleep.assert_called_once_with(1) - self.assertEqual(retval, False) - - def test_lock_representation(self): - self.lock.acquire() - self.assertIn("locked", repr(self.lock)) - self.lock.release() - self.assertIn("unlocked", repr(self.lock)) - - -class RLockTests(unittest.TestCase): - """Test dummy RLock objects.""" - - def setUp(self): - self.rlock = _thread.RLock() - - def test_multiple_acquire(self): - self.assertIn("unlocked", repr(self.rlock)) - self.rlock.acquire() - self.rlock.acquire() - self.assertIn("locked", repr(self.rlock)) - self.rlock.release() - self.assertIn("locked", repr(self.rlock)) - self.rlock.release() - self.assertIn("unlocked", repr(self.rlock)) - self.assertRaises(RuntimeError, self.rlock.release) - - -class MiscTests(unittest.TestCase): - """Miscellaneous tests.""" - - def test_exit(self): - self.assertRaises(SystemExit, _thread.exit) - - def test_ident(self): - self.assertIsInstance(_thread.get_ident(), int, - "_thread.get_ident() returned a non-integer") - self.assertGreater(_thread.get_ident(), 0) - - def test_LockType(self): - self.assertIsInstance(_thread.allocate_lock(), _thread.LockType, - "_thread.LockType is not an instance of what " - "is returned by _thread.allocate_lock()") - - def test_set_sentinel(self): - self.assertIsInstance(_thread._set_sentinel(), _thread.LockType, - "_thread._set_sentinel() did not return a " - "LockType instance.") - - def test_interrupt_main(self): - #Calling start_new_thread with a function that executes interrupt_main - # should raise KeyboardInterrupt upon completion. - def call_interrupt(): - _thread.interrupt_main() - - self.assertRaises(KeyboardInterrupt, - _thread.start_new_thread, - call_interrupt, - tuple()) - - def test_interrupt_in_main(self): - self.assertRaises(KeyboardInterrupt, _thread.interrupt_main) - - def test_stack_size_None(self): - retval = _thread.stack_size(None) - self.assertEqual(retval, 0) - - def test_stack_size_not_None(self): - with self.assertRaises(_thread.error) as cm: - _thread.stack_size("") - self.assertEqual(cm.exception.args[0], - "setting thread stack size not supported") - - -class ThreadTests(unittest.TestCase): - """Test thread creation.""" - - def test_arg_passing(self): - #Make sure that parameter passing works. - def arg_tester(queue, arg1=False, arg2=False): - """Use to test _thread.start_new_thread() passes args properly.""" - queue.put((arg1, arg2)) - - testing_queue = queue.Queue(1) - _thread.start_new_thread(arg_tester, (testing_queue, True, True)) - result = testing_queue.get() - self.assertTrue(result[0] and result[1], - "Argument passing for thread creation " - "using tuple failed") - - _thread.start_new_thread( - arg_tester, - tuple(), - {'queue':testing_queue, 'arg1':True, 'arg2':True}) - - result = testing_queue.get() - self.assertTrue(result[0] and result[1], - "Argument passing for thread creation " - "using kwargs failed") - - _thread.start_new_thread( - arg_tester, - (testing_queue, True), - {'arg2':True}) - - result = testing_queue.get() - self.assertTrue(result[0] and result[1], - "Argument passing for thread creation using both tuple" - " and kwargs failed") - - def test_multi_thread_creation(self): - def queue_mark(queue, delay): - time.sleep(delay) - queue.put(_thread.get_ident()) - - thread_count = 5 - testing_queue = queue.Queue(thread_count) - - if support.verbose: - print() - print("*** Testing multiple thread creation " - "(will take approx. %s to %s sec.) ***" % ( - DELAY, thread_count)) - - for count in range(thread_count): - if DELAY: - local_delay = round(random.random(), 1) - else: - local_delay = 0 - _thread.start_new_thread(queue_mark, - (testing_queue, local_delay)) - time.sleep(DELAY) - if support.verbose: - print('done') - self.assertEqual(testing_queue.qsize(), thread_count, - "Not all %s threads executed properly " - "after %s sec." % (thread_count, DELAY)) - - def test_args_not_tuple(self): - """ - Test invoking start_new_thread() with a non-tuple value for "args". - Expect TypeError with a meaningful error message to be raised. - """ - with self.assertRaises(TypeError) as cm: - _thread.start_new_thread(mock.Mock(), []) - self.assertEqual(cm.exception.args[0], "2nd arg must be a tuple") - - def test_kwargs_not_dict(self): - """ - Test invoking start_new_thread() with a non-dict value for "kwargs". - Expect TypeError with a meaningful error message to be raised. - """ - with self.assertRaises(TypeError) as cm: - _thread.start_new_thread(mock.Mock(), tuple(), kwargs=[]) - self.assertEqual(cm.exception.args[0], "3rd arg must be a dict") - - def test_SystemExit(self): - """ - Test invoking start_new_thread() with a function that raises - SystemExit. - The exception should be discarded. - """ - func = mock.Mock(side_effect=SystemExit()) - try: - _thread.start_new_thread(func, tuple()) - except SystemExit: - self.fail("start_new_thread raised SystemExit.") - - @mock.patch('traceback.print_exc') - def test_RaiseException(self, mock_print_exc): - """ - Test invoking start_new_thread() with a function that raises exception. - - The exception should be discarded and the traceback should be printed - via traceback.print_exc() - """ - func = mock.Mock(side_effect=Exception) - _thread.start_new_thread(func, tuple()) - self.assertTrue(mock_print_exc.called) - -if __name__ == '__main__': - unittest.main() diff --git a/Lib/test/test_dummy_threading.py b/Lib/test/test_dummy_threading.py deleted file mode 100644 index a0c2972a60e9..000000000000 --- a/Lib/test/test_dummy_threading.py +++ /dev/null @@ -1,60 +0,0 @@ -from test import support -import unittest -import dummy_threading as _threading -import time - -class DummyThreadingTestCase(unittest.TestCase): - - class TestThread(_threading.Thread): - - def run(self): - global running - global sema - global mutex - # Uncomment if testing another module, such as the real 'threading' - # module. - #delay = random.random() * 2 - delay = 0 - if support.verbose: - print('task', self.name, 'will run for', delay, 'sec') - sema.acquire() - mutex.acquire() - running += 1 - if support.verbose: - print(running, 'tasks are running') - mutex.release() - time.sleep(delay) - if support.verbose: - print('task', self.name, 'done') - mutex.acquire() - running -= 1 - if support.verbose: - print(self.name, 'is finished.', running, 'tasks are running') - mutex.release() - sema.release() - - def setUp(self): - self.numtasks = 10 - global sema - sema = _threading.BoundedSemaphore(value=3) - global mutex - mutex = _threading.RLock() - global running - running = 0 - self.threads = [] - - def test_tasks(self): - for i in range(self.numtasks): - t = self.TestThread(name=""%i) - self.threads.append(t) - t.start() - - if support.verbose: - print('waiting for all tasks to complete') - for t in self.threads: - t.join() - if support.verbose: - print('all tasks done') - -if __name__ == '__main__': - unittest.main() diff --git a/Misc/NEWS.d/next/Library/2019-06-17-10-03-52.bpo-37312.qKvBfF.rst b/Misc/NEWS.d/next/Library/2019-06-17-10-03-52.bpo-37312.qKvBfF.rst new file mode 100644 index 000000000000..eaaa0daf02b8 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-17-10-03-52.bpo-37312.qKvBfF.rst @@ -0,0 +1,2 @@ +``_dummy_thread`` and ``dummy_threading`` modules have been removed. These +modules were deprecated since Python 3.7 which requires threading support. diff --git a/PCbuild/lib.pyproj b/PCbuild/lib.pyproj index 7ed71bd819cb..683335e04489 100644 --- a/PCbuild/lib.pyproj +++ b/PCbuild/lib.pyproj @@ -250,7 +250,6 @@ - @@ -976,8 +975,6 @@ - - @@ -1564,7 +1561,6 @@ - From webhook-mailer at python.org Mon Jun 17 08:27:33 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 17 Jun 2019 12:27:33 -0000 Subject: [Python-checkins] bpo-37194: Add a new public PyObject_CallNoArgs() function (GH-13890) Message-ID: https://github.com/python/cpython/commit/2ff58a24e8a1c7e290d025d69ebaea0bbead3b8c commit: 2ff58a24e8a1c7e290d025d69ebaea0bbead3b8c branch: master author: Victor Stinner committer: GitHub date: 2019-06-17T14:27:23+02:00 summary: bpo-37194: Add a new public PyObject_CallNoArgs() function (GH-13890) Add a new public PyObject_CallNoArgs() function to the C API: call a callable Python object without any arguments. It is the most efficient way to call a callback without any argument. On x86-64, for example, PyObject_CallFunctionObjArgs(func, NULL) allocates 960 bytes on the stack per call, whereas PyObject_CallNoArgs(func) only allocates 624 bytes per call. It is excluded from stable ABI 3.8. Replace private _PyObject_CallNoArg() with public PyObject_CallNoArgs() in C extensions: _asyncio, _datetime, _elementtree, _pickle, _tkinter and readline. files: A Misc/NEWS.d/next/C API/2019-06-07-14-03-52.bpo-37194.uck7MD.rst M Doc/c-api/object.rst M Doc/whatsnew/3.9.rst M Include/abstract.h M Include/cpython/abstract.h M Modules/_asynciomodule.c M Modules/_datetimemodule.c M Modules/_elementtree.c M Modules/_pickle.c M Modules/_tkinter.c M Modules/readline.c M Objects/call.c diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst index ce0d05942f4e..aecd001a216e 100644 --- a/Doc/c-api/object.rst +++ b/Doc/c-api/object.rst @@ -253,6 +253,16 @@ Object Protocol and ``0`` otherwise. This function always succeeds. +.. c:function:: PyObject* PyObject_CallNoArgs(PyObject *callable) + + Call a callable Python object *callable* without any arguments. + + Returns the result of the call on success, or raise an exception and return + *NULL* on failure. + + .. versionadded:: 3.9 + + .. c:function:: PyObject* PyObject_Call(PyObject *callable, PyObject *args, PyObject *kwargs) Call a callable Python object *callable*, with arguments given by the diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index ed558385464a..62b013f7721c 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -102,6 +102,8 @@ Optimizations Build and C API Changes ======================= +* Add a new public :c:func:`PyObject_CallNoArgs` function to the C API: + call a callable Python object without any arguments. Deprecated diff --git a/Include/abstract.h b/Include/abstract.h index c226aab9b730..f36fafb43c9e 100644 --- a/Include/abstract.h +++ b/Include/abstract.h @@ -141,6 +141,12 @@ extern "C" { #endif +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03090000 +/* Call a callable Python object without any arguments */ +PyAPI_FUNC(PyObject *) PyObject_CallNoArgs(PyObject *func); +#endif + + /* Call a callable Python object 'callable' with arguments given by the tuple 'args' and keywords arguments given by the dictionary 'kwargs'. diff --git a/Include/cpython/abstract.h b/Include/cpython/abstract.h index d0369122287b..415f3e15f974 100644 --- a/Include/cpython/abstract.h +++ b/Include/cpython/abstract.h @@ -144,7 +144,9 @@ _PyObject_FastCall(PyObject *func, PyObject *const *args, Py_ssize_t nargs) return _PyObject_Vectorcall(func, args, (size_t)nargs, NULL); } -/* Call a callable without any arguments */ +/* Call a callable without any arguments + Private static inline function variant of public function + PyObject_CallNoArgs(). */ static inline PyObject * _PyObject_CallNoArg(PyObject *func) { return _PyObject_Vectorcall(func, NULL, 0, NULL); diff --git a/Misc/NEWS.d/next/C API/2019-06-07-14-03-52.bpo-37194.uck7MD.rst b/Misc/NEWS.d/next/C API/2019-06-07-14-03-52.bpo-37194.uck7MD.rst new file mode 100644 index 000000000000..c15d3720b010 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2019-06-07-14-03-52.bpo-37194.uck7MD.rst @@ -0,0 +1,6 @@ +Add a new public :c:func:`PyObject_CallNoArgs` function to the C API: call a +callable Python object without any arguments. It is the most efficient way to +call a callback without any argument. On x86-64, for example, +``PyObject_CallFunctionObjArgs(func, NULL)`` allocates 960 bytes on the stack +per call, whereas ``PyObject_CallNoArgs(func)`` only allocates 624 bytes per +call. diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c index 281161b68611..4caf3a466469 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -216,7 +216,7 @@ get_future_loop(PyObject *fut) return NULL; } if (getloop != NULL) { - PyObject *res = _PyObject_CallNoArg(getloop); + PyObject *res = PyObject_CallNoArgs(getloop); Py_DECREF(getloop); return res; } @@ -328,7 +328,7 @@ get_event_loop(void) return loop; } - policy = _PyObject_CallNoArg(asyncio_get_event_loop_policy); + policy = PyObject_CallNoArgs(asyncio_get_event_loop_policy); if (policy == NULL) { return NULL; } @@ -510,7 +510,7 @@ future_init(FutureObj *fut, PyObject *loop) method, which is called during the interpreter shutdown and the traceback module is already unloaded. */ - fut->fut_source_tb = _PyObject_CallNoArg(traceback_extract_stack); + fut->fut_source_tb = PyObject_CallNoArgs(traceback_extract_stack); if (fut->fut_source_tb == NULL) { return -1; } @@ -553,7 +553,7 @@ future_set_exception(FutureObj *fut, PyObject *exc) } if (PyExceptionClass_Check(exc)) { - exc_val = _PyObject_CallNoArg(exc); + exc_val = PyObject_CallNoArgs(exc); if (exc_val == NULL) { return NULL; } @@ -2593,7 +2593,7 @@ task_step_impl(TaskObj *task, PyObject *exc) if (!exc) { /* exc was not a CancelledError */ - exc = _PyObject_CallNoArg(asyncio_CancelledError); + exc = PyObject_CallNoArgs(asyncio_CancelledError); if (!exc) { goto fail; } @@ -3308,7 +3308,7 @@ module_init(void) PyObject *weak_set; WITH_MOD("weakref") GET_MOD_ATTR(weak_set, "WeakSet"); - all_tasks = _PyObject_CallNoArg(weak_set); + all_tasks = PyObject_CallNoArgs(weak_set); Py_CLEAR(weak_set); if (all_tasks == NULL) { goto fail; diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index 4d3562cbe64f..2e0211cbbef8 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -1528,8 +1528,8 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple, ntoappend = 1; } else if ((ch = *pin++) == '\0') { - /* Null byte follows %, copy only '%'. - * + /* Null byte follows %, copy only '%'. + * * Back the pin up one char so that we catch the null check * the next time through the loop.*/ pin--; @@ -1619,7 +1619,7 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple, usednew += ntoappend; assert(usednew <= totalnew); } /* end while() */ - + if (_PyBytes_Resize(&newfmt, usednew) < 0) goto Done; { @@ -3607,7 +3607,7 @@ tzinfo_reduce(PyObject *self, PyObject *Py_UNUSED(ignored)) getinitargs = _PyObject_GetAttrId(self, &PyId___getinitargs__); if (getinitargs != NULL) { - args = _PyObject_CallNoArg(getinitargs); + args = PyObject_CallNoArgs(getinitargs); Py_DECREF(getinitargs); if (args == NULL) { return NULL; @@ -3624,7 +3624,7 @@ tzinfo_reduce(PyObject *self, PyObject *Py_UNUSED(ignored)) getstate = _PyObject_GetAttrId(self, &PyId___getstate__); if (getstate != NULL) { - state = _PyObject_CallNoArg(getstate); + state = PyObject_CallNoArgs(getstate); Py_DECREF(getstate); if (state == NULL) { Py_DECREF(args); diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index 8119c8b1e2b1..ee1b5e5882fa 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -3892,7 +3892,7 @@ _elementtree_XMLParser_close_impl(XMLParserObject *self) } else if (self->handle_close) { Py_DECREF(res); - return _PyObject_CallNoArg(self->handle_close); + return PyObject_CallNoArgs(self->handle_close); } else { return res; diff --git a/Modules/_pickle.c b/Modules/_pickle.c index 34e11bd5f820..3adece0f0012 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -1274,7 +1274,7 @@ _Unpickler_ReadFromFile(UnpicklerObject *self, Py_ssize_t n) return -1; if (n == READ_WHOLE_LINE) { - data = _PyObject_CallNoArg(self->readline); + data = PyObject_CallNoArgs(self->readline); } else { PyObject *len; @@ -4411,7 +4411,7 @@ save(PicklerObject *self, PyObject *obj, int pers_save) /* Check for a __reduce__ method. */ reduce_func = _PyObject_GetAttrId(obj, &PyId___reduce__); if (reduce_func != NULL) { - reduce_value = _PyObject_CallNoArg(reduce_func); + reduce_value = PyObject_CallNoArgs(reduce_func); } else { PyErr_Format(st->PicklingError, diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c index 613a95b08972..a832099c0950 100644 --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -2768,7 +2768,7 @@ TimerHandler(ClientData clientData) ENTER_PYTHON - res = _PyObject_CallNoArg(func); + res = PyObject_CallNoArgs(func); Py_DECREF(func); Py_DECREF(v); /* See Tktt_New() */ diff --git a/Modules/readline.c b/Modules/readline.c index 57335fe911bf..930e63975c5c 100644 --- a/Modules/readline.c +++ b/Modules/readline.c @@ -867,7 +867,7 @@ on_hook(PyObject *func) int result = 0; if (func != NULL) { PyObject *r; - r = _PyObject_CallNoArg(func); + r = PyObject_CallNoArgs(func); if (r == NULL) goto error; if (r == Py_None) diff --git a/Objects/call.c b/Objects/call.c index 5bef9f566e8f..f9a3207e9622 100644 --- a/Objects/call.c +++ b/Objects/call.c @@ -70,6 +70,14 @@ _Py_CheckFunctionResult(PyObject *callable, PyObject *result, const char *where) /* --- Core PyObject call functions ------------------------------- */ +/* Call a callable Python object without any arguments */ +PyObject * +PyObject_CallNoArgs(PyObject *func) +{ + return _PyObject_CallNoArg(func); +} + + PyObject * _PyObject_FastCallDict(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwargs) From webhook-mailer at python.org Mon Jun 17 08:58:22 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 17 Jun 2019 12:58:22 -0000 Subject: [Python-checkins] bpo-37194: Complete PyObject_CallXXX() docs (GH-14156) Message-ID: https://github.com/python/cpython/commit/1ce2656f13e726b3b99d4c968926908cff1f460a commit: 1ce2656f13e726b3b99d4c968926908cff1f460a branch: master author: Victor Stinner committer: GitHub date: 2019-06-17T14:58:10+02:00 summary: bpo-37194: Complete PyObject_CallXXX() docs (GH-14156) Mention explicitly that PyObject_CallXXX() functions raise an exception an failure. files: M Doc/c-api/object.rst diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst index aecd001a216e..e4787ad39c08 100644 --- a/Doc/c-api/object.rst +++ b/Doc/c-api/object.rst @@ -257,7 +257,7 @@ Object Protocol Call a callable Python object *callable* without any arguments. - Returns the result of the call on success, or raise an exception and return + Return the result of the call on success, or raise an exception and return *NULL* on failure. .. versionadded:: 3.9 @@ -271,7 +271,8 @@ Object Protocol *args* must not be *NULL*, use an empty tuple if no arguments are needed. If no named arguments are needed, *kwargs* can be *NULL*. - Returns the result of the call on success, or *NULL* on failure. + Return the result of the call on success, or raise an exception and return + *NULL* on failure. This is the equivalent of the Python expression: ``callable(*args, **kwargs)``. @@ -282,7 +283,8 @@ Object Protocol Call a callable Python object *callable*, with arguments given by the tuple *args*. If no arguments are needed, then *args* can be *NULL*. - Returns the result of the call on success, or *NULL* on failure. + Return the result of the call on success, or raise an exception and return + *NULL* on failure. This is the equivalent of the Python expression: ``callable(*args)``. @@ -293,7 +295,8 @@ Object Protocol The C arguments are described using a :c:func:`Py_BuildValue` style format string. The format can be *NULL*, indicating that no arguments are provided. - Returns the result of the call on success, or *NULL* on failure. + Return the result of the call on success, or raise an exception and return + *NULL* on failure. This is the equivalent of the Python expression: ``callable(*args)``. @@ -312,7 +315,8 @@ Object Protocol The format can be *NULL*, indicating that no arguments are provided. - Returns the result of the call on success, or *NULL* on failure. + Return the result of the call on success, or raise an exception and return + *NULL* on failure. This is the equivalent of the Python expression: ``obj.name(arg1, arg2, ...)``. @@ -330,7 +334,8 @@ Object Protocol :c:type:`PyObject\*` arguments. The arguments are provided as a variable number of parameters followed by *NULL*. - Returns the result of the call on success, or *NULL* on failure. + Return the result of the call on success, or raise an exception and return + *NULL* on failure. This is the equivalent of the Python expression: ``callable(arg1, arg2, ...)``. @@ -341,7 +346,9 @@ Object Protocol Calls a method of the Python object *obj*, where the name of the method is given as a Python string object in *name*. It is called with a variable number of :c:type:`PyObject\*` arguments. The arguments are provided as a variable number - of parameters followed by *NULL*. Returns the result of the call on success, or + of parameters followed by *NULL*. + + Return the result of the call on success, or raise an exception and return *NULL* on failure. @@ -365,7 +372,8 @@ Object Protocol *kwnames* must contain only objects of type ``str`` (not a subclass), and all keys must be unique. - Return the result of the call on success, or *NULL* on failure. + Return the result of the call on success, or raise an exception and return + *NULL* on failure. This uses the vectorcall protocol if the callable supports it; otherwise, the arguments are converted to use From webhook-mailer at python.org Mon Jun 17 09:23:58 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 17 Jun 2019 13:23:58 -0000 Subject: [Python-checkins] bpo-37194: Complete PyObject_CallXXX() docs (GH-14156) (GH-14158) Message-ID: https://github.com/python/cpython/commit/ac4202ee4d53d6c0a07109e03795b70d91edbbb3 commit: ac4202ee4d53d6c0a07109e03795b70d91edbbb3 branch: 3.7 author: Victor Stinner committer: GitHub date: 2019-06-17T15:23:52+02:00 summary: bpo-37194: Complete PyObject_CallXXX() docs (GH-14156) (GH-14158) Mention explicitly that PyObject_CallXXX() functions raise an exception an failure. (cherry picked from commit 1ce2656f13e726b3b99d4c968926908cff1f460a) files: M Doc/c-api/object.rst diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst index a64ff2e6b58b..c09d97a66c01 100644 --- a/Doc/c-api/object.rst +++ b/Doc/c-api/object.rst @@ -261,7 +261,8 @@ Object Protocol *args* must not be *NULL*, use an empty tuple if no arguments are needed. If no named arguments are needed, *kwargs* can be *NULL*. - Returns the result of the call on success, or *NULL* on failure. + Return the result of the call on success, or raise an exception and return + *NULL* on failure. This is the equivalent of the Python expression: ``callable(*args, **kwargs)``. @@ -272,7 +273,8 @@ Object Protocol Call a callable Python object *callable*, with arguments given by the tuple *args*. If no arguments are needed, then *args* can be *NULL*. - Returns the result of the call on success, or *NULL* on failure. + Return the result of the call on success, or raise an exception and return + *NULL* on failure. This is the equivalent of the Python expression: ``callable(*args)``. @@ -283,7 +285,8 @@ Object Protocol The C arguments are described using a :c:func:`Py_BuildValue` style format string. The format can be *NULL*, indicating that no arguments are provided. - Returns the result of the call on success, or *NULL* on failure. + Return the result of the call on success, or raise an exception and return + *NULL* on failure. This is the equivalent of the Python expression: ``callable(*args)``. @@ -302,7 +305,8 @@ Object Protocol The format can be *NULL*, indicating that no arguments are provided. - Returns the result of the call on success, or *NULL* on failure. + Return the result of the call on success, or raise an exception and return + *NULL* on failure. This is the equivalent of the Python expression: ``obj.name(arg1, arg2, ...)``. @@ -320,7 +324,8 @@ Object Protocol :c:type:`PyObject\*` arguments. The arguments are provided as a variable number of parameters followed by *NULL*. - Returns the result of the call on success, or *NULL* on failure. + Return the result of the call on success, or raise an exception and return + *NULL* on failure. This is the equivalent of the Python expression: ``callable(arg1, arg2, ...)``. @@ -331,7 +336,9 @@ Object Protocol Calls a method of the Python object *obj*, where the name of the method is given as a Python string object in *name*. It is called with a variable number of :c:type:`PyObject\*` arguments. The arguments are provided as a variable number - of parameters followed by *NULL*. Returns the result of the call on success, or + of parameters followed by *NULL*. + + Return the result of the call on success, or raise an exception and return *NULL* on failure. From webhook-mailer at python.org Mon Jun 17 09:24:03 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 17 Jun 2019 13:24:03 -0000 Subject: [Python-checkins] bpo-37194: Complete PyObject_CallXXX() docs (GH-14156) (GH-14157) Message-ID: https://github.com/python/cpython/commit/71031cf4ed5ac9e330c8890b92379d9df383925b commit: 71031cf4ed5ac9e330c8890b92379d9df383925b branch: 3.8 author: Victor Stinner committer: GitHub date: 2019-06-17T15:23:59+02:00 summary: bpo-37194: Complete PyObject_CallXXX() docs (GH-14156) (GH-14157) Mention explicitly that PyObject_CallXXX() functions raise an exception an failure. (cherry picked from commit 1ce2656f13e726b3b99d4c968926908cff1f460a) files: M Doc/c-api/object.rst diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst index ce0d05942f4e..187a025a67cb 100644 --- a/Doc/c-api/object.rst +++ b/Doc/c-api/object.rst @@ -261,7 +261,8 @@ Object Protocol *args* must not be *NULL*, use an empty tuple if no arguments are needed. If no named arguments are needed, *kwargs* can be *NULL*. - Returns the result of the call on success, or *NULL* on failure. + Return the result of the call on success, or raise an exception and return + *NULL* on failure. This is the equivalent of the Python expression: ``callable(*args, **kwargs)``. @@ -272,7 +273,8 @@ Object Protocol Call a callable Python object *callable*, with arguments given by the tuple *args*. If no arguments are needed, then *args* can be *NULL*. - Returns the result of the call on success, or *NULL* on failure. + Return the result of the call on success, or raise an exception and return + *NULL* on failure. This is the equivalent of the Python expression: ``callable(*args)``. @@ -283,7 +285,8 @@ Object Protocol The C arguments are described using a :c:func:`Py_BuildValue` style format string. The format can be *NULL*, indicating that no arguments are provided. - Returns the result of the call on success, or *NULL* on failure. + Return the result of the call on success, or raise an exception and return + *NULL* on failure. This is the equivalent of the Python expression: ``callable(*args)``. @@ -302,7 +305,8 @@ Object Protocol The format can be *NULL*, indicating that no arguments are provided. - Returns the result of the call on success, or *NULL* on failure. + Return the result of the call on success, or raise an exception and return + *NULL* on failure. This is the equivalent of the Python expression: ``obj.name(arg1, arg2, ...)``. @@ -320,7 +324,8 @@ Object Protocol :c:type:`PyObject\*` arguments. The arguments are provided as a variable number of parameters followed by *NULL*. - Returns the result of the call on success, or *NULL* on failure. + Return the result of the call on success, or raise an exception and return + *NULL* on failure. This is the equivalent of the Python expression: ``callable(arg1, arg2, ...)``. @@ -331,7 +336,9 @@ Object Protocol Calls a method of the Python object *obj*, where the name of the method is given as a Python string object in *name*. It is called with a variable number of :c:type:`PyObject\*` arguments. The arguments are provided as a variable number - of parameters followed by *NULL*. Returns the result of the call on success, or + of parameters followed by *NULL*. + + Return the result of the call on success, or raise an exception and return *NULL* on failure. @@ -355,7 +362,8 @@ Object Protocol *kwnames* must contain only objects of type ``str`` (not a subclass), and all keys must be unique. - Return the result of the call on success, or *NULL* on failure. + Return the result of the call on success, or raise an exception and return + *NULL* on failure. This uses the vectorcall protocol if the callable supports it; otherwise, the arguments are converted to use From webhook-mailer at python.org Mon Jun 17 09:57:59 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Mon, 17 Jun 2019 13:57:59 -0000 Subject: [Python-checkins] bpo-37315: Deprecate accepting floats in math.factorial(). (GH-14147) Message-ID: https://github.com/python/cpython/commit/231aad38493c871dd32930a21d256cbacd2ae20c commit: 231aad38493c871dd32930a21d256cbacd2ae20c branch: master author: Serhiy Storchaka committer: GitHub date: 2019-06-17T16:57:27+03:00 summary: bpo-37315: Deprecate accepting floats in math.factorial(). (GH-14147) files: A Misc/NEWS.d/next/Library/2019-06-17-11-59-52.bpo-37315.o1xFC0.rst M Doc/library/math.rst M Doc/whatsnew/3.9.rst M Lib/test/test_math.py M Modules/mathmodule.c diff --git a/Doc/library/math.rst b/Doc/library/math.rst index ff937d27c6ce..bfce41a7f4c4 100644 --- a/Doc/library/math.rst +++ b/Doc/library/math.rst @@ -71,6 +71,9 @@ Number-theoretic and representation functions Return *x* factorial as an integer. Raises :exc:`ValueError` if *x* is not integral or is negative. + .. deprecated:: 3.9 + Accepting floats with integral values (like ``5.0``) is deprecated. + .. function:: floor(x) diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 62b013f7721c..c5cb626a1b6b 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -109,6 +109,11 @@ Build and C API Changes Deprecated ========== +* Currently :func:`math.factorial` accepts :class:`float` instances with + non-negative integer values (like ``5.0``). It raises a :exc:`ValueError` + for non-integral and negative floats. It is deprecated now. In future + Python versions it will raise a :exc:`TypeError` for all floats. + (Contributed by Serhiy Storchaka in :issue:`37315`.) Removed diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index adefa07a4041..f25913941b8a 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -501,21 +501,25 @@ def testFabs(self): def testFactorial(self): self.assertEqual(math.factorial(0), 1) - self.assertEqual(math.factorial(0.0), 1) total = 1 for i in range(1, 1000): total *= i self.assertEqual(math.factorial(i), total) - self.assertEqual(math.factorial(float(i)), total) self.assertEqual(math.factorial(i), py_factorial(i)) self.assertRaises(ValueError, math.factorial, -1) - self.assertRaises(ValueError, math.factorial, -1.0) self.assertRaises(ValueError, math.factorial, -10**100) - self.assertRaises(ValueError, math.factorial, -1e100) - self.assertRaises(ValueError, math.factorial, math.pi) def testFactorialNonIntegers(self): - self.assertRaises(TypeError, math.factorial, decimal.Decimal(5.2)) + with self.assertWarns(DeprecationWarning): + self.assertEqual(math.factorial(5.0), 120) + with self.assertWarns(DeprecationWarning): + self.assertRaises(ValueError, math.factorial, 5.2) + with self.assertWarns(DeprecationWarning): + self.assertRaises(ValueError, math.factorial, -1.0) + with self.assertWarns(DeprecationWarning): + self.assertRaises(ValueError, math.factorial, -1e100) + self.assertRaises(TypeError, math.factorial, decimal.Decimal('5')) + self.assertRaises(TypeError, math.factorial, decimal.Decimal('5.2')) self.assertRaises(TypeError, math.factorial, "5") # Other implementations may place different upper bounds. @@ -524,7 +528,8 @@ def testFactorialHugeInputs(self): # Currently raises ValueError for inputs that are too large # to fit into a C long. self.assertRaises(OverflowError, math.factorial, 10**100) - self.assertRaises(OverflowError, math.factorial, 1e100) + with self.assertWarns(DeprecationWarning): + self.assertRaises(OverflowError, math.factorial, 1e100) def testFloor(self): self.assertRaises(TypeError, math.floor) diff --git a/Misc/NEWS.d/next/Library/2019-06-17-11-59-52.bpo-37315.o1xFC0.rst b/Misc/NEWS.d/next/Library/2019-06-17-11-59-52.bpo-37315.o1xFC0.rst new file mode 100644 index 000000000000..fd5981989b7d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-17-11-59-52.bpo-37315.o1xFC0.rst @@ -0,0 +1,2 @@ +Deprecated accepting floats with integral value (like ``5.0``) in +:func:`math.factorial`. diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index 82a9a14724f5..a75a3c929e7b 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -1981,6 +1981,12 @@ math_factorial(PyObject *module, PyObject *arg) PyObject *result, *odd_part, *pyint_form; if (PyFloat_Check(arg)) { + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "Using factorial() with floats is deprecated", + 1) < 0) + { + return NULL; + } PyObject *lx; double dx = PyFloat_AS_DOUBLE((PyFloatObject *)arg); if (!(Py_IS_FINITE(dx) && dx == floor(dx))) { From webhook-mailer at python.org Mon Jun 17 09:58:43 2019 From: webhook-mailer at python.org (Serhiy Storchaka) Date: Mon, 17 Jun 2019 13:58:43 -0000 Subject: [Python-checkins] bpo-35431: Test math.comb() and math.perm() for OverflowError only on CPython. (GH-14146) Message-ID: https://github.com/python/cpython/commit/1b8a46d59734a77cd1f5ffcf3bdfcaafd58a87e7 commit: 1b8a46d59734a77cd1f5ffcf3bdfcaafd58a87e7 branch: master author: Serhiy Storchaka committer: GitHub date: 2019-06-17T16:58:32+03:00 summary: bpo-35431: Test math.comb() and math.perm() for OverflowError only on CPython. (GH-14146) Other implementation can raise MemoryError, but it can takes hours. files: M Lib/test/test_math.py diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index f25913941b8a..fa690441be43 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -525,7 +525,7 @@ def testFactorialNonIntegers(self): # Other implementations may place different upper bounds. @support.cpython_only def testFactorialHugeInputs(self): - # Currently raises ValueError for inputs that are too large + # Currently raises OverflowError for inputs that are too large # to fit into a C long. self.assertRaises(OverflowError, math.factorial, 10**100) with self.assertWarns(DeprecationWarning): @@ -1922,7 +1922,8 @@ def testPerm(self): self.assertEqual(perm(n, 0), 1) self.assertEqual(perm(n, 1), n) self.assertEqual(perm(n, 2), n * (n-1)) - self.assertRaises((OverflowError, MemoryError), perm, n, n) + if support.check_impl_detail(cpython=True): + self.assertRaises(OverflowError, perm, n, n) for n, k in (True, True), (True, False), (False, False): self.assertEqual(perm(n, k), 1) @@ -1991,7 +1992,8 @@ def testComb(self): self.assertEqual(comb(n, n), 1) self.assertEqual(comb(n, n-1), n) self.assertEqual(comb(n, n-2), n * (n-1) // 2) - self.assertRaises((OverflowError, MemoryError), comb, n, n//2) + if support.check_impl_detail(cpython=True): + self.assertRaises(OverflowError, comb, n, n//2) for n, k in (True, True), (True, False), (False, False): self.assertEqual(comb(n, k), 1) From webhook-mailer at python.org Mon Jun 17 11:16:00 2019 From: webhook-mailer at python.org (Victor Stinner) Date: Mon, 17 Jun 2019 15:16:00 -0000 Subject: [Python-checkins] bpo-37194: Add PyObject_CallNoArgs() rationale (GH-14159) Message-ID: https://github.com/python/cpython/commit/5352cc41fa4eb5f0dc847709392e88473b8593b0 commit: 5352cc41fa4eb5f0dc847709392e88473b8593b0 branch: master author: Victor Stinner committer: GitHub date: 2019-06-17T17:15:36+02:00 summary: bpo-37194: Add PyObject_CallNoArgs() rationale (GH-14159) Explain in the doc why PyObject_CallNoArgs() should be preferred over other existing ways to call a function without any arguments. files: M Doc/c-api/object.rst M Doc/whatsnew/3.9.rst diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst index e4787ad39c08..13f13b3489b8 100644 --- a/Doc/c-api/object.rst +++ b/Doc/c-api/object.rst @@ -255,7 +255,8 @@ Object Protocol .. c:function:: PyObject* PyObject_CallNoArgs(PyObject *callable) - Call a callable Python object *callable* without any arguments. + Call a callable Python object *callable* without any arguments. It is the + most efficient way to call a callable Python object without any argument. Return the result of the call on success, or raise an exception and return *NULL* on failure. diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index c5cb626a1b6b..3da8b1685bde 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -103,7 +103,10 @@ Build and C API Changes ======================= * Add a new public :c:func:`PyObject_CallNoArgs` function to the C API: - call a callable Python object without any arguments. + call a callable Python object without any arguments. It is the most efficient + way to call a callable Python object without any argument. + (Contributed by Victor Stinner in :issue:`37194`.) + Deprecated From webhook-mailer at python.org Mon Jun 17 11:21:36 2019 From: webhook-mailer at python.org (Steve Dower) Date: Mon, 17 Jun 2019 15:21:36 -0000 Subject: [Python-checkins] bpo-37288: Fix Windows build when --no-tkinter is specified (GH-14096) Message-ID: https://github.com/python/cpython/commit/00f6493084c385033fe5574314223217d9a26672 commit: 00f6493084c385033fe5574314223217d9a26672 branch: master author: Paul Monson committer: Steve Dower date: 2019-06-17T08:21:28-07:00 summary: bpo-37288: Fix Windows build when --no-tkinter is specified (GH-14096) files: M PCbuild/python.vcxproj diff --git a/PCbuild/python.vcxproj b/PCbuild/python.vcxproj index fdf8f12037aa..e37bcfb0b6e1 100644 --- a/PCbuild/python.vcxproj +++ b/PCbuild/python.vcxproj @@ -150,10 +150,10 @@ $(_PGOPath) + + $(tcltkDir)tixlicense.terms" Condition="$(IncludeTkinter)" /> <_LicenseFiles Include="@(LicenseFiles)"> $([System.IO.File]::ReadAllText(%(FullPath))) From webhook-mailer at python.org Mon Jun 17 11:48:03 2019 From: webhook-mailer at python.org (Miss Islington (bot)) Date: Mon, 17 Jun 2019 15:48:03 -0000 Subject: [Python-checkins] bpo-37288: Fix Windows build when --no-tkinter is specified (GH-14096) Message-ID: https://github.com/python/cpython/commit/79d8204c4f02d02b3c6570de94c85863c27ddecb commit: 79d8204c4f02d02b3c6570de94c85863c27ddecb branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: GitHub date: 2019-06-17T08:43:35-07:00 summary: bpo-37288: Fix Windows build when --no-tkinter is specified (GH-14096) (cherry picked from commit 00f6493084c385033fe5574314223217d9a26672) Co-authored-by: Paul Monson files: M PCbuild/python.vcxproj diff --git a/PCbuild/python.vcxproj b/PCbuild/python.vcxproj index fdf8f12037aa..e37bcfb0b6e1 100644 --- a/PCbuild/python.vcxproj +++ b/PCbuild/python.vcxproj @@ -150,10 +150,10 @@ $(_PGOPath) + + $(tcltkDir)tixlicense.terms" Condition="$(IncludeTkinter)" /> <_LicenseFiles Include="@(LicenseFiles)"> $([System.IO.File]::ReadAllText(%(FullPath))) From webhook-mailer at python.org Mon Jun 17 12:33:30 2019 From: webhook-mailer at python.org (Steve Dower) Date: Mon, 17 Jun 2019 16:33:30 -0000 Subject: [Python-checkins] bpo-34631: Updated OpenSSL to 1.0.2s in Windows installer (GH-14161) Message-ID: https://github.com/python/cpython/commit/d8e3a8af775d683c606f3618d04f2be4e97ac3c0 commit: d8e3a8af775d683c606f3618d04f2be4e97ac3c0 branch: 2.7 author: Steve Dower committer: GitHub date: 2019-06-17T09:33:11-07:00 summary: bpo-34631: Updated OpenSSL to 1.0.2s in Windows installer (GH-14161) files: A Misc/NEWS.d/next/Security/2019-06-17-08-43-19.bpo-34631.pJ8CGR.rst M PCbuild/get_externals.bat M PCbuild/python.props M PCbuild/readme.txt diff --git a/Misc/NEWS.d/next/Security/2019-06-17-08-43-19.bpo-34631.pJ8CGR.rst b/Misc/NEWS.d/next/Security/2019-06-17-08-43-19.bpo-34631.pJ8CGR.rst new file mode 100644 index 000000000000..41a972e9665a --- /dev/null +++ b/Misc/NEWS.d/next/Security/2019-06-17-08-43-19.bpo-34631.pJ8CGR.rst @@ -0,0 +1 @@ +Updated OpenSSL to 1.0.2s in Windows installer diff --git a/PCbuild/get_externals.bat b/PCbuild/get_externals.bat index ed6a79f11db6..f0a4b9946d86 100644 --- a/PCbuild/get_externals.bat +++ b/PCbuild/get_externals.bat @@ -47,7 +47,7 @@ rem files in both this dir and PC\VS9.0 set libraries= set libraries=%libraries% bzip2-1.0.6 if NOT "%IncludeBsddb%"=="false" set libraries=%libraries% bsddb-4.7.25.0 -if NOT "%IncludeSSL%"=="false" set libraries=%libraries% openssl-1.0.2q +if NOT "%IncludeSSL%"=="false" set libraries=%libraries% openssl-1.0.2s set libraries=%libraries% sqlite-3.14.2.0 if NOT "%IncludeTkinter%"=="false" set libraries=%libraries% tcl-8.5.19.0 if NOT "%IncludeTkinter%"=="false" set libraries=%libraries% tk-8.5.19.0 diff --git a/PCbuild/python.props b/PCbuild/python.props index 6673ff31368e..b3dc1da3dffd 100644 --- a/PCbuild/python.props +++ b/PCbuild/python.props @@ -35,7 +35,7 @@ $(ExternalsDir)sqlite-3.14.2.0\ $(ExternalsDir)bzip2-1.0.6\ $(ExternalsDir)bsddb-4.7.25.0 - $(ExternalsDir)openssl-1.0.2q\ + $(ExternalsDir)openssl-1.0.2s\ $(opensslDir)include32 $(opensslDir)include64 $(ExternalsDir)\nasm-2.11.06\ diff --git a/PCbuild/readme.txt b/PCbuild/readme.txt index 556a8f25ca98..ab4b6d0760a7 100644 --- a/PCbuild/readme.txt +++ b/PCbuild/readme.txt @@ -192,7 +192,7 @@ _bz2 Homepage: http://www.bzip.org/ _ssl - Python wrapper for version 1.0.2o of the OpenSSL secure sockets + Python wrapper for version 1.0.2s of the OpenSSL secure sockets library, which is built by ssl.vcxproj Homepage: http://www.openssl.org/ From webhook-mailer at python.org Mon Jun 17 12:40:57 2019 From: webhook-mailer at python.org (Vinay Sajip) Date: Mon, 17 Jun 2019 16:40:57 -0000 Subject: [Python-checkins] =?utf-8?q?bpo-37111=3A_Add_=27encoding=27_and_?= =?utf-8?q?=27errors=27_parameters_to_logging=2EbasicCon=E2=80=A6_=28GH-14?= =?utf-8?q?008=29?= Message-ID: https://github.com/python/cpython/commit/ca7b504a4d4c3a5fde1ee4607b9501c2bab6e743 commit: ca7b504a4d4c3a5fde1ee4607b9501c2bab6e743 branch: master author: Vinay Sajip committer: GitHub date: 2019-06-17T17:40:52+01:00 summary: bpo-37111: Add 'encoding' and 'errors' parameters to logging.basicCon? (GH-14008) files: A Misc/NEWS.d/next/Library/2019-06-09-17-22-33.bpo-37111.2I0z2k.rst M Doc/howto/logging.rst M Doc/library/logging.handlers.rst M Doc/library/logging.rst M Doc/tools/susp-ignored.csv M Lib/logging/__init__.py M Lib/logging/handlers.py M Lib/test/test_logging.py diff --git a/Doc/howto/logging.rst b/Doc/howto/logging.rst index 7a68ca89199c..fbe5a118d186 100644 --- a/Doc/howto/logging.rst +++ b/Doc/howto/logging.rst @@ -128,10 +128,18 @@ look at that next. Be sure to try the following in a newly-started Python interpreter, and don't just continue from the session described above:: import logging - logging.basicConfig(filename='example.log',level=logging.DEBUG) + logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') + logging.error('And non-ASCII stuff, too, like ?resund and Malm?') + +.. versionchanged:: 3.9 + The *encoding* argument was added. In earlier Python versions, or if not + specified, the encoding used is the default value used by :func:`open`. While + not shown in the above example, an *errors* argument can also now be passed, + which determines how encoding errors are handled. For available values and + the default, see the documentation for :func:`open`. And now if we open the file and look at what we have, we should find the log messages: @@ -141,6 +149,7 @@ messages: DEBUG:root:This message should go to the log file INFO:root:So should this WARNING:root:And this, too + ERROR:root:And non-ASCII stuff, too, like ?resund and Malm? This example also shows how you can set the logging level which acts as the threshold for tracking. In this case, because we set the threshold to diff --git a/Doc/library/logging.handlers.rst b/Doc/library/logging.handlers.rst index dee9a84e3337..822f82dffcfd 100644 --- a/Doc/library/logging.handlers.rst +++ b/Doc/library/logging.handlers.rst @@ -89,18 +89,22 @@ sends logging output to a disk file. It inherits the output functionality from :class:`StreamHandler`. -.. class:: FileHandler(filename, mode='a', encoding=None, delay=False) +.. class:: FileHandler(filename, mode='a', encoding=None, delay=False, errors=None) Returns a new instance of the :class:`FileHandler` class. The specified file is opened and used as the stream for logging. If *mode* is not specified, :const:`'a'` is used. If *encoding* is not ``None``, it is used to open the file with that encoding. If *delay* is true, then file opening is deferred until the - first call to :meth:`emit`. By default, the file grows indefinitely. + first call to :meth:`emit`. By default, the file grows indefinitely. If + *errors* is specified, it's used to determine how encoding errors are handled. .. versionchanged:: 3.6 As well as string values, :class:`~pathlib.Path` objects are also accepted for the *filename* argument. + .. versionchanged:: 3.9 + The *errors* parameter was added. + .. method:: close() Closes the file. @@ -168,18 +172,22 @@ exclusive locks - and so there is no need for such a handler. Furthermore, for this value. -.. class:: WatchedFileHandler(filename, mode='a', encoding=None, delay=False) +.. class:: WatchedFileHandler(filename, mode='a', encoding=None, delay=False, errors=None) Returns a new instance of the :class:`WatchedFileHandler` class. The specified file is opened and used as the stream for logging. If *mode* is not specified, :const:`'a'` is used. If *encoding* is not ``None``, it is used to open the file with that encoding. If *delay* is true, then file opening is deferred until the - first call to :meth:`emit`. By default, the file grows indefinitely. + first call to :meth:`emit`. By default, the file grows indefinitely. If + *errors* is provided, it determines how encoding errors are handled. .. versionchanged:: 3.6 As well as string values, :class:`~pathlib.Path` objects are also accepted for the *filename* argument. + .. versionchanged:: 3.9 + The *errors* parameter was added. + .. method:: reopenIfNeeded() Checks to see if the file has changed. If it has, the existing stream is @@ -205,7 +213,7 @@ module, is the base class for the rotating file handlers, not need to instantiate this class, but it has attributes and methods you may need to override. -.. class:: BaseRotatingHandler(filename, mode, encoding=None, delay=False) +.. class:: BaseRotatingHandler(filename, mode, encoding=None, delay=False, errors=None) The parameters are as for :class:`FileHandler`. The attributes are: @@ -284,13 +292,14 @@ The :class:`RotatingFileHandler` class, located in the :mod:`logging.handlers` module, supports rotation of disk log files. -.. class:: RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False) +.. class:: RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False, errors=None) Returns a new instance of the :class:`RotatingFileHandler` class. The specified file is opened and used as the stream for logging. If *mode* is not specified, ``'a'`` is used. If *encoding* is not ``None``, it is used to open the file with that encoding. If *delay* is true, then file opening is deferred until the - first call to :meth:`emit`. By default, the file grows indefinitely. + first call to :meth:`emit`. By default, the file grows indefinitely. If + *errors* is provided, it determines how encoding errors are handled. You can use the *maxBytes* and *backupCount* values to allow the file to :dfn:`rollover` at a predetermined size. When the size is about to be exceeded, @@ -311,6 +320,9 @@ module, supports rotation of disk log files. As well as string values, :class:`~pathlib.Path` objects are also accepted for the *filename* argument. + .. versionchanged:: 3.9 + The *errors* parameter was added. + .. method:: doRollover() Does a rollover, as described above. @@ -331,7 +343,7 @@ The :class:`TimedRotatingFileHandler` class, located in the timed intervals. -.. class:: TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None) +.. class:: TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None, errors=None) Returns a new instance of the :class:`TimedRotatingFileHandler` class. The specified file is opened and used as the stream for logging. On rotating it also @@ -391,6 +403,9 @@ timed intervals. rollover, and subsequent rollovers would be calculated via the normal interval calculation. + If *errors* is specified, it's used to determine how encoding errors are + handled. + .. note:: Calculation of the initial rollover time is done when the handler is initialised. Calculation of subsequent rollover times is done only when rollover occurs, and rollover occurs only when emitting output. If @@ -411,6 +426,9 @@ timed intervals. As well as string values, :class:`~pathlib.Path` objects are also accepted for the *filename* argument. + .. versionchanged:: 3.9 + The *errors* parameter was added. + .. method:: doRollover() Does a rollover, as described above. diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst index 08555c3a3576..3e4d7deee8cf 100644 --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -1196,6 +1196,21 @@ functions. | | carrying out the configuration as specified | | | by the other arguments. | +--------------+---------------------------------------------+ + | *encoding* | If this keyword argument is specified along | + | | with *filename*, its value is used when the | + | | FileHandler is created, and thus used when | + | | opening the output file. | + +--------------+---------------------------------------------+ + | *errors* | If this keyword argument is specified along | + | | with *filename*, its value is used when the | + | | FileHandler is created, and thus used when | + | | opening the output file. If not specified, | + | | the value 'backslashreplace' is used. Note | + | | that if ``None`` is specified, it will be | + | | passed as such to func:`open`, which means | + | | that it will be treated the same as passing | + | | 'errors'. | + +--------------+---------------------------------------------+ .. versionchanged:: 3.2 The *style* argument was added. @@ -1209,6 +1224,9 @@ functions. .. versionchanged:: 3.8 The *force* argument was added. + .. versionchanged:: 3.9 + The *encoding* and *errors* arguments were added. + .. function:: shutdown() Informs the logging system to perform an orderly shutdown by flushing and diff --git a/Doc/tools/susp-ignored.csv b/Doc/tools/susp-ignored.csv index 85263d47c8bb..fcf556ec0daf 100644 --- a/Doc/tools/susp-ignored.csv +++ b/Doc/tools/susp-ignored.csv @@ -81,6 +81,7 @@ howto/ipaddress,,::,IPv6Address('2001:db8::ffff:ffff') howto/ipaddress,,:ffff,IPv6Address('2001:db8::ffff:ffff') howto/logging,,:And,"WARNING:And this, too" howto/logging,,:And,"WARNING:root:And this, too" +howto/logging,,:And,"ERROR:root:And non-ASCII stuff, too, like " howto/logging,,:Doing,INFO:root:Doing something howto/logging,,:Finished,INFO:root:Finished howto/logging,,:logger,severity:logger name:message @@ -90,6 +91,7 @@ howto/logging,,:root,DEBUG:root:This message should go to the log file howto/logging,,:root,INFO:root:Doing something howto/logging,,:root,INFO:root:Finished howto/logging,,:root,INFO:root:So should this +howto/logging,,:root,"ERROR:root:And non-ASCII stuff, too, like " howto/logging,,:root,INFO:root:Started howto/logging,,:root,"WARNING:root:And this, too" howto/logging,,:root,WARNING:root:Look before you leap! diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index 16812ec8d556..645e0b3c3a67 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2001-2017 by Vinay Sajip. All Rights Reserved. +# Copyright 2001-2019 by Vinay Sajip. All Rights Reserved. # # Permission to use, copy, modify, and distribute this software and its # documentation for any purpose and without fee is hereby granted, @@ -18,7 +18,7 @@ Logging package for Python. Based on PEP 282 and comments thereto in comp.lang.python. -Copyright (C) 2001-2017 Vinay Sajip. All Rights Reserved. +Copyright (C) 2001-2019 Vinay Sajip. All Rights Reserved. To use, simply 'import logging' and log away! """ @@ -1122,7 +1122,7 @@ class FileHandler(StreamHandler): """ A handler class which writes formatted logging records to disk files. """ - def __init__(self, filename, mode='a', encoding=None, delay=False): + def __init__(self, filename, mode='a', encoding=None, delay=False, errors=None): """ Open the specified file and use it as the stream for logging. """ @@ -1133,6 +1133,7 @@ def __init__(self, filename, mode='a', encoding=None, delay=False): self.baseFilename = os.path.abspath(filename) self.mode = mode self.encoding = encoding + self.errors = errors self.delay = delay if delay: #We don't open the stream, but we still need to call the @@ -1169,7 +1170,8 @@ def _open(self): Open the current base file with the (original) mode and encoding. Return the resulting stream. """ - return open(self.baseFilename, self.mode, encoding=self.encoding) + return open(self.baseFilename, self.mode, encoding=self.encoding, + errors=self.errors) def emit(self, record): """ @@ -1928,15 +1930,20 @@ def basicConfig(**kwargs): attached to the root logger are removed and closed, before carrying out the configuration as specified by the other arguments. + encoding If specified together with a filename, this encoding is passed to + the created FileHandler, causing it to be used when the file is + opened. + errors If specified together with a filename, this value is passed to the + created FileHandler, causing it to be used when the file is + opened in text mode. If not specified, the default value is + `backslashreplace`. + Note that you could specify a stream created using open(filename, mode) rather than passing the filename and mode in. However, it should be remembered that StreamHandler does not close its stream (since it may be using sys.stdout or sys.stderr), whereas FileHandler closes its stream when the handler is closed. - .. versionchanged:: 3.8 - Added the ``force`` parameter. - .. versionchanged:: 3.2 Added the ``style`` parameter. @@ -1946,12 +1953,20 @@ def basicConfig(**kwargs): ``filename``/``filemode``, or ``filename``/``filemode`` specified together with ``stream``, or ``handlers`` specified together with ``stream``. + + .. versionchanged:: 3.8 + Added the ``force`` parameter. + + .. versionchanged:: 3.9 + Added the ``encoding`` and ``errors`` parameters. """ # Add thread safety in case someone mistakenly calls # basicConfig() from multiple threads _acquireLock() try: force = kwargs.pop('force', False) + encoding = kwargs.pop('encoding', None) + errors = kwargs.pop('errors', 'backslashreplace') if force: for h in root.handlers[:]: root.removeHandler(h) @@ -1970,7 +1985,10 @@ def basicConfig(**kwargs): filename = kwargs.pop("filename", None) mode = kwargs.pop("filemode", 'a') if filename: - h = FileHandler(filename, mode) + if 'b'in mode: + errors = None + h = FileHandler(filename, mode, + encoding=encoding, errors=errors) else: stream = kwargs.pop("stream", None) h = StreamHandler(stream) diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py index 34ff7a056ef5..5641fee57355 100644 --- a/Lib/logging/handlers.py +++ b/Lib/logging/handlers.py @@ -48,13 +48,16 @@ class BaseRotatingHandler(logging.FileHandler): Not meant to be instantiated directly. Instead, use RotatingFileHandler or TimedRotatingFileHandler. """ - def __init__(self, filename, mode, encoding=None, delay=False): + def __init__(self, filename, mode, encoding=None, delay=False, errors=None): """ Use the specified filename for streamed logging """ - logging.FileHandler.__init__(self, filename, mode, encoding, delay) + logging.FileHandler.__init__(self, filename, mode=mode, + encoding=encoding, delay=delay, + errors=errors) self.mode = mode self.encoding = encoding + self.errors = errors self.namer = None self.rotator = None @@ -117,7 +120,8 @@ class RotatingFileHandler(BaseRotatingHandler): Handler for logging to a set of files, which switches from one file to the next when the current file reaches a certain size. """ - def __init__(self, filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False): + def __init__(self, filename, mode='a', maxBytes=0, backupCount=0, + encoding=None, delay=False, errors=None): """ Open the specified file and use it as the stream for logging. @@ -145,7 +149,8 @@ def __init__(self, filename, mode='a', maxBytes=0, backupCount=0, encoding=None, # on each run. if maxBytes > 0: mode = 'a' - BaseRotatingHandler.__init__(self, filename, mode, encoding, delay) + BaseRotatingHandler.__init__(self, filename, mode, encoding=encoding, + delay=delay, errors=errors) self.maxBytes = maxBytes self.backupCount = backupCount @@ -196,8 +201,11 @@ class TimedRotatingFileHandler(BaseRotatingHandler): If backupCount is > 0, when rollover is done, no more than backupCount files are kept - the oldest ones are deleted. """ - def __init__(self, filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None): - BaseRotatingHandler.__init__(self, filename, 'a', encoding, delay) + def __init__(self, filename, when='h', interval=1, backupCount=0, + encoding=None, delay=False, utc=False, atTime=None, + errors=None): + BaseRotatingHandler.__init__(self, filename, 'a', encoding=encoding, + delay=delay, errors=errors) self.when = when.upper() self.backupCount = backupCount self.utc = utc @@ -431,8 +439,11 @@ class WatchedFileHandler(logging.FileHandler): This handler is based on a suggestion and patch by Chad J. Schroeder. """ - def __init__(self, filename, mode='a', encoding=None, delay=False): - logging.FileHandler.__init__(self, filename, mode, encoding, delay) + def __init__(self, filename, mode='a', encoding=None, delay=False, + errors=None): + logging.FileHandler.__init__(self, filename, mode=mode, + encoding=encoding, delay=delay, + errors=errors) self.dev, self.ino = -1, -1 self._statstream() diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index 50148dc2f252..ac8919de8f2f 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -1,4 +1,4 @@ -# Copyright 2001-2017 by Vinay Sajip. All Rights Reserved. +# Copyright 2001-2019 by Vinay Sajip. All Rights Reserved. # # Permission to use, copy, modify, and distribute this software and its # documentation for any purpose and without fee is hereby granted, @@ -16,7 +16,7 @@ """Test harness for the logging module. Run all tests. -Copyright (C) 2001-2017 Vinay Sajip. All Rights Reserved. +Copyright (C) 2001-2019 Vinay Sajip. All Rights Reserved. """ import logging @@ -4445,6 +4445,99 @@ def test_force(self): self.assertEqual(new_string_io.getvalue().strip(), 'WARNING:root:warn\nINFO:root:info') + def test_encoding(self): + try: + encoding = 'utf-8' + logging.basicConfig(filename='test.log', encoding=encoding, + errors='strict', + format='%(message)s', level=logging.DEBUG) + + self.assertEqual(len(logging.root.handlers), 1) + handler = logging.root.handlers[0] + self.assertIsInstance(handler, logging.FileHandler) + self.assertEqual(handler.encoding, encoding) + logging.debug('The ?resund Bridge joins Copenhagen to Malm?') + finally: + handler.close() + with open('test.log', encoding='utf-8') as f: + data = f.read().strip() + os.remove('test.log') + self.assertEqual(data, + 'The ?resund Bridge joins Copenhagen to Malm?') + + def test_encoding_errors(self): + try: + encoding = 'ascii' + logging.basicConfig(filename='test.log', encoding=encoding, + errors='ignore', + format='%(message)s', level=logging.DEBUG) + + self.assertEqual(len(logging.root.handlers), 1) + handler = logging.root.handlers[0] + self.assertIsInstance(handler, logging.FileHandler) + self.assertEqual(handler.encoding, encoding) + logging.debug('The ?resund Bridge joins Copenhagen to Malm?') + finally: + handler.close() + with open('test.log', encoding='utf-8') as f: + data = f.read().strip() + os.remove('test.log') + self.assertEqual(data, 'The resund Bridge joins Copenhagen to Malm') + + def test_encoding_errors_default(self): + try: + encoding = 'ascii' + logging.basicConfig(filename='test.log', encoding=encoding, + format='%(message)s', level=logging.DEBUG) + + self.assertEqual(len(logging.root.handlers), 1) + handler = logging.root.handlers[0] + self.assertIsInstance(handler, logging.FileHandler) + self.assertEqual(handler.encoding, encoding) + self.assertEqual(handler.errors, 'backslashreplace') + logging.debug('?: ??: The ?resund Bridge joins Copenhagen to Malm?') + finally: + handler.close() + with open('test.log', encoding='utf-8') as f: + data = f.read().strip() + os.remove('test.log') + self.assertEqual(data, r'\U0001f602: \u2603\ufe0f: The \xd8resund ' + r'Bridge joins Copenhagen to Malm\xf6') + + def test_encoding_errors_none(self): + # Specifying None should behave as 'strict' + try: + encoding = 'ascii' + logging.basicConfig(filename='test.log', encoding=encoding, + errors=None, + format='%(message)s', level=logging.DEBUG) + + self.assertEqual(len(logging.root.handlers), 1) + handler = logging.root.handlers[0] + self.assertIsInstance(handler, logging.FileHandler) + self.assertEqual(handler.encoding, encoding) + self.assertIsNone(handler.errors) + + message = [] + + def dummy_handle_error(record): + _, v, _ = sys.exc_info() + message.append(str(v)) + + handler.handleError = dummy_handle_error + logging.debug('The ?resund Bridge joins Copenhagen to Malm?') + self.assertTrue(message) + self.assertIn("'ascii' codec can't encode " + "character '\\xd8' in position 4:", message[0]) + finally: + handler.close() + with open('test.log', encoding='utf-8') as f: + data = f.read().strip() + os.remove('test.log') + # didn't write anything due to the encoding error + self.assertEqual(data, r'') + + def _test_log(self, method, level=None): # logging.root has no handlers so basicConfig should be called called = [] diff --git a/Misc/NEWS.d/next/Library/2019-06-09-17-22-33.bpo-37111.2I0z2k.rst b/Misc/NEWS.d/next/Library/2019-06-09-17-22-33.bpo-37111.2I0z2k.rst new file mode 100644 index 000000000000..39821ed1419d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-09-17-22-33.bpo-37111.2I0z2k.rst @@ -0,0 +1 @@ +Added ``encoding`` and ``errors`` keyword parameters to ``logging.basicConfig``. From webhook-mailer at python.org Mon Jun 17 14:36:14 2019 From: webhook-mailer at python.org (Steve Dower) Date: Mon, 17 Jun 2019 18:36:14 -0000 Subject: [Python-checkins] bpo-34631: Updated OpenSSL to 1.1.1c in Windows installer (GH-14163) Message-ID: https://github.com/python/cpython/commit/a268edd6a411480281222b1fdb0f78053434d17f commit: a268edd6a411480281222b1fdb0f78053434d17f branch: master author: Steve Dower committer: GitHub date: 2019-06-17T11:36:08-07:00 summary: bpo-34631: Updated OpenSSL to 1.1.1c in Windows installer (GH-14163) files: A Misc/NEWS.d/next/Security/2019-06-17-09-34-25.bpo-34631.DBfM4j.rst M PCbuild/get_externals.bat M PCbuild/python.props M PCbuild/readme.txt diff --git a/Misc/NEWS.d/next/Security/2019-06-17-09-34-25.bpo-34631.DBfM4j.rst b/Misc/NEWS.d/next/Security/2019-06-17-09-34-25.bpo-34631.DBfM4j.rst new file mode 100644 index 000000000000..90aa30192fc8 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2019-06-17-09-34-25.bpo-34631.DBfM4j.rst @@ -0,0 +1 @@ +Updated OpenSSL to 1.1.1c in Windows installer diff --git a/PCbuild/get_externals.bat b/PCbuild/get_externals.bat index 42ffe6f485fa..1640769e40d6 100644 --- a/PCbuild/get_externals.bat +++ b/PCbuild/get_externals.bat @@ -53,7 +53,7 @@ echo.Fetching external libraries... set libraries= set libraries=%libraries% bzip2-1.0.6 if NOT "%IncludeLibffiSrc%"=="false" set libraries=%libraries% libffi-3.3.0-rc0-r1 -if NOT "%IncludeSSLSrc%"=="false" set libraries=%libraries% openssl-1.1.1b +if NOT "%IncludeSSLSrc%"=="false" set libraries=%libraries% openssl-1.1.1c set libraries=%libraries% sqlite-3.21.0.0 if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tcl-core-8.6.9.0 if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tk-8.6.9.0 @@ -77,7 +77,7 @@ echo.Fetching external binaries... set binaries= if NOT "%IncludeLibffi%"=="false" set binaries=%binaries% libffi -if NOT "%IncludeSSL%"=="false" set binaries=%binaries% openssl-bin-1.1.1b +if NOT "%IncludeSSL%"=="false" set binaries=%binaries% openssl-bin-1.1.1c if NOT "%IncludeTkinter%"=="false" set binaries=%binaries% tcltk-8.6.9.0 if NOT "%IncludeSSLSrc%"=="false" set binaries=%binaries% nasm-2.11.06 diff --git a/PCbuild/python.props b/PCbuild/python.props index b13837d394b1..0f93a0038366 100644 --- a/PCbuild/python.props +++ b/PCbuild/python.props @@ -62,8 +62,8 @@ $(ExternalsDir)libffi\ $(ExternalsDir)libffi\$(ArchName)\ $(libffiOutDir)include - $(ExternalsDir)openssl-1.1.1b\ - $(ExternalsDir)openssl-bin-1.1.1b\$(ArchName)\ + $(ExternalsDir)openssl-1.1.1c\ + $(ExternalsDir)openssl-bin-1.1.1c\$(ArchName)\ $(opensslOutDir)include $(ExternalsDir)\nasm-2.11.06\ $(ExternalsDir)\zlib-1.2.11\ diff --git a/PCbuild/readme.txt b/PCbuild/readme.txt index 312fa6a588a6..b32595b86ddc 100644 --- a/PCbuild/readme.txt +++ b/PCbuild/readme.txt @@ -165,7 +165,7 @@ _lzma Homepage: http://tukaani.org/xz/ _ssl - Python wrapper for version 1.1.1b of the OpenSSL secure sockets + Python wrapper for version 1.1.1c of the OpenSSL secure sockets library, which is downloaded from our binaries repository at https://github.com/python/cpython-bin-deps. From webhook-mailer at python.org Mon Jun 17 15:41:22 2019 From: webhook-mailer at python.org (Terry Jan Reedy) Date: Mon, 17 Jun 2019 19:41:22 -0000 Subject: [Python-checkins] bpo-37039: Make IDLE's Zoom Height adjust to users' screens (GH-13678) Message-ID: https://github.com/python/cpython/commit/5bff3c86ab77e9d831b3cd19b45654c7eef22931 commit: 5bff3c86ab77e9d831b3cd19b45654c7eef22931 branch: master author: Tal Einat committer: Terry Jan Reedy date: 2019-06-17T15:41:00-04:00 summary: bpo-37039: Make IDLE's Zoom Height adjust to users' screens (GH-13678) Measure required height by quickly maximizing once per screen. A search for a better method failed. files: A Misc/NEWS.d/next/IDLE/2019-06-04-23-27-33.bpo-37039.FN_fBf.rst M Doc/library/idle.rst M Lib/idlelib/NEWS.txt M Lib/idlelib/help.html M Lib/idlelib/zoomheight.py diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst index bd24695c7282..d494c9766eb7 100644 --- a/Doc/library/idle.rst +++ b/Doc/library/idle.rst @@ -289,7 +289,10 @@ Show/Hide Code Context (Editor Window only) Zoom/Restore Height Toggles the window between normal size and maximum height. The initial size defaults to 40 lines by 80 chars unless changed on the General tab of the - Configure IDLE dialog. + Configure IDLE dialog. The maximum height for a screen is determined by + momentarily maximizing a window the first time one is zoomed on the screen. + Changing screen settings may invalidate the saved height. This toogle has + no effect when a window is maximized. Window menu (Shell and Editor) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 982af7767251..7646aed59364 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,14 @@ Released on 2019-10-20? ====================================== +bpo-37039: Adjust "Zoom Height" to individual screens by momemtarily +maximizing the window on first use with a particular screen. Changing +screen settings may invalidate the saved height. While a window is +maximized, "Zoom Height" has no effect. + +bpo-35763: Make calltip reminder about '/' meaning positional-only less +obtrusive by only adding it when there is room on the first line. + bpo-35610: Replace now redundant editor.context_use_ps1 with .prompt_last_line. This finishes change started in bpo-31858. diff --git a/Lib/idlelib/help.html b/Lib/idlelib/help.html index 228b3195cf92..e27ec8d6e173 100644 --- a/Lib/idlelib/help.html +++ b/Lib/idlelib/help.html @@ -6,7 +6,7 @@ - IDLE — Python 3.8.0a4 documentation + IDLE — Python 3.9.0a0 documentation @@ -19,7 +19,7 @@ @@ -50,6 +50,7 @@ +