[Python-checkins] cpython: co_lnotab supports negative line number delta

victor.stinner python-checkins at python.org
Wed Jan 20 06:31:35 EST 2016


https://hg.python.org/cpython/rev/775b74e0e103
changeset:   100004:775b74e0e103
parent:      100002:f97da0952a2e
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Wed Jan 20 12:16:21 2016 +0100
summary:
  co_lnotab supports negative line number delta

Issue #26107: The format of the co_lnotab attribute of code objects changes to
support negative line number delta.

Changes:

* assemble_lnotab(): if line number delta is less than -128 or greater than
  127, emit multiple (offset_delta, lineno_delta) in co_lnotab
* update functions decoding co_lnotab to use signed 8-bit integers

  - dis.findlinestarts()
  - PyCode_Addr2Line()
  - _PyCode_CheckLineNumber()
  - frame_setlineno()

* update lnotab_notes.txt
* increase importlib MAGIC_NUMBER to 3361
* document the change in What's New in Python 3.6
* cleanup also PyCode_Optimize() to use better variable names

files:
  Doc/whatsnew/3.6.rst                 |   10 +
  Include/code.h                       |    2 +-
  Lib/dis.py                           |    7 +-
  Lib/importlib/_bootstrap_external.py |    5 +-
  Misc/NEWS                            |    3 +
  Objects/codeobject.c                 |   11 +-
  Objects/frameobject.c                |    2 +-
  Objects/lnotab_notes.txt             |   37 +-
  Python/compile.c                     |   25 +-
  Python/importlib_external.h          |  211 +++++++-------
  Python/peephole.c                    |   51 +-
  11 files changed, 203 insertions(+), 161 deletions(-)


diff --git a/Doc/whatsnew/3.6.rst b/Doc/whatsnew/3.6.rst
--- a/Doc/whatsnew/3.6.rst
+++ b/Doc/whatsnew/3.6.rst
@@ -244,6 +244,16 @@
 Changes in the Python API
 -------------------------
 
+* The format of the ``co_lnotab`` attribute of code objects changed to support
+  negative line number delta. By default, Python does not emit bytecode with
+  negative line number delta. Functions using ``frame.f_lineno``,
+  ``PyFrame_GetLineNumber()`` or ``PyCode_Addr2Line()`` are not affected.
+  Functions decoding directly ``co_lnotab`` should be updated to use a signed
+  8-bit integer type for the line number delta, but it's only required to
+  support applications using negative line number delta. See
+  ``Objects/lnotab_notes.txt`` for the ``co_lnotab`` format and how to decode
+  it, and see the :pep:`511` for the rationale.
+
 * The functions in the :mod:`compileall` module now return booleans instead
   of ``1`` or ``0`` to represent success or failure, respectively. Thanks to
   booleans being a subclass of integers, this should only be an issue if you
diff --git a/Include/code.h b/Include/code.h
--- a/Include/code.h
+++ b/Include/code.h
@@ -117,7 +117,7 @@
 #endif
 
 PyAPI_FUNC(PyObject*) PyCode_Optimize(PyObject *code, PyObject* consts,
-                                      PyObject *names, PyObject *lineno_obj);
+                                      PyObject *names, PyObject *lnotab);
 
 #ifdef __cplusplus
 }
diff --git a/Lib/dis.py b/Lib/dis.py
--- a/Lib/dis.py
+++ b/Lib/dis.py
@@ -397,8 +397,8 @@
     Generate pairs (offset, lineno) as described in Python/compile.c.
 
     """
-    byte_increments = list(code.co_lnotab[0::2])
-    line_increments = list(code.co_lnotab[1::2])
+    byte_increments = code.co_lnotab[0::2]
+    line_increments = code.co_lnotab[1::2]
 
     lastlineno = None
     lineno = code.co_firstlineno
@@ -409,6 +409,9 @@
                 yield (addr, lineno)
                 lastlineno = lineno
             addr += byte_incr
+        if line_incr >= 0x80:
+            # line_increments is an array of 8-bit signed integers
+            line_incr -= 0x100
         lineno += line_incr
     if lineno != lastlineno:
         yield (addr, lineno)
diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py
--- a/Lib/importlib/_bootstrap_external.py
+++ b/Lib/importlib/_bootstrap_external.py
@@ -223,13 +223,14 @@
 #     Python 3.5b1  3330 (PEP 448: Additional Unpacking Generalizations)
 #     Python 3.5b2  3340 (fix dictionary display evaluation order #11205)
 #     Python 3.5b2  3350 (add GET_YIELD_FROM_ITER opcode #24400)
-#     Python 3.6a0  3360 (add FORMAT_VALUE opcode #25483)
+#     Python 3.6a0  3360 (add FORMAT_VALUE opcode #25483
+#     Python 3.6a0  3361 (lineno delta of code.co_lnotab becomes signed)
 #
 # MAGIC must change whenever the bytecode emitted by the compiler may no
 # longer be understood by older implementations of the eval loop (usually
 # due to the addition of new opcodes).
 
-MAGIC_NUMBER = (3360).to_bytes(2, 'little') + b'\r\n'
+MAGIC_NUMBER = (3361).to_bytes(2, 'little') + b'\r\n'
 _RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little')  # For import.c
 
 _PYCACHE = '__pycache__'
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@
 Core and Builtins
 -----------------
 
+- Issue #26107: The format of the ``co_lnotab`` attribute of code objects
+  changes to support negative line number delta.
+
 - Issue #26154: Add a new private _PyThreadState_UncheckedGet() function to get
   the current Python thread state, but don't issue a fatal error if it is NULL.
   This new function must be used instead of accessing directly the
diff --git a/Objects/codeobject.c b/Objects/codeobject.c
--- a/Objects/codeobject.c
+++ b/Objects/codeobject.c
@@ -557,7 +557,8 @@
         addr += *p++;
         if (addr > addrq)
             break;
-        line += *p++;
+        line += (signed char)*p;
+        p++;
     }
     return line;
 }
@@ -592,17 +593,19 @@
         if (addr + *p > lasti)
             break;
         addr += *p++;
-        if (*p)
+        if ((signed char)*p)
             bounds->ap_lower = addr;
-        line += *p++;
+        line += (signed char)*p;
+        p++;
         --size;
     }
 
     if (size > 0) {
         while (--size >= 0) {
             addr += *p++;
-            if (*p++)
+            if ((signed char)*p)
                 break;
+            p++;
         }
         bounds->ap_upper = addr;
     }
diff --git a/Objects/frameobject.c b/Objects/frameobject.c
--- a/Objects/frameobject.c
+++ b/Objects/frameobject.c
@@ -137,7 +137,7 @@
         new_lasti = -1;
         for (offset = 0; offset < lnotab_len; offset += 2) {
             addr += lnotab[offset];
-            line += lnotab[offset+1];
+            line += (signed char)lnotab[offset+1];
             if (line >= new_lineno) {
                 new_lasti = addr;
                 new_lineno = line;
diff --git a/Objects/lnotab_notes.txt b/Objects/lnotab_notes.txt
--- a/Objects/lnotab_notes.txt
+++ b/Objects/lnotab_notes.txt
@@ -12,42 +12,47 @@
         0		    1
         6		    2
        50		    7
-      350                 307
-      361                 308
+      350                 207
+      361                 208
 
 Instead of storing these numbers literally, we compress the list by storing only
-the increments from one row to the next.  Conceptually, the stored list might
+the difference from one row to the next.  Conceptually, the stored list might
 look like:
 
-    0, 1,  6, 1,  44, 5,  300, 300,  11, 1
+    0, 1,  6, 1,  44, 5,  300, 200,  11, 1
 
-The above doesn't really work, but it's a start. Note that an unsigned byte
-can't hold negative values, or values larger than 255, and the above example
-contains two such values. So we make two tweaks:
+The above doesn't really work, but it's a start. An unsigned byte (byte code
+offset)) can't hold negative values, or values larger than 255, a signed byte
+(line number) can't hold values larger than 127 or less than -128, and the
+above example contains two such values. So we make two tweaks:
 
- (a) there's a deep assumption that byte code offsets and their corresponding
- line #s both increase monotonically, and
- (b) if at least one column jumps by more than 255 from one row to the next,
- more than one pair is written to the table. In case #b, there's no way to know
- from looking at the table later how many were written.  That's the delicate
- part.  A user of co_lnotab desiring to find the source line number
- corresponding to a bytecode address A should do something like this
+ (a) there's a deep assumption that byte code offsets increase monotonically,
+ and
+ (b) if byte code offset jumps by more than 255 from one row to the next, or if
+ source code line number jumps by more than 127 or less than -128 from one row
+ to the next, more than one pair is written to the table. In case #b,
+ there's no way to know from looking at the table later how many were written.
+ That's the delicate part.  A user of co_lnotab desiring to find the source
+ line number corresponding to a bytecode address A should do something like
+ this:
 
     lineno = addr = 0
     for addr_incr, line_incr in co_lnotab:
         addr += addr_incr
         if addr > A:
             return lineno
+        if line_incr >= 0x80:
+            line_incr -= 0x100
         lineno += line_incr
 
 (In C, this is implemented by PyCode_Addr2Line().)  In order for this to work,
 when the addr field increments by more than 255, the line # increment in each
 pair generated must be 0 until the remaining addr increment is < 256.  So, in
 the example above, assemble_lnotab in compile.c should not (as was actually done
-until 2.2) expand 300, 300 to
+until 2.2) expand 300, 200 to
     255, 255, 45, 45,
 but to
-    255, 0, 45, 255, 0, 45.
+    255, 0, 45, 128, 0, 72.
 
 The above is sufficient to reconstruct line numbers for tracebacks, but not for
 line tracing.  Tracing is handled by PyCode_CheckLineNumber() in codeobject.c
diff --git a/Python/compile.c b/Python/compile.c
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -4452,7 +4452,6 @@
     d_lineno = i->i_lineno - a->a_lineno;
 
     assert(d_bytecode >= 0);
-    assert(d_lineno >= 0);
 
     if(d_bytecode == 0 && d_lineno == 0)
         return 1;
@@ -4482,9 +4481,21 @@
         d_bytecode -= ncodes * 255;
         a->a_lnotab_off += ncodes * 2;
     }
-    assert(d_bytecode <= 255);
-    if (d_lineno > 255) {
-        int j, nbytes, ncodes = d_lineno / 255;
+    assert(0 <= d_bytecode && d_bytecode <= 255);
+
+    if (d_lineno < -128 || 127 < d_lineno) {
+        int j, nbytes, ncodes, k;
+        if (d_lineno < 0) {
+            k = -128;
+            /* use division on positive numbers */
+            ncodes = (-d_lineno) / 128;
+        }
+        else {
+            k = 127;
+            ncodes = d_lineno / 127;
+        }
+        d_lineno -= ncodes * k;
+        assert(ncodes >= 1);
         nbytes = a->a_lnotab_off + 2 * ncodes;
         len = PyBytes_GET_SIZE(a->a_lnotab);
         if (nbytes >= len) {
@@ -4502,15 +4513,15 @@
         lnotab = (unsigned char *)
                    PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
         *lnotab++ = d_bytecode;
-        *lnotab++ = 255;
+        *lnotab++ = k;
         d_bytecode = 0;
         for (j = 1; j < ncodes; j++) {
             *lnotab++ = 0;
-            *lnotab++ = 255;
+            *lnotab++ = k;
         }
-        d_lineno -= ncodes * 255;
         a->a_lnotab_off += ncodes * 2;
     }
+    assert(-128 <= d_lineno && d_lineno <= 127);
 
     len = PyBytes_GET_SIZE(a->a_lnotab);
     if (a->a_lnotab_off + 2 >= len) {
diff --git a/Python/importlib_external.h b/Python/importlib_external.h
--- a/Python/importlib_external.h
+++ b/Python/importlib_external.h
@@ -258,7 +258,7 @@
     114,5,0,0,0,218,13,95,119,114,105,116,101,95,97,116,
     111,109,105,99,99,0,0,0,115,26,0,0,0,0,5,24,
     1,9,1,33,1,3,3,21,1,20,1,20,1,13,1,3,
-    1,17,1,13,1,5,1,114,55,0,0,0,105,32,13,0,
+    1,17,1,13,1,5,1,114,55,0,0,0,105,33,13,0,
     0,233,2,0,0,0,114,13,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,
@@ -368,7 +368,7 @@
     103,90,15,97,108,109,111,115,116,95,102,105,108,101,110,97,
     109,101,114,4,0,0,0,114,4,0,0,0,114,5,0,0,
     0,218,17,99,97,99,104,101,95,102,114,111,109,95,115,111,
-    117,114,99,101,244,0,0,0,115,46,0,0,0,0,18,12,
+    117,114,99,101,245,0,0,0,115,46,0,0,0,0,18,12,
     1,9,1,7,1,12,1,6,1,12,1,18,1,18,1,24,
     1,12,1,12,1,12,1,36,1,12,1,18,1,9,2,12,
     1,12,1,12,1,12,1,21,1,21,1,114,79,0,0,0,
@@ -447,7 +447,7 @@
     101,118,101,108,90,13,98,97,115,101,95,102,105,108,101,110,
     97,109,101,114,4,0,0,0,114,4,0,0,0,114,5,0,
     0,0,218,17,115,111,117,114,99,101,95,102,114,111,109,95,
-    99,97,99,104,101,32,1,0,0,115,44,0,0,0,0,9,
+    99,97,99,104,101,33,1,0,0,115,44,0,0,0,0,9,
     18,1,12,1,18,1,18,1,12,1,9,1,15,1,15,1,
     12,1,9,1,15,1,12,1,22,1,15,1,9,1,12,1,
     22,1,12,1,9,1,12,1,19,1,114,85,0,0,0,99,
@@ -484,7 +484,7 @@
     0,0,114,36,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,
     4,0,0,0,114,4,0,0,0,114,5,0,0,0,218,15,
-    95,103,101,116,95,115,111,117,114,99,101,102,105,108,101,65,
+    95,103,101,116,95,115,111,117,114,99,101,102,105,108,101,66,
     1,0,0,115,20,0,0,0,0,7,18,1,4,1,24,1,
     35,1,4,1,3,1,16,1,19,1,21,1,114,91,0,0,
     0,99,1,0,0,0,0,0,0,0,1,0,0,0,11,0,
@@ -499,7 +499,7 @@
     0,0,114,79,0,0,0,114,66,0,0,0,114,74,0,0,
     0,41,1,218,8,102,105,108,101,110,97,109,101,114,4,0,
     0,0,114,4,0,0,0,114,5,0,0,0,218,11,95,103,
-    101,116,95,99,97,99,104,101,100,84,1,0,0,115,16,0,
+    101,116,95,99,97,99,104,101,100,85,1,0,0,115,16,0,
     0,0,0,1,21,1,3,1,14,1,13,1,8,1,21,1,
     4,2,114,95,0,0,0,99,1,0,0,0,0,0,0,0,
     2,0,0,0,11,0,0,0,67,0,0,0,115,60,0,0,
@@ -514,7 +514,7 @@
     114,39,0,0,0,114,41,0,0,0,114,40,0,0,0,41,
     2,114,35,0,0,0,114,42,0,0,0,114,4,0,0,0,
     114,4,0,0,0,114,5,0,0,0,218,10,95,99,97,108,
-    99,95,109,111,100,101,96,1,0,0,115,12,0,0,0,0,
+    99,95,109,111,100,101,97,1,0,0,115,12,0,0,0,0,
     2,3,1,19,1,13,1,11,3,10,1,114,97,0,0,0,
     99,1,0,0,0,0,0,0,0,3,0,0,0,11,0,0,
     0,3,0,0,0,115,84,0,0,0,100,1,0,135,0,0,
@@ -554,7 +554,7 @@
     103,115,90,6,107,119,97,114,103,115,41,1,218,6,109,101,
     116,104,111,100,114,4,0,0,0,114,5,0,0,0,218,19,
     95,99,104,101,99,107,95,110,97,109,101,95,119,114,97,112,
-    112,101,114,116,1,0,0,115,12,0,0,0,0,1,12,1,
+    112,101,114,117,1,0,0,115,12,0,0,0,0,1,12,1,
     12,1,15,1,6,1,25,1,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,
@@ -573,7 +573,7 @@
     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,52,0,0,0,114,4,0,0,0,114,4,0,
-    0,0,114,5,0,0,0,218,5,95,119,114,97,112,127,1,
+    0,0,114,5,0,0,0,218,5,95,119,114,97,112,128,1,
     0,0,115,8,0,0,0,0,1,25,1,15,1,29,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,3,218,10,95,
@@ -581,7 +581,7 @@
     78,97,109,101,69,114,114,111,114,41,3,114,102,0,0,0,
     114,103,0,0,0,114,113,0,0,0,114,4,0,0,0,41,
     1,114,102,0,0,0,114,5,0,0,0,218,11,95,99,104,
-    101,99,107,95,110,97,109,101,108,1,0,0,115,14,0,0,
+    101,99,107,95,110,97,109,101,109,1,0,0,115,14,0,0,
     0,0,8,21,7,3,1,13,1,13,2,17,5,13,1,114,
     116,0,0,0,99,2,0,0,0,0,0,0,0,5,0,0,
     0,4,0,0,0,67,0,0,0,115,84,0,0,0,124,0,
@@ -611,7 +611,7 @@
     218,8,112,111,114,116,105,111,110,115,218,3,109,115,103,114,
     4,0,0,0,114,4,0,0,0,114,5,0,0,0,218,17,
     95,102,105,110,100,95,109,111,100,117,108,101,95,115,104,105,
-    109,136,1,0,0,115,10,0,0,0,0,10,21,1,24,1,
+    109,137,1,0,0,115,10,0,0,0,0,10,21,1,24,1,
     6,1,29,1,114,123,0,0,0,99,4,0,0,0,0,0,
     0,0,11,0,0,0,19,0,0,0,67,0,0,0,115,252,
     1,0,0,105,0,0,125,4,0,124,2,0,100,1,0,107,
@@ -698,7 +698,7 @@
     218,11,115,111,117,114,99,101,95,115,105,122,101,114,4,0,
     0,0,114,4,0,0,0,114,5,0,0,0,218,25,95,118,
     97,108,105,100,97,116,101,95,98,121,116,101,99,111,100,101,
-    95,104,101,97,100,101,114,153,1,0,0,115,76,0,0,0,
+    95,104,101,97,100,101,114,154,1,0,0,115,76,0,0,0,
     0,11,6,1,12,1,13,3,6,1,12,1,10,1,16,1,
     16,1,16,1,12,1,18,1,16,1,18,1,18,1,15,1,
     16,1,15,1,18,1,15,1,16,1,12,1,12,1,3,1,
@@ -729,7 +729,7 @@
     5,114,53,0,0,0,114,98,0,0,0,114,89,0,0,0,
     114,90,0,0,0,218,4,99,111,100,101,114,4,0,0,0,
     114,4,0,0,0,114,5,0,0,0,218,17,95,99,111,109,
-    112,105,108,101,95,98,121,116,101,99,111,100,101,208,1,0,
+    112,105,108,101,95,98,121,116,101,99,111,100,101,209,1,0,
     0,115,16,0,0,0,0,2,15,1,15,1,16,1,12,1,
     16,1,4,2,18,1,114,141,0,0,0,114,59,0,0,0,
     99,3,0,0,0,0,0,0,0,4,0,0,0,3,0,0,
@@ -749,7 +749,7 @@
     100,117,109,112,115,41,4,114,140,0,0,0,114,126,0,0,
     0,114,134,0,0,0,114,53,0,0,0,114,4,0,0,0,
     114,4,0,0,0,114,5,0,0,0,218,17,95,99,111,100,
-    101,95,116,111,95,98,121,116,101,99,111,100,101,220,1,0,
+    101,95,116,111,95,98,121,116,101,99,111,100,101,221,1,0,
     0,115,10,0,0,0,0,3,12,1,19,1,19,1,22,1,
     114,144,0,0,0,99,1,0,0,0,0,0,0,0,5,0,
     0,0,4,0,0,0,67,0,0,0,115,89,0,0,0,100,
@@ -778,7 +778,7 @@
     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,4,0,0,0,
     114,4,0,0,0,114,5,0,0,0,218,13,100,101,99,111,
-    100,101,95,115,111,117,114,99,101,230,1,0,0,115,10,0,
+    100,101,95,115,111,117,114,99,101,231,1,0,0,115,10,0,
     0,0,0,5,12,1,18,1,15,1,18,1,114,149,0,0,
     0,114,120,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,
@@ -843,7 +843,7 @@
     102,105,120,101,115,114,153,0,0,0,90,7,100,105,114,110,
     97,109,101,114,4,0,0,0,114,4,0,0,0,114,5,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,247,1,0,0,115,
+    108,101,95,108,111,99,97,116,105,111,110,248,1,0,0,115,
     60,0,0,0,0,12,12,4,6,1,15,2,3,1,19,1,
     13,1,5,8,24,1,9,3,12,1,22,1,21,1,15,1,
     9,1,5,2,4,3,12,2,15,1,3,1,19,1,13,1,
@@ -883,7 +883,7 @@
     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,218,3,107,101,121,114,4,
     0,0,0,114,4,0,0,0,114,5,0,0,0,218,14,95,
-    111,112,101,110,95,114,101,103,105,115,116,114,121,69,2,0,
+    111,112,101,110,95,114,101,103,105,115,116,114,121,70,2,0,
     0,115,8,0,0,0,0,2,3,1,23,1,13,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,
@@ -910,7 +910,7 @@
     121,95,107,101,121,114,165,0,0,0,90,4,104,107,101,121,
     218,8,102,105,108,101,112,97,116,104,114,4,0,0,0,114,
     4,0,0,0,114,5,0,0,0,218,16,95,115,101,97,114,
-    99,104,95,114,101,103,105,115,116,114,121,76,2,0,0,115,
+    99,104,95,114,101,103,105,115,116,114,121,77,2,0,0,115,
     22,0,0,0,0,2,9,1,12,2,9,1,15,1,22,1,
     3,1,18,1,29,1,13,1,9,1,122,38,87,105,110,100,
     111,119,115,82,101,103,105,115,116,114,121,70,105,110,100,101,
@@ -935,7 +935,7 @@
     103,101,116,114,171,0,0,0,114,120,0,0,0,114,160,0,
     0,0,114,158,0,0,0,114,4,0,0,0,114,4,0,0,
     0,114,5,0,0,0,218,9,102,105,110,100,95,115,112,101,
-    99,91,2,0,0,115,26,0,0,0,0,2,15,1,12,1,
+    99,92,2,0,0,115,26,0,0,0,0,2,15,1,12,1,
     4,1,3,1,14,1,13,1,9,1,22,1,21,1,9,1,
     15,1,9,1,122,31,87,105,110,100,111,119,115,82,101,103,
     105,115,116,114,121,70,105,110,100,101,114,46,102,105,110,100,
@@ -954,7 +954,7 @@
     175,0,0,0,114,120,0,0,0,41,4,114,164,0,0,0,
     114,119,0,0,0,114,35,0,0,0,114,158,0,0,0,114,
     4,0,0,0,114,4,0,0,0,114,5,0,0,0,218,11,
-    102,105,110,100,95,109,111,100,117,108,101,107,2,0,0,115,
+    102,105,110,100,95,109,111,100,117,108,101,108,2,0,0,115,
     8,0,0,0,0,7,18,1,12,1,7,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,
@@ -963,7 +963,7 @@
     167,0,0,0,218,11,99,108,97,115,115,109,101,116,104,111,
     100,114,166,0,0,0,114,172,0,0,0,114,175,0,0,0,
     114,176,0,0,0,114,4,0,0,0,114,4,0,0,0,114,
-    4,0,0,0,114,5,0,0,0,114,162,0,0,0,57,2,
+    4,0,0,0,114,5,0,0,0,114,162,0,0,0,58,2,
     0,0,115,20,0,0,0,12,2,6,3,6,3,6,2,6,
     2,18,7,18,15,3,1,21,15,3,1,114,162,0,0,0,
     99,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,
@@ -1001,7 +1001,7 @@
     100,0,0,0,114,119,0,0,0,114,94,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,4,0,0,0,114,4,0,
-    0,0,114,5,0,0,0,114,153,0,0,0,126,2,0,0,
+    0,0,114,5,0,0,0,114,153,0,0,0,127,2,0,0,
     115,8,0,0,0,0,3,25,1,22,1,19,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,
@@ -1012,7 +1012,7 @@
     111,110,46,78,114,4,0,0,0,41,2,114,100,0,0,0,
     114,158,0,0,0,114,4,0,0,0,114,4,0,0,0,114,
     5,0,0,0,218,13,99,114,101,97,116,101,95,109,111,100,
-    117,108,101,134,2,0,0,115,0,0,0,0,122,27,95,76,
+    117,108,101,135,2,0,0,115,0,0,0,0,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,3,0,0,0,4,0,0,0,67,0,0,0,115,80,
@@ -1033,7 +1033,7 @@
     101,99,114,111,0,0,0,41,3,114,100,0,0,0,218,6,
     109,111,100,117,108,101,114,140,0,0,0,114,4,0,0,0,
     114,4,0,0,0,114,5,0,0,0,218,11,101,120,101,99,
-    95,109,111,100,117,108,101,137,2,0,0,115,10,0,0,0,
+    95,109,111,100,117,108,101,138,2,0,0,115,10,0,0,0,
     0,2,18,1,12,1,9,1,15,1,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,2,0,
@@ -1044,14 +1044,14 @@
     114,0,0,0,218,17,95,108,111,97,100,95,109,111,100,117,
     108,101,95,115,104,105,109,41,2,114,100,0,0,0,114,119,
     0,0,0,114,4,0,0,0,114,4,0,0,0,114,5,0,
-    0,0,218,11,108,111,97,100,95,109,111,100,117,108,101,145,
+    0,0,218,11,108,111,97,100,95,109,111,100,117,108,101,146,
     2,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,105,0,0,0,114,104,0,
     0,0,114,106,0,0,0,114,107,0,0,0,114,153,0,0,
     0,114,180,0,0,0,114,185,0,0,0,114,187,0,0,0,
     114,4,0,0,0,114,4,0,0,0,114,4,0,0,0,114,
-    5,0,0,0,114,178,0,0,0,121,2,0,0,115,10,0,
+    5,0,0,0,114,178,0,0,0,122,2,0,0,115,10,0,
     0,0,12,3,6,2,12,8,12,3,12,8,114,178,0,0,
     0,99,0,0,0,0,0,0,0,0,0,0,0,0,4,0,
     0,0,64,0,0,0,115,106,0,0,0,101,0,0,90,1,
@@ -1079,7 +1079,7 @@
     41,1,218,7,73,79,69,114,114,111,114,41,2,114,100,0,
     0,0,114,35,0,0,0,114,4,0,0,0,114,4,0,0,
     0,114,5,0,0,0,218,10,112,97,116,104,95,109,116,105,
-    109,101,152,2,0,0,115,2,0,0,0,0,6,122,23,83,
+    109,101,153,2,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,2,
     0,0,0,3,0,0,0,67,0,0,0,115,19,0,0,0,
@@ -1114,7 +1114,7 @@
     32,32,32,32,114,126,0,0,0,41,1,114,190,0,0,0,
     41,2,114,100,0,0,0,114,35,0,0,0,114,4,0,0,
     0,114,4,0,0,0,114,5,0,0,0,218,10,112,97,116,
-    104,95,115,116,97,116,115,160,2,0,0,115,2,0,0,0,
+    104,95,115,116,97,116,115,161,2,0,0,115,2,0,0,0,
     0,11,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,4,0,0,0,3,0,0,0,67,0,0,0,
@@ -1138,7 +1138,7 @@
     114,90,0,0,0,90,10,99,97,99,104,101,95,112,97,116,
     104,114,53,0,0,0,114,4,0,0,0,114,4,0,0,0,
     114,5,0,0,0,218,15,95,99,97,99,104,101,95,98,121,
-    116,101,99,111,100,101,173,2,0,0,115,2,0,0,0,0,
+    116,101,99,111,100,101,174,2,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,3,0,0,0,1,0,0,0,
@@ -1155,7 +1155,7 @@
     32,32,32,32,32,32,32,78,114,4,0,0,0,41,3,114,
     100,0,0,0,114,35,0,0,0,114,53,0,0,0,114,4,
     0,0,0,114,4,0,0,0,114,5,0,0,0,114,192,0,
-    0,0,183,2,0,0,115,0,0,0,0,122,21,83,111,117,
+    0,0,184,2,0,0,115,0,0,0,0,122,21,83,111,117,
     114,99,101,76,111,97,100,101,114,46,115,101,116,95,100,97,
     116,97,99,2,0,0,0,0,0,0,0,5,0,0,0,16,
     0,0,0,67,0,0,0,115,105,0,0,0,124,0,0,106,
@@ -1177,7 +1177,7 @@
     0,0,0,114,119,0,0,0,114,35,0,0,0,114,147,0,
     0,0,218,3,101,120,99,114,4,0,0,0,114,4,0,0,
     0,114,5,0,0,0,218,10,103,101,116,95,115,111,117,114,
-    99,101,190,2,0,0,115,14,0,0,0,0,2,15,1,3,
+    99,101,191,2,0,0,115,14,0,0,0,0,2,15,1,3,
     1,19,1,18,1,9,1,31,1,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,218,9,95,111,112,116,105,109,105,122,101,114,29,0,
@@ -1199,7 +1199,7 @@
     108,101,41,4,114,100,0,0,0,114,53,0,0,0,114,35,
     0,0,0,114,197,0,0,0,114,4,0,0,0,114,4,0,
     0,0,114,5,0,0,0,218,14,115,111,117,114,99,101,95,
-    116,111,95,99,111,100,101,200,2,0,0,115,4,0,0,0,
+    116,111,95,99,111,100,101,201,2,0,0,115,4,0,0,0,
     0,5,21,1,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,10,0,0,0,43,0,
@@ -1260,7 +1260,7 @@
     89,0,0,0,218,2,115,116,114,53,0,0,0,218,10,98,
     121,116,101,115,95,100,97,116,97,114,147,0,0,0,90,11,
     99,111,100,101,95,111,98,106,101,99,116,114,4,0,0,0,
-    114,4,0,0,0,114,5,0,0,0,114,181,0,0,0,208,
+    114,4,0,0,0,114,5,0,0,0,114,181,0,0,0,209,
     2,0,0,115,78,0,0,0,0,7,15,1,6,1,3,1,
     16,1,13,1,11,2,3,1,19,1,13,1,5,2,16,1,
     3,1,19,1,13,1,5,2,3,1,9,1,12,1,13,1,
@@ -1273,7 +1273,7 @@
     0,0,0,114,192,0,0,0,114,196,0,0,0,114,200,0,
     0,0,114,181,0,0,0,114,4,0,0,0,114,4,0,0,
     0,114,4,0,0,0,114,5,0,0,0,114,188,0,0,0,
-    150,2,0,0,115,14,0,0,0,12,2,12,8,12,13,12,
+    151,2,0,0,115,14,0,0,0,12,2,12,8,12,13,12,
     10,12,7,12,10,18,8,114,188,0,0,0,99,0,0,0,
     0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,
     0,115,112,0,0,0,101,0,0,90,1,0,100,0,0,90,
@@ -1301,7 +1301,7 @@
     32,32,32,32,32,102,105,110,100,101,114,46,78,41,2,114,
     98,0,0,0,114,35,0,0,0,41,3,114,100,0,0,0,
     114,119,0,0,0,114,35,0,0,0,114,4,0,0,0,114,
-    4,0,0,0,114,5,0,0,0,114,179,0,0,0,9,3,
+    4,0,0,0,114,5,0,0,0,114,179,0,0,0,10,3,
     0,0,115,4,0,0,0,0,3,9,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,2,0,0,0,2,0,0,
@@ -1311,7 +1311,7 @@
     2,218,9,95,95,99,108,97,115,115,95,95,114,111,0,0,
     0,41,2,114,100,0,0,0,218,5,111,116,104,101,114,114,
     4,0,0,0,114,4,0,0,0,114,5,0,0,0,218,6,
-    95,95,101,113,95,95,15,3,0,0,115,4,0,0,0,0,
+    95,95,101,113,95,95,16,3,0,0,115,4,0,0,0,0,
     1,18,1,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,1,
     0,0,0,3,0,0,0,67,0,0,0,115,26,0,0,0,
@@ -1319,7 +1319,7 @@
     0,0,106,2,0,131,1,0,65,83,41,1,78,41,3,218,
     4,104,97,115,104,114,98,0,0,0,114,35,0,0,0,41,
     1,114,100,0,0,0,114,4,0,0,0,114,4,0,0,0,
-    114,5,0,0,0,218,8,95,95,104,97,115,104,95,95,19,
+    114,5,0,0,0,218,8,95,95,104,97,115,104,95,95,20,
     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,2,0,0,0,3,0,0,0,
@@ -1334,7 +1334,7 @@
     32,32,32,32,32,32,32,41,3,218,5,115,117,112,101,114,
     114,204,0,0,0,114,187,0,0,0,41,2,114,100,0,0,
     0,114,119,0,0,0,41,1,114,205,0,0,0,114,4,0,
-    0,0,114,5,0,0,0,114,187,0,0,0,22,3,0,0,
+    0,0,114,5,0,0,0,114,187,0,0,0,23,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,2,0,0,0,1,0,0,0,
@@ -1345,7 +1345,7 @@
     98,121,32,116,104,101,32,102,105,110,100,101,114,46,41,1,
     114,35,0,0,0,41,2,114,100,0,0,0,114,119,0,0,
     0,114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,
-    114,151,0,0,0,34,3,0,0,115,2,0,0,0,0,3,
+    114,151,0,0,0,35,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,3,0,0,0,9,0,0,0,67,0,0,0,115,42,
@@ -1358,14 +1358,14 @@
     0,0,0,114,50,0,0,0,90,4,114,101,97,100,41,3,
     114,100,0,0,0,114,35,0,0,0,114,54,0,0,0,114,
     4,0,0,0,114,4,0,0,0,114,5,0,0,0,114,194,
-    0,0,0,39,3,0,0,115,4,0,0,0,0,2,21,1,
+    0,0,0,40,3,0,0,115,4,0,0,0,0,2,21,1,
     122,19,70,105,108,101,76,111,97,100,101,114,46,103,101,116,
     95,100,97,116,97,41,11,114,105,0,0,0,114,104,0,0,
     0,114,106,0,0,0,114,107,0,0,0,114,179,0,0,0,
     114,207,0,0,0,114,209,0,0,0,114,116,0,0,0,114,
     187,0,0,0,114,151,0,0,0,114,194,0,0,0,114,4,
     0,0,0,114,4,0,0,0,41,1,114,205,0,0,0,114,
-    5,0,0,0,114,204,0,0,0,4,3,0,0,115,14,0,
+    5,0,0,0,114,204,0,0,0,5,3,0,0,115,14,0,
     0,0,12,3,6,2,12,6,12,4,12,3,24,12,18,5,
     114,204,0,0,0,99,0,0,0,0,0,0,0,0,0,0,
     0,0,4,0,0,0,64,0,0,0,115,64,0,0,0,101,
@@ -1388,7 +1388,7 @@
     114,39,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,100,0,0,0,114,
     35,0,0,0,114,202,0,0,0,114,4,0,0,0,114,4,
-    0,0,0,114,5,0,0,0,114,191,0,0,0,49,3,0,
+    0,0,0,114,5,0,0,0,114,191,0,0,0,50,3,0,
     0,115,4,0,0,0,0,2,12,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,
@@ -1399,7 +1399,7 @@
     97,0,0,0,114,192,0,0,0,41,5,114,100,0,0,0,
     114,90,0,0,0,114,89,0,0,0,114,53,0,0,0,114,
     42,0,0,0,114,4,0,0,0,114,4,0,0,0,114,5,
-    0,0,0,114,193,0,0,0,54,3,0,0,115,4,0,0,
+    0,0,0,114,193,0,0,0,55,3,0,0,115,4,0,0,
     0,0,2,12,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,214,0,0,0,105,182,1,0,
@@ -1438,7 +1438,7 @@
     0,114,214,0,0,0,218,6,112,97,114,101,110,116,114,94,
     0,0,0,114,27,0,0,0,114,23,0,0,0,114,195,0,
     0,0,114,4,0,0,0,114,4,0,0,0,114,5,0,0,
-    0,114,192,0,0,0,59,3,0,0,115,42,0,0,0,0,
+    0,114,192,0,0,0,60,3,0,0,115,42,0,0,0,0,
     2,18,1,6,2,22,1,18,1,17,2,19,1,15,1,3,
     1,17,1,13,2,7,1,18,3,9,1,10,1,27,1,3,
     1,16,1,20,1,18,2,12,1,122,25,83,111,117,114,99,
@@ -1447,7 +1447,7 @@
     0,114,106,0,0,0,114,107,0,0,0,114,191,0,0,0,
     114,193,0,0,0,114,192,0,0,0,114,4,0,0,0,114,
     4,0,0,0,114,4,0,0,0,114,5,0,0,0,114,212,
-    0,0,0,45,3,0,0,115,8,0,0,0,12,2,6,2,
+    0,0,0,46,3,0,0,115,8,0,0,0,12,2,6,2,
     12,5,12,5,114,212,0,0,0,99,0,0,0,0,0,0,
     0,0,0,0,0,0,2,0,0,0,64,0,0,0,115,46,
     0,0,0,101,0,0,90,1,0,100,0,0,90,2,0,100,
@@ -1469,7 +1469,7 @@
     0,114,141,0,0,0,41,5,114,100,0,0,0,114,119,0,
     0,0,114,35,0,0,0,114,53,0,0,0,114,203,0,0,
     0,114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,
-    114,181,0,0,0,94,3,0,0,115,8,0,0,0,0,1,
+    114,181,0,0,0,95,3,0,0,115,8,0,0,0,0,1,
     15,1,15,1,24,1,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,2,0,
@@ -1479,13 +1479,13 @@
     111,32,115,111,117,114,99,101,32,99,111,100,101,46,78,114,
     4,0,0,0,41,2,114,100,0,0,0,114,119,0,0,0,
     114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,114,
-    196,0,0,0,100,3,0,0,115,2,0,0,0,0,2,122,
+    196,0,0,0,101,3,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,105,0,0,0,114,104,0,0,0,114,106,0,
     0,0,114,107,0,0,0,114,181,0,0,0,114,196,0,0,
     0,114,4,0,0,0,114,4,0,0,0,114,4,0,0,0,
-    114,5,0,0,0,114,217,0,0,0,90,3,0,0,115,6,
+    114,5,0,0,0,114,217,0,0,0,91,3,0,0,115,6,
     0,0,0,12,2,6,2,12,6,114,217,0,0,0,99,0,
     0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,64,
     0,0,0,115,136,0,0,0,101,0,0,90,1,0,100,0,
@@ -1510,7 +1510,7 @@
     1,0,100,0,0,83,41,1,78,41,2,114,98,0,0,0,
     114,35,0,0,0,41,3,114,100,0,0,0,114,98,0,0,
     0,114,35,0,0,0,114,4,0,0,0,114,4,0,0,0,
-    114,5,0,0,0,114,179,0,0,0,117,3,0,0,115,4,
+    114,5,0,0,0,114,179,0,0,0,118,3,0,0,115,4,
     0,0,0,0,1,9,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,2,0,
@@ -1520,7 +1520,7 @@
     83,41,1,78,41,2,114,205,0,0,0,114,111,0,0,0,
     41,2,114,100,0,0,0,114,206,0,0,0,114,4,0,0,
     0,114,4,0,0,0,114,5,0,0,0,114,207,0,0,0,
-    121,3,0,0,115,4,0,0,0,0,1,18,1,122,26,69,
+    122,3,0,0,115,4,0,0,0,0,1,18,1,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,1,0,0,0,3,0,0,0,67,0,0,0,115,26,
@@ -1528,7 +1528,7 @@
     0,0,124,0,0,106,2,0,131,1,0,65,83,41,1,78,
     41,3,114,208,0,0,0,114,98,0,0,0,114,35,0,0,
     0,41,1,114,100,0,0,0,114,4,0,0,0,114,4,0,
-    0,0,114,5,0,0,0,114,209,0,0,0,125,3,0,0,
+    0,0,114,5,0,0,0,114,209,0,0,0,126,3,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,3,0,
@@ -1546,7 +1546,7 @@
     97,109,105,99,114,129,0,0,0,114,98,0,0,0,114,35,
     0,0,0,41,3,114,100,0,0,0,114,158,0,0,0,114,
     184,0,0,0,114,4,0,0,0,114,4,0,0,0,114,5,
-    0,0,0,114,180,0,0,0,128,3,0,0,115,10,0,0,
+    0,0,0,114,180,0,0,0,129,3,0,0,115,10,0,0,
     0,0,2,6,1,15,1,9,1,16,1,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,
@@ -1564,7 +1564,7 @@
     97,109,105,99,114,129,0,0,0,114,98,0,0,0,114,35,
     0,0,0,41,2,114,100,0,0,0,114,184,0,0,0,114,
     4,0,0,0,114,4,0,0,0,114,5,0,0,0,114,185,
-    0,0,0,136,3,0,0,115,6,0,0,0,0,2,19,1,
+    0,0,0,137,3,0,0,115,6,0,0,0,0,2,19,1,
     9,1,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,2,0,0,0,
@@ -1582,7 +1582,7 @@
     41,2,114,179,0,0,0,78,114,4,0,0,0,41,2,114,
     22,0,0,0,218,6,115,117,102,102,105,120,41,1,218,9,
     102,105,108,101,95,110,97,109,101,114,4,0,0,0,114,5,
-    0,0,0,250,9,60,103,101,110,101,120,112,114,62,145,3,
+    0,0,0,250,9,60,103,101,110,101,120,112,114,62,146,3,
     0,0,115,2,0,0,0,6,1,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,
@@ -1591,7 +1591,7 @@
     88,84,69,78,83,73,79,78,95,83,85,70,70,73,88,69,
     83,41,2,114,100,0,0,0,114,119,0,0,0,114,4,0,
     0,0,41,1,114,220,0,0,0,114,5,0,0,0,114,153,
-    0,0,0,142,3,0,0,115,6,0,0,0,0,2,19,1,
+    0,0,0,143,3,0,0,115,6,0,0,0,0,2,19,1,
     18,1,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,2,0,0,0,1,
@@ -1602,7 +1602,7 @@
     101,97,116,101,32,97,32,99,111,100,101,32,111,98,106,101,
     99,116,46,78,114,4,0,0,0,41,2,114,100,0,0,0,
     114,119,0,0,0,114,4,0,0,0,114,4,0,0,0,114,
-    5,0,0,0,114,181,0,0,0,148,3,0,0,115,2,0,
+    5,0,0,0,114,181,0,0,0,149,3,0,0,115,2,0,
     0,0,0,2,122,28,69,120,116,101,110,115,105,111,110,70,
     105,108,101,76,111,97,100,101,114,46,103,101,116,95,99,111,
     100,101,99,2,0,0,0,0,0,0,0,2,0,0,0,1,
@@ -1612,7 +1612,7 @@
     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,4,0,0,0,41,
     2,114,100,0,0,0,114,119,0,0,0,114,4,0,0,0,
-    114,4,0,0,0,114,5,0,0,0,114,196,0,0,0,152,
+    114,4,0,0,0,114,5,0,0,0,114,196,0,0,0,153,
     3,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,
@@ -1624,7 +1624,7 @@
     101,32,102,105,110,100,101,114,46,41,1,114,35,0,0,0,
     41,2,114,100,0,0,0,114,119,0,0,0,114,4,0,0,
     0,114,4,0,0,0,114,5,0,0,0,114,151,0,0,0,
-    156,3,0,0,115,2,0,0,0,0,3,122,32,69,120,116,
+    157,3,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,105,0,0,0,114,104,0,0,0,114,106,0,0,0,114,
@@ -1632,7 +1632,7 @@
     0,0,0,114,180,0,0,0,114,185,0,0,0,114,153,0,
     0,0,114,181,0,0,0,114,196,0,0,0,114,116,0,0,
     0,114,151,0,0,0,114,4,0,0,0,114,4,0,0,0,
-    114,4,0,0,0,114,5,0,0,0,114,218,0,0,0,109,
+    114,4,0,0,0,114,5,0,0,0,114,218,0,0,0,110,
     3,0,0,115,20,0,0,0,12,6,6,2,12,4,12,4,
     12,3,12,8,12,6,12,6,12,4,12,4,114,218,0,0,
     0,99,0,0,0,0,0,0,0,0,0,0,0,0,2,0,
@@ -1677,7 +1677,7 @@
     100,101,114,41,4,114,100,0,0,0,114,98,0,0,0,114,
     35,0,0,0,218,11,112,97,116,104,95,102,105,110,100,101,
     114,114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,
-    114,179,0,0,0,169,3,0,0,115,8,0,0,0,0,1,
+    114,179,0,0,0,170,3,0,0,115,8,0,0,0,0,1,
     9,1,9,1,21,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,4,0,0,0,3,0,0,0,
@@ -1696,7 +1696,7 @@
     0,0,0,218,3,100,111,116,90,2,109,101,114,4,0,0,
     0,114,4,0,0,0,114,5,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,175,3,0,0,115,8,0,0,0,0,2,27,
+    97,109,101,115,176,3,0,0,115,8,0,0,0,0,2,27,
     1,12,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,
@@ -1709,7 +1709,7 @@
     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,4,0,0,0,114,4,0,0,0,114,
-    5,0,0,0,114,227,0,0,0,185,3,0,0,115,4,0,
+    5,0,0,0,114,227,0,0,0,186,3,0,0,115,4,0,
     0,0,0,1,18,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,
@@ -1727,7 +1727,7 @@
     226,0,0,0,41,3,114,100,0,0,0,90,11,112,97,114,
     101,110,116,95,112,97,116,104,114,158,0,0,0,114,4,0,
     0,0,114,4,0,0,0,114,5,0,0,0,218,12,95,114,
-    101,99,97,108,99,117,108,97,116,101,189,3,0,0,115,16,
+    101,99,97,108,99,117,108,97,116,101,190,3,0,0,115,16,
     0,0,0,0,2,18,1,15,1,21,3,27,1,9,1,12,
     1,9,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,
@@ -1736,7 +1736,7 @@
     106,1,0,131,0,0,131,1,0,83,41,1,78,41,2,218,
     4,105,116,101,114,114,234,0,0,0,41,1,114,100,0,0,
     0,114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,
-    218,8,95,95,105,116,101,114,95,95,202,3,0,0,115,2,
+    218,8,95,95,105,116,101,114,95,95,203,3,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,1,
     0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,67,
@@ -1744,7 +1744,7 @@
     0,131,0,0,131,1,0,83,41,1,78,41,2,114,31,0,
     0,0,114,234,0,0,0,41,1,114,100,0,0,0,114,4,
     0,0,0,114,4,0,0,0,114,5,0,0,0,218,7,95,
-    95,108,101,110,95,95,205,3,0,0,115,2,0,0,0,0,
+    95,108,101,110,95,95,206,3,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,1,0,0,0,2,0,0,0,67,0,0,0,115,16,
@@ -1753,7 +1753,7 @@
     99,101,80,97,116,104,40,123,33,114,125,41,41,2,114,47,
     0,0,0,114,226,0,0,0,41,1,114,100,0,0,0,114,
     4,0,0,0,114,4,0,0,0,114,5,0,0,0,218,8,
-    95,95,114,101,112,114,95,95,208,3,0,0,115,2,0,0,
+    95,95,114,101,112,114,95,95,209,3,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,2,0,0,0,2,0,0,0,67,0,0,
@@ -1761,7 +1761,7 @@
     0,0,107,6,0,83,41,1,78,41,1,114,234,0,0,0,
     41,2,114,100,0,0,0,218,4,105,116,101,109,114,4,0,
     0,0,114,4,0,0,0,114,5,0,0,0,218,12,95,95,
-    99,111,110,116,97,105,110,115,95,95,211,3,0,0,115,2,
+    99,111,110,116,97,105,110,115,95,95,212,3,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,2,0,0,0,2,
@@ -1769,7 +1769,7 @@
     0,0,106,1,0,124,1,0,131,1,0,1,100,0,0,83,
     41,1,78,41,2,114,226,0,0,0,114,157,0,0,0,41,
     2,114,100,0,0,0,114,239,0,0,0,114,4,0,0,0,
-    114,4,0,0,0,114,5,0,0,0,114,157,0,0,0,214,
+    114,4,0,0,0,114,5,0,0,0,114,157,0,0,0,215,
     3,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,13,114,105,0,0,0,114,104,0,0,0,114,106,
@@ -1777,7 +1777,7 @@
     0,0,114,227,0,0,0,114,234,0,0,0,114,236,0,0,
     0,114,237,0,0,0,114,238,0,0,0,114,240,0,0,0,
     114,157,0,0,0,114,4,0,0,0,114,4,0,0,0,114,
-    4,0,0,0,114,5,0,0,0,114,224,0,0,0,162,3,
+    4,0,0,0,114,5,0,0,0,114,224,0,0,0,163,3,
     0,0,115,20,0,0,0,12,5,6,2,12,6,12,10,12,
     4,12,13,12,3,12,3,12,3,12,3,114,224,0,0,0,
     99,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,
@@ -1797,7 +1797,7 @@
     0,114,226,0,0,0,41,4,114,100,0,0,0,114,98,0,
     0,0,114,35,0,0,0,114,230,0,0,0,114,4,0,0,
     0,114,4,0,0,0,114,5,0,0,0,114,179,0,0,0,
-    220,3,0,0,115,2,0,0,0,0,1,122,25,95,78,97,
+    221,3,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,2,
     0,0,0,2,0,0,0,67,0,0,0,115,16,0,0,0,
@@ -1814,21 +1814,21 @@
     41,62,41,2,114,47,0,0,0,114,105,0,0,0,41,2,
     114,164,0,0,0,114,184,0,0,0,114,4,0,0,0,114,
     4,0,0,0,114,5,0,0,0,218,11,109,111,100,117,108,
-    101,95,114,101,112,114,223,3,0,0,115,2,0,0,0,0,
+    101,95,114,101,112,114,224,3,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,2,0,0,0,1,0,0,0,
     67,0,0,0,115,4,0,0,0,100,1,0,83,41,2,78,
     84,114,4,0,0,0,41,2,114,100,0,0,0,114,119,0,
     0,0,114,4,0,0,0,114,4,0,0,0,114,5,0,0,
-    0,114,153,0,0,0,232,3,0,0,115,2,0,0,0,0,
+    0,114,153,0,0,0,233,3,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,2,0,0,0,1,0,0,0,67,
     0,0,0,115,4,0,0,0,100,1,0,83,41,2,78,114,
     30,0,0,0,114,4,0,0,0,41,2,114,100,0,0,0,
     114,119,0,0,0,114,4,0,0,0,114,4,0,0,0,114,
-    5,0,0,0,114,196,0,0,0,235,3,0,0,115,2,0,
+    5,0,0,0,114,196,0,0,0,236,3,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,2,0,0,0,6,0,
@@ -1838,7 +1838,7 @@
     110,103,62,114,183,0,0,0,114,198,0,0,0,84,41,1,
     114,199,0,0,0,41,2,114,100,0,0,0,114,119,0,0,
     0,114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,
-    114,181,0,0,0,238,3,0,0,115,2,0,0,0,0,1,
+    114,181,0,0,0,239,3,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,2,0,0,0,1,0,0,0,67,0,0,0,
@@ -1847,14 +1847,14 @@
     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,4,0,0,0,41,2,114,
     100,0,0,0,114,158,0,0,0,114,4,0,0,0,114,4,
-    0,0,0,114,5,0,0,0,114,180,0,0,0,241,3,0,
+    0,0,0,114,5,0,0,0,114,180,0,0,0,242,3,0,
     0,115,0,0,0,0,122,30,95,78,97,109,101,115,112,97,
     99,101,76,111,97,100,101,114,46,99,114,101,97,116,101,95,
     109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,2,
     0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,
     100,0,0,83,41,1,78,114,4,0,0,0,41,2,114,100,
     0,0,0,114,184,0,0,0,114,4,0,0,0,114,4,0,
-    0,0,114,5,0,0,0,114,185,0,0,0,244,3,0,0,
+    0,0,114,5,0,0,0,114,185,0,0,0,245,3,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,2,0,
@@ -1873,7 +1873,7 @@
     41,4,114,114,0,0,0,114,129,0,0,0,114,226,0,0,
     0,114,186,0,0,0,41,2,114,100,0,0,0,114,119,0,
     0,0,114,4,0,0,0,114,4,0,0,0,114,5,0,0,
-    0,114,187,0,0,0,247,3,0,0,115,6,0,0,0,0,
+    0,114,187,0,0,0,248,3,0,0,115,6,0,0,0,0,
     7,9,1,10,1,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,105,0,0,0,114,104,0,0,0,
@@ -1881,7 +1881,7 @@
     242,0,0,0,114,153,0,0,0,114,196,0,0,0,114,181,
     0,0,0,114,180,0,0,0,114,185,0,0,0,114,187,0,
     0,0,114,4,0,0,0,114,4,0,0,0,114,4,0,0,
-    0,114,5,0,0,0,114,241,0,0,0,219,3,0,0,115,
+    0,114,5,0,0,0,114,241,0,0,0,220,3,0,0,115,
     16,0,0,0,12,1,12,3,18,9,12,3,12,3,12,3,
     12,3,12,3,114,241,0,0,0,99,0,0,0,0,0,0,
     0,0,0,0,0,0,5,0,0,0,64,0,0,0,115,160,
@@ -1919,7 +1919,7 @@
     99,104,101,218,6,118,97,108,117,101,115,114,108,0,0,0,
     114,244,0,0,0,41,2,114,164,0,0,0,218,6,102,105,
     110,100,101,114,114,4,0,0,0,114,4,0,0,0,114,5,
-    0,0,0,114,244,0,0,0,9,4,0,0,115,6,0,0,
+    0,0,0,114,244,0,0,0,10,4,0,0,115,6,0,0,
     0,0,4,22,1,15,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,3,0,
@@ -1944,7 +1944,7 @@
     0,114,61,0,0,0,114,118,0,0,0,114,99,0,0,0,
     41,3,114,164,0,0,0,114,35,0,0,0,90,4,104,111,
     111,107,114,4,0,0,0,114,4,0,0,0,114,5,0,0,
-    0,218,11,95,112,97,116,104,95,104,111,111,107,115,17,4,
+    0,218,11,95,112,97,116,104,95,104,111,111,107,115,18,4,
     0,0,115,16,0,0,0,0,7,25,1,16,1,16,1,3,
     1,14,1,13,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,
@@ -1977,7 +1977,7 @@
     0,0,0,41,3,114,164,0,0,0,114,35,0,0,0,114,
     247,0,0,0,114,4,0,0,0,114,4,0,0,0,114,5,
     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,34,4,0,0,115,22,0,
+    116,101,114,95,99,97,99,104,101,35,4,0,0,115,22,0,
     0,0,0,8,12,1,3,1,16,1,13,3,9,1,3,1,
     17,1,13,1,15,1,18,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,
@@ -1997,7 +1997,7 @@
     0,0,0,114,247,0,0,0,114,120,0,0,0,114,121,0,
     0,0,114,158,0,0,0,114,4,0,0,0,114,4,0,0,
     0,114,5,0,0,0,218,16,95,108,101,103,97,99,121,95,
-    103,101,116,95,115,112,101,99,56,4,0,0,115,18,0,0,
+    103,101,116,95,115,112,101,99,57,4,0,0,115,18,0,0,
     0,0,4,15,1,24,2,15,1,6,1,12,1,16,1,18,
     1,9,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,
@@ -2033,7 +2033,7 @@
     99,101,95,112,97,116,104,90,5,101,110,116,114,121,114,247,
     0,0,0,114,158,0,0,0,114,121,0,0,0,114,4,0,
     0,0,114,4,0,0,0,114,5,0,0,0,218,9,95,103,
-    101,116,95,115,112,101,99,71,4,0,0,115,40,0,0,0,
+    101,116,95,115,112,101,99,72,4,0,0,115,40,0,0,0,
     0,5,6,1,13,1,21,1,3,1,15,1,12,1,15,1,
     21,2,18,1,12,1,3,1,15,1,4,1,9,1,12,1,
     12,5,17,2,18,1,9,1,122,20,80,97,116,104,70,105,
@@ -2060,7 +2060,7 @@
     0,114,152,0,0,0,114,224,0,0,0,41,6,114,164,0,
     0,0,114,119,0,0,0,114,35,0,0,0,114,174,0,0,
     0,114,158,0,0,0,114,254,0,0,0,114,4,0,0,0,
-    114,4,0,0,0,114,5,0,0,0,114,175,0,0,0,103,
+    114,4,0,0,0,114,5,0,0,0,114,175,0,0,0,104,
     4,0,0,115,26,0,0,0,0,4,12,1,9,1,21,1,
     12,1,4,1,15,1,9,1,6,3,9,1,24,1,4,2,
     7,2,122,20,80,97,116,104,70,105,110,100,101,114,46,102,
@@ -2083,7 +2083,7 @@
     0,114,120,0,0,0,41,4,114,164,0,0,0,114,119,0,
     0,0,114,35,0,0,0,114,158,0,0,0,114,4,0,0,
     0,114,4,0,0,0,114,5,0,0,0,114,176,0,0,0,
-    125,4,0,0,115,8,0,0,0,0,8,18,1,12,1,4,
+    126,4,0,0,115,8,0,0,0,0,8,18,1,12,1,4,
     1,122,22,80,97,116,104,70,105,110,100,101,114,46,102,105,
     110,100,95,109,111,100,117,108,101,41,12,114,105,0,0,0,
     114,104,0,0,0,114,106,0,0,0,114,107,0,0,0,114,
@@ -2091,7 +2091,7 @@
     0,0,0,114,252,0,0,0,114,255,0,0,0,114,175,0,
     0,0,114,176,0,0,0,114,4,0,0,0,114,4,0,0,
     0,114,4,0,0,0,114,5,0,0,0,114,243,0,0,0,
-    5,4,0,0,115,22,0,0,0,12,2,6,2,18,8,18,
+    6,4,0,0,115,22,0,0,0,12,2,6,2,18,8,18,
     17,18,22,18,15,3,1,18,31,3,1,21,21,3,1,114,
     243,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,
     0,3,0,0,0,64,0,0,0,115,133,0,0,0,101,0,
@@ -2140,7 +2140,7 @@
     3,0,100,0,0,83,41,1,78,114,4,0,0,0,41,2,
     114,22,0,0,0,114,219,0,0,0,41,1,114,120,0,0,
     0,114,4,0,0,0,114,5,0,0,0,114,221,0,0,0,
-    154,4,0,0,115,2,0,0,0,6,0,122,38,70,105,108,
+    155,4,0,0,115,2,0,0,0,6,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,58,0,0,0,114,29,0,0,0,78,114,87,
@@ -2152,7 +2152,7 @@
     100,0,0,0,114,35,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,160,0,0,0,114,4,0,0,0,41,1,114,120,
-    0,0,0,114,5,0,0,0,114,179,0,0,0,148,4,0,
+    0,0,0,114,5,0,0,0,114,179,0,0,0,149,4,0,
     0,115,16,0,0,0,0,4,6,1,19,1,36,1,9,2,
     15,1,9,1,12,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,
@@ -2163,7 +2163,7 @@
     116,105,109,101,46,114,29,0,0,0,78,114,87,0,0,0,
     41,1,114,2,1,0,0,41,1,114,100,0,0,0,114,4,
     0,0,0,114,4,0,0,0,114,5,0,0,0,114,244,0,
-    0,0,162,4,0,0,115,2,0,0,0,0,2,122,28,70,
+    0,0,163,4,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,3,0,0,0,2,0,0,0,67,0,0,0,
@@ -2187,7 +2187,7 @@
     0,114,120,0,0,0,114,150,0,0,0,41,3,114,100,0,
     0,0,114,119,0,0,0,114,158,0,0,0,114,4,0,0,
     0,114,4,0,0,0,114,5,0,0,0,114,117,0,0,0,
-    168,4,0,0,115,8,0,0,0,0,7,15,1,12,1,10,
+    169,4,0,0,115,8,0,0,0,0,7,15,1,12,1,10,
     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,7,0,0,0,7,0,0,0,67,0,0,0,115,40,
@@ -2198,7 +2198,7 @@
     7,114,100,0,0,0,114,159,0,0,0,114,119,0,0,0,
     114,35,0,0,0,90,4,115,109,115,108,114,174,0,0,0,
     114,120,0,0,0,114,4,0,0,0,114,4,0,0,0,114,
-    5,0,0,0,114,255,0,0,0,180,4,0,0,115,6,0,
+    5,0,0,0,114,255,0,0,0,181,4,0,0,115,6,0,
     0,0,0,1,15,1,18,1,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,14,0,0,0,15,0,0,0,
@@ -2262,7 +2262,7 @@
     110,105,116,95,102,105,108,101,110,97,109,101,90,9,102,117,
     108,108,95,112,97,116,104,114,158,0,0,0,114,4,0,0,
     0,114,4,0,0,0,114,5,0,0,0,114,175,0,0,0,
-    185,4,0,0,115,70,0,0,0,0,3,6,1,19,1,3,
+    186,4,0,0,115,70,0,0,0,0,3,6,1,19,1,3,
     1,34,1,13,1,11,1,15,1,10,1,9,2,9,1,9,
     1,15,2,9,1,6,2,12,1,18,1,22,1,10,1,15,
     1,12,1,32,4,12,2,22,1,22,1,22,1,16,1,12,
@@ -2298,7 +2298,7 @@
     0,0,146,2,0,113,6,0,83,114,4,0,0,0,41,1,
     114,88,0,0,0,41,2,114,22,0,0,0,90,2,102,110,
     114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,250,
-    9,60,115,101,116,99,111,109,112,62,4,5,0,0,115,2,
+    9,60,115,101,116,99,111,109,112,62,5,5,0,0,115,2,
     0,0,0,9,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,
@@ -2315,7 +2315,7 @@
     95,99,111,110,116,101,110,116,115,114,239,0,0,0,114,98,
     0,0,0,114,231,0,0,0,114,219,0,0,0,90,8,110,
     101,119,95,110,97,109,101,114,4,0,0,0,114,4,0,0,
-    0,114,5,0,0,0,114,7,1,0,0,231,4,0,0,115,
+    0,114,5,0,0,0,114,7,1,0,0,232,4,0,0,115,
     34,0,0,0,0,2,9,1,3,1,31,1,22,3,11,3,
     18,1,18,7,9,1,13,1,24,1,6,1,27,2,6,1,
     17,1,9,1,18,1,122,22,70,105,108,101,70,105,110,100,
@@ -2354,7 +2354,7 @@
     0,0,0,41,1,114,35,0,0,0,41,2,114,164,0,0,
     0,114,6,1,0,0,114,4,0,0,0,114,5,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,16,5,0,0,115,6,
+    70,105,108,101,70,105,110,100,101,114,17,5,0,0,115,6,
     0,0,0,0,2,12,1,18,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,
@@ -2362,7 +2362,7 @@
     114,114,4,0,0,0,41,3,114,164,0,0,0,114,6,1,
     0,0,114,12,1,0,0,114,4,0,0,0,41,2,114,164,
     0,0,0,114,6,1,0,0,114,5,0,0,0,218,9,112,
-    97,116,104,95,104,111,111,107,6,5,0,0,115,4,0,0,
+    97,116,104,95,104,111,111,107,7,5,0,0,115,4,0,0,
     0,0,10,21,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,1,0,0,0,2,0,0,0,67,0,0,0,
@@ -2371,7 +2371,7 @@
     110,100,101,114,40,123,33,114,125,41,41,2,114,47,0,0,
     0,114,35,0,0,0,41,1,114,100,0,0,0,114,4,0,
     0,0,114,4,0,0,0,114,5,0,0,0,114,238,0,0,
-    0,24,5,0,0,115,2,0,0,0,0,1,122,19,70,105,
+    0,25,5,0,0,115,2,0,0,0,0,1,122,19,70,105,
     108,101,70,105,110,100,101,114,46,95,95,114,101,112,114,95,
     95,41,15,114,105,0,0,0,114,104,0,0,0,114,106,0,
     0,0,114,107,0,0,0,114,179,0,0,0,114,244,0,0,
@@ -2379,7 +2379,7 @@
     114,255,0,0,0,114,175,0,0,0,114,7,1,0,0,114,
     177,0,0,0,114,13,1,0,0,114,238,0,0,0,114,4,
     0,0,0,114,4,0,0,0,114,4,0,0,0,114,5,0,
-    0,0,114,0,1,0,0,139,4,0,0,115,20,0,0,0,
+    0,0,114,0,1,0,0,140,4,0,0,115,20,0,0,0,
     12,7,6,2,12,14,12,4,6,2,12,12,12,5,15,46,
     12,31,18,18,114,0,1,0,0,99,4,0,0,0,0,0,
     0,0,6,0,0,0,11,0,0,0,67,0,0,0,115,195,
@@ -2405,7 +2405,7 @@
     104,110,97,109,101,90,9,99,112,97,116,104,110,97,109,101,
     114,120,0,0,0,114,158,0,0,0,114,4,0,0,0,114,
     4,0,0,0,114,5,0,0,0,218,14,95,102,105,120,95,
-    117,112,95,109,111,100,117,108,101,30,5,0,0,115,34,0,
+    117,112,95,109,111,100,117,108,101,31,5,0,0,115,34,0,
     0,0,0,2,15,1,15,1,6,1,6,1,12,1,12,1,
     18,2,15,1,6,1,21,1,3,1,10,1,10,1,10,1,
     14,1,13,2,114,18,1,0,0,99,0,0,0,0,0,0,
@@ -2426,7 +2426,7 @@
     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,4,0,0,0,114,4,0,0,0,114,5,0,0,0,
-    114,155,0,0,0,53,5,0,0,115,8,0,0,0,0,5,
+    114,155,0,0,0,54,5,0,0,115,8,0,0,0,0,5,
     18,1,12,1,12,1,114,155,0,0,0,99,1,0,0,0,
     0,0,0,0,12,0,0,0,12,0,0,0,67,0,0,0,
     115,70,2,0,0,124,0,0,97,0,0,116,0,0,106,1,
@@ -2488,7 +2488,7 @@
     83,41,2,114,29,0,0,0,78,41,1,114,31,0,0,0,
     41,2,114,22,0,0,0,114,77,0,0,0,114,4,0,0,
     0,114,4,0,0,0,114,5,0,0,0,114,221,0,0,0,
-    89,5,0,0,115,2,0,0,0,6,0,122,25,95,115,101,
+    90,5,0,0,115,2,0,0,0,6,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,59,0,0,0,122,30,105,109,112,
     111,114,116,108,105,98,32,114,101,113,117,105,114,101,115,32,
@@ -2518,7 +2518,7 @@
     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,
     4,0,0,0,114,4,0,0,0,114,5,0,0,0,218,6,
-    95,115,101,116,117,112,64,5,0,0,115,82,0,0,0,0,
+    95,115,101,116,117,112,65,5,0,0,115,82,0,0,0,0,
     8,6,1,9,1,9,3,13,1,13,1,15,1,18,2,13,
     1,20,3,33,1,19,2,31,1,10,1,15,1,13,1,4,
     2,3,1,15,1,5,1,13,1,12,2,12,1,16,1,16,
@@ -2544,7 +2544,7 @@
     114,212,0,0,0,41,2,114,26,1,0,0,90,17,115,117,
     112,112,111,114,116,101,100,95,108,111,97,100,101,114,115,114,
     4,0,0,0,114,4,0,0,0,114,5,0,0,0,218,8,
-    95,105,110,115,116,97,108,108,132,5,0,0,115,16,0,0,
+    95,105,110,115,116,97,108,108,133,5,0,0,115,16,0,0,
     0,0,2,10,1,9,1,28,1,15,1,16,1,16,4,9,
     1,114,29,1,0,0,41,3,122,3,119,105,110,114,1,0,
     0,0,114,2,0,0,0,41,56,114,107,0,0,0,114,10,
@@ -2571,11 +2571,12 @@
     114,18,1,0,0,114,155,0,0,0,114,27,1,0,0,114,
     29,1,0,0,114,4,0,0,0,114,4,0,0,0,114,4,
     0,0,0,114,5,0,0,0,218,8,60,109,111,100,117,108,
-    101,62,8,0,0,0,115,98,0,0,0,6,17,6,3,12,
+    101,62,8,0,0,0,115,102,0,0,0,6,17,6,3,12,
     12,12,5,12,5,12,6,12,12,12,10,12,9,12,5,12,
-    7,15,22,15,111,22,1,18,2,6,1,6,2,9,2,9,
+    7,15,22,15,112,22,1,18,2,6,1,6,2,9,2,9,
     2,10,2,21,44,12,33,12,19,12,12,12,12,12,28,12,
     17,21,55,21,12,18,10,12,14,9,3,12,1,15,65,19,
     64,19,29,22,110,19,41,25,45,25,16,6,3,25,53,19,
-    57,19,42,19,134,19,147,15,23,12,11,12,68,
+    57,19,42,19,127,0,7,19,127,0,20,15,23,12,11,12,
+    68,
 };
diff --git a/Python/peephole.c b/Python/peephole.c
--- a/Python/peephole.c
+++ b/Python/peephole.c
@@ -346,19 +346,19 @@
    single basic block.  All transformations keep the code size the same or
    smaller.  For those that reduce size, the gaps are initially filled with
    NOPs.  Later those NOPs are removed and the jump addresses retargeted in
-   a single pass.  Line numbering is adjusted accordingly. */
+   a single pass.  Code offset is adjusted accordingly. */
 
 PyObject *
 PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,
-                PyObject *lineno_obj)
+                PyObject *lnotab_obj)
 {
     Py_ssize_t i, j, codelen;
     int nops, h, adj;
     int tgt, tgttgt, opcode;
     unsigned char *codestr = NULL;
-    unsigned char *lineno;
+    unsigned char *lnotab;
     int *addrmap = NULL;
-    int new_line, cum_orig_line, last_line;
+    int cum_orig_offset, last_offset;
     Py_ssize_t tabsiz;
     PyObject **const_stack = NULL;
     Py_ssize_t *load_const_stack = NULL;
@@ -371,12 +371,17 @@
     if (PyErr_Occurred())
         goto exitError;
 
-    /* Bypass optimization when the lineno table is too complex */
-    assert(PyBytes_Check(lineno_obj));
-    lineno = (unsigned char*)PyBytes_AS_STRING(lineno_obj);
-    tabsiz = PyBytes_GET_SIZE(lineno_obj);
-    if (memchr(lineno, 255, tabsiz) != NULL)
+    /* Bypass optimization when the lnotab table is too complex */
+    assert(PyBytes_Check(lnotab_obj));
+    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;
+    }
+    /* Note: -128 and 127 special values for line number delta are ok,
+       the peephole optimizer doesn't modify line numbers. */
 
     /* Avoid situations where jump retargeting could overflow */
     assert(PyBytes_Check(code));
@@ -663,21 +668,24 @@
         }
     }
 
-    /* Fixup linenotab */
+    /* Fixup lnotab */
     for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
         assert(i - nops <= INT_MAX);
+        /* original code offset => new code offset */
         addrmap[i] = (int)(i - nops);
         if (codestr[i] == NOP)
             nops++;
     }
-    cum_orig_line = 0;
-    last_line = 0;
+    cum_orig_offset = 0;
+    last_offset = 0;
     for (i=0 ; i < tabsiz ; i+=2) {
-        cum_orig_line += lineno[i];
-        new_line = addrmap[cum_orig_line];
-        assert (new_line - last_line < 255);
-        lineno[i] =((unsigned char)(new_line - last_line));
-        last_line = new_line;
+        int offset_delta, new_offset;
+        cum_orig_offset += lnotab[i];
+        new_offset = addrmap[cum_orig_offset];
+        offset_delta = new_offset - last_offset;
+        assert(0 <= offset_delta && offset_delta <= 255);
+        lnotab[i] = (unsigned char)offset_delta;
+        last_offset = new_offset;
     }
 
     /* Remove NOPs and fixup jump targets */
@@ -727,12 +735,9 @@
 
  exitUnchanged:
     CONST_STACK_DELETE();
-    if (blocks != NULL)
-        PyMem_Free(blocks);
-    if (addrmap != NULL)
-        PyMem_Free(addrmap);
-    if (codestr != NULL)
-        PyMem_Free(codestr);
+    PyMem_Free(blocks);
+    PyMem_Free(addrmap);
+    PyMem_Free(codestr);
     Py_XINCREF(code);
     return code;
 }

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list