]> granicus.if.org Git - sudo/commitdiff
Do not follow symbolic links in sudoedit by default. This behavior
authorTodd C. Miller <Todd.Miller@courtesan.com>
Thu, 6 Aug 2015 19:20:01 +0000 (13:20 -0600)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Thu, 6 Aug 2015 19:20:01 +0000 (13:20 -0600)
can be controlled by the sudoedit_follow Defaults flag as well as
the FOLLOW/NOFOLLOW tags.

35 files changed:
doc/UPGRADE
doc/sudo.cat
doc/sudo.man.in
doc/sudo.mdoc.in
doc/sudo_plugin.cat
doc/sudo_plugin.man.in
doc/sudo_plugin.mdoc.in
doc/sudoers.cat
doc/sudoers.man.in
doc/sudoers.mdoc.in
include/sudo_compat.h
include/sudo_plugin.h
plugins/sudoers/def_data.c
plugins/sudoers/def_data.h
plugins/sudoers/def_data.in
plugins/sudoers/gram.c
plugins/sudoers/gram.h
plugins/sudoers/gram.y
plugins/sudoers/ldap.c
plugins/sudoers/parse.c
plugins/sudoers/parse.h
plugins/sudoers/policy.c
plugins/sudoers/regress/sudoers/test1.in
plugins/sudoers/regress/sudoers/test1.json.ok
plugins/sudoers/regress/sudoers/test1.out.ok
plugins/sudoers/regress/sudoers/test1.toke.ok
plugins/sudoers/sudoers_version.h
plugins/sudoers/testsudoers.c
plugins/sudoers/toke.c
plugins/sudoers/toke.l
plugins/sudoers/visudo_json.c
src/sesh.c
src/sudo.c
src/sudo.h
src/sudo_edit.c

index b4ba2157b1e5582db5ac53a31784304bef01e9ed..b4bb897a625a76d6992b42a1bef6e376738a064c 100644 (file)
@@ -1,6 +1,13 @@
 Notes on upgrading from an older release
 ========================================
 
+o Upgrading from a version prior to 1.8.15:
+
+    When editing files with sudoedit, symbolic links will no longer
+    be followed by default.  The old behavior can be restored by
+    enabling the sudoedit_follow option in sudoers or on a per-command
+    basis with the FOLLOW and NOFOLLOW tags.
+
 o Upgrading from a version prior to 1.8.14:
 
     On HP-UX, sudo will no longer check for "plugin.sl" if "plugin.so"
index c4b5b3c67c1c4e1d1d240549c51bd01f12263306..36deb993073ecf89b38476d3635a7c72bd235d9d 100644 (file)
@@ -124,6 +124,13 @@ D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
                        copied back to their original location and the
                        temporary versions are removed.
 
+                 Unless explicitly allowed by the security policy, symbolic
+                 links will not be opened.  This helps prevent the editing of
+                 unauthorized files when the file is located in a user-
+                 writable directory.  Versions of s\bsu\bud\bdo\bo prior to 1.8.15 do not
+                 have this restriction.  Users are never allowed to edit
+                 device special files.
+
                  If the specified file does not exist, it will be created.
                  Note that unlike most commands run by _\bs_\bu_\bd_\bo, the editor is run
                  with the invoking user's environment unmodified.  If, for
@@ -585,4 +592,4 @@ D\bDI\bIS\bSC\bCL\bLA\bAI\bIM\bME\bER\bR
      file distributed with s\bsu\bud\bdo\bo or http://www.sudo.ws/license.html for
      complete details.
 
-Sudo 1.8.14                      July 10, 2015                     Sudo 1.8.14
+Sudo 1.8.15                     August 6, 2015                     Sudo 1.8.15
index c3b50ac9df88d5c735e1892f35c97facd2852449..455e5148a82c5f34f0161866fe02a29cf7e393b2 100644 (file)
@@ -21,7 +21,7 @@
 .\" Agency (DARPA) and Air Force Research Laboratory, Air Force
 .\" Materiel Command, USAF, under agreement number F39502-99-1-0512.
 .\"
-.TH "SUDO" "8" "July 10, 2015" "Sudo @PACKAGE_VERSION@" "System Manager's Manual"
+.TH "SUDO" "8" "August 6, 2015" "Sudo @PACKAGE_VERSION@" "System Manager's Manual"
 .nh
 .if n .ad l
 .SH "NAME"
@@ -292,6 +292,15 @@ their original location and the temporary versions are removed.
 .RE
 .RS 12n
 .sp
+Unless explicitly allowed by the security policy, symbolic links
+will not be opened.
+This helps prevent the editing of unauthorized files when the file
+is located in a user-writable directory.
+Versions of
+\fBsudo\fR
+prior to 1.8.15 do not have this restriction.
+Users are never allowed to edit device special files.
+.sp
 If the specified file does not exist, it will be created.
 Note that unlike most commands run by
 \fIsudo\fR,
index 23ed9f020a9d99e8f0ed523baf011a3906cd1db6..89ceee0d611c798878eaefc23411fb1a35e38c8a 100644 (file)
@@ -19,7 +19,7 @@
 .\" Agency (DARPA) and Air Force Research Laboratory, Air Force
 .\" Materiel Command, USAF, under agreement number F39502-99-1-0512.
 .\"
-.Dd July 10, 2015
+.Dd August 6, 2015
 .Dt SUDO @mansectsu@
 .Os Sudo @PACKAGE_VERSION@
 .Sh NAME
@@ -265,6 +265,15 @@ If they have been modified, the temporary files are copied back to
 their original location and the temporary versions are removed.
 .El
 .Pp
+Unless explicitly allowed by the security policy, symbolic links
+will not be opened.
+This helps prevent the editing of unauthorized files when the file
+is located in a user-writable directory.
+Versions of
+.Nm
+prior to 1.8.15 do not have this restriction.
+Users are never allowed to edit device special files.
+.Pp
 If the specified file does not exist, it will be created.
 Note that unlike most commands run by
 .Em sudo ,
index ce3649b76507ad9286fdf4f3b9558764dd7c81fd..08923bda58b3e69d5fbbf5a75e8f481de48328f7 100644 (file)
@@ -606,6 +606,14 @@ D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
                        substitution and transparently enable _\bs_\bu_\bd_\bo_\be_\bd_\bi_\bt when the
                        user attempts to run an editor.
 
+                 sudoedit_follow=bool
+                       Set to true to allow s\bsu\bud\bdo\boe\bed\bdi\bit\bt to edit files that are
+                       symbolic links.  By default, s\bsu\bud\bdo\boe\bed\bdi\bit\bt 1.8.15 and higher
+                       will refuse to open a symbolic link.  The
+                       _\bs_\bu_\bd_\bo_\be_\bd_\bi_\bt_\b__\bf_\bo_\bl_\bl_\bo_\bw option can be used to restore the older
+                       behavior and allow s\bsu\bud\bdo\boe\bed\bdi\bit\bt to open symbolic links.
+                       Only available starting with API version 1.8.
+
                  timeout=int
                        Command timeout.  If non-zero then when the timeout
                        expires the command will be killed.
@@ -1479,6 +1487,9 @@ P\bPL\bLU\bUG\bGI\bIN\bN A\bAP\bPI\bI C\bCH\bHA\bAN\bNG\bGE\bEL\bLO\bOG\bG
            may occur multiple times if there are multiple plugin-specific
            Debug lines in the sudo.conf(4) file.
 
+     Version 1.8 (sudo 1.8.15)
+           The _\bs_\bu_\bd_\bo_\be_\bd_\bi_\bt_\b__\bf_\bo_\bl_\bl_\bo_\bw entry was added to the command_info list.
+
 S\bSE\bEE\bE A\bAL\bLS\bSO\bO
      sudo.conf(4), sudoers(4), sudo(1m)
 
@@ -1508,4 +1519,4 @@ D\bDI\bIS\bSC\bCL\bLA\bAI\bIM\bME\bER\bR
      file distributed with s\bsu\bud\bdo\bo or http://www.sudo.ws/license.html for
      complete details.
 
-Sudo 1.8.14                    December 4, 2014                    Sudo 1.8.14
+Sudo 1.8.15                     August 6, 2015                     Sudo 1.8.15
index 79ea1d898e0d326d98d8a4cadf5a7480f12241de..dc65bd4f39783fe29242161a6e06d3cdbb6964cc 100644 (file)
@@ -16,7 +16,7 @@
 .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 .\" ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.TH "SUDO_PLUGIN" "5" "December 4, 2014" "Sudo @PACKAGE_VERSION@" "File Formats Manual"
+.TH "SUDO_PLUGIN" "5" "August 6, 2015" "Sudo @PACKAGE_VERSION@" "File Formats Manual"
 .nh
 .if n .ad l
 .SH "NAME"
@@ -999,6 +999,20 @@ enable
 \fIsudoedit\fR
 when the user attempts to run an editor.
 .TP 6n
+sudoedit_follow=bool
+Set to true to allow
+\fBsudoedit\fR
+to edit files that are symbolic links.
+By default,
+\fBsudoedit\fR
+1.8.15 and higher will refuse to open a symbolic link.
+The
+\fIsudoedit_follow\fR
+option can be used to restore the older behavior and allow
+\fBsudoedit\fR
+to open symbolic links.
+Only available starting with API version 1.8.
+.TP 6n
 timeout=int
 Command timeout.
 If non-zero then when the timeout expires the command will be killed.
@@ -2641,6 +2655,13 @@ The
 entry now starts with a debug file path name and may occur multiple
 times if there are multiple plugin-specific Debug lines in the
 sudo.conf(@mansectform@) file.
+.TP 6n
+Version 1.8 (sudo 1.8.15)
+The
+\fIsudoedit_follow\fR
+entry was added to the
+\fRcommand_info\fR
+list.
 .SH "SEE ALSO"
 sudo.conf(@mansectform@),
 sudoers(@mansectform@),
index edb3970c9bcffa5f622c43885e868aed15cf7107..951bdfb626d4828c424ba40762245558b55ec552 100644 (file)
@@ -14,7 +14,7 @@
 .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 .\" ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd December 4, 2014
+.Dd August 6, 2015
 .Dt SUDO_PLUGIN @mansectform@
 .Os Sudo @PACKAGE_VERSION@
 .Sh NAME
@@ -881,6 +881,19 @@ This allows the plugin to perform command substitution and transparently
 enable
 .Em sudoedit
 when the user attempts to run an editor.
+.It sudoedit_follow=bool
+Set to true to allow
+.Nm sudoedit
+to edit files that are symbolic links.
+By default,
+.Nm sudoedit
+1.8.15 and higher will refuse to open a symbolic link.
+The
+.Em sudoedit_follow
+option can be used to restore the older behavior and allow
+.Nm sudoedit
+to open symbolic links.
+Only available starting with API version 1.8.
 .It timeout=int
 Command timeout.
 If non-zero then when the timeout expires the command will be killed.
@@ -2310,6 +2323,12 @@ The
 entry now starts with a debug file path name and may occur multiple
 times if there are multiple plugin-specific Debug lines in the
 .Xr sudo.conf @mansectform@ file.
+.It Version 1.8 (sudo 1.8.15)
+The
+.Em sudoedit_follow
+entry was added to the
+.Li command_info
+list.
 .El
 .Sh SEE ALSO
 .Xr sudo.conf @mansectform@ ,
index cd73fa5a745d088760f1e72569107c7fae018a09..c47edcc990461b63415ad7e72822767208ab681b 100644 (file)
@@ -465,9 +465,10 @@ S\bSU\bUD\bDO\bOE\bER\bRS\bS F\bFI\bIL\bLE\bE F\bFO\bOR\bRM\bMA\bAT\bT
 
      Solaris_Priv_Spec ::= ('PRIVS=privset' | 'LIMITPRIVS=privset')
 
-     Tag_Spec ::= ('NOEXEC:' | 'EXEC:' | 'LOG_INPUT:' | 'NOLOG_INPUT:' |
-                   'LOG_OUTPUT:' | 'NOLOG_OUTPUT:' | 'MAIL:' | 'NOMAIL:' |
-                   'NOPASSWD:' | 'PASSWD:' | 'SETENV:' | 'NOSETENV:')
+     Tag_Spec ::= ('EXEC:' | 'NOEXEC:' | 'FOLLOW:' | 'NOFOLLOW' |
+                   'LOG_INPUT:' | 'NOLOG_INPUT:' | 'LOG_OUTPUT:' |
+                   'NOLOG_OUTPUT:' | 'MAIL:' | 'NOMAIL:' | 'PASSWD:' |
+                   'NOPASSWD:' | 'SETENV:' | 'NOSETENV:')
 
      A u\bus\bse\ber\br s\bsp\bpe\bec\bci\bif\bfi\bic\bca\bat\bti\bio\bon\bn determines which commands a user may run (and as
      what user) on specified hosts.  By default, commands are run as r\bro\boo\bot\bt, but
@@ -581,13 +582,14 @@ S\bSU\bUD\bDO\bOE\bER\bRS\bS F\bFI\bIL\bLE\bE F\bFO\bOR\bRM\bMA\bAT\bT
 
    T\bTa\bag\bg_\b_S\bSp\bpe\bec\bc
      A command may have zero or more tags associated with it.  There are ten
-     possible tag values: NOEXEC, EXEC, LOG_INPUT, NOLOG_INPUT, LOG_OUTPUT,
-     NOLOG_OUTPUT, MAIL, NOMAIL, NOPASSWD, PASSWD, SETENV, and NOSETENV.  Once
-     a tag is set on a Cmnd, subsequent Cmnds in the Cmnd_Spec_List, inherit
-     the tag unless it is overridden by the opposite tag (in other words,
-     PASSWD overrides NOPASSWD and NOEXEC overrides EXEC).
+     possible tag values: EXEC, NOEXEC, FOLLOW, NOFOLLOW, LOG_INPUT,
+     NOLOG_INPUT, LOG_OUTPUT, NOLOG_OUTPUT, MAIL, NOMAIL, PASSWD, NOPASSWD,
+     SETENV, and NOSETENV.  Once a tag is set on a Cmnd, subsequent Cmnds in
+     the Cmnd_Spec_List, inherit the tag unless it is overridden by the
+     opposite tag (in other words, PASSWD overrides NOPASSWD and NOEXEC
+     overrides EXEC).
 
-     _\bN_\bO_\bE_\bX_\bE_\bC and _\bE_\bX_\bE_\bC
+     _\bE_\bX_\bE_\bC and _\bN_\bO_\bE_\bX_\bE_\bC
 
        If s\bsu\bud\bdo\bo has been compiled with _\bn_\bo_\be_\bx_\be_\bc support and the underlying
        operating system supports it, the NOEXEC tag can be used to prevent a
@@ -601,6 +603,13 @@ S\bSU\bUD\bDO\bOE\bER\bRS\bS F\bFI\bIL\bLE\bE F\bFO\bOR\bRM\bMA\bAT\bT
        See the _\bP_\br_\be_\bv_\be_\bn_\bt_\bi_\bn_\bg _\bs_\bh_\be_\bl_\bl _\be_\bs_\bc_\ba_\bp_\be_\bs section below for more details on how
        NOEXEC works and whether or not it will work on your system.
 
+     _\bF_\bO_\bL_\bL_\bO_\bW and _\bN_\bO_\bF_\bO_\bL_\bL_\bO_\bW Starting with version 1.8.15, s\bsu\bud\bdo\boe\bed\bdi\bit\bt will not
+       follow symbolic links when opening files unless the _\bs_\bu_\bd_\bo_\be_\bd_\bi_\bt_\b__\bf_\bo_\bl_\bl_\bo_\bw
+       option is enabled.  The _\bF_\bO_\bL_\bL_\bO_\bW and _\bN_\bO_\bF_\bO_\bL_\bL_\bO_\bW tags override the value of
+       _\bs_\bu_\bd_\bo_\be_\bd_\bi_\bt_\b__\bf_\bo_\bl_\bl_\bo_\bw and can be used to permit (or deny) the editing of
+       symbolic links on a per-command basis.  These tags are only effective
+       for the _\bs_\bu_\bd_\bo_\be_\bd_\bi_\bt command and are ignored for all other commands.
+
      _\bL_\bO_\bG_\b__\bI_\bN_\bP_\bU_\bT and _\bN_\bO_\bL_\bO_\bG_\b__\bI_\bN_\bP_\bU_\bT
 
        These tags override the value of the _\bl_\bo_\bg_\b__\bi_\bn_\bp_\bu_\bt option on a per-command
@@ -623,7 +632,7 @@ S\bSU\bUD\bDO\bOE\bER\bRS\bS F\bFI\bIL\bLE\bE F\bFO\bOR\bRM\bMA\bAT\bT
        the descriptions of _\bm_\ba_\bi_\bl_\b__\ba_\bl_\bl_\b__\bc_\bm_\bn_\bd_\bs, _\bm_\ba_\bi_\bl_\b__\ba_\bl_\bw_\ba_\by_\bs, and _\bm_\ba_\bi_\bl_\b__\bn_\bo_\b__\bp_\be_\br_\bm_\bs in
        the _\bS_\bU_\bD_\bO_\bE_\bR_\bS _\bO_\bP_\bT_\bI_\bO_\bN_\bS section below.
 
-     _\bN_\bO_\bP_\bA_\bS_\bS_\bW_\bD and _\bP_\bA_\bS_\bS_\bW_\bD
+     _\bP_\bA_\bS_\bS_\bW_\bD and _\bN_\bO_\bP_\bA_\bS_\bS_\bW_\bD
 
        By default, s\bsu\bud\bdo\bo requires that a user authenticate him or herself
        before running a command.  This behavior can be modified via the
@@ -1248,6 +1257,15 @@ S\bSU\bUD\bDO\bOE\bER\bRS\bS O\bOP\bPT\bTI\bIO\bON\bNS\bS
                        that support either the setreuid(2) or setresuid(2)
                        system call.  This flag is _\bo_\bf_\bf by default.
 
+     sudoedit_follow   By default, s\bsu\bud\bdo\boe\bed\bdi\bit\bt will not follow symbolic links
+                       when opening files.  The _\bs_\bu_\bd_\bo_\be_\bd_\bi_\bt_\b__\bf_\bo_\bl_\bl_\bo_\bw option can be
+                       enabled to allow s\bsu\bud\bdo\boe\bed\bdi\bit\bt to open symbolic links.  It
+                       may be overridden on a per-command basis by the _\bF_\bO_\bL_\bL_\bO_\bW
+                       and _\bN_\bO_\bF_\bO_\bL_\bL_\bO_\bW tags.  This flag is _\bo_\bf_\bf by default.
+
+                       This setting is only supported by version 1.8.15 or
+                       higher.
+
      targetpw          If set, s\bsu\bud\bdo\bo will prompt for the password of the user
                        specified by the -\b-u\bu option (defaults to root) instead
                        of the password of the invoking user when running a
@@ -2417,4 +2435,4 @@ D\bDI\bIS\bSC\bCL\bLA\bAI\bIM\bME\bER\bR
      file distributed with s\bsu\bud\bdo\bo or http://www.sudo.ws/license.html for
      complete details.
 
-Sudo 1.8.14                     August 4, 2015                     Sudo 1.8.14
+Sudo 1.8.15                     August 6, 2015                     Sudo 1.8.15
index 103ddb57720d0a09c4cf69a403763aad462d747e..d4c120b3fe3f2aa26c3426eb265245dac466c16c 100644 (file)
@@ -21,7 +21,7 @@
 .\" Agency (DARPA) and Air Force Research Laboratory, Air Force
 .\" Materiel Command, USAF, under agreement number F39502-99-1-0512.
 .\"
-.TH "SUDOERS" "5" "August 4, 2015" "Sudo @PACKAGE_VERSION@" "File Formats Manual"
+.TH "SUDOERS" "5" "August 6, 2015" "Sudo @PACKAGE_VERSION@" "File Formats Manual"
 .nh
 .if n .ad l
 .SH "NAME"
@@ -961,9 +961,10 @@ SELinux_Spec ::= ('ROLE=role' | 'TYPE=type')
 
 Solaris_Priv_Spec ::= ('PRIVS=privset' | 'LIMITPRIVS=privset')
 
-Tag_Spec ::= ('NOEXEC:' | 'EXEC:' | 'LOG_INPUT:' | 'NOLOG_INPUT:' |
-              'LOG_OUTPUT:' | 'NOLOG_OUTPUT:' | 'MAIL:' | 'NOMAIL:' |
-             'NOPASSWD:' | 'PASSWD:' | 'SETENV:' | 'NOSETENV:')
+Tag_Spec ::= ('EXEC:' | 'NOEXEC:' | 'FOLLOW:' | 'NOFOLLOW' |
+              'LOG_INPUT:' | 'NOLOG_INPUT:' | 'LOG_OUTPUT:' |
+              'NOLOG_OUTPUT:' | 'MAIL:' | 'NOMAIL:' | 'PASSWD:' |
+              'NOPASSWD:' | 'SETENV:' | 'NOSETENV:')
 .RE
 .fi
 .PP
@@ -1214,16 +1215,18 @@ character.
 A command may have zero or more tags associated with it.
 There are
 ten possible tag values:
-\fRNOEXEC\fR,
 \fREXEC\fR,
+\fRNOEXEC\fR,
+\fRFOLLOW\fR,
+\fRNOFOLLOW\fR,
 \fRLOG_INPUT\fR,
 \fRNOLOG_INPUT\fR,
 \fRLOG_OUTPUT\fR,
 \fRNOLOG_OUTPUT\fR,
 \fRMAIL\fR,
 \fRNOMAIL\fR,
-\fRNOPASSWD\fR,
 \fRPASSWD\fR,
+\fRNOPASSWD\fR,
 \fRSETENV\fR,
 and
 \fRNOSETENV\fR.
@@ -1242,7 +1245,7 @@ and
 overrides
 \fREXEC\fR).
 .TP 2n
-\fINOEXEC\fR and \fIEXEC\fR
+\fIEXEC\fR and \fINOEXEC\fR
 .sp
 If
 \fBsudo\fR
@@ -1275,6 +1278,24 @@ section below for more details on how
 works and whether or not it will work on your system.
 .RE
 .TP 2n
+\fIFOLLOW\fR and \fINOFOLLOW\fR
+Starting with version 1.8.15,
+\fBsudoedit\fR
+will not follow symbolic links when opening files unless the
+\fIsudoedit_follow\fR
+option is enabled.
+The
+\fIFOLLOW\fR
+and
+\fINOFOLLOW\fR
+tags override the value of
+\fIsudoedit_follow\fR
+and can be used to permit (or deny) the editing of symbolic links
+on a per-command basis.
+These tags are only effective for the
+\fIsudoedit\fR
+command and are ignored for all other commands.
+.TP 2n
 \fILOG_INPUT\fR and \fINOLOG_INPUT\fR
 .sp
 These tags override the value of the
@@ -1327,7 +1348,7 @@ in the
 \fISUDOERS OPTIONS\fR
 section below.
 .TP 2n
-\fINOPASSWD\fR and \fIPASSWD\fR
+\fIPASSWD\fR and \fINOPASSWD\fR
 .sp
 By default,
 \fBsudo\fR
@@ -2660,6 +2681,26 @@ This flag is
 \fIoff\fR
 by default.
 .TP 18n
+sudoedit_follow
+By default,
+\fBsudoedit\fR
+will not follow symbolic links when opening files.
+The
+\fIsudoedit_follow\fR
+option can be enabled to allow
+\fBsudoedit\fR
+to open symbolic links.
+It may be overridden on a per-command basis by the
+\fIFOLLOW\fR
+and
+\fINOFOLLOW\fR
+tags.
+This flag is
+\fIoff\fR
+by default.
+.sp
+This setting is only supported by version 1.8.15 or higher.
+.TP 18n
 targetpw
 If set,
 \fBsudo\fR
index 055c9ce1afa2751873ec683528407ff3fd18f178..54275d7353e511647869ddfd2a74bd0bb4152df6 100644 (file)
@@ -19,7 +19,7 @@
 .\" Agency (DARPA) and Air Force Research Laboratory, Air Force
 .\" Materiel Command, USAF, under agreement number F39502-99-1-0512.
 .\"
-.Dd August 4, 2015
+.Dd August 6, 2015
 .Dt SUDOERS @mansectform@
 .Os Sudo @PACKAGE_VERSION@
 .Sh NAME
@@ -914,9 +914,10 @@ SELinux_Spec ::= ('ROLE=role' | 'TYPE=type')
 
 Solaris_Priv_Spec ::= ('PRIVS=privset' | 'LIMITPRIVS=privset')
 
-Tag_Spec ::= ('NOEXEC:' | 'EXEC:' | 'LOG_INPUT:' | 'NOLOG_INPUT:' |
-              'LOG_OUTPUT:' | 'NOLOG_OUTPUT:' | 'MAIL:' | 'NOMAIL:' |
-             'NOPASSWD:' | 'PASSWD:' | 'SETENV:' | 'NOSETENV:')
+Tag_Spec ::= ('EXEC:' | 'NOEXEC:' | 'FOLLOW:' | 'NOFOLLOW' |
+              'LOG_INPUT:' | 'NOLOG_INPUT:' | 'LOG_OUTPUT:' |
+              'NOLOG_OUTPUT:' | 'MAIL:' | 'NOMAIL:' | 'PASSWD:' |
+              'NOPASSWD:' | 'SETENV:' | 'NOSETENV:')
 .Ed
 .Pp
 A
@@ -1137,16 +1138,18 @@ character.
 A command may have zero or more tags associated with it.
 There are
 ten possible tag values:
-.Li NOEXEC ,
 .Li EXEC ,
+.Li NOEXEC ,
+.Li FOLLOW ,
+.Li NOFOLLOW ,
 .Li LOG_INPUT ,
 .Li NOLOG_INPUT ,
 .Li LOG_OUTPUT ,
 .Li NOLOG_OUTPUT ,
 .Li MAIL ,
 .Li NOMAIL ,
-.Li NOPASSWD ,
 .Li PASSWD ,
+.Li NOPASSWD ,
 .Li SETENV ,
 and
 .Li NOSETENV .
@@ -1165,7 +1168,7 @@ and
 overrides
 .Li EXEC ) .
 .Bl -hang -width 0n
-.It Em NOEXEC No and Em EXEC
+.It Em EXEC No and Em NOEXEC
 .sp
 If
 .Nm sudo
@@ -1192,6 +1195,23 @@ See the
 section below for more details on how
 .Li NOEXEC
 works and whether or not it will work on your system.
+.It Em FOLLOW No and Em NOFOLLOW
+Starting with version 1.8.15,
+.Nm sudoedit
+will not follow symbolic links when opening files unless the
+.Em sudoedit_follow
+option is enabled.
+The
+.Em FOLLOW
+and
+.Em NOFOLLOW
+tags override the value of
+.Em sudoedit_follow
+and can be used to permit (or deny) the editing of symbolic links
+on a per-command basis.
+These tags are only effective for the
+.Em sudoedit
+command and are ignored for all other commands.
 .It Em LOG_INPUT No and Em NOLOG_INPUT
 .sp
 These tags override the value of the
@@ -1241,7 +1261,7 @@ and
 in the
 .Sx SUDOERS OPTIONS
 section below.
-.It Em NOPASSWD No and Em PASSWD
+.It Em PASSWD No and Em NOPASSWD
 .sp
 By default,
 .Nm sudo
@@ -2493,6 +2513,25 @@ system call.
 This flag is
 .Em off
 by default.
+.It sudoedit_follow
+By default,
+.Nm sudoedit
+will not follow symbolic links when opening files.
+The
+.Em sudoedit_follow
+option can be enabled to allow
+.Nm sudoedit
+to open symbolic links.
+It may be overridden on a per-command basis by the
+.Em FOLLOW
+and
+.Em NOFOLLOW
+tags.
+This flag is
+.Em off
+by default.
+.Pp
+This setting is only supported by version 1.8.15 or higher.
 .It targetpw
 If set,
 .Nm sudo
index a808eef66f35c1d5cb910e7dff6d252da7cdec72..7fb234eeffa50a74f41c7ebe3ad9ec0b1739ddc8 100644 (file)
 #ifndef S_ISDIR
 # define S_ISDIR(m)            (((m) & _S_IFMT) == _S_IFDIR)
 #endif /* S_ISDIR */
+#ifndef S_ISLNK
+# define S_ISLNK(m)            (((m) & _S_IFMT) == _S_IFLNK)
+#endif /* S_ISLNK */
 
 /* For futimens() and utimensat() emulation. */
 #if !defined(HAVE_FUTIMENS) && !defined(HAVE_UTIMENSAT)
index de15926325461cb6d0f688a0d0ab70a979928f7c..aa5258c1c2afa171a17cf0f229f421d3c212f44d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009-2014 Todd C. Miller <Todd.Miller@courtesan.com>
+ * Copyright (c) 2009-2015 Todd C. Miller <Todd.Miller@courtesan.com>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -19,7 +19,7 @@
 
 /* API version major/minor */
 #define SUDO_API_VERSION_MAJOR 1
-#define SUDO_API_VERSION_MINOR 7
+#define SUDO_API_VERSION_MINOR 8
 #define SUDO_API_MKVERSION(x, y) ((x << 16) | y)
 #define SUDO_API_VERSION SUDO_API_MKVERSION(SUDO_API_VERSION_MAJOR, SUDO_API_VERSION_MINOR)
 
index 37cf62ac864802b39f3e8f8f903c3bd229ea1e6b..40c509a59b84f11d6632e4c8050fcbd32ca3bf29 100644 (file)
@@ -386,6 +386,10 @@ struct sudo_defs_types sudo_defs_table[] = {
        "use_netgroups", T_FLAG,
        N_("Enable sudoers netgroup support"),
        NULL,
+    }, {
+       "sudoedit_follow", T_FLAG,
+       N_("Follow symbolic links when editing files with sudoedit"),
+       NULL,
     }, {
        NULL, 0, NULL
     }
index c14526af7c19829aae5752593295f6518dd53a07..7fbe1d80408140b3ce866997ed2a20ae7d78b792 100644 (file)
 #define I_MAXSEQ                89
 #define def_use_netgroups       (sudo_defs_table[90].sd_un.flag)
 #define I_USE_NETGROUPS         90
+#define def_sudoedit_follow     (sudo_defs_table[91].sd_un.flag)
+#define I_SUDOEDIT_FOLLOW       91
 
 enum def_tuple {
        never,
index c0a10ecfbbe4e255a8e695814424353d67407440..55a2126ad7cde001db0cd55729d1209016bb42f9 100644 (file)
@@ -286,3 +286,6 @@ maxseq
 use_netgroups
        T_FLAG
        "Enable sudoers netgroup support"
+sudoedit_follow
+       T_FLAG
+       "Follow symbolic links when editing files with sudoedit"
index 35bdfe1607129e679111ec141bdc8d850f0396a3..301cf73aeab92778d2e76fe5bddd7384e304c028 100644 (file)
@@ -150,22 +150,24 @@ typedef union {
 #define NOLOG_OUTPUT 279
 #define MAIL 280
 #define NOMAIL 281
-#define ALL 282
-#define COMMENT 283
-#define HOSTALIAS 284
-#define CMNDALIAS 285
-#define USERALIAS 286
-#define RUNASALIAS 287
-#define ERROR 288
-#define TYPE 289
-#define ROLE 290
-#define PRIVS 291
-#define LIMITPRIVS 292
-#define MYSELF 293
-#define SHA224_TOK 294
-#define SHA256_TOK 295
-#define SHA384_TOK 296
-#define SHA512_TOK 297
+#define FOLLOW 282
+#define NOFOLLOW 283
+#define ALL 284
+#define COMMENT 285
+#define HOSTALIAS 286
+#define CMNDALIAS 287
+#define USERALIAS 288
+#define RUNASALIAS 289
+#define ERROR 290
+#define TYPE 291
+#define ROLE 292
+#define PRIVS 293
+#define LIMITPRIVS 294
+#define MYSELF 295
+#define SHA224_TOK 296
+#define SHA256_TOK 297
+#define SHA384_TOK 298
+#define SHA512_TOK 299
 #define YYERRCODE 256
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoerslhs[] =
@@ -180,11 +182,11 @@ short sudoerslhs[] =
     7,    7,    6,    6,   24,   25,   23,   23,   23,   23,
    23,   27,   28,   26,   26,   26,   26,   26,   18,   18,
    19,   19,   19,   19,   19,   22,   22,   22,   22,   22,
-   22,   22,   22,   22,   22,   22,   22,   22,    5,    5,
-    5,   33,   33,   36,   10,   10,   34,   34,   37,    8,
-    8,   35,   35,   38,   32,   32,   39,   14,   14,   12,
-   12,   13,   13,   13,   13,   13,   17,   17,   15,   15,
-   16,   16,   16,
+   22,   22,   22,   22,   22,   22,   22,   22,   22,   22,
+    5,    5,    5,   33,   33,   36,   10,   10,   34,   34,
+   37,    8,    8,   35,   35,   38,   32,   32,   39,   14,
+   14,   12,   12,   13,   13,   13,   13,   13,   17,   17,
+   15,   15,   16,   16,   16,
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoerslen[] =
@@ -199,11 +201,11 @@ short sudoerslen[] =
     1,    2,    1,    2,    3,    3,    0,    1,    1,    2,
     2,    3,    3,    0,    1,    1,    2,    2,    0,    3,
     0,    1,    3,    2,    1,    0,    2,    2,    2,    2,
-    2,    2,    2,    2,    2,    2,    2,    2,    1,    1,
-    1,    1,    3,    3,    1,    3,    1,    3,    3,    1,
-    3,    1,    3,    3,    1,    3,    3,    1,    3,    1,
-    2,    1,    1,    1,    1,    1,    1,    3,    1,    2,
-    1,    1,    1,
+    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
+    1,    1,    1,    1,    3,    3,    1,    3,    1,    3,
+    3,    1,    3,    1,    3,    3,    1,    3,    3,    1,
+    3,    1,    2,    1,    1,    1,    1,    1,    1,    3,
+    1,    2,    1,    1,    1,
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoersdefred[] =
@@ -211,24 +213,24 @@ const short sudoersdefred[] =
 short sudoersdefred[] =
 #endif
        {                                      0,
-    0,  102,  104,  105,  106,    0,    0,    0,    0,    0,
-  103,    5,    0,    0,    0,    0,    0,    0,   98,  100,
+    0,  104,  106,  107,  108,    0,    0,    0,    0,    0,
+  105,    5,    0,    0,    0,    0,    0,    0,  100,  102,
     0,    0,    3,    6,    0,    0,   17,    0,   29,   32,
-   31,   33,   30,    0,   27,    0,   85,    0,    0,   81,
-   80,   79,    0,    0,    0,    0,    0,   43,   41,   90,
-    0,    0,    0,    0,   82,    0,    0,   87,    0,    0,
-   95,    0,    0,   92,  101,    0,    0,   24,    0,    4,
+   31,   33,   30,    0,   27,    0,   87,    0,    0,   83,
+   82,   81,    0,    0,    0,    0,    0,   43,   41,   92,
+    0,    0,    0,    0,   84,    0,    0,   89,    0,    0,
+   97,    0,    0,   94,  103,    0,    0,   24,    0,    4,
     0,    0,    0,   20,    0,   28,    0,    0,    0,    0,
    44,    0,    0,    0,    0,    0,    0,   42,    0,    0,
-    0,    0,    0,    0,    0,    0,   99,    0,    0,   21,
-   22,   23,   18,   86,   37,   38,   39,   40,   91,    0,
-   83,    0,   88,    0,   96,    0,   93,    0,   34,    0,
+    0,    0,    0,    0,    0,    0,  101,    0,    0,   21,
+   22,   23,   18,   88,   37,   38,   39,   40,   93,    0,
+   85,    0,   90,    0,   98,    0,   95,    0,   34,    0,
     0,   25,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,  111,  113,  112,    0,  107,  109,    0,    0,   60,
+    0,  113,  115,  114,    0,  109,  111,    0,    0,   60,
    35,    0,    0,    0,    0,   66,    0,    0,   50,   51,
-  110,    0,    0,   46,   45,    0,    0,    0,   57,   58,
-  108,   52,   53,   67,   68,   69,   70,   71,   72,   73,
-   74,   75,   76,   77,   78,   36,
+  112,    0,    0,   46,   45,    0,    0,    0,   57,   58,
+  110,   52,   53,   67,   68,   69,   70,   71,   72,   73,
+   74,   75,   76,   79,   80,   77,   78,   36,
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoersdgoto[] =
@@ -246,294 +248,276 @@ const short sudoerssindex[] =
 #else
 short sudoerssindex[] =
 #endif
-       {                                    780,
- -268,    0,    0,    0,    0,  -28,  -11,   47,   47,  -21,
-    0,    0, -237, -226, -222, -205, -235,    0,    0,    0,
-  -31,  780,    0,    0,    3, -242,    0,   12,    0,    0,
-    0,    0,    0, -221,    0,  -26,    0,  -25,  -25,    0,
-    0,    0, -247,   -1,    2,    4,    5,    0,    0,    0,
-  -24,   -4,   -3,   10,    0,   -2,   11,    0,    9,   13,
-    0,   14,   15,    0,    0,   47,  -30,    0,   18,    0,
- -191, -189, -186,    0,  -28,    0,  -11,   12,   12,   12,
-    0, -185, -183, -181, -180,  -21,   12,    0,  -11, -237,
-  -21, -226,   47, -222,   47, -205,    0,   45,  -11,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,   42,
-    0,   43,    0,   48,    0,   48,    0,  -17,    0,   49,
- -246,    0,   79,  -20,   53,   45,   28,   34, -241, -193,
- -190,    0,    0,    0, -233,    0,    0,   55,   79,    0,
-    0, -162, -161,   44,   46,    0, -188, -182,    0,    0,
-    0,   79,   55,    0,    0, -160, -157,  625,    0,    0,
+       {                                    686,
+ -272,    0,    0,    0,    0,  -23,  227,  -19,  -19,   -5,
+    0,    0, -239, -236, -234, -232, -231,    0,    0,    0,
+  -33,  686,    0,    0,   -3, -220,    0,    3,    0,    0,
+    0,    0,    0, -225,    0,  -28,    0,  -24,  -24,    0,
+    0,    0, -240,  -15,   -8,    2,    8,    0,    0,    0,
+  -21,  -12,   -9,   10,    0,    9,   13,    0,   11,   16,
+    0,   14,   19,    0,    0,  -19,  -36,    0,   20,    0,
+ -208, -187, -183,    0,  -23,    0,  227,    3,    3,    3,
+    0, -181, -180, -179, -178,   -5,    3,    0,  227, -239,
+   -5, -236,  -19, -234,  -19, -232,    0,   41,  227,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,   46,
+    0,   47,    0,   48,    0,   48,    0,  -29,    0,   50,
+ -230,    0,  289,   -7,   52,   41,   34,   37, -229, -192,
+ -191,    0,    0,    0, -217,    0,    0,   56,  289,    0,
+    0, -161, -160,   43,   44,    0, -188, -185,    0,    0,
+    0,  289,   56,    0,    0, -154, -153,  533,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,};
+    0,    0,    0,    0,    0,    0,    0,    0,};
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoersrindex[] =
 #else
 short sudoersrindex[] =
 #endif
-       {                                    108,
+       {                                    113,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,  110,    0,    0,    1,    0,    0,  193,    0,    0,
+    0,  114,    0,    0,    1,    0,    0,  145,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,  225,    0,    0,  260,    0,    0,  292,
-    0,    0,  324,    0,    0,    0,    0,    0,  356,    0,
-    0,    0,    0,    0,    0,    0,    0,  388,  420,  452,
-    0,    0,    0,    0,    0,    0,  484,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,  502,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,   33,
-    0,   65,    0,   97,    0,  129,    0,   70,    0,  161,
-  530,    0,   73,   74,    0,  502,    0,    0,  657,  561,
-  593,    0,    0,    0,    0,    0,    0,   75,    0,    0,
-    0,    0,    0,    0,    0,    0,  689,  721,    0,    0,
-    0,    0,   76,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,  159,    0,    0,  193,    0,    0,  207,
+    0,    0,  241,    0,    0,    0,    0,    0,  275,    0,
+    0,    0,    0,    0,    0,    0,    0,  309,  323,  357,
+    0,    0,    0,    0,    0,    0,  371,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,  404,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,   15,
+    0,   49,    0,   63,    0,   97,    0,   74,    0,  111,
+  434,    0,   75,   76,    0,  404,    0,    0,  566,  465,
+  499,    0,    0,    0,    0,    0,    0,   77,    0,    0,
+    0,    0,    0,    0,    0,    0,  597,  630,    0,    0,
+    0,    0,   78,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,};
+    0,    0,    0,    0,    0,    0,    0,    0,};
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoersgindex[] =
 #else
 short sudoersgindex[] =
 #endif
        {                                      0,
-   -8,    0,   50,   16,   77,   67,  -80,   30,   88,   -7,
-   51,   58,  109,   -5,  -19,    6,  -12,    0,    0,   32,
-    0,    0,    0,    7,   17,    0,  -16,  -13,    0,    0,
-  113,    0,    0,    0,    0,   52,   54,   40,   56,
+   -4,    0,   45,   18,   80,   72,  -79,   35,   91,   -1,
+   51,   61,  112,   -6,  -20,   -2,    4,    0,    0,   32,
+    0,    0,    0,    5,    7,    0,  -14,    6,    0,    0,
+  116,    0,    0,    0,    0,   57,   54,   39,   55,
 };
-#define YYTABLESIZE 1067
+#define YYTABLESIZE 975
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoerstable[] =
 #else
 short sudoerstable[] =
 #endif
-       {                                      36,
-   19,   34,   38,   39,   26,  109,   26,   26,   26,   40,
-   41,   43,   66,   77,   24,   17,   74,   77,   66,   86,
-   53,   34,    2,   66,  132,    3,    4,    5,   43,  133,
-   98,   56,   84,   19,   42,   59,   29,  139,   30,   31,
-  123,   32,  127,  128,   19,   72,   11,   73,  134,  144,
-  145,   78,   62,   79,   80,   75,   82,   89,   91,   83,
-   33,   84,   85,   71,   89,   84,   87,   90,   92,   93,
-   94,  100,   96,  101,   95,   99,  102,  176,  105,   17,
-  106,  110,  107,  108,  118,   77,   86,  114,  142,  116,
-   84,   66,  126,  140,  143,  127,   97,   89,  152,  128,
-  154,  155,  162,  145,  156,  163,  157,    1,  144,    2,
-   61,  135,  124,   65,   62,   64,   63,  141,   88,   81,
-  112,   76,   89,   97,  103,   65,  153,  104,   94,   97,
-  122,  160,  161,  159,   70,  117,    0,  150,    0,    0,
-  151,  111,    0,    0,    0,  113,  149,    0,    0,  115,
-    0,    0,    0,    0,   97,    0,    0,    0,    0,    0,
-   26,   94,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,   94,    0,    0,    0,
-    0,    0,   12,   26,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+       {                                      34,
+   19,   38,   39,   17,   26,   36,  109,   77,   26,   26,
+   66,   26,   24,   17,   86,   77,   40,   41,   53,   66,
+   43,   56,   86,   59,   98,   62,    2,   43,  123,    3,
+    4,    5,   29,   19,   30,   31,   66,   32,   74,   72,
+  132,   73,   82,   42,   19,  133,   75,   86,   91,   83,
+  139,   89,   11,   78,  100,   79,   80,   71,   33,   84,
+  127,  128,   99,  144,  145,   85,  134,   90,   87,   91,
+   92,   93,   86,   94,   95,  101,   96,   99,  178,  102,
+  118,   91,  105,  106,  107,  108,  114,  110,  116,   77,
+   86,   66,  140,  126,  142,   99,   96,  143,  127,  152,
+  128,  154,  155,  156,  157,  145,   91,  144,  162,  163,
+   26,  124,    1,    2,   61,   65,   62,   64,   63,  103,
+   99,  141,   81,   88,   76,  112,   97,  104,   65,   96,
+  122,  161,  151,  160,  117,  150,  149,   70,    0,    0,
+    0,    0,  153,   26,   12,  113,  111,    0,  115,    0,
+    0,    0,  159,    0,   96,    0,    0,    0,    9,    0,
     0,    0,    0,    0,    0,    0,    0,    0,   26,    0,
-    0,    0,    0,    0,    9,   12,   29,    0,   30,   31,
-   25,   32,   25,   25,   25,   40,   41,    0,    0,    0,
-    2,    0,    0,    3,    4,    5,   29,    0,   30,   31,
-   33,   32,   40,   41,    0,    0,   19,    9,   19,   10,
-   42,   19,   19,   19,   11,   19,   19,   19,   19,   19,
-   33,    0,   44,   45,   46,   47,    0,   42,    0,    0,
-    0,    0,   19,   19,   19,   19,   19,   19,   84,    0,
-   84,    8,   10,   84,   84,   84,    0,   84,   84,   84,
-   84,   84,    0,    0,    2,    0,    0,    3,    4,    5,
-    0,    0,    0,    0,   84,   84,   84,   84,   84,   84,
-   89,    0,   89,   11,    8,   89,   89,   89,   11,   89,
-   89,   89,   89,   89,    0,    0,  132,    0,    0,    0,
-    0,  133,    0,    0,    0,    0,   89,   89,   89,   89,
-   89,   89,   97,    0,   97,    7,   11,   97,   97,   97,
-  134,   97,   97,   97,   97,   97,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,   97,   97,
-   97,   97,   97,   97,   94,    0,   94,   15,    7,   94,
-   94,   94,    0,   94,   94,   94,   94,   94,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,   12,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-   94,   94,   94,   94,   94,   94,   26,    0,   26,   13,
-   15,   26,   26,   26,    0,   26,   26,   26,   26,   26,
+    0,    9,   10,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    8,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,   26,   26,   26,   26,   26,   26,   12,    0,
-   12,   14,   13,   12,   12,   12,    0,   12,   12,   12,
-   12,   12,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,   12,   12,   12,   12,   12,   12,
-    9,    0,    9,   16,   14,    9,    9,    9,    0,    9,
-    9,    9,    9,    9,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    9,    9,    9,    9,
-    9,    9,    0,    0,    0,   10,   16,   10,    0,    0,
-   10,   10,   10,    0,   10,   10,   10,   10,   10,    0,
-    0,    0,    0,    0,   59,    0,    0,    0,    0,    0,
-    0,   10,   10,   10,   10,   10,   10,    8,    0,    8,
-    0,    0,    8,    8,    8,    0,    8,    8,    8,    8,
-    8,    0,   47,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    8,    8,    8,    8,    8,    8,   11,
-    0,   11,    0,    0,   11,   11,   11,    0,   11,   11,
-   11,   11,   11,   48,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,   11,   11,   11,   11,   11,
-   11,    7,    0,    7,    0,    0,    7,    7,    7,    0,
-    7,    7,    7,    7,    7,   49,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    7,    7,    7,
-    7,    7,    7,   15,    0,   15,    0,    0,   15,   15,
-   15,    0,   15,   15,   15,   15,   15,   43,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,   15,
-   15,   15,   15,   15,   15,   13,    0,   13,    0,    0,
-   13,   13,   13,    0,   13,   13,   13,   13,   13,   54,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,   13,   13,   13,   13,   13,   13,   14,    0,   14,
-    0,    0,   14,   14,   14,    0,   14,   14,   14,   14,
-   14,   55,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,   14,   14,   14,   14,   14,   14,   16,
-    0,   16,    0,    0,   16,   16,   16,    0,   16,   16,
-   16,   16,   16,   56,    0,    0,    0,    0,   59,   59,
-    0,    0,    0,    0,    0,   16,   16,   16,   16,   16,
-   16,   59,   59,   59,   59,   59,   59,   59,   59,   59,
-   59,   59,   59,   59,    0,    0,   47,   47,    0,    0,
-   59,   59,   59,   59,    0,   59,   59,   59,   59,   47,
-   47,   47,   47,   47,   47,   47,   47,   47,   47,   47,
-   47,   47,   17,    0,    0,    0,    0,   48,   48,    0,
-   47,   47,    0,   47,   47,   47,   47,    0,    0,    0,
-   48,   48,   48,   48,   48,   48,   48,   48,   48,   48,
-   48,   48,   48,    0,    0,    0,    0,    0,    0,   49,
-   49,   48,   48,    0,   48,   48,   48,   48,    0,    0,
-    0,    0,   49,   49,   49,   49,   49,   49,   49,   49,
-   49,   49,   49,   49,   49,    0,    0,    0,    0,    0,
-    0,   40,   41,   49,   49,    0,   49,   49,   49,   49,
-    0,    0,    0,    0,  164,  165,  166,  167,  168,  169,
-  170,  171,  172,  173,  174,  175,   42,    0,    0,    0,
-    0,    0,    0,   54,   54,    0,    0,    0,   44,   45,
-   46,   47,    0,    0,    0,    0,   54,   54,   54,   54,
-   54,   54,   54,   54,   54,   54,   54,   54,   54,    0,
-    0,    0,    0,    0,    0,   55,   55,    0,    0,    0,
-   54,   54,   54,   54,    0,    0,    0,    0,   55,   55,
+    0,    0,    0,    0,   29,   10,   30,   31,    2,   32,
+   25,    3,    4,    5,   25,   25,    0,   25,    2,    8,
+   11,    3,    4,    5,   40,   41,    0,    0,    0,    0,
+   33,   40,   41,    0,   11,    0,   19,    0,   19,   34,
+    0,   19,   19,   19,   11,   19,   19,   19,   19,   19,
+   86,   42,   86,   11,    7,   86,   86,   86,   42,   86,
+   86,   86,   86,   86,   19,   19,   19,   19,   19,   19,
+   44,   45,   46,   47,    0,    0,    0,    0,   86,   86,
+   86,   86,   86,   86,   91,    0,   91,    7,   15,   91,
+   91,   91,    0,   91,   91,   91,   91,   91,   99,    0,
+   99,  135,   13,   99,   99,   99,    0,   99,   99,   99,
+   99,   99,   91,   91,   91,   91,   91,   91,    0,    0,
+    0,   15,    0,    0,    0,    0,   99,   99,   99,   99,
+   99,   99,   96,    0,   96,   13,   14,   96,   96,   96,
+    0,   96,   96,   96,   96,   96,   26,    0,   26,    0,
+   16,   26,   26,   26,    0,   26,   26,   26,   26,   26,
+   96,   96,   96,   96,   96,   96,    0,    0,    0,   14,
+    0,    0,    0,    0,   26,   26,   26,   26,   26,   26,
+   12,    0,   12,   16,    0,   12,   12,   12,    0,   12,
+   12,   12,   12,   12,    9,    0,    9,    0,    0,    9,
+    9,    9,    0,    9,    9,    9,    9,    9,   12,   12,
+   12,   12,   12,   12,    0,    0,   59,    0,    0,    0,
+    0,    0,    9,    9,    9,    9,    9,    9,   10,    0,
+   10,    0,    0,   10,   10,   10,    0,   10,   10,   10,
+   10,   10,    8,    0,    8,    0,   47,    8,    8,    8,
+    0,    8,    8,    8,    8,    8,   10,   10,   10,   10,
+   10,   10,    0,    0,   29,    0,   30,   31,    0,   32,
+    8,    8,    8,    8,    8,    8,   11,   48,   11,    0,
+    0,   11,   11,   11,    0,   11,   11,   11,   11,   11,
+   33,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,   11,   11,   11,   11,   11,   11,
+    7,   49,    7,    0,    0,    7,    7,    7,    0,    7,
+    7,    7,    7,    7,    0,    0,  132,    0,    0,    0,
+    0,  133,    0,    0,    0,    0,    0,    0,    7,    7,
+    7,    7,    7,    7,   15,   43,   15,    0,    0,   15,
+   15,   15,  134,   15,   15,   15,   15,   15,   13,    0,
+   13,    0,    0,   13,   13,   13,    0,   13,   13,   13,
+   13,   13,   15,   15,   15,   15,   15,   15,   54,    0,
+    0,    0,    0,    0,    0,    0,   13,   13,   13,   13,
+   13,   13,   14,    0,   14,    0,    0,   14,   14,   14,
+    0,   14,   14,   14,   14,   14,   16,    0,   16,   55,
+    0,   16,   16,   16,    0,   16,   16,   16,   16,   16,
+   14,   14,   14,   14,   14,   14,    0,    0,    0,    0,
+    0,    0,    0,    0,   16,   16,   16,   16,   16,   16,
+   59,   59,   56,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,   59,   59,   59,   59,   59,   59,   59,
+   59,   59,   59,   59,   59,   59,   59,   59,    0,    0,
+   47,   47,    0,    0,   59,   59,   59,   59,    0,   59,
+   59,   59,   59,   47,   47,   47,   47,   47,   47,   47,
+   47,   47,   47,   47,   47,   47,   47,   47,   17,    0,
+    0,   48,   48,    0,    0,    0,   47,   47,    0,   47,
+   47,   47,   47,    0,   48,   48,   48,   48,   48,   48,
+   48,   48,   48,   48,   48,   48,   48,   48,   48,    0,
+    0,    0,    0,    0,    0,   49,   49,   48,   48,    0,
+   48,   48,   48,   48,    0,    0,    0,    0,   49,   49,
+   49,   49,   49,   49,   49,   49,   49,   49,   49,   49,
+   49,   49,   49,    0,    0,    0,    0,    0,    0,   40,
+   41,   49,   49,    0,   49,   49,   49,   49,    0,    0,
+    0,    0,  164,  165,  166,  167,  168,  169,  170,  171,
+  172,  173,  174,  175,  176,  177,   42,    0,    0,    0,
+    0,    0,   54,   54,    0,    0,    0,    0,   44,   45,
+   46,   47,    0,    0,    0,   54,   54,   54,   54,   54,
+   54,   54,   54,   54,   54,   54,   54,   54,   54,   54,
+    0,    0,    0,   55,   55,    0,    0,    0,    0,    0,
+    0,   54,   54,   54,   54,    0,   55,   55,   55,   55,
    55,   55,   55,   55,   55,   55,   55,   55,   55,   55,
-   55,    0,    0,    0,    0,    0,    0,   56,   56,    0,
-    0,    0,   55,   55,   55,   55,    0,    0,    0,    0,
+   55,    0,    0,    0,    0,    0,   56,   56,    0,    0,
+    0,    0,   55,   55,   55,   55,    0,    0,    0,   56,
    56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-   56,   56,   56,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,   56,   56,   56,   56,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    1,    0,    2,    0,    0,
-    3,    4,    5,    0,    6,    7,    8,    9,   10,    0,
+   56,   56,   56,   56,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,   56,   56,   56,   56,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,   11,   12,   13,   14,   15,   16,
+    0,    1,    0,    2,    0,    0,    3,    4,    5,    0,
+    6,    7,    8,    9,   10,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,   11,
+   12,   13,   14,   15,   16,
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoerscheck[] =
 #else
 short sudoerscheck[] =
 #endif
-       {                                       7,
-    0,   33,    8,    9,   33,   86,   33,   33,   33,  257,
-  258,   33,   44,   44,  283,   33,  259,   44,   44,   44,
-  258,   33,  258,   44,  258,  261,  262,  263,   33,  263,
-   61,  258,    0,   33,  282,  258,  258,   58,  260,  261,
-   58,  263,  289,  290,   44,   43,  282,   45,  282,  291,
-  292,   36,  258,   38,   39,   44,   58,   61,   61,   58,
-  282,   58,   58,   61,    0,   33,   51,   58,   58,   61,
-   58,  263,   58,  263,   61,   58,  263,  158,  264,   33,
-  264,   89,  264,  264,   40,   44,   44,   93,   61,   95,
-   58,   44,   44,   41,   61,  289,    0,   33,   44,  290,
-  263,  263,  263,  292,   61,  263,   61,    0,  291,    0,
-   41,   33,  118,   41,   41,   41,   41,  126,   52,   43,
-   91,   34,   58,   66,   75,   17,  139,   77,    0,   33,
-   99,  148,  152,  147,   22,   96,   -1,  131,   -1,   -1,
-  135,   90,   -1,   -1,   -1,   92,  130,   -1,   -1,   94,
-   -1,   -1,   -1,   -1,   58,   -1,   -1,   -1,   -1,   -1,
-    0,   33,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   58,   -1,   -1,   -1,
-   -1,   -1,    0,   33,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+       {                                      33,
+    0,    8,    9,   33,   33,    7,   86,   44,   33,   33,
+   44,   33,  285,   33,    0,   44,  257,  258,  258,   44,
+   33,  258,   44,  258,   61,  258,  258,   33,   58,  261,
+  262,  263,  258,   33,  260,  261,   44,  263,  259,   43,
+  258,   45,   58,  284,   44,  263,   44,   33,    0,   58,
+   58,   61,  284,   36,  263,   38,   39,   61,  284,   58,
+  291,  292,    0,  293,  294,   58,  284,   58,   51,   61,
+   58,   61,   58,   58,   61,  263,   58,   58,  158,  263,
+   40,   33,  264,  264,  264,  264,   93,   89,   95,   44,
+   44,   44,   41,   44,   61,   33,    0,   61,  291,   44,
+  292,  263,  263,   61,   61,  294,   58,  293,  263,  263,
+    0,  118,    0,    0,   41,   41,   41,   41,   41,   75,
+   58,  126,   43,   52,   34,   91,   66,   77,   17,   33,
+   99,  152,  135,  148,   96,  131,  130,   22,   -1,   -1,
+   -1,   -1,  139,   33,    0,   92,   90,   -1,   94,   -1,
+   -1,   -1,  147,   -1,   58,   -1,   -1,   -1,    0,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   58,   -1,
-   -1,   -1,   -1,   -1,    0,   33,  258,   -1,  260,  261,
-  259,  263,  259,  259,  259,  257,  258,   -1,   -1,   -1,
-  258,   -1,   -1,  261,  262,  263,  258,   -1,  260,  261,
-  282,  263,  257,  258,   -1,   -1,  256,   33,  258,    0,
-  282,  261,  262,  263,  282,  265,  266,  267,  268,  269,
-  282,   -1,  294,  295,  296,  297,   -1,  282,   -1,   -1,
-   -1,   -1,  282,  283,  284,  285,  286,  287,  256,   -1,
-  258,    0,   33,  261,  262,  263,   -1,  265,  266,  267,
-  268,  269,   -1,   -1,  258,   -1,   -1,  261,  262,  263,
-   -1,   -1,   -1,   -1,  282,  283,  284,  285,  286,  287,
-  256,   -1,  258,    0,   33,  261,  262,  263,  282,  265,
-  266,  267,  268,  269,   -1,   -1,  258,   -1,   -1,   -1,
-   -1,  263,   -1,   -1,   -1,   -1,  282,  283,  284,  285,
-  286,  287,  256,   -1,  258,    0,   33,  261,  262,  263,
-  282,  265,  266,  267,  268,  269,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  282,  283,
-  284,  285,  286,  287,  256,   -1,  258,    0,   33,  261,
-  262,  263,   -1,  265,  266,  267,  268,  269,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-  282,  283,  284,  285,  286,  287,  256,   -1,  258,    0,
-   33,  261,  262,  263,   -1,  265,  266,  267,  268,  269,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   33,   -1,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,  282,  283,  284,  285,  286,  287,  256,   -1,
-  258,    0,   33,  261,  262,  263,   -1,  265,  266,  267,
-  268,  269,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,  282,  283,  284,  285,  286,  287,
-  256,   -1,  258,    0,   33,  261,  262,  263,   -1,  265,
-  266,  267,  268,  269,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,  282,  283,  284,  285,
-  286,  287,   -1,   -1,   -1,  256,   33,  258,   -1,   -1,
-  261,  262,  263,   -1,  265,  266,  267,  268,  269,   -1,
-   -1,   -1,   -1,   -1,   33,   -1,   -1,   -1,   -1,   -1,
-   -1,  282,  283,  284,  285,  286,  287,  256,   -1,  258,
-   -1,   -1,  261,  262,  263,   -1,  265,  266,  267,  268,
-  269,   -1,   33,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,  282,  283,  284,  285,  286,  287,  256,
-   -1,  258,   -1,   -1,  261,  262,  263,   -1,  265,  266,
-  267,  268,  269,   33,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,  282,  283,  284,  285,  286,
-  287,  256,   -1,  258,   -1,   -1,  261,  262,  263,   -1,
-  265,  266,  267,  268,  269,   33,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,  282,  283,  284,
-  285,  286,  287,  256,   -1,  258,   -1,   -1,  261,  262,
-  263,   -1,  265,  266,  267,  268,  269,   33,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  282,
-  283,  284,  285,  286,  287,  256,   -1,  258,   -1,   -1,
-  261,  262,  263,   -1,  265,  266,  267,  268,  269,   33,
+   -1,   33,    0,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,    0,   -1,   -1,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,  282,  283,  284,  285,  286,  287,  256,   -1,  258,
-   -1,   -1,  261,  262,  263,   -1,  265,  266,  267,  268,
-  269,   33,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,  282,  283,  284,  285,  286,  287,  256,
-   -1,  258,   -1,   -1,  261,  262,  263,   -1,  265,  266,
-  267,  268,  269,   33,   -1,   -1,   -1,   -1,  257,  258,
-   -1,   -1,   -1,   -1,   -1,  282,  283,  284,  285,  286,
-  287,  270,  271,  272,  273,  274,  275,  276,  277,  278,
-  279,  280,  281,  282,   -1,   -1,  257,  258,   -1,   -1,
-  289,  290,  291,  292,   -1,  294,  295,  296,  297,  270,
-  271,  272,  273,  274,  275,  276,  277,  278,  279,  280,
-  281,  282,   33,   -1,   -1,   -1,   -1,  257,  258,   -1,
-  291,  292,   -1,  294,  295,  296,  297,   -1,   -1,   -1,
-  270,  271,  272,  273,  274,  275,  276,  277,  278,  279,
-  280,  281,  282,   -1,   -1,   -1,   -1,   -1,   -1,  257,
-  258,  291,  292,   -1,  294,  295,  296,  297,   -1,   -1,
-   -1,   -1,  270,  271,  272,  273,  274,  275,  276,  277,
-  278,  279,  280,  281,  282,   -1,   -1,   -1,   -1,   -1,
-   -1,  257,  258,  291,  292,   -1,  294,  295,  296,  297,
-   -1,   -1,   -1,   -1,  270,  271,  272,  273,  274,  275,
-  276,  277,  278,  279,  280,  281,  282,   -1,   -1,   -1,
-   -1,   -1,   -1,  257,  258,   -1,   -1,   -1,  294,  295,
-  296,  297,   -1,   -1,   -1,   -1,  270,  271,  272,  273,
-  274,  275,  276,  277,  278,  279,  280,  281,  282,   -1,
-   -1,   -1,   -1,   -1,   -1,  257,  258,   -1,   -1,   -1,
-  294,  295,  296,  297,   -1,   -1,   -1,   -1,  270,  271,
+   -1,   -1,   -1,   -1,  258,   33,  260,  261,  258,  263,
+  259,  261,  262,  263,  259,  259,   -1,  259,  258,   33,
+    0,  261,  262,  263,  257,  258,   -1,   -1,   -1,   -1,
+  284,  257,  258,   -1,  284,   -1,  256,   -1,  258,   33,
+   -1,  261,  262,  263,  284,  265,  266,  267,  268,  269,
+  256,  284,  258,   33,    0,  261,  262,  263,  284,  265,
+  266,  267,  268,  269,  284,  285,  286,  287,  288,  289,
+  296,  297,  298,  299,   -1,   -1,   -1,   -1,  284,  285,
+  286,  287,  288,  289,  256,   -1,  258,   33,    0,  261,
+  262,  263,   -1,  265,  266,  267,  268,  269,  256,   -1,
+  258,   33,    0,  261,  262,  263,   -1,  265,  266,  267,
+  268,  269,  284,  285,  286,  287,  288,  289,   -1,   -1,
+   -1,   33,   -1,   -1,   -1,   -1,  284,  285,  286,  287,
+  288,  289,  256,   -1,  258,   33,    0,  261,  262,  263,
+   -1,  265,  266,  267,  268,  269,  256,   -1,  258,   -1,
+    0,  261,  262,  263,   -1,  265,  266,  267,  268,  269,
+  284,  285,  286,  287,  288,  289,   -1,   -1,   -1,   33,
+   -1,   -1,   -1,   -1,  284,  285,  286,  287,  288,  289,
+  256,   -1,  258,   33,   -1,  261,  262,  263,   -1,  265,
+  266,  267,  268,  269,  256,   -1,  258,   -1,   -1,  261,
+  262,  263,   -1,  265,  266,  267,  268,  269,  284,  285,
+  286,  287,  288,  289,   -1,   -1,   33,   -1,   -1,   -1,
+   -1,   -1,  284,  285,  286,  287,  288,  289,  256,   -1,
+  258,   -1,   -1,  261,  262,  263,   -1,  265,  266,  267,
+  268,  269,  256,   -1,  258,   -1,   33,  261,  262,  263,
+   -1,  265,  266,  267,  268,  269,  284,  285,  286,  287,
+  288,  289,   -1,   -1,  258,   -1,  260,  261,   -1,  263,
+  284,  285,  286,  287,  288,  289,  256,   33,  258,   -1,
+   -1,  261,  262,  263,   -1,  265,  266,  267,  268,  269,
+  284,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,  284,  285,  286,  287,  288,  289,
+  256,   33,  258,   -1,   -1,  261,  262,  263,   -1,  265,
+  266,  267,  268,  269,   -1,   -1,  258,   -1,   -1,   -1,
+   -1,  263,   -1,   -1,   -1,   -1,   -1,   -1,  284,  285,
+  286,  287,  288,  289,  256,   33,  258,   -1,   -1,  261,
+  262,  263,  284,  265,  266,  267,  268,  269,  256,   -1,
+  258,   -1,   -1,  261,  262,  263,   -1,  265,  266,  267,
+  268,  269,  284,  285,  286,  287,  288,  289,   33,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,  284,  285,  286,  287,
+  288,  289,  256,   -1,  258,   -1,   -1,  261,  262,  263,
+   -1,  265,  266,  267,  268,  269,  256,   -1,  258,   33,
+   -1,  261,  262,  263,   -1,  265,  266,  267,  268,  269,
+  284,  285,  286,  287,  288,  289,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,  284,  285,  286,  287,  288,  289,
+  257,  258,   33,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,  270,  271,  272,  273,  274,  275,  276,
+  277,  278,  279,  280,  281,  282,  283,  284,   -1,   -1,
+  257,  258,   -1,   -1,  291,  292,  293,  294,   -1,  296,
+  297,  298,  299,  270,  271,  272,  273,  274,  275,  276,
+  277,  278,  279,  280,  281,  282,  283,  284,   33,   -1,
+   -1,  257,  258,   -1,   -1,   -1,  293,  294,   -1,  296,
+  297,  298,  299,   -1,  270,  271,  272,  273,  274,  275,
+  276,  277,  278,  279,  280,  281,  282,  283,  284,   -1,
+   -1,   -1,   -1,   -1,   -1,  257,  258,  293,  294,   -1,
+  296,  297,  298,  299,   -1,   -1,   -1,   -1,  270,  271,
   272,  273,  274,  275,  276,  277,  278,  279,  280,  281,
-  282,   -1,   -1,   -1,   -1,   -1,   -1,  257,  258,   -1,
-   -1,   -1,  294,  295,  296,  297,   -1,   -1,   -1,   -1,
-  270,  271,  272,  273,  274,  275,  276,  277,  278,  279,
-  280,  281,  282,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,  294,  295,  296,  297,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,  256,   -1,  258,   -1,   -1,
-  261,  262,  263,   -1,  265,  266,  267,  268,  269,   -1,
+  282,  283,  284,   -1,   -1,   -1,   -1,   -1,   -1,  257,
+  258,  293,  294,   -1,  296,  297,  298,  299,   -1,   -1,
+   -1,   -1,  270,  271,  272,  273,  274,  275,  276,  277,
+  278,  279,  280,  281,  282,  283,  284,   -1,   -1,   -1,
+   -1,   -1,  257,  258,   -1,   -1,   -1,   -1,  296,  297,
+  298,  299,   -1,   -1,   -1,  270,  271,  272,  273,  274,
+  275,  276,  277,  278,  279,  280,  281,  282,  283,  284,
+   -1,   -1,   -1,  257,  258,   -1,   -1,   -1,   -1,   -1,
+   -1,  296,  297,  298,  299,   -1,  270,  271,  272,  273,
+  274,  275,  276,  277,  278,  279,  280,  281,  282,  283,
+  284,   -1,   -1,   -1,   -1,   -1,  257,  258,   -1,   -1,
+   -1,   -1,  296,  297,  298,  299,   -1,   -1,   -1,  270,
+  271,  272,  273,  274,  275,  276,  277,  278,  279,  280,
+  281,  282,  283,  284,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,  296,  297,  298,  299,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,  282,  283,  284,  285,  286,  287,
+   -1,  256,   -1,  258,   -1,   -1,  261,  262,  263,   -1,
+  265,  266,  267,  268,  269,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  284,
+  285,  286,  287,  288,  289,
 };
 #define YYFINAL 18
 #ifndef YYDEBUG
 #define YYDEBUG 0
 #endif
-#define YYMAXTOKEN 297
+#define YYMAXTOKEN 299
 #if YYDEBUG
 #if defined(__cplusplus) || defined(__STDC__)
 const char * const sudoersname[] =
@@ -551,9 +535,10 @@ char *sudoersname[] =
 "COMMAND","ALIAS","DEFVAR","NTWKADDR","NETGROUP","USERGROUP","WORD","DIGEST",
 "DEFAULTS","DEFAULTS_HOST","DEFAULTS_USER","DEFAULTS_RUNAS","DEFAULTS_CMND",
 "NOPASSWD","PASSWD","NOEXEC","EXEC","SETENV","NOSETENV","LOG_INPUT",
-"NOLOG_INPUT","LOG_OUTPUT","NOLOG_OUTPUT","MAIL","NOMAIL","ALL","COMMENT",
-"HOSTALIAS","CMNDALIAS","USERALIAS","RUNASALIAS","ERROR","TYPE","ROLE","PRIVS",
-"LIMITPRIVS","MYSELF","SHA224_TOK","SHA256_TOK","SHA384_TOK","SHA512_TOK",
+"NOLOG_INPUT","LOG_OUTPUT","NOLOG_OUTPUT","MAIL","NOMAIL","FOLLOW","NOFOLLOW",
+"ALL","COMMENT","HOSTALIAS","CMNDALIAS","USERALIAS","RUNASALIAS","ERROR","TYPE",
+"ROLE","PRIVS","LIMITPRIVS","MYSELF","SHA224_TOK","SHA256_TOK","SHA384_TOK",
+"SHA512_TOK",
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const char * const sudoersrule[] =
@@ -637,6 +622,8 @@ char *sudoersrule[] =
 "cmndtag : cmndtag NOLOG_INPUT",
 "cmndtag : cmndtag LOG_OUTPUT",
 "cmndtag : cmndtag NOLOG_OUTPUT",
+"cmndtag : cmndtag FOLLOW",
+"cmndtag : cmndtag NOFOLLOW",
 "cmndtag : cmndtag MAIL",
 "cmndtag : cmndtag NOMAIL",
 "cmnd : ALL",
@@ -701,7 +688,7 @@ short *yyss;
 short *yysslim;
 YYSTYPE *yyvs;
 unsigned int yystacksize;
-#line 850 "gram.y"
+#line 859 "gram.y"
 void
 sudoerserror(const char *s)
 {
@@ -1000,7 +987,7 @@ init_parser(const char *path, bool quiet)
 
     debug_return_bool(rval);
 }
-#line 951 "gram.c"
+#line 938 "gram.c"
 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
 #if defined(__cplusplus) || defined(__STDC__)
 static int yygrowstack(void)
@@ -1209,23 +1196,23 @@ yyreduce:
     switch (yyn)
     {
 case 1:
-#line 165 "gram.y"
+#line 167 "gram.y"
 { ; }
 break;
 case 5:
-#line 173 "gram.y"
+#line 175 "gram.y"
 {
                            ;
                        }
 break;
 case 6:
-#line 176 "gram.y"
+#line 178 "gram.y"
 {
                            yyerrok;
                        }
 break;
 case 7:
-#line 179 "gram.y"
+#line 181 "gram.y"
 {
                            if (!add_userspec(yyvsp[-1].member, yyvsp[0].privilege)) {
                                sudoerserror(N_("unable to allocate memory"));
@@ -1234,31 +1221,31 @@ case 7:
                        }
 break;
 case 8:
-#line 185 "gram.y"
+#line 187 "gram.y"
 {
                            ;
                        }
 break;
 case 9:
-#line 188 "gram.y"
+#line 190 "gram.y"
 {
                            ;
                        }
 break;
 case 10:
-#line 191 "gram.y"
+#line 193 "gram.y"
 {
                            ;
                        }
 break;
 case 11:
-#line 194 "gram.y"
+#line 196 "gram.y"
 {
                            ;
                        }
 break;
 case 12:
-#line 197 "gram.y"
+#line 199 "gram.y"
 {
                            if (!add_defaults(DEFAULTS, NULL, yyvsp[0].defaults)) {
                                sudoerserror(N_("unable to allocate memory"));
@@ -1267,7 +1254,7 @@ case 12:
                        }
 break;
 case 13:
-#line 203 "gram.y"
+#line 205 "gram.y"
 {
                            if (!add_defaults(DEFAULTS_USER, yyvsp[-1].member, yyvsp[0].defaults)) {
                                sudoerserror(N_("unable to allocate memory"));
@@ -1276,7 +1263,7 @@ case 13:
                        }
 break;
 case 14:
-#line 209 "gram.y"
+#line 211 "gram.y"
 {
                            if (!add_defaults(DEFAULTS_RUNAS, yyvsp[-1].member, yyvsp[0].defaults)) {
                                sudoerserror(N_("unable to allocate memory"));
@@ -1285,7 +1272,7 @@ case 14:
                        }
 break;
 case 15:
-#line 215 "gram.y"
+#line 217 "gram.y"
 {
                            if (!add_defaults(DEFAULTS_HOST, yyvsp[-1].member, yyvsp[0].defaults)) {
                                sudoerserror(N_("unable to allocate memory"));
@@ -1294,7 +1281,7 @@ case 15:
                        }
 break;
 case 16:
-#line 221 "gram.y"
+#line 223 "gram.y"
 {
                            if (!add_defaults(DEFAULTS_CMND, yyvsp[-1].member, yyvsp[0].defaults)) {
                                sudoerserror(N_("unable to allocate memory"));
@@ -1303,14 +1290,14 @@ case 16:
                        }
 break;
 case 18:
-#line 230 "gram.y"
+#line 232 "gram.y"
 {
                            HLTQ_CONCAT(yyvsp[-2].defaults, yyvsp[0].defaults, entries);
                            yyval.defaults = yyvsp[-2].defaults;
                        }
 break;
 case 19:
-#line 236 "gram.y"
+#line 238 "gram.y"
 {
                            yyval.defaults = new_default(yyvsp[0].string, NULL, true);
                            if (yyval.defaults == NULL) {
@@ -1320,7 +1307,7 @@ case 19:
                        }
 break;
 case 20:
-#line 243 "gram.y"
+#line 245 "gram.y"
 {
                            yyval.defaults = new_default(yyvsp[0].string, NULL, false);
                            if (yyval.defaults == NULL) {
@@ -1330,7 +1317,7 @@ case 20:
                        }
 break;
 case 21:
-#line 250 "gram.y"
+#line 252 "gram.y"
 {
                            yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, true);
                            if (yyval.defaults == NULL) {
@@ -1340,7 +1327,7 @@ case 21:
                        }
 break;
 case 22:
-#line 257 "gram.y"
+#line 259 "gram.y"
 {
                            yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, '+');
                            if (yyval.defaults == NULL) {
@@ -1350,7 +1337,7 @@ case 22:
                        }
 break;
 case 23:
-#line 264 "gram.y"
+#line 266 "gram.y"
 {
                            yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, '-');
                            if (yyval.defaults == NULL) {
@@ -1360,14 +1347,14 @@ case 23:
                        }
 break;
 case 25:
-#line 274 "gram.y"
+#line 276 "gram.y"
 {
                            HLTQ_CONCAT(yyvsp[-2].privilege, yyvsp[0].privilege, entries);
                            yyval.privilege = yyvsp[-2].privilege;
                        }
 break;
 case 26:
-#line 280 "gram.y"
+#line 282 "gram.y"
 {
                            struct privilege *p = calloc(1, sizeof(*p));
                            if (p == NULL) {
@@ -1381,21 +1368,21 @@ case 26:
                        }
 break;
 case 27:
-#line 293 "gram.y"
+#line 295 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = false;
                        }
 break;
 case 28:
-#line 297 "gram.y"
+#line 299 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = true;
                        }
 break;
 case 29:
-#line 303 "gram.y"
+#line 305 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, ALIAS);
                            if (yyval.member == NULL) {
@@ -1405,7 +1392,7 @@ case 29:
                        }
 break;
 case 30:
-#line 310 "gram.y"
+#line 312 "gram.y"
 {
                            yyval.member = new_member(NULL, ALL);
                            if (yyval.member == NULL) {
@@ -1415,7 +1402,7 @@ case 30:
                        }
 break;
 case 31:
-#line 317 "gram.y"
+#line 319 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, NETGROUP);
                            if (yyval.member == NULL) {
@@ -1425,7 +1412,7 @@ case 31:
                        }
 break;
 case 32:
-#line 324 "gram.y"
+#line 326 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, NTWKADDR);
                            if (yyval.member == NULL) {
@@ -1435,7 +1422,7 @@ case 32:
                        }
 break;
 case 33:
-#line 331 "gram.y"
+#line 333 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, WORD);
                            if (yyval.member == NULL) {
@@ -1445,7 +1432,7 @@ case 33:
                        }
 break;
 case 35:
-#line 341 "gram.y"
+#line 343 "gram.y"
 {
                            struct cmndspec *prev;
                            prev = HLTQ_LAST(yyvsp[-2].cmndspec, cmndspec, entries);
@@ -1478,6 +1465,8 @@ case 35:
                                yyvsp[0].cmndspec->tags.log_output = prev->tags.log_output;
                            if (yyvsp[0].cmndspec->tags.send_mail == UNSPEC)
                                yyvsp[0].cmndspec->tags.send_mail = prev->tags.send_mail;
+                           if (yyvsp[0].cmndspec->tags.follow == UNSPEC)
+                               yyvsp[0].cmndspec->tags.follow = prev->tags.follow;
                            if ((yyvsp[0].cmndspec->runasuserlist == NULL &&
                                 yyvsp[0].cmndspec->runasgrouplist == NULL) &&
                                (prev->runasuserlist != NULL ||
@@ -1489,7 +1478,7 @@ case 35:
                        }
 break;
 case 36:
-#line 384 "gram.y"
+#line 388 "gram.y"
 {
                            struct cmndspec *cs = calloc(1, sizeof(*cs));
                            if (cs == NULL) {
@@ -1538,7 +1527,7 @@ case 36:
                        }
 break;
 case 37:
-#line 432 "gram.y"
+#line 436 "gram.y"
 {
                            yyval.digest = new_digest(SUDO_DIGEST_SHA224, yyvsp[0].string);
                            if (yyval.digest == NULL) {
@@ -1548,7 +1537,7 @@ case 37:
                        }
 break;
 case 38:
-#line 439 "gram.y"
+#line 443 "gram.y"
 {
                            yyval.digest = new_digest(SUDO_DIGEST_SHA256, yyvsp[0].string);
                            if (yyval.digest == NULL) {
@@ -1558,7 +1547,7 @@ case 38:
                        }
 break;
 case 39:
-#line 446 "gram.y"
+#line 450 "gram.y"
 {
                            yyval.digest = new_digest(SUDO_DIGEST_SHA384, yyvsp[0].string);
                            if (yyval.digest == NULL) {
@@ -1568,7 +1557,7 @@ case 39:
                        }
 break;
 case 40:
-#line 453 "gram.y"
+#line 457 "gram.y"
 {
                            yyval.digest = new_digest(SUDO_DIGEST_SHA512, yyvsp[0].string);
                            if (yyval.digest == NULL) {
@@ -1578,13 +1567,13 @@ case 40:
                        }
 break;
 case 41:
-#line 462 "gram.y"
+#line 466 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                        }
 break;
 case 42:
-#line 465 "gram.y"
+#line 469 "gram.y"
 {
                            if (yyvsp[0].member->type != COMMAND) {
                                sudoerserror(N_("a digest requires a path name"));
@@ -1596,127 +1585,127 @@ case 42:
                        }
 break;
 case 43:
-#line 476 "gram.y"
+#line 480 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = false;
                        }
 break;
 case 44:
-#line 480 "gram.y"
+#line 484 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = true;
                        }
 break;
 case 45:
-#line 486 "gram.y"
+#line 490 "gram.y"
 {
                            yyval.string = yyvsp[0].string;
                        }
 break;
 case 46:
-#line 491 "gram.y"
+#line 495 "gram.y"
 {
                            yyval.string = yyvsp[0].string;
                        }
 break;
 case 47:
-#line 496 "gram.y"
+#line 500 "gram.y"
 {
                            yyval.seinfo.role = NULL;
                            yyval.seinfo.type = NULL;
                        }
 break;
 case 48:
-#line 500 "gram.y"
+#line 504 "gram.y"
 {
                            yyval.seinfo.role = yyvsp[0].string;
                            yyval.seinfo.type = NULL;
                        }
 break;
 case 49:
-#line 504 "gram.y"
+#line 508 "gram.y"
 {
                            yyval.seinfo.type = yyvsp[0].string;
                            yyval.seinfo.role = NULL;
                        }
 break;
 case 50:
-#line 508 "gram.y"
+#line 512 "gram.y"
 {
                            yyval.seinfo.role = yyvsp[-1].string;
                            yyval.seinfo.type = yyvsp[0].string;
                        }
 break;
 case 51:
-#line 512 "gram.y"
+#line 516 "gram.y"
 {
                            yyval.seinfo.type = yyvsp[-1].string;
                            yyval.seinfo.role = yyvsp[0].string;
                        }
 break;
 case 52:
-#line 518 "gram.y"
+#line 522 "gram.y"
 {
                            yyval.string = yyvsp[0].string;
                        }
 break;
 case 53:
-#line 522 "gram.y"
+#line 526 "gram.y"
 {
                            yyval.string = yyvsp[0].string;
                        }
 break;
 case 54:
-#line 527 "gram.y"
+#line 531 "gram.y"
 {
                            yyval.privinfo.privs = NULL;
                            yyval.privinfo.limitprivs = NULL;
                        }
 break;
 case 55:
-#line 531 "gram.y"
+#line 535 "gram.y"
 {
                            yyval.privinfo.privs = yyvsp[0].string;
                            yyval.privinfo.limitprivs = NULL;
                        }
 break;
 case 56:
-#line 535 "gram.y"
+#line 539 "gram.y"
 {
                            yyval.privinfo.privs = NULL;
                            yyval.privinfo.limitprivs = yyvsp[0].string;
                        }
 break;
 case 57:
-#line 539 "gram.y"
+#line 543 "gram.y"
 {
                            yyval.privinfo.privs = yyvsp[-1].string;
                            yyval.privinfo.limitprivs = yyvsp[0].string;
                        }
 break;
 case 58:
-#line 543 "gram.y"
+#line 547 "gram.y"
 {
                            yyval.privinfo.limitprivs = yyvsp[-1].string;
                            yyval.privinfo.privs = yyvsp[0].string;
                        }
 break;
 case 59:
-#line 549 "gram.y"
+#line 553 "gram.y"
 {
                            yyval.runas = NULL;
                        }
 break;
 case 60:
-#line 552 "gram.y"
+#line 556 "gram.y"
 {
                            yyval.runas = yyvsp[-1].runas;
                        }
 break;
 case 61:
-#line 557 "gram.y"
+#line 561 "gram.y"
 {
                            yyval.runas = calloc(1, sizeof(struct runascontainer));
                            if (yyval.runas != NULL) {
@@ -1734,7 +1723,7 @@ case 61:
                        }
 break;
 case 62:
-#line 572 "gram.y"
+#line 576 "gram.y"
 {
                            yyval.runas = calloc(1, sizeof(struct runascontainer));
                            if (yyval.runas == NULL) {
@@ -1746,7 +1735,7 @@ case 62:
                        }
 break;
 case 63:
-#line 581 "gram.y"
+#line 585 "gram.y"
 {
                            yyval.runas = calloc(1, sizeof(struct runascontainer));
                            if (yyval.runas == NULL) {
@@ -1758,7 +1747,7 @@ case 63:
                        }
 break;
 case 64:
-#line 590 "gram.y"
+#line 594 "gram.y"
 {
                            yyval.runas = calloc(1, sizeof(struct runascontainer));
                            if (yyval.runas == NULL) {
@@ -1770,7 +1759,7 @@ case 64:
                        }
 break;
 case 65:
-#line 599 "gram.y"
+#line 603 "gram.y"
 {
                            yyval.runas = calloc(1, sizeof(struct runascontainer));
                            if (yyval.runas != NULL) {
@@ -1788,86 +1777,97 @@ case 65:
                        }
 break;
 case 66:
-#line 616 "gram.y"
+#line 620 "gram.y"
 {
-                           yyval.tag.log_input = yyval.tag.log_output = yyval.tag.noexec =
-                               yyval.tag.nopasswd = yyval.tag.send_mail = yyval.tag.setenv = UNSPEC;
+                           TAGS_INIT(yyval.tag);
                        }
 break;
 case 67:
-#line 620 "gram.y"
+#line 623 "gram.y"
 {
                            yyval.tag.nopasswd = true;
                        }
 break;
 case 68:
-#line 623 "gram.y"
+#line 626 "gram.y"
 {
                            yyval.tag.nopasswd = false;
                        }
 break;
 case 69:
-#line 626 "gram.y"
+#line 629 "gram.y"
 {
                            yyval.tag.noexec = true;
                        }
 break;
 case 70:
-#line 629 "gram.y"
+#line 632 "gram.y"
 {
                            yyval.tag.noexec = false;
                        }
 break;
 case 71:
-#line 632 "gram.y"
+#line 635 "gram.y"
 {
                            yyval.tag.setenv = true;
                        }
 break;
 case 72:
-#line 635 "gram.y"
+#line 638 "gram.y"
 {
                            yyval.tag.setenv = false;
                        }
 break;
 case 73:
-#line 638 "gram.y"
+#line 641 "gram.y"
 {
                            yyval.tag.log_input = true;
                        }
 break;
 case 74:
-#line 641 "gram.y"
+#line 644 "gram.y"
 {
                            yyval.tag.log_input = false;
                        }
 break;
 case 75:
-#line 644 "gram.y"
+#line 647 "gram.y"
 {
                            yyval.tag.log_output = true;
                        }
 break;
 case 76:
-#line 647 "gram.y"
+#line 650 "gram.y"
 {
                            yyval.tag.log_output = false;
                        }
 break;
 case 77:
-#line 650 "gram.y"
+#line 653 "gram.y"
 {
-                           yyval.tag.send_mail = true;
+                           yyval.tag.follow = true;
                        }
 break;
 case 78:
-#line 653 "gram.y"
+#line 656 "gram.y"
 {
-                           yyval.tag.send_mail = false;
+                           yyval.tag.follow = false;
                        }
 break;
 case 79:
-#line 658 "gram.y"
+#line 659 "gram.y"
+{
+                           yyval.tag.send_mail = true;
+                       }
+break;
+case 80:
+#line 662 "gram.y"
+{
+                           yyval.tag.send_mail = false;
+                       }
+break;
+case 81:
+#line 667 "gram.y"
 {
                            yyval.member = new_member(NULL, ALL);
                            if (yyval.member == NULL) {
@@ -1876,8 +1876,8 @@ case 79:
                            }
                        }
 break;
-case 80:
-#line 665 "gram.y"
+case 82:
+#line 674 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, ALIAS);
                            if (yyval.member == NULL) {
@@ -1886,8 +1886,8 @@ case 80:
                            }
                        }
 break;
-case 81:
-#line 672 "gram.y"
+case 83:
+#line 681 "gram.y"
 {
                            struct sudo_command *c = calloc(1, sizeof(*c));
                            if (c == NULL) {
@@ -1904,8 +1904,8 @@ case 81:
                            }
                        }
 break;
-case 84:
-#line 693 "gram.y"
+case 86:
+#line 702 "gram.y"
 {
                            const char *s;
                            if ((s = alias_add(yyvsp[-2].string, HOSTALIAS, yyvsp[0].member)) != NULL) {
@@ -1914,15 +1914,15 @@ case 84:
                            }
                        }
 break;
-case 86:
-#line 703 "gram.y"
+case 88:
+#line 712 "gram.y"
 {
                            HLTQ_CONCAT(yyvsp[-2].member, yyvsp[0].member, entries);
                            yyval.member = yyvsp[-2].member;
                        }
 break;
-case 89:
-#line 713 "gram.y"
+case 91:
+#line 722 "gram.y"
 {
                            const char *s;
                            if ((s = alias_add(yyvsp[-2].string, CMNDALIAS, yyvsp[0].member)) != NULL) {
@@ -1931,15 +1931,15 @@ case 89:
                            }
                        }
 break;
-case 91:
-#line 723 "gram.y"
+case 93:
+#line 732 "gram.y"
 {
                            HLTQ_CONCAT(yyvsp[-2].member, yyvsp[0].member, entries);
                            yyval.member = yyvsp[-2].member;
                        }
 break;
-case 94:
-#line 733 "gram.y"
+case 96:
+#line 742 "gram.y"
 {
                            const char *s;
                            if ((s = alias_add(yyvsp[-2].string, RUNASALIAS, yyvsp[0].member)) != NULL) {
@@ -1948,8 +1948,8 @@ case 94:
                            }
                        }
 break;
-case 97:
-#line 746 "gram.y"
+case 99:
+#line 755 "gram.y"
 {
                            const char *s;
                            if ((s = alias_add(yyvsp[-2].string, USERALIAS, yyvsp[0].member)) != NULL) {
@@ -1958,29 +1958,29 @@ case 97:
                            }
                        }
 break;
-case 99:
-#line 756 "gram.y"
+case 101:
+#line 765 "gram.y"
 {
                            HLTQ_CONCAT(yyvsp[-2].member, yyvsp[0].member, entries);
                            yyval.member = yyvsp[-2].member;
                        }
 break;
-case 100:
-#line 762 "gram.y"
+case 102:
+#line 771 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = false;
                        }
 break;
-case 101:
-#line 766 "gram.y"
+case 103:
+#line 775 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = true;
                        }
 break;
-case 102:
-#line 772 "gram.y"
+case 104:
+#line 781 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, ALIAS);
                            if (yyval.member == NULL) {
@@ -1989,8 +1989,8 @@ case 102:
                            }
                        }
 break;
-case 103:
-#line 779 "gram.y"
+case 105:
+#line 788 "gram.y"
 {
                            yyval.member = new_member(NULL, ALL);
                            if (yyval.member == NULL) {
@@ -1999,8 +1999,8 @@ case 103:
                            }
                        }
 break;
-case 104:
-#line 786 "gram.y"
+case 106:
+#line 795 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, NETGROUP);
                            if (yyval.member == NULL) {
@@ -2009,8 +2009,8 @@ case 104:
                            }
                        }
 break;
-case 105:
-#line 793 "gram.y"
+case 107:
+#line 802 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, USERGROUP);
                            if (yyval.member == NULL) {
@@ -2019,8 +2019,8 @@ case 105:
                            }
                        }
 break;
-case 106:
-#line 800 "gram.y"
+case 108:
+#line 809 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, WORD);
                            if (yyval.member == NULL) {
@@ -2029,29 +2029,29 @@ case 106:
                            }
                        }
 break;
-case 108:
-#line 810 "gram.y"
+case 110:
+#line 819 "gram.y"
 {
                            HLTQ_CONCAT(yyvsp[-2].member, yyvsp[0].member, entries);
                            yyval.member = yyvsp[-2].member;
                        }
 break;
-case 109:
-#line 816 "gram.y"
+case 111:
+#line 825 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = false;
                        }
 break;
-case 110:
-#line 820 "gram.y"
+case 112:
+#line 829 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = true;
                        }
 break;
-case 111:
-#line 826 "gram.y"
+case 113:
+#line 835 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, ALIAS);
                            if (yyval.member == NULL) {
@@ -2060,8 +2060,8 @@ case 111:
                            }
                        }
 break;
-case 112:
-#line 833 "gram.y"
+case 114:
+#line 842 "gram.y"
 {
                            yyval.member = new_member(NULL, ALL);
                            if (yyval.member == NULL) {
@@ -2070,8 +2070,8 @@ case 112:
                            }
                        }
 break;
-case 113:
-#line 840 "gram.y"
+case 115:
+#line 849 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, WORD);
                            if (yyval.member == NULL) {
index 8ad05fb59ab6c9b541b4aff3e8442b852bdbb23f..c0a8e45c33ba56fedc916b754df2ee158f068316 100644 (file)
 #define NOLOG_OUTPUT 279
 #define MAIL 280
 #define NOMAIL 281
-#define ALL 282
-#define COMMENT 283
-#define HOSTALIAS 284
-#define CMNDALIAS 285
-#define USERALIAS 286
-#define RUNASALIAS 287
-#define ERROR 288
-#define TYPE 289
-#define ROLE 290
-#define PRIVS 291
-#define LIMITPRIVS 292
-#define MYSELF 293
-#define SHA224_TOK 294
-#define SHA256_TOK 295
-#define SHA384_TOK 296
-#define SHA512_TOK 297
+#define FOLLOW 282
+#define NOFOLLOW 283
+#define ALL 284
+#define COMMENT 285
+#define HOSTALIAS 286
+#define CMNDALIAS 287
+#define USERALIAS 288
+#define RUNASALIAS 289
+#define ERROR 290
+#define TYPE 291
+#define ROLE 292
+#define PRIVS 293
+#define LIMITPRIVS 294
+#define MYSELF 295
+#define SHA224_TOK 296
+#define SHA256_TOK 297
+#define SHA384_TOK 298
+#define SHA512_TOK 299
 #ifndef YYSTYPE_DEFINED
 #define YYSTYPE_DEFINED
 typedef union {
index 82604ba82a80caf98ca136725ccee546508810c1..8e3d95ecaa97de46b3a7301e6013ab91a2e38271 100644 (file)
@@ -111,6 +111,8 @@ static struct sudo_digest *new_digest(int, const char *);
 %token <tok>    NOLOG_OUTPUT           /* don't log cmnd output */
 %token <tok>    MAIL                   /* mail log message */
 %token <tok>    NOMAIL                 /* don't mail log message */
+%token <tok>    FOLLOW                 /* follow symbolic links */
+%token <tok>    NOFOLLOW               /* don't follow symbolic links */
 %token <tok>    ALL                    /* ALL keyword */
 %token <tok>    COMMENT                /* comment and/or carriage return */
 %token <tok>    HOSTALIAS              /* Host_Alias keyword */
@@ -370,6 +372,8 @@ cmndspeclist        :       cmndspec
                                $3->tags.log_output = prev->tags.log_output;
                            if ($3->tags.send_mail == UNSPEC)
                                $3->tags.send_mail = prev->tags.send_mail;
+                           if ($3->tags.follow == UNSPEC)
+                               $3->tags.follow = prev->tags.follow;
                            if (($3->runasuserlist == NULL &&
                                 $3->runasgrouplist == NULL) &&
                                (prev->runasuserlist != NULL ||
@@ -614,8 +618,7 @@ runaslist   :       /* empty */ {
                ;
 
 cmndtag                :       /* empty */ {
-                           $$.log_input = $$.log_output = $$.noexec =
-                               $$.nopasswd = $$.send_mail = $$.setenv = UNSPEC;
+                           TAGS_INIT($$);
                        }
                |       cmndtag NOPASSWD {
                            $$.nopasswd = true;
@@ -647,6 +650,12 @@ cmndtag            :       /* empty */ {
                |       cmndtag NOLOG_OUTPUT {
                            $$.log_output = false;
                        }
+               |       cmndtag FOLLOW {
+                           $$.follow = true;
+                       }
+               |       cmndtag NOFOLLOW {
+                           $$.follow = false;
+                       }
                |       cmndtag MAIL {
                            $$.send_mail = true;
                        }
index e4c451f97e9e2820ff16cf847edb2eca38402bf9..751044ed1ebe72bd3deaf595900c8235af2b7be2 100644 (file)
@@ -2325,6 +2325,9 @@ sudo_ldap_display_entry_short(LDAP *ld, LDAPMessage *entry, struct sudo_lbuf *lb
            if (strcmp(cp, "authenticate") == 0)
                sudo_lbuf_append(lbuf, (*p)->bv_val[0] == '!' ?
                    "NOPASSWD: " : "PASSWD: ");
+           else if (strcmp(cp, "sudoedit_follow") == 0)
+               sudo_lbuf_append(lbuf, (*p)->bv_val[0] == '!' ?
+                   "FOLLOW: " : "NOFOLLOW: ");
            else if (strcmp(cp, "noexec") == 0)
                sudo_lbuf_append(lbuf, (*p)->bv_val[0] == '!' ?
                    "EXEC: " : "NOEXEC: ");
index 793bbcf4ab65a3587c4ab30aad4e81cbc9000fe9..b8f04b1629be6a8aacd3063066dad4791e97c2cb 100644 (file)
@@ -320,6 +320,8 @@ sudo_file_lookup(struct sudo_nss *nss, int validated, int pwflag)
                    def_mail_no_perms = false;
                }
            }
+           if (tags->follow != UNSPEC)
+               def_sudoedit_follow = tags->follow;
        }
     } else if (match == DENY) {
        SET(validated, VALIDATE_FAILURE);
@@ -346,9 +348,6 @@ done:
     debug_return_int(validated);
 }
 
-#define        TAG_SET(tt) \
-       ((tt) != UNSPEC && (tt) != IMPLIED)
-
 #define        TAG_CHANGED(t) \
        (TAG_SET(cs->tags.t) && cs->tags.t != tags->t)
 
@@ -394,14 +393,14 @@ sudo_file_append_cmnd(struct cmndspec *cs, struct cmndtag *tags,
        tags->send_mail = cs->tags.send_mail;
        sudo_lbuf_append(lbuf, tags->send_mail ? "MAIL: " : "NOMAIL: ");
     }
+    if (TAG_CHANGED(follow)) {
+       tags->follow = cs->tags.follow;
+       sudo_lbuf_append(lbuf, tags->follow ? "FOLLOW: " : "NOFOLLOW: ");
+    }
     print_member(lbuf, cs->cmnd, CMNDALIAS);
     debug_return_bool(!sudo_lbuf_error(lbuf));
 }
 
-#define        RUNAS_CHANGED(cs1, cs2) \
-       (cs1->runasuserlist != cs2->runasuserlist || \
-        cs1->runasgrouplist != cs2->runasgrouplist)
-
 static int
 sudo_file_display_priv_short(struct passwd *pw, struct userspec *us,
     struct sudo_lbuf *lbuf)
@@ -414,12 +413,7 @@ sudo_file_display_priv_short(struct passwd *pw, struct userspec *us,
     debug_decl(sudo_file_display_priv_short, SUDOERS_DEBUG_NSS)
 
     /* gcc -Wuninitialized false positive */
-    tags.log_input = UNSPEC;
-    tags.log_output = UNSPEC;
-    tags.noexec = UNSPEC;
-    tags.nopasswd = UNSPEC;
-    tags.send_mail = UNSPEC;
-    tags.setenv = UNSPEC;
+    TAGS_INIT(tags);
     TAILQ_FOREACH(priv, &us->privileges, entries) {
        if (hostlist_matches(&priv->hostlist) != ALLOW)
            continue;
@@ -449,12 +443,7 @@ sudo_file_display_priv_short(struct passwd *pw, struct userspec *us,
                    }
                }
                sudo_lbuf_append(lbuf, ") ");
-               tags.log_input = UNSPEC;
-               tags.log_output = UNSPEC;
-               tags.noexec = UNSPEC;
-               tags.nopasswd = UNSPEC;
-               tags.send_mail = UNSPEC;
-               tags.setenv = UNSPEC;
+               TAGS_INIT(tags);
            } else if (cs != TAILQ_FIRST(&priv->cmndlist)) {
                sudo_lbuf_append(lbuf, ", ");
            }
@@ -467,13 +456,6 @@ sudo_file_display_priv_short(struct passwd *pw, struct userspec *us,
     debug_return_int(nfound);
 }
 
-#define        TAGS_CHANGED(ot, nt) \
-       ((TAG_SET((nt).setenv) && (nt).setenv != (ot).setenv) || \
-        (TAG_SET((nt).noexec) && (nt).noexec != (ot).noexec) || \
-        (TAG_SET((nt).nopasswd) && (nt).nopasswd != (ot).nopasswd) || \
-        (TAG_SET((nt).log_input) && (nt).log_input != (ot).log_input) || \
-        (TAG_SET((nt).log_output) && (nt).log_output != (ot).log_output))
-
 /*
  * Compare the current cmndspec with the previous one to determine
  * whether we need to start a new long entry for "sudo -ll".
index e51d2326b832a7210b3edfeb39e94609a66c785d..85e02297afd312fee2a587b1b41ae60311f61e08 100644 (file)
 #undef IMPLIED
 #define IMPLIED         2
 
+/*
+ * Initialize all tags to UNSPEC.
+ */
+#define TAGS_INIT(t)   do {                                                   \
+    (t).follow = UNSPEC;                                                      \
+    (t).log_input = UNSPEC;                                                   \
+    (t).log_output = UNSPEC;                                                  \
+    (t).noexec = UNSPEC;                                                      \
+    (t).nopasswd = UNSPEC;                                                    \
+    (t).send_mail = UNSPEC;                                                   \
+    (t).setenv = UNSPEC;                                                      \
+} while (0)
+
+/*
+ * Returns true if any tag are not UNSPEC, else false.
+ */
+#define TAGS_SET(t)                                                           \
+    ((t).follow != UNSPEC || (t).log_input != UNSPEC ||                               \
+     (t).log_output != UNSPEC || (t).noexec != UNSPEC ||                      \
+     (t).nopasswd != UNSPEC || (t).send_mail != UNSPEC ||                     \
+     (t).setenv != UNSPEC)
+
+/*
+ * Returns true if the specified tag is not UNSPEC or IMPLIED, else false.
+ */
+#define TAG_SET(tt) \
+    ((tt) != UNSPEC && (tt) != IMPLIED)
+
+/*
+ * Returns true if any tags set in nt differ between ot and nt, else false.
+ */
+#define TAGS_CHANGED(ot, nt) \
+    ((TAG_SET((nt).follow) && (nt).follow != (ot).follow) || \
+    (TAG_SET((nt).log_input) && (nt).log_input != (ot).log_input) || \
+    (TAG_SET((nt).log_output) && (nt).log_output != (ot).log_output) || \
+    (TAG_SET((nt).noexec) && (nt).noexec != (ot).noexec) || \
+    (TAG_SET((nt).nopasswd) && (nt).nopasswd != (ot).nopasswd) || \
+    (TAG_SET((nt).setenv) && (nt).setenv != (ot).setenv) || \
+    (TAG_SET((nt).send_mail) && (nt).send_mail != (ot).send_mail))
+
+/*
+ * Returns true if the runas user and group lists match, else false.
+ */
+#define RUNAS_CHANGED(cs1, cs2) \
+    ((cs1) == NULL || (cs2) == NULL || \
+     (cs1)->runasuserlist != (cs2)->runasuserlist || \
+     (cs1)->runasgrouplist != (cs2)->runasgrouplist)
+
 #define SUDO_DIGEST_SHA224     0
 #define SUDO_DIGEST_SHA256     1
 #define SUDO_DIGEST_SHA384     2
@@ -59,6 +107,7 @@ struct cmndtag {
     signed int log_input: 3;
     signed int log_output: 3;
     signed int send_mail: 3;
+    signed int follow: 3;
 };
 
 /*
index 59fc1fa037c778abfdf81858f4f0a00edc2a33b0..a92b7a7a93ec247b80eddc46491b502b6325f426 100644 (file)
@@ -438,6 +438,10 @@ sudoers_policy_exec_setup(char *argv[], char *envp[], mode_t cmnd_umask,
     if (ISSET(sudo_mode, MODE_EDIT)) {
        if ((command_info[info_len++] = strdup("sudoedit=true")) == NULL)
            goto oom;
+       if (def_sudoedit_follow) {
+           if ((command_info[info_len++] = strdup("sudoedit_follow=true")) == NULL)
+               goto oom;
+       }
     }
     if (ISSET(sudo_mode, MODE_LOGIN_SHELL)) {
        /* Set cwd to run user's homedir. */
index 455456abd7e807ae8751453359bbb2359b5200eb..70e8a03589f1eb8cbc9283fef906e012b2d65e95 100644 (file)
@@ -8,3 +8,5 @@ user2 ALL = NOPASSWD: NOEXEC: SETENV: /usr/bin/vi:\
       ALL = PASSWD: EXEC: NOSETENV: /usr/bin/echo
 user3 ALL = MAIL: /bin/sh:\
       ALL = NOMAIL: /usr/bin/id
+user4 ALL = FOLLOW: sudoedit /etc/motd:\
+      ALL = NOFOLLOW: sudoedit /home/*/*
index 214f40edbf3b1b60ff143e8c13203efbcf0934cf..58875dcee8cedea40cc0776a9c012cf263d705e5 100644 (file)
                     ]
                 }
             ]
+        },
+        {
+            "User_List": [
+                { "username": "user4" }
+            ],
+            "Host_List": [
+                { "hostalias": "ALL" }
+            ],
+            "Cmnd_Specs": [
+                {
+                    "Options": [
+                        { "sudoedit_follow": true }
+                    ],
+                    "Commands": [
+                        { "command": "sudoedit \/etc\/motd" }
+                    ]
+                }
+            ]
+        },
+        {
+            "User_List": [
+                { "username": "user4" }
+            ],
+            "Host_List": [
+                { "hostalias": "ALL" }
+            ],
+            "Cmnd_Specs": [
+                {
+                    "Options": [
+                        { "sudoedit_follow": false }
+                    ],
+                    "Commands": [
+                        { "command": "sudoedit \/home\/*\/*" }
+                    ]
+                }
+            ]
         }
     ]
 }
index a68124ea61dd24edf7608ec497bac45ea589bf74..34f9aa2bac990d7b9f95f88698a8b444682dceb1 100644 (file)
@@ -5,3 +5,4 @@ Parses OK.
 user1  ALL = LOG_INPUT: LOG_OUTPUT: /usr/bin/su - : ALL = NOLOG_INPUT: NOLOG_OUTPUT: /usr/bin/id
 user2  ALL = NOEXEC: NOPASSWD: SETENV: /usr/bin/vi : ALL = EXEC: PASSWD: NOSETENV: /usr/bin/echo
 user3  ALL = MAIL: /bin/sh : ALL = NOMAIL: /usr/bin/id
+user4  ALL = FOLLOW: sudoedit /etc/motd : ALL = NOFOLLOW: sudoedit /home/*/*
index a9c18bb918885cefb6a8ab825e0fb8ca79092ff8..79945dc9e34b3caae34ee33a7df09800bd4dfb76 100644 (file)
@@ -5,3 +5,4 @@
 WORD(5) ALL = LOG_INPUT LOG_OUTPUT COMMAND ARG : ALL = NOLOG_INPUT NOLOG_OUTPUT COMMAND 
 WORD(5) ALL = NOPASSWD NOEXEC SETENV COMMAND : ALL = PASSWD EXEC NOSETENV COMMAND 
 WORD(5) ALL = MAIL COMMAND : ALL = NOMAIL COMMAND 
+WORD(5) ALL = FOLLOW COMMAND ARG : ALL = NOFOLLOW COMMAND ARG 
index 57fe1df20f3e2e14f7b0c441515b1117c0085382..ce953941642d91e17e3e14f8ccf8eb60b6f71949 100644 (file)
  * 42  sudo 1.8.6, Support for empty Runas_List (with or without a colon) to mean the invoking user.  Support for Solaris Privilege Sets (PRIVS= and LIMITPRIVS=).
  * 43  sudo 1.8.7, Support for specifying a digest along with the command.
  * 44  sudo 1.8.13, added MAIL/NOMAIL tags.
+ * 45  sudo 1.8.15, added FOLLOW/NOFOLLOW tags and sudoedit_follow Default.
 */
 
 #ifndef SUDOERS_VERSION_H
 #define        SUDOERS_VERSION_H
 
-#define SUDOERS_GRAMMAR_VERSION        44
+#define SUDOERS_GRAMMAR_VERSION        45
 
 #endif /* SUDOERS_VERSION_H */
index 13fade71887fac424028821dbc6a06bd9f2aeb49..1feee9a4a013e6a848e401f853fced081a31480a 100644 (file)
@@ -591,12 +591,7 @@ print_privilege(struct privilege *priv)
        print_member(m);
     }
     fputs(" = ", stdout);
-    tags.log_input = UNSPEC;
-    tags.log_output = UNSPEC;
-    tags.noexec = UNSPEC;
-    tags.nopasswd = UNSPEC;
-    tags.send_mail = UNSPEC;
-    tags.setenv = UNSPEC;
+    TAGS_INIT(tags);
     TAILQ_FOREACH(cs, &priv->cmndlist, entries) {
        if (cs != TAILQ_FIRST(&priv->cmndlist))
            fputs(", ", stdout);
@@ -635,6 +630,8 @@ print_privilege(struct privilege *priv)
        if (cs->limitprivs)
            printf("LIMITPRIVS=%s ", cs->limitprivs);
 #endif /* HAVE_PRIV_SET */
+       if (TAG_CHANGED(follow))
+           printf("%sFOLLOW: ", cs->tags.follow ? "" : "NO");
        if (TAG_CHANGED(log_input))
            printf("%sLOG_INPUT: ", cs->tags.log_input ? "" : "NO");
        if (TAG_CHANGED(log_output))
index 537aa21d449e1355a1c9b0bd1b8d986a7113aa3a..9a1acc864d77aca354856e7311aa621a777b24f3 100644 (file)
@@ -306,102 +306,105 @@ static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
        *yy_cp = '\0'; \
        yy_c_buf_p = yy_cp;
 
-#define YY_NUM_RULES 69
-#define YY_END_OF_BUFFER 70
-static yyconst short int yy_accept[834] =
+#define YY_NUM_RULES 71
+#define YY_END_OF_BUFFER 72
+static yyconst short int yy_accept[862] =
     {   0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,   70,   57,   65,   64,   63,   56,
-       67,   36,   58,   59,   36,   60,   57,   57,   57,   57,
-       62,   61,   68,   48,   48,   48,   48,   48,   48,   48,
-       48,   48,   48,   48,   68,   57,   57,   65,   67,   48,
-       48,   48,   48,   48,    2,   68,    1,   57,   48,   48,
-       57,   17,   16,   17,   16,   16,   68,   67,   68,    3,
-        9,    8,    9,    4,    9,    5,   68,   13,   13,   13,
-       11,   12,   68,   19,   19,   18,   18,   18,   19,   18,
-       18,   18,   19,   19,   19,   19,   19,   19,   18,   19,
-
-       19,   57,    0,   65,   63,   67,   67,    0,   57,   38,
-        0,   36,    0,   37,    0,   55,   55,    0,   57,   57,
-        0,   57,   57,   57,   57,    0,   41,   48,   48,   48,
-       48,   48,   48,   48,   48,   48,   48,   48,   48,   48,
-       57,   66,   57,   57,   65,    0,    0,    0,    0,    0,
-       67,   57,   57,   57,   57,   57,    2,    1,    0,    1,
-       49,   49,    0,   57,   17,   17,   15,   14,   15,    0,
-        0,    3,    9,    0,    6,    7,    9,    9,   13,    0,
-       13,   13,    0,   10,   38,    0,    0,   37,   19,   19,
-        0,   19,    0,    0,   18,   18,   18,   18,   18,   18,
-
-       19,   19,   48,   19,   19,   19,   19,   19,   19,   19,
-       19,   67,   67,    0,   38,   57,   57,   57,   57,   57,
-        0,    0,   41,   41,   48,   43,   48,   48,   48,   48,
-       48,   48,   48,   48,   48,   48,   48,   48,   48,   48,
-       57,   57,    0,    0,    0,    0,    0,   67,   57,   57,
-       57,   57,   57,    0,   57,   10,    0,    0,    0,   18,
-       18,   18,   19,   19,   19,   19,   19,   19,   19,   19,
-       19,   19,   19,   19,   19,   67,   57,   57,   57,   57,
-       57,   57,    0,   42,   42,   42,    0,    0,   41,   41,
-       41,   41,   41,   41,   41,   48,   48,   48,   48,   48,
-
-       48,   48,   48,   48,   48,   48,   48,   44,   48,   45,
-       57,   57,   57,   57,    0,    0,    0,    0,    0,   67,
-       57,   57,   57,   57,    0,    0,    0,    0,    0,   18,
-       18,   19,   48,   19,   19,   19,   19,   19,   19,   19,
-       19,   19,   19,   19,   19,   57,   57,   57,    0,    0,
-       42,   42,   42,    0,   41,   41,    0,   41,   41,   41,
-       41,   41,   41,   41,   41,   41,   41,   41,    0,   27,
-       48,   48,   48,    0,   34,   48,   48,   48,   48,   48,
-       48,   46,   48,   57,   57,   57,   57,   57,    0,    0,
-        0,   67,   57,   57,   57,    0,    0,    0,   18,   18,
-
-       48,   48,   19,   19,   19,   19,   19,   19,   19,   19,
-       19,   19,   19,   19,   57,   57,   57,   57,   57,    0,
-       42,    0,   41,   41,   41,    0,    0,    0,   41,   41,
+        0,    0,    0,    0,   72,   59,   67,   66,   65,   58,
+       69,   38,   60,   61,   38,   62,   59,   59,   59,   59,
+       64,   63,   70,   50,   50,   50,   50,   50,   50,   50,
+       50,   50,   50,   50,   50,   70,   59,   59,   67,   69,
+       50,   50,   50,   50,   50,    2,   70,    1,   59,   50,
+       50,   59,   17,   16,   17,   16,   16,   70,   69,   70,
+        3,    9,    8,    9,    4,    9,    5,   70,   13,   13,
+       13,   11,   12,   70,   19,   19,   18,   18,   18,   19,
+       18,   18,   18,   18,   19,   19,   19,   19,   19,   19,
+
+       18,   19,   19,   59,    0,   67,   65,   69,   69,    0,
+       59,   40,    0,   38,    0,   39,    0,   57,   57,    0,
+       59,   59,    0,   59,   59,   59,   59,    0,   43,   50,
+       50,   50,   50,   50,   50,   50,   50,   50,   50,   50,
+       50,   50,   50,   59,   68,   59,   59,   67,    0,    0,
+        0,    0,    0,   69,   59,   59,   59,   59,   59,    2,
+        1,    0,    1,   51,   51,    0,   59,   17,   17,   15,
+       14,   15,    0,    0,    3,    9,    0,    6,    7,    9,
+        9,   13,    0,   13,   13,    0,   10,   40,    0,    0,
+       39,   19,   19,    0,   19,    0,    0,   18,   18,   18,
+
+       18,   18,   18,   19,   19,   50,   19,   19,   19,   19,
+       19,   19,   19,   19,   19,   69,   69,    0,   40,   59,
+       59,   59,   59,   59,    0,    0,   43,   43,   50,   45,
+       50,   50,   50,   50,   50,   50,   50,   50,   50,   50,
+       50,   50,   50,   50,   50,   50,   59,   59,    0,    0,
+        0,    0,    0,   69,   59,   59,   59,   59,   59,    0,
+       59,   10,    0,    0,    0,   18,   18,   18,   19,   19,
+       19,   19,   19,   19,   19,   19,   19,   19,   19,   19,
+       19,   19,   19,   69,   59,   59,   59,   59,   59,   59,
+        0,   44,   44,   44,    0,    0,   43,   43,   43,   43,
+
+       43,   43,   43,   50,   50,   50,   50,   50,   50,   50,
+       50,   50,   50,   50,   50,   50,   50,   46,   50,   47,
+       59,   59,   59,   59,    0,    0,    0,    0,    0,   69,
+       59,   59,   59,   59,    0,    0,    0,    0,    0,   18,
+       18,   19,   19,   50,   19,   19,   19,   19,   19,   19,
+       19,   19,   19,   19,   19,   19,   19,   59,   59,   59,
+        0,    0,   44,   44,   44,    0,   43,   43,    0,   43,
+       43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
+        0,   27,   50,   50,   50,   50,    0,   34,   50,   50,
+       50,   50,   50,   50,   50,   48,   50,   59,   59,   59,
+
+       59,   59,    0,    0,    0,   69,   59,   59,   59,    0,
+        0,    0,   18,   18,   19,   50,   50,   19,   19,   19,
+       19,   19,   19,   19,   19,   19,   19,   19,   19,   19,
+       59,   59,   59,   59,   59,    0,   44,    0,   43,   43,
+       43,    0,    0,    0,   43,   43,   43,   43,   43,   43,
+       43,   43,   43,   43,   43,   43,   43,   50,   50,   50,
+       50,   50,   50,   50,   50,   50,   50,   50,   50,   52,
+       53,   54,   55,   59,    0,    0,   69,   59,   59,   59,
+        0,    0,    0,    0,    0,   19,   50,   50,   19,   19,
+       50,   19,   19,   19,   19,   19,   19,   19,   19,   19,
+
+       19,   41,   41,   41,    0,    0,   43,   43,   43,   43,
+       43,   43,   43,    0,    0,    0,    0,    0,   43,   43,
+       43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
+       43,   43,    0,   36,   50,   50,   50,    0,   26,   50,
+       50,   50,    0,   35,   50,   50,    0,   25,    0,   28,
+       59,    0,    0,   69,   59,   59,   59,   41,   41,   41,
+       50,   50,   19,   50,   50,   19,   19,   19,   59,   41,
+       41,   41,   41,    0,   43,    0,   43,   43,   43,   43,
+       43,   43,   43,   43,   43,   43,   43,    0,    0,    0,
+       43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
+
+       43,   43,   43,   50,   50,   50,   50,   50,   50,   50,
+       50,   56,    0,    0,   69,   59,   22,   51,    0,   41,
+       41,   41,   41,   50,   50,   19,   50,   50,   19,   19,
+       19,   42,   42,   42,   42,   43,    0,    0,    0,   43,
+       43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
+       43,   43,    0,    0,    0,    0,    0,   43,   43,   43,
+       43,   43,   43,   43,   43,   50,   50,   50,    0,   37,
+       50,   50,    0,   24,    0,   29,    0,   22,   69,   69,
+       59,    0,   59,   42,   42,   42,   42,   50,   50,   50,
+       50,   59,   59,   42,   42,   42,   42,    0,    0,    0,
+
+        0,    0,   43,   43,   43,   43,   43,   43,   43,   43,
+       43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
+       43,   43,   49,    0,   32,   50,   50,   50,    0,   69,
+       69,   20,   69,   23,   22,    0,    0,    0,    0,    0,
+       22,    0,    0,    0,   42,   42,   42,   42,   50,   50,
+       50,   59,   59,   59,    0,    0,    0,   43,   43,   43,
+       43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
+       43,   43,   43,   43,   43,    0,   30,   50,   50,   23,
+       69,    0,   22,    0,    0,    0,   50,   50,   59,   59,
+       59,   59,   59,    0,    0,    0,    0,    0,   43,   43,
+
+       43,   43,   43,   43,   43,   43,    0,   33,   50,   69,
+        0,    0,    0,    0,    0,   50,   59,   59,   59,   43,
+       43,   43,   43,   43,   43,    0,   31,   69,   69,   21,
+        0,    0,    0,   59,   59,   59,   59,   59,   43,   43,
+       43,   43,   43,    0,    0,    0,    0,    0,   41,   41,
        41,   41,   41,   41,   41,   41,   41,   41,   41,   41,
-       41,   48,   48,   48,   48,   48,   48,   48,   48,   48,
-       48,   50,   51,   52,   53,   57,    0,    0,   67,   57,
-       57,   57,    0,    0,    0,    0,    0,   48,   48,   19,
-       48,   19,   19,   19,   19,   19,   19,   19,   19,   19,
-       19,   39,   39,   39,    0,    0,   41,   41,   41,   41,
-       41,   41,   41,    0,    0,    0,    0,    0,   41,   41,
-
-       41,   41,   41,   41,   41,   41,   41,   41,   41,   41,
-       41,   41,   48,   48,   48,    0,   26,   48,   48,    0,
-       35,   48,   48,    0,   25,    0,   28,   57,    0,    0,
-       67,   57,   57,   57,   39,   39,   39,   48,   48,   48,
-       48,   19,   19,   19,   57,   39,   39,   39,   39,    0,
-       41,    0,   41,   41,   41,   41,   41,   41,   41,   41,
-       41,   41,   41,    0,    0,    0,   41,   41,   41,   41,
-       41,   41,   41,   41,   41,   41,   41,   41,   41,   48,
-       48,   48,   48,   48,   48,   48,   54,    0,    0,   67,
-       57,   22,   49,    0,   39,   39,   39,   39,   48,   48,
-
-       48,   48,   19,   19,   19,   40,   40,   40,   40,   41,
-        0,    0,    0,   41,   41,   41,   41,   41,   41,   41,
-       41,   41,   41,   41,   41,   41,    0,    0,    0,    0,
-        0,   41,   41,   41,   41,   41,   41,   41,   41,   48,
-       48,   48,   48,   48,    0,   24,    0,   29,    0,   22,
-       67,   67,   57,    0,   57,   40,   40,   40,   40,   48,
-       48,   48,   48,   57,   57,   40,   40,   40,   40,    0,
-        0,    0,    0,    0,   41,   41,   41,   41,   41,   41,
-       41,   41,   41,   41,   41,   41,   41,   41,   41,   41,
-       41,   41,   41,   41,   47,    0,   32,   48,   48,   48,
-
-        0,   67,   67,   20,   67,   23,   22,    0,    0,    0,
-        0,    0,   22,    0,    0,    0,   40,   40,   40,   40,
-       48,   48,   48,   57,   57,   57,    0,    0,    0,   41,
-       41,   41,   41,   41,   41,   41,   41,   41,   41,   41,
-       41,   41,   41,   41,   41,   41,   41,    0,   30,   48,
-       48,   23,   67,    0,   22,    0,    0,    0,   48,   48,
-       57,   57,   57,   57,   57,    0,    0,    0,    0,    0,
-       41,   41,   41,   41,   41,   41,   41,   41,    0,   33,
-       48,   67,    0,    0,    0,    0,    0,   48,   57,   57,
-       57,   41,   41,   41,   41,   41,   41,    0,   31,   67,
-
-       67,   21,    0,    0,    0,   57,   57,   57,   57,   57,
-       41,   41,   41,   41,   41,    0,    0,    0,    0,    0,
-       39,   39,   39,   39,   39,   39,   39,   39,   39,   39,
-       39,   39,    0
+        0
     } ;
 
 static yyconst int yy_ec[256] =
@@ -412,14 +415,14 @@ static yyconst int yy_ec[256] =
         1,    2,    4,    5,    6,    1,    7,    1,    1,    8,
         9,   10,   11,   12,   13,   14,   15,   16,   17,   18,
        19,   20,   21,   22,   23,   24,   25,   26,    1,    1,
-       27,   28,   10,   29,   30,   31,   32,   33,   34,   31,
-       35,   36,   37,   38,   38,   39,   40,   41,   42,   43,
-       38,   44,   45,   46,   47,   48,   49,   50,   51,   38,
-       10,   52,   10,    1,   53,    1,   54,   55,   56,   57,
-
-       58,   59,   60,   61,   62,   60,   60,   63,   64,   65,
-       66,   60,   60,   67,   68,   69,   70,   60,   60,   60,
-       60,   60,    1,    1,    1,    1,    1,    1,    1,    1,
+       27,   28,   10,   29,   30,   31,   32,   33,   34,   35,
+       36,   37,   38,   39,   39,   40,   41,   42,   43,   44,
+       39,   45,   46,   47,   48,   49,   50,   51,   52,   39,
+       10,   53,   10,    1,   54,    1,   55,   56,   57,   58,
+
+       59,   60,   61,   62,   63,   61,   61,   64,   65,   66,
+       67,   61,   61,   68,   69,   70,   71,   61,   61,   61,
+       61,   61,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -436,862 +439,867 @@ static yyconst int yy_ec[256] =
         1,    1,    1,    1,    1
     } ;
 
-static yyconst int yy_meta[71] =
+static yyconst int yy_meta[72] =
     {   0,
         1,    2,    3,    4,    5,    6,    1,    7,    7,    1,
         8,    9,   10,   11,   12,   13,   13,   13,   13,   13,
        13,   13,   13,   13,   13,   14,   15,    7,    1,   16,
-       16,   16,   16,   16,   17,   17,   17,   17,   17,   17,
+       16,   16,   16,   16,   16,   17,   17,   17,   17,   17,
        17,   17,   17,   17,   17,   17,   17,   17,   17,   17,
-       17,   18,   19,   20,   20,   20,   20,   20,   20,   21,
-       21,   21,   21,   21,   21,   21,   21,   21,   21,   21
+       17,   17,   18,   19,   20,   20,   20,   20,   20,   20,
+       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
+       21
     } ;
 
-static yyconst short int yy_base[951] =
+static yyconst short int yy_base[979] =
     {   0,
-        0,   69,   71,   79,   94,  124,  175,  244,  153,  197,
-       85,  130,  314,    0, 4617, 4563, 4604, 5604, 4601, 5604,
-      382,   86, 5604, 5604, 4548, 5604,  140,  394,  195,  153,
-     4571, 5604, 5604,  453, 4555,   43,  508,   37, 4563, 4543,
-       65, 4542, 4545, 4526,  566,  581,   91,  151,  604,   39,
-       41, 4510,   34, 4507,  117, 4561, 4571,  428, 4530, 4534,
-      136,    0, 5604, 4554, 5604,    0,  606,  664,  105,    0,
-     4504, 5604,  115, 5604,  133, 5604,  138, 4502,  152,  171,
-     5604,  188,  383,  641,  694,  737,  235,  245,  794,  843,
-     4514,  157,  898, 4510, 4521, 4480, 4491, 4482,  944,    0,
-
-      206, 4462,  266, 4511, 4508, 4508, 5604,  263,  532,  585,
-     4497,  608,  707, 4457,  829,  648, 4370,  968,  981, 1018,
-     4395, 4406,  563,  708,  422, 4393,  371, 1062, 1106, 4379,
-     4383, 4376, 4380, 4377,  596, 4368, 4375, 4372, 4364, 4366,
-      644, 5604,  237,  137,  946, 4344, 4349, 4340, 4335, 4336,
-      121,  225,  530,  377,  369,  335,  445, 4401,  720, 4400,
-      931, 4349, 1018,  169,    0, 4396,  160, 5604, 5604,  991,
-      388,    0, 4347,  638, 5604, 5604, 4346,  661, 4345, 4380,
-      392,  221,  420, 4382,  653,  665, 1139, 4331, 1145,    0,
-     1173, 1201, 1210, 1037, 1239, 4368, 1081, 1170,  826, 1288,
-
-     1343, 4342,    0, 4346, 4344, 4341,  904, 4332, 4330, 4321,
-     4317, 4370, 4369, 1222, 1258, 1389, 1362,  968, 1428, 4357,
-     4344, 1472,  520, 1517, 1561, 1605, 4337, 4331, 4314, 4327,
-     4315, 4322, 4333, 4332, 4327, 4315, 4300, 4313, 4312, 4311,
-      654,  493, 4279, 4284, 4274, 4276, 4282,  534,  617, 4285,
-      491,  407,  506, 1413,  579, 4336, 4323, 4322, 1651, 1661,
-     4321, 1705,    0, 4302, 4280, 4272, 4260, 4267, 4278, 4277,
-     4272, 4220, 4219,  811, 4175, 4226, 1749,  378,    0,    0,
-     1041,  243, 4191, 4179, 1786,  805, 4167, 4155,  623, 1410,
-     1799, 1447, 1091, 1844, 1890, 4143,  429, 4111,  655,  688,
-
-     4111, 4098, 4088, 4079, 4077, 4073, 4076,    0, 4079,    0,
-     1124,  967,  544,  561, 4062, 4064, 4048, 4047, 4033,  746,
-      524, 1063,  413,  875, 1491, 4085, 4084, 4073, 1270, 1900,
-     1944,  763,  904,  764, 4045, 4043, 4040, 4031, 4029, 4025,
-     4032,  818, 4048, 4054, 3997, 1990, 2002, 2014, 4028, 4027,
-     2024, 4016, 4003, 3991, 3979,  919, 1536, 1003, 1580, 1142,
-     2037,    0, 1626, 2083, 1680, 1372, 2128, 2174,  869, 5604,
-     3927, 3915, 3908,  924, 5604, 3922, 3885, 3898, 3891, 3901,
-     3885,    0, 3869,  658,  698,  820, 1117, 1097, 3863, 3845,
-     3846,  922,  995,  969, 1161, 3899, 3887, 2186, 2196, 3874,
-
-     3853, 3846, 3860, 3827, 3833, 3820, 3814, 3814, 3798, 3811,
-     3807, 3808, 3808, 3738, 2240, 1017, 2279, 2291, 1637, 3720,
-     3712, 3705, 3688, 2301, 1158, 3699, 3698, 2347, 1181, 1205,
-     1209, 1724, 1761, 2359,    0, 1763, 2405, 1774, 1457, 2450,
-     2496, 2521,  618, 1024, 1223, 1190, 1224, 1372, 1109, 1392,
-     1394, 3636, 3622, 3620, 3604,  919, 3625, 3591, 1245, 1391,
-     1152, 1118, 1818, 3622, 3615, 3598, 1503, 3568, 3564,  949,
-     1380, 1065, 3549, 3540, 1088, 1290,    0,    0,    0,    0,
-     3511, 2577, 1863, 1546, 3539, 3526, 3514, 1919, 2616, 1963,
-     1590, 2660, 2706, 2056, 3487, 3467, 3444, 1692, 1879, 1979,
-
-     2096, 2104, 2147, 2106, 2718,    0, 2217, 2764, 2250, 1734,
-     2809, 2855, 2880, 2086, 1807, 1369, 5604,  421, 2087, 1453,
-     5604, 1812, 2088, 1454, 5604, 1455, 5604, 1248, 3394, 3373,
-     1282, 2127, 1165, 1449, 3418, 3348, 2936, 3303, 3299, 3300,
-     3282, 2951, 1218, 3257, 3006, 1119, 3044,    0, 1709, 3299,
-     3269, 2260,   58, 2320, 1774, 3083,    0, 2380, 3129, 2424,
-     1929, 3173, 3219, 3270, 3265, 3231, 2336, 2462, 2464, 2471,
-     3257, 2477, 3243,    0, 2589, 3289, 2600, 2066, 3335, 3360,
-     1324, 1376, 1803, 1498, 1586, 1845, 3219, 3184, 3166, 1870,
-     1516, 2382, 3174, 2635, 3210, 3203, 3186, 2435, 3135, 3118,
-
-     3115, 3111, 3429, 1543,    0, 3486, 2679, 2737, 1632, 3103,
-     3098, 3097, 3525, 3063, 2003, 2280, 2783, 2381, 3537,    0,
-     2830, 3583, 3016, 2157, 3627, 3673, 3026, 3067, 2989, 2966,
-     2228, 2472, 2474, 2695, 1485, 1575, 3685,    0, 2647, 1844,
-     2064, 1642, 1566, 1847, 1826, 5604, 1926, 5604, 2925, 1967,
-     1630, 2177, 1921, 2761, 2810, 2950, 2949, 3731, 2272, 1927,
-     2155, 2386, 2766, 3741, 2074, 3780,    0, 2200, 2075, 3054,
-     2847, 2844, 2824, 3066, 2809, 2745, 2485, 2600, 3102, 2617,
-     3819,    0, 3150, 3865, 3192, 3036, 3909, 3955, 2749, 2732,
-     3966, 2844, 2698, 1742, 2596, 2129, 5604, 2499, 1924, 1738,
-
-     2481, 2491, 1824, 5604, 1923, 2406, 3126, 3218, 3276, 3281,
-     2419, 2880, 2357, 3360, 3496, 2391, 2277, 2273, 3074, 2142,
-     2326, 2643, 2744, 3978, 3990, 4002, 2121, 1983, 4014, 1925,
-     1865, 2831, 2951, 3506, 3084, 4026,    0, 3558, 4072, 3602,
-     3272,    0, 1833, 1743, 1699, 3319, 1692, 2327, 5604, 2500,
-     2300, 5604, 1894, 3646, 3704, 1652, 1511, 4118, 2328, 2791,
-     4130, 2335, 4142, 4154, 3659, 3751, 1423, 1390, 1287, 3418,
-     1239, 1226, 3130, 1189, 1169, 4166,    0, 3569, 2685, 5604,
-     2834, 1989, 3761, 1099, 1057, 1014, 3614, 2686, 4178, 4190,
-     4202, 3790, 3800, 3838,  916,    0,  704, 2743, 5604,  612,
-
-     2062, 5604,  522,  382, 4214, 4226, 2443, 4238, 4250, 3850,
-     5604, 3887, 3928, 3516, 5604, 4045,  374,  208,  117, 3716,
-     4260, 4297, 4334, 4091, 4270, 4280,   59, 4371, 3941, 5604,
-     4307, 3771, 5604, 4423, 4444, 4465, 4486, 4507, 4528, 4549,
-     4570, 4591, 4600, 2337, 4620, 4641, 2383, 4662, 4683, 4704,
-     4725, 4746, 4767, 4788, 4809, 2483, 4830, 4839, 4847, 4856,
-     4876, 4897, 4918, 2592, 4939, 4960, 4981, 5002, 5011, 5030,
-     5039, 5048, 2516, 2694, 5056, 5064, 5072, 5081, 5089, 5096,
-     5104, 5112, 5121, 5131, 2695, 2841, 5139, 5147, 5155, 2842,
-     2872, 5164, 5174, 5194, 2873, 5203, 5211, 3122, 5220, 5230,
-
-     5250, 2116, 2228, 5259, 5271, 5280, 5290, 3123, 3161, 5299,
-     5309, 5318, 5338, 2511, 5347, 5359, 3162, 3166, 5368, 5378,
-     3169, 5387, 5397, 5417, 5438, 5459, 3189, 3208, 5479, 3283,
-     5486, 5496, 2615, 2798, 5505, 2520, 5525, 3304, 3305, 5534,
-     5544, 3311, 3319, 3430, 5552, 5562, 5582, 3814, 3553, 3569
+        0,   70,   72,   80,   87,  126,  178,  248,  156,  200,
+      132,  140,  319,    0, 4925, 4863, 4908, 5587, 4903, 5587,
+      388,   95, 5587, 5587, 4853, 5587,  142,  400,  198,  155,
+     4878, 5587, 5587,  460, 4863,   37,   40,  516,   62, 4868,
+     4851,   49, 4846, 4852, 4831,  575,  590,  125,  223,  613,
+       33,   45, 4815,   38, 4805,   94, 4860, 4866,  434, 4822,
+     4832,  136,    0, 5587, 4857, 5587,    0,  615,  674,  108,
+        0, 4800, 5587,   70, 5587,  104, 5587,  152, 4799,   73,
+      135, 5587,  161,  171,  651,  705,  749,  256,  245,  807,
+      857, 4807,   82,  151,  913, 4801, 4811, 4797, 4807, 4802,
+
+      960,    0,   94, 4782,  645, 4831, 4824, 4824, 5587,  266,
+      541,  204, 4813,  614,  718, 4771,  843,  947, 4767,  984,
+      997, 1035, 4793, 4804,  572,  719,  276, 4790,  175, 1080,
+     1125, 4767, 4772, 4761, 4757, 4759, 4756,  406, 4728, 4705,
+     4698, 4688, 4688,  391, 5587,  173,  339,  637, 4666, 4663,
+     4650, 4644, 4645,  397,  133,  385,  139,  349,  395,  257,
+     4711,  731, 4710, 1019, 4658, 1036,  345,    0, 4706,  296,
+     5587, 5587,  941,  393,    0, 4649,  654, 5587, 5587, 4643,
+      552, 4641, 4687,  435,  595,  425, 4689,  649,  981, 1159,
+     4637, 1165,    0, 1194, 1222, 1189, 1057, 1261, 4675, 1100,
+
+     1221,  840, 1311, 1367, 4631,    0, 4635, 4599, 4597, 4592,
+      991, 4583, 4580, 4571, 4563, 4614, 4609, 1236, 1246, 1414,
+     1281,  985, 1454, 4595, 4580, 1499,  674, 1545, 1590, 1635,
+     4573, 4557, 4558, 4537, 4548, 4534, 4541, 4538, 4550, 4549,
+     4543, 4522, 4518, 4528, 4525, 4522,  976,  398, 4489, 4487,
+     4477, 4475, 4480,  541,  411, 4483,  396,  490,  499, 1438,
+      515, 4535, 4522, 4521, 1682, 1692, 4520, 1737,    0, 4494,
+     4480, 4464, 4476, 4464, 4471, 4470, 4454, 4453, 4444, 4430,
+     4441,  625, 4407, 4470, 1782,  415,    0,    0, 1061,  658,
+     4446, 4445, 1820,  606, 4358, 4357,  702, 1387, 1833, 1435,
+
+     1110, 1879, 1926, 4356,  660, 4338, 4333,  645,  677, 4345,
+     4338, 4341, 4338, 4329, 4327, 4323, 4326,    0, 4329,    0,
+      832,  176,  419,  648, 4312, 4314, 4298, 4312, 4298,  660,
+      516, 1081,  708,  672, 1474, 4351, 4350, 4349, 1191, 1936,
+     1981,  776, 4319,  678,  820, 4327, 4320, 4323, 4320, 4300,
+     4298, 4294, 4301,  249, 4318, 4324, 4281, 2028, 2040, 2052,
+     4313, 4312, 2062, 4312, 4310, 4309, 4308,  828, 1519, 1139,
+     1565, 1162, 2075,    0, 1612, 2122, 1655, 1291, 2168, 2215,
+      884, 5587, 4283, 4288, 4289, 4282,  965, 5587, 4276, 4267,
+     4252, 4265, 4258, 4269, 4269,    0, 4251,  533,  781,  709,
+
+      980,  896, 4244, 4226, 4227,  937, 1079, 1109, 1116, 4280,
+     4279, 2227, 2237, 4244, 4143, 4139, 4121, 4125, 4095, 4069,
+     4071, 4053, 4053, 4042, 4014, 4031, 4017, 4011, 4006, 3948,
+     2282, 1035, 2322, 2334, 1667, 3979, 3978, 3977, 3966, 2344,
+     1178, 3965, 3953, 2391, 1198, 1299, 1403, 1712, 1749, 2403,
+        0, 1762, 2450, 1792, 1484, 2496, 2543, 2568, 1188, 1246,
+     1394, 1313, 1419, 1880, 1338, 1393, 1440, 1481, 1524, 3902,
+     3890, 3855, 3847,  946, 3863, 3811, 1167, 1164,  575,  983,
+     1802, 3860, 3859, 3858, 1577, 1525, 3811, 3801, 1526, 3786,
+     1510, 1547, 3753, 3736, 1615, 1616,    0,    0,    0,    0,
+
+     3712, 2625, 1853, 1722, 3737, 3734, 3687, 1908, 2665, 1956,
+     1812, 2710, 2757, 2001, 3675, 3667, 3666, 1968, 1454, 1758,
+     1893, 2017, 2095, 2135, 2769,    0, 2148, 2816, 2188, 2105,
+     2862, 2909, 1617, 5587, 2934, 1023, 1596, 1637, 5587, 1411,
+     1001, 2122, 1695, 5587, 1752, 2181, 1763, 5587, 1858, 5587,
+     1393, 3591, 3557, 1130, 2210, 1220, 1721, 3604, 3595, 2991,
+     3549, 3540, 3006, 3490, 3464, 1829,  786, 3418, 3062, 1493,
+     3101,    0, 1391, 3461, 3446, 2258, 2041, 2292, 2145, 3141,
+        0, 2304, 3154, 2364, 2268, 3199, 3246, 3449, 3378, 3258,
+     2311, 2380, 2416, 2425, 3364, 2429, 3270,    0, 2472, 3317,
+
+     2516, 2429, 3364, 3389, 1040,  893, 1915, 1836, 1498, 1981,
+     2102, 3301, 3282, 3252, 2100, 1519, 2519, 3264, 2635, 3292,
+     3282, 3258, 2646, 3206, 3179, 3459, 3182, 3161, 2007, 2008,
+        0, 3517, 2652, 2685, 1619, 3173, 3177, 3142, 3557, 3087,
+     2305, 2427, 2730, 2532, 3569,    0, 2791, 3582, 2836, 2483,
+     3627, 3674, 2882, 3098, 3077, 3020, 2697, 2746, 2898, 3074,
+     1273, 1309, 3686,    0, 2848, 1837, 2171, 1615, 2170, 5587,
+     1399, 1871, 2216, 5587, 2264, 5587, 2834, 2368, 1742, 1858,
+     2280, 2817, 3088, 2802, 2750, 3698, 2742, 2430, 2548, 2523,
+     2452, 3708, 1976, 3748,    0, 2192, 2318, 3085, 2743, 2723,
+
+     2705, 3113, 2686, 2570, 2666, 2792, 3126, 3006, 3788,    0,
+     3176, 3801, 3219, 3119, 3846, 3893, 2509, 2482, 3904, 3235,
+     2442, 1772, 2403, 2736, 5587, 2794, 1916, 1979, 2329, 2288,
+     2173, 5587, 2261, 2212, 3199, 3304, 3309, 3314, 2182, 2934,
+     1982, 3389, 3527, 1994, 1948, 1908, 3448, 1902, 2737, 2889,
+     3180, 3916, 3928, 3940, 1873, 1867, 3952, 1808, 1740, 3085,
+     3155, 3537, 3298, 3964,    0, 3604, 3977, 3647, 3547, 4024,
+     1731, 1704, 1674, 3658, 1667, 2886, 5587, 2888, 2080, 5587,
+     2219, 3718, 3728, 1630, 1585, 4036, 2914, 3296, 4048, 2320,
+     4060, 4072, 3763, 3769, 1578, 1492, 1467, 3615, 1368, 1248,
+
+     3330, 1233, 1220, 4084,    0, 2368, 3033, 5587, 3297, 2325,
+     3821, 1183, 1094, 1016, 3833, 3126, 4096, 4108, 4120, 3866,
+     3997, 4130,  924,    0,  830, 3181, 5587,  754, 2492, 5587,
+      694,  586, 4142, 4154, 3100, 4166, 4178, 3878, 5587, 4188,
+     4198, 3738, 5587, 4208,  571,  286,  244, 4009, 4218, 4256,
+     4294, 4228, 4238, 4266,   55, 4332, 4248, 5587, 4304, 3779,
+     5587, 4385, 4406, 4427, 4448, 4469, 4490, 4511, 4532, 4553,
+     4562, 2563, 4582, 4603, 2523, 4624, 4645, 4666, 4687, 4708,
+     4729, 4750, 4771, 2567, 4792, 4801, 4809, 4818, 4838, 4859,
+     4880, 2794, 4901, 4922, 4943, 4964, 4985, 4994, 5013, 5022,
+
+     5031, 2466, 2897, 5039, 5047, 5055, 5064, 5072, 5079, 5087,
+     5095, 5104, 5114, 2898, 3084, 5122, 5130, 5138, 3085, 3187,
+     5147, 5157, 5177, 3234, 5186, 5194, 3235, 5203, 5213, 5233,
+     2681, 2785, 5242, 5254, 5263, 5273, 3238, 3342, 5282, 5292,
+     5301, 5321, 2832, 5330, 5342, 3347, 3348, 5351, 5361, 3352,
+     5370, 5380, 5400, 5421, 5442, 3353, 3357, 5462, 3358, 5469,
+     5479, 2926, 3006, 5488, 3559, 5508, 3460, 3598, 5517, 5527,
+     3615, 3643, 5535, 5545, 5565, 4279, 3763, 3817
     } ;
 
-static yyconst short int yy_def[951] =
+static yyconst short int yy_def[979] =
     {   0,
-      833,    1,    1,    1,  834,  834,  835,  835,  836,  836,
-      837,  837,  833,   13,  833,  838,  833,  833,  833,  833,
-      839,  840,  833,  833,  841,  833,  842,  838,   28,   28,
-      843,  833,  833,  833,   34,   34,   34,   37,   37,   37,
-       37,   37,   37,   37,  838,   28,  838,  833,  839,   34,
-       34,   37,   37,   37,  833,  844,  833,  845,   37,   37,
-      838,  846,  833,  846,  833,  846,  833,  839,  833,  847,
-      848,  833,  848,  833,  848,  833,  849,  850,  850,  850,
-      833,  833,  851,  852,  853,  833,   86,   86,   86,  833,
-       90,   90,   90,   93,   93,   93,   93,   93,   86,   89,
-
-       89,  838,  838,  833,  833,  854,  833,  855,  833,  840,
-      856,  851,  840,  841,  841,  842,  857,  838,  838,   28,
-      858,  120,  120,  120,  120,  859,  860,   37,  128,  129,
-      129,  129,  129,  129,  129,  129,  129,  129,  129,  129,
-      838,  833,  838,  838,  833,  833,  833,  833,  833,  833,
-      854,  838,  120,  838,  838,  838,  833,  833,  833,  833,
-      861,  862,  838,  838,  863,  863,  833,  833,  833,  855,
-      833,  864,  865,  865,  833,  833,  865,  865,  850,  833,
-      850,  850,  833,  833,  851,  851,  851,  866,  867,   89,
-      866,  868,  833,  833,   86,  195,  195,  195,  195,  833,
-
-      200,  201,  869,  201,  201,  201,  201,  201,  201,   89,
-       89,  854,  870,  833,  833,  838,  216,  216,  120,  219,
-      871,  833,  872,  833,  129,  225,  226,  226,  226,  226,
-      226,  226,  226,  226,  226,  226,  226,  226,  226,  226,
-      838,  838,  833,  833,  833,  833,  833,  854,  838,  219,
-      838,  838,  838,  833,  838,  833,  873,  874,  833,   89,
-      260,  200,  201,  201,  201,  201,  201,  201,  201,  201,
-      201,  201,  201,   89,   89,  870,  838,  838,  216,  216,
-      216,  838,  875,  876,  876,  285,  877,  876,  878,  224,
-      833,  291,  291,  833,  291,  226,  226,  226,  226,  226,
-
-      226,  226,  226,  226,  226,  226,  226,  226,  226,  226,
-      838,  838,  838,  838,  833,  833,  833,  833,  833,  854,
-      838,  838,  838,  838,  833,  833,  873,  873,  833,  260,
-      200,  201,  879,  201,  201,  201,  201,  201,  201,  201,
-      201,   89,   89,   89,   89,  216,  216,  216,  833,  880,
-      880,  351,  880,  881,  882,  883,  833,  884,  294,  884,
-      833,  361,  884,  833,  364,  364,  833,  364,  833,  833,
-      226,  226,  226,  833,  833,  226,  226,  226,  226,  226,
-      226,  226,  226,  838,  838,  838,  838,  838,  833,  833,
-      833,  854,  838,  838,  838,  885,  886,  833,   89,  331,
-
-      879,  879,  201,  201,  201,  201,  201,  201,  201,   89,
-       89,   89,   89,   89,  838,  838,  216,  216,  838,  887,
-      887,  888,  889,  833,  833,  890,  891,  833,  892,  892,
-      893,  367,  893,  833,  434,  893,  833,  437,  437,  833,
-      437,  833,  442,  442,  442,  442,  442,  442,  442,  442,
-      442,  838,  838,  838,  838,  838,  833,  833,  894,  838,
-      838,  838,  833,  833,  895,  895,  833,  879,  879,  201,
-      879,  201,  201,  201,  201,  201,   89,   89,   89,   89,
-       89,  838,  482,  482,  833,  896,  897,  424,  833,  489,
-      489,  833,  489,  833,  833,  898,  898,  833,  833,  899,
-
-      899,  900,  440,  900,  833,  505,  900,  833,  508,  508,
-      833,  508,  833,  513,  513,  833,  833,  513,  513,  833,
-      833,  513,  513,  833,  833,  833,  833,  838,  833,  833,
-      901,  838,  838,  838,  902,  903,  833,  904,  904,  904,
-      904,  833,  542,  905,  838,  838,  838,  547,  547,  833,
-      906,  833,  907,  492,  907,  833,  556,  907,  833,  559,
-      559,  833,  559,  908,  909,  833,  833,  910,  910,  911,
-      912,  911,  833,  573,  911,  833,  576,  576,  576,  833,
-      580,  580,  580,  580,  580,  580,  838,  833,  833,  913,
-      838,  838,  838,  833,  833,  914,  914,  833,  915,  915,
-
-      915,  915,  833,  603,  916,  838,  606,  606,  606,  833,
-      917,  918,  833,  919,  919,  920,  562,  920,  833,  619,
-      920,  833,  622,  622,  833,  622,  833,  833,  921,  921,
-      833,  833,  922,  922,  923,  923,  833,  637,  923,  580,
-      580,  580,  580,  580,  833,  833,  833,  833,  833,  833,
-      924,  913,  838,  925,  926,  927,  928,  833,  927,  929,
-      929,  929,  929,  838,  838,  838,  666,  666,  838,  833,
-      833,  930,  930,  833,  833,  931,  931,  932,  625,  932,
-      833,  681,  932,  833,  684,  684,  833,  684,  933,  934,
-      833,  833,  935,  935,  580,  833,  833,  580,  580,  580,
-
-      833,  924,  924,  833,  913,  838,  925,  925,  925,  925,
-      936,  925,  937,  937,  833,  833,  927,  927,  833,  833,
-      929,  929,  929,  666,  666,  666,  938,  939,  833,  833,
-      940,  940,  941,  687,  941,  833,  736,  941,  833,  739,
-      739,  942,  833,  933,  933,  833,  833,  833,  833,  580,
-      580,  833,  913,  833,  833,  943,  944,  833,  929,  929,
-      666,  838,  666,  666,  838,  833,  833,  938,  938,  833,
-      833,  945,  945,  946,  946,  946,  776,  946,  833,  833,
-      580,  947,  833,  833,  943,  943,  833,  929,  666,  666,
-      666,  833,  833,  833,  833,  948,  948,  833,  833,  947,
-
-      947,  833,  949,  950,  833,  666,  838,  666,  666,  838,
-      833,  833,  833,  833,  833,  833,  833,  949,  949,  833,
-      838,  838,  838,  833,  833,  833,  838,  838,  838,  833,
-      833,  833,    0,  833,  833,  833,  833,  833,  833,  833,
-      833,  833,  833,  833,  833,  833,  833,  833,  833,  833,
-      833,  833,  833,  833,  833,  833,  833,  833,  833,  833,
-      833,  833,  833,  833,  833,  833,  833,  833,  833,  833,
-      833,  833,  833,  833,  833,  833,  833,  833,  833,  833,
-      833,  833,  833,  833,  833,  833,  833,  833,  833,  833,
-      833,  833,  833,  833,  833,  833,  833,  833,  833,  833,
-
-      833,  833,  833,  833,  833,  833,  833,  833,  833,  833,
-      833,  833,  833,  833,  833,  833,  833,  833,  833,  833,
-      833,  833,  833,  833,  833,  833,  833,  833,  833,  833,
-      833,  833,  833,  833,  833,  833,  833,  833,  833,  833,
-      833,  833,  833,  833,  833,  833,  833,  833,  833,  833
+      861,    1,    1,    1,  862,  862,  863,  863,  864,  864,
+      865,  865,  861,   13,  861,  866,  861,  861,  861,  861,
+      867,  868,  861,  861,  869,  861,  870,  866,   28,   28,
+      871,  861,  861,  861,   34,   34,   34,   34,   38,   38,
+       38,   38,   38,   38,   38,  866,   28,  866,  861,  867,
+       34,   34,   38,   38,   38,  861,  872,  861,  873,   38,
+       38,  866,  874,  861,  874,  861,  874,  861,  867,  861,
+      875,  876,  861,  876,  861,  876,  861,  877,  878,  878,
+      878,  861,  861,  879,  880,  881,  861,   87,   87,   87,
+      861,   91,   91,   91,   91,   95,   95,   95,   95,   95,
+
+       87,   90,   90,  866,  866,  861,  861,  882,  861,  883,
+      861,  868,  884,  879,  868,  869,  869,  870,  885,  866,
+      866,   28,  886,  122,  122,  122,  122,  887,  888,   38,
+      130,  131,  131,  131,  131,  131,  131,  131,  131,  131,
+      131,  131,  131,  866,  861,  866,  866,  861,  861,  861,
+      861,  861,  861,  882,  866,  122,  866,  866,  866,  861,
+      861,  861,  861,  889,  890,  866,  866,  891,  891,  861,
+      861,  861,  883,  861,  892,  893,  893,  861,  861,  893,
+      893,  894,  861,  894,  894,  861,  861,  879,  879,  879,
+      895,  896,   90,  895,  897,  861,  861,   87,  198,  198,
+
+      198,  198,  861,  203,  204,  898,  204,  204,  204,  204,
+      204,  204,  204,   90,   90,  882,  899,  861,  861,  866,
+      220,  220,  122,  223,  900,  861,  901,  861,  131,  229,
+      230,  230,  230,  230,  230,  230,  230,  230,  230,  230,
+      230,  230,  230,  230,  230,  230,  866,  866,  861,  861,
+      861,  861,  861,  882,  866,  223,  866,  866,  866,  861,
+      866,  861,  902,  903,  861,   90,  266,  203,  204,  204,
+      204,  204,  204,  204,  204,  204,  204,  204,  204,  204,
+      204,   90,   90,  899,  866,  866,  220,  220,  220,  866,
+      904,  905,  905,  293,  906,  905,  907,  228,  861,  299,
+
+      299,  861,  299,  230,  230,  230,  230,  230,  230,  230,
+      230,  230,  230,  230,  230,  230,  230,  230,  230,  230,
+      866,  866,  866,  866,  861,  861,  861,  861,  861,  882,
+      866,  866,  866,  866,  861,  861,  902,  902,  861,  266,
+      203,  204,  204,  908,  204,  204,  204,  204,  204,  204,
+      204,  204,  204,   90,   90,   90,   90,  220,  220,  220,
+      861,  909,  909,  363,  909,  910,  911,  912,  861,  913,
+      302,  913,  861,  373,  913,  861,  376,  376,  861,  376,
+      861,  861,  230,  230,  230,  230,  861,  861,  230,  230,
+      230,  230,  230,  230,  230,  230,  230,  866,  866,  866,
+
+      866,  866,  861,  861,  861,  882,  866,  866,  866,  914,
+      915,  861,   90,  341,  204,  908,  908,  204,  204,  204,
+      204,  204,  204,  204,  204,   90,   90,   90,   90,   90,
+      866,  866,  220,  220,  866,  916,  916,  917,  918,  861,
+      861,  919,  920,  861,  921,  921,  922,  379,  922,  861,
+      450,  922,  861,  453,  453,  861,  453,  861,  458,  458,
+      458,  458,  458,  458,  458,  458,  458,  458,  458,  866,
+      866,  866,  866,  866,  861,  861,  923,  866,  866,  866,
+      861,  861,  924,  924,  861,  204,  908,  908,  204,  204,
+      908,  204,  204,  204,  204,  204,   90,   90,   90,   90,
+
+       90,  866,  502,  502,  861,  925,  926,  440,  861,  509,
+      509,  861,  509,  861,  861,  927,  927,  861,  861,  928,
+      928,  929,  456,  929,  861,  525,  929,  861,  528,  528,
+      861,  528,  861,  861,  861,  535,  535,  861,  861,  535,
+      535,  535,  861,  861,  535,  535,  861,  861,  861,  861,
+      866,  861,  861,  930,  866,  866,  866,  931,  932,  861,
+      933,  933,  861,  933,  933,  563,  563,  934,  866,  866,
+      866,  571,  571,  861,  935,  861,  936,  512,  936,  936,
+      580,  936,  861,  583,  583,  861,  583,  937,  938,  861,
+      861,  939,  939,  940,  941,  940,  861,  597,  940,  861,
+
+      600,  600,  600,  861,  604,  604,  604,  604,  604,  604,
+      604,  866,  861,  861,  942,  866,  866,  866,  861,  861,
+      943,  943,  861,  944,  944,  861,  944,  944,  626,  626,
+      945,  866,  632,  632,  632,  861,  946,  947,  861,  948,
+      948,  949,  586,  949,  949,  645,  949,  861,  648,  648,
+      861,  648,  861,  861,  950,  950,  861,  861,  951,  951,
+      952,  952,  952,  663,  952,  604,  604,  604,  861,  861,
+      604,  604,  861,  861,  861,  861,  861,  861,  953,  942,
+      866,  954,  955,  956,  957,  861,  956,  958,  958,  958,
+      958,  866,  866,  866,  694,  694,  866,  861,  861,  959,
+
+      959,  861,  861,  960,  960,  961,  651,  961,  961,  709,
+      961,  861,  712,  712,  861,  712,  962,  963,  861,  861,
+      964,  964,  604,  861,  861,  604,  604,  604,  861,  953,
+      953,  861,  942,  866,  954,  954,  954,  954,  965,  954,
+      966,  966,  861,  861,  956,  956,  861,  861,  958,  958,
+      958,  694,  694,  694,  967,  968,  861,  861,  969,  969,
+      970,  715,  970,  970,  764,  970,  861,  767,  767,  767,
+      861,  962,  962,  861,  861,  861,  861,  604,  604,  861,
+      942,  861,  861,  971,  972,  861,  958,  958,  694,  866,
+      694,  694,  866,  861,  861,  967,  967,  861,  861,  973,
+
+      973,  974,  974,  974,  804,  804,  861,  861,  604,  975,
+      861,  861,  971,  971,  861,  958,  694,  694,  694,  861,
+      861,  861,  861,  976,  976,  861,  861,  975,  975,  861,
+      977,  978,  861,  694,  866,  694,  694,  866,  861,  861,
+      861,  861,  861,  861,  861,  977,  977,  861,  866,  866,
+      866,  861,  861,  861,  866,  866,  866,  861,  861,  861,
+        0,  861,  861,  861,  861,  861,  861,  861,  861,  861,
+      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
+      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
+      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
+
+      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
+      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
+      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
+      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
+      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
+      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
+      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
+      861,  861,  861,  861,  861,  861,  861,  861
     } ;
 
-static yyconst short int yy_nxt[5675] =
+static yyconst short int yy_nxt[5659] =
     {   0,
        16,   17,   18,   19,   20,   21,   22,   23,   24,   16,
        25,   26,   16,   16,   27,   28,   29,   30,   28,   28,
        28,   28,   28,   28,   28,   31,   32,   33,   16,   34,
-       35,   35,   35,   36,   37,   37,   37,   37,   38,   39,
-       40,   37,   41,   42,   43,   44,   37,   37,   37,   37,
-       37,   45,   16,   46,   46,   46,   46,   46,   46,   16,
-       16,   16,   16,   16,   16,   16,   16,   47,   16,   16,
-       48,  552,   55,  132,   49,  138,   56,  129,  133,  129,
-       55,  129,   57,  554,   56,   58,   79,   18,   80,   81,
-       57,  111,  131,   58,  136,   17,   63,   64,  153,   65,
-
-       50,   51,  152,  155,   52,   65,  171,  142,  137,   59,
-      103,  112,   53,   60,   37,   54,   37,   59,  157,   65,
-       66,   60,   37,  107,   37,   17,   63,   64,  158,   65,
-      816,   79,   18,   80,   81,   65,   82,  113,   61,  178,
-      142,  175,  103,  117,  117,   67,   61,  117,  117,   65,
-       66,  143,  145,  181,   17,   18,   19,   72,   68,  176,
-      144,  171,  142,   73,   74,   75,  174,  117,  124,  124,
-      124,  124,  124,  125,  182,   67,   17,   18,   19,   76,
-       68,   82,  146,  147,  174,  248,  148,  103,  103,  183,
-      184,  118,  179,  242,  149,  201,  143,  150,   17,   18,
-
-       19,   72,   68,  180,   77,  164,  204,   73,   74,   75,
-      123,  123,  123,  123,  123,  123,  123,  123,  123,  123,
-      103,  816,  180,   76,  182,  255,   69,   70,   70,   70,
-       70,   70,   70,   70,   70,   70,   70,   70,   70,   70,
-       70,   70,   70,   70,   70,   17,   18,   19,   77,   68,
-      197,  197,  197,  197,  197,  197,  197,  197,  197,  197,
-      198,  198,  198,  198,  198,  199,  210,  102,  121,  102,
-      102,  102,  180,  102,  102,  211,  103,  102,  109,  109,
-      109,  109,  109,  109,  109,  109,  109,  109,  103,  249,
-      241,  102,  102,  102,  103,   69,   70,   70,   70,   70,
-
-       70,   70,   70,   70,   70,   70,   70,   70,   70,   70,
-       70,   70,   70,   70,   33,   17,   18,   19,   33,   33,
-       83,   23,   24,   33,   84,   26,   33,   33,   85,   86,
-       87,   88,   86,   86,   86,   86,   86,   86,   86,   31,
-       89,   33,   33,   90,   91,   91,   91,   92,   93,   93,
-       93,   93,   94,   95,   96,   93,   97,   93,   98,   93,
-       93,   93,   93,   93,   93,   69,   33,   99,   99,   99,
-       99,   99,   99,  100,  100,  100,  100,  100,  100,  100,
-      100,  101,  100,  100,  107,  222,  103,  816,  111,  171,
-      142,  277,  253,  181,  108,  816,  224,  109,  109,  109,
-
-      109,  109,  109,  109,  109,  109,  109,  119,  186,  120,
-      120,  120,  120,  120,  120,  120,  120,  120,  120,  121,
-      103,  183,  184,  122,  122,  122,  122,  122,  103,  103,
-      369,  162,  162,  252,  187,  162,  162,  220,  220,  220,
-      220,  220,  220,  180,  251,  103,  157,  122,  122,  122,
-      122,  122,  122,  102,  370,  162,  158,  129,  103,  102,
-      323,  583,  102,  102,  103,  102,  102,  102,  128,  128,
-      128,  128,  128,  128,  128,  128,  128,  128,  121,  163,
-      321,  102,  128,  128,  128,  128,  128,  129,  129,  129,
-      129,  130,  129,  129,  129,  129,  129,  129,  129,  129,
-
-      129,  129,  129,  129,  103,  129,  122,  122,  122,  122,
-      122,  122,  102,  102,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,  129,  129,  129,  129,  129,  129,  129,
-      129,  129,  129,  833,  222,  816,  107,  129,  129,  129,
-      129,  129,  103,  102,  103,  290,  129,  109,  109,  109,
-      109,  109,  109,  109,  109,  109,  109,  103,  314,  321,
-      387,  102,  102,  102,  102,  102,  102,  141,  142,  102,
-      102,  102,  321,  102,  102,  103,  393,  102,  220,  220,
-      220,  220,  220,  220,  220,  220,  220,  220,  250,  320,
-      833,  102,  102,  102,  102,  103,  122,  122,  122,  122,
-
-      122,  122,  122,  122,  122,  122,  107,  167,  142,  168,
-      833,  169,  103,  111,  802,  168,  108,  169,  388,  109,
-      109,  109,  109,  109,  109,  109,  109,  109,  109,  231,
-      103,  169,  169,  833,  232,  233,  113,  222,  234,  173,
-      235,  188,  173,  173,  324,  171,  142,  188,  290,  173,
-      188,  117,  117,  188,  188,  117,  117,  169,  833,  187,
-      514,  129,  171,  142,  173,  151,  107,  190,  103,  188,
-      111,  311,  312,  321,  313,  117,  170,  452,  833,  833,
-      833,  833,  833,  833,  833,  833,  833,  833,  833,  374,
-      833,  372,  191,  188,  117,  103,  373,  117,  117,  118,
-
-      117,  117,  117,  117,  187,  103,  117,  117,  110,  103,
-      110,  110,  174,  375,  110,  110,  187,  552,  110,  453,
-      190,  117,  117,  220,  220,  220,  220,  220,  220,  220,
-      220,  220,  220,  110,  110,  109,  109,  109,  109,  109,
-      109,  109,  109,  109,  109,  193,  117,  190,  107,  103,
-      194,  190,  195,  195,  195,  195,  195,  195,  195,  195,
-      195,  195,  121,  190,  369,  374,  196,  196,  196,  196,
-      196,  190,  190,  190,  190,  190,  190,  190,  190,  190,
-      190,  190,  190,  190,  190,  190,  190,  190,  370,  375,
-      196,  196,  196,  196,  196,  196,  190,  190,  190,  190,
-
-      190,  190,  190,  190,  190,  190,  190,  833,  392,  190,
-      190,  190,  190,  190,  190,  190,  190,  190,  190,  833,
-      353,  353,  353,  190,  190,  190,  190,  190,  342,  343,
-      114,  344,  114,  114,  114,  410,  114,  114,  411,  454,
-      114,  261,  261,  261,  261,  261,  261,  190,  190,  190,
-      190,  190,  190,  190,  114,  114,  114,  190,  200,  200,
-      200,  200,  200,  200,  200,  200,  200,  200,  121,  190,
-      369,  103,  200,  200,  200,  200,  200,  201,  201,  201,
-      201,  202,  201,  201,  201,  201,  201,  201,  201,  201,
-      201,  201,  201,  201,  370,  203,  196,  196,  196,  196,
-
-      196,  196,  190,  190,  190,  190,  190,  190,  190,  190,
-      190,  190,  190,  201,  201,  201,  201,  201,  201,  201,
-      201,  201,  201,  833,  107,  374,  103,  201,  201,  201,
-      201,  201,  395,  222,  162,  162,  201,  267,  162,  162,
-      401,  734,  268,  269,  290,  402,  270,  145,  271,  375,
-      516,  190,  190,  190,  190,  190,  190,  833,  162,  196,
-      196,  196,  196,  196,  196,  196,  196,  196,  196,  116,
-      103,  102,  102,  116,  517,  102,  102,  146,  147,  116,
-      528,  148,  163,  280,  280,  280,  280,  280,  281,  149,
-      386,  459,  150,  116,  116,  102,  216,  217,  218,  216,
-
-      216,  216,  216,  216,  216,  216,  833,  833,  833,  833,
-      833,  833,  833,  833,  833,  833,  357,  222,  103,  161,
-      103,  102,  102,  161,  460,  102,  102,  783,  359,  161,
-      415,  461,  103,  219,  219,  219,  219,  219,  219,  219,
-      219,  219,  219,  161,  161,  102,  103,  219,  219,  219,
-      219,  219,  257,  258,  259,  257,  257,  257,  257,  257,
-      257,  257,  102,  102,  102,  102,  520,  129,  103,  515,
-      783,  219,  219,  219,  219,  219,  219,  225,  225,  225,
-      225,  225,  225,  225,  225,  225,  225,  121,  121,  524,
-      521,  225,  225,  225,  225,  225,  261,  261,  261,  261,
-
-      261,  261,  261,  261,  261,  261,  362,  362,  362,  362,
-      362,  363,  783,  525,  103,  219,  219,  219,  219,  219,
-      219,  129,  129,  129,  129,  129,  129,  129,  129,  129,
-      129,  833,  394,  545,  455,  129,  129,  129,  129,  129,
-      185,  384,  185,  185,  385,  188,  185,  185,  103,  523,
-      185,  188,  129,  456,  188,  833,  222,  188,  188,  102,
-      102,  102,  102,  102,  102,  185,  185,  359,  103,  103,
-      103,  190,  222,  188,  188,  103,  188,  188,  188,  534,
-      188,  188,  833,  290,  188,  261,  261,  261,  261,  261,
-      261,  261,  261,  261,  261,  222,  191,  188,  188,  188,
-
-      188,  117,  552,  103,  117,  117,  359,  117,  117,  117,
-      117,  117,  103,  117,  117,  117,  103,  462,  357,  222,
-      533,  117,  357,  222,  516,  520,  518,  190,  117,  117,
-      359,  519,  592,  129,  432,  117,  117,  215,  215,  215,
-      215,  215,  215,  215,  215,  215,  215,  107,  517,  521,
-      201,  734,  193,  117,  260,  260,  260,  260,  260,  260,
-      260,  260,  260,  260,  679,  604,  129,  129,  260,  260,
-      260,  260,  260,  215,  215,  215,  215,  215,  215,  215,
-      215,  215,  215,  325,  107,  326,  326,  326,  326,  326,
-      326,  526,  260,  260,  260,  260,  260,  260,  190,  103,
-
-      766,  531,  190,  262,  262,  262,  262,  262,  262,  262,
-      262,  262,  262,  121,  190,  527,  587,  262,  262,  262,
-      262,  262,  201,  201,  201,  201,  201,  201,  201,  201,
-      201,  201,  201,  201,  201,  201,  201,  201,  201,  590,
-      203,  260,  260,  260,  260,  260,  260,  190,  190,  190,
-      190,  190,  190,  190,  190,  190,  190,  190,  201,  201,
-      201,  201,  201,  201,  201,  201,  201,  201,  833,  641,
-      516,  129,  201,  201,  201,  201,  201,  279,  279,  279,
-      279,  279,  279,  279,  279,  279,  279,  435,  435,  435,
-      435,  435,  436,  524,  517,  526,  190,  190,  190,  190,
-
-      190,  190,  277,  766,  278,  278,  278,  278,  278,  278,
-      278,  278,  278,  278,  162,  129,  540,  525,  162,  527,
-      522,  541,  642,  129,  162,  295,  295,  295,  295,  295,
-      295,  295,  295,  295,  295,  129,  766,  129,  162,  162,
-      103,  102,  103,  282,  282,  282,  282,  282,  282,  282,
-      282,  282,  282,  532,  520,  524,  526,  282,  282,  282,
-      282,  282,  361,  361,  361,  361,  361,  361,  361,  361,
-      361,  361,  506,  506,  506,  506,  506,  507,  521,  525,
-      527,  282,  282,  282,  282,  282,  282,  284,  285,  286,
-      286,  286,  286,  286,  286,  286,  286,  287,  357,  222,
-
-      103,  288,  288,  288,  288,  288,  396,  397,  398,  396,
-      396,  396,  396,  396,  396,  396,  463,  593,  464,  464,
-      464,  464,  464,  464,  783,  288,  288,  288,  288,  288,
-      288,  222,  291,  292,  293,  291,  291,  291,  291,  291,
-      291,  291,  294,  644,  647,  129,  295,  295,  295,  295,
-      295,  426,  427,  428,  426,  426,  426,  426,  426,  426,
-      426,  548,  548,  548,  548,  548,  549,  103,  648,  653,
-      295,  295,  295,  295,  295,  295,  296,  296,  296,  296,
-      296,  296,  296,  296,  296,  296,  121,  645,  833,  222,
-      296,  296,  296,  296,  296,  368,  368,  368,  368,  368,
-
-      368,  368,  368,  368,  368,  557,  557,  557,  557,  557,
-      558,  646,  699,  129,  282,  282,  282,  282,  282,  282,
-      129,  129,  129,  129,  129,  129,  129,  129,  129,  129,
-      833,  703,  704,  129,  129,  129,  129,  129,  129,  357,
-      222,  430,  430,  430,  430,  430,  430,  669,  669,  669,
-      415,  359,  416,  416,  416,  416,  416,  416,  102,  102,
-      102,  102,  102,  102,  325,  783,  328,  328,  328,  328,
-      328,  329,  326,  326,  326,  326,  330,  330,  330,  330,
-      330,  330,  330,  330,  330,  330,  121,  698,  103,  129,
-      330,  330,  330,  330,  330,  434,  434,  434,  434,  434,
-
-      434,  434,  434,  434,  434,  494,  222,  495,  495,  495,
-      495,  495,  495,  222,  330,  330,  330,  330,  330,  330,
-      331,  331,  331,  331,  331,  331,  331,  331,  331,  331,
-      102,  102,  102,  102,  331,  331,  331,  331,  331,  441,
-      441,  441,  441,  441,  441,  441,  441,  441,  441,  574,
-      574,  574,  574,  574,  575,  357,  222,  222,  330,  330,
-      330,  330,  330,  330,  346,  347,  348,  346,  346,  346,
-      346,  346,  346,  346,  833,  222,  357,  222,  501,  501,
-      501,  501,  501,  501,  751,  129,  432,  833,  432,  505,
-      505,  505,  505,  505,  505,  505,  505,  505,  505,  554,
-
-      103,  351,  351,  352,  353,  353,  353,  353,  353,  353,
-      353,  287,  357,  222,  358,  358,  358,  358,  358,  358,
-      358,  358,  358,  358,  359,  703,  704,  645,  360,  360,
-      360,  360,  360,  535,  536,  537,  535,  535,  535,  535,
-      535,  535,  535,  129,  585,  643,  647,  222,  129,  582,
-      129,  646,  360,  360,  360,  360,  360,  360,  222,  364,
-      365,  366,  364,  364,  364,  364,  364,  364,  364,  367,
-      648,  651,  107,  368,  368,  368,  368,  368,  547,  547,
-      547,  547,  547,  547,  547,  547,  547,  547,  695,  700,
-      679,  129,  129,  222,  129,  782,  107,  368,  368,  368,
-
-      368,  368,  368,  833,  359,  360,  360,  360,  360,  360,
-      360,  360,  360,  360,  360,  399,  399,  399,  399,  399,
-      399,  399,  399,  399,  399,  107,  652,  647,  696,  399,
-      399,  399,  399,  399,  493,  493,  493,  493,  493,  493,
-      493,  493,  493,  493,  620,  620,  620,  620,  620,  621,
-      617,  648,  697,  399,  399,  399,  399,  399,  399,  400,
-      400,  400,  400,  400,  400,  400,  400,  400,  400,  750,
-      654,  129,  103,  400,  400,  400,  400,  400,  556,  556,
-      556,  556,  556,  556,  556,  556,  556,  556,  706,  753,
-      801,  802,  654,  222,  654,  654,  766,  399,  399,  399,
-
-      399,  399,  399,  415,  432,  416,  416,  416,  416,  416,
-      416,  416,  416,  416,  416,  415,  552,  417,  417,  417,
-      417,  417,  417,  417,  417,  417,  417,  415,  554,  418,
-      418,  418,  418,  418,  419,  416,  416,  416,  416,  421,
-      421,  421,  421,  421,  421,  421,  421,  421,  421,  287,
-      357,  222,  430,  430,  430,  430,  430,  430,  430,  430,
-      430,  430,  359,  801,  802,  696,  429,  429,  429,  429,
-      429,  564,  565,  566,  564,  564,  564,  564,  564,  564,
-      564,  638,  638,  638,  638,  638,  639,  664,  664,  697,
-      429,  429,  429,  429,  429,  429,  357,  222,  431,  431,
-
-      431,  431,  431,  431,  431,  431,  431,  431,  432,  357,
-      222,  129,  433,  433,  433,  433,  433,  357,  222,  833,
-      222,  432,  129,  129,  129,  103,  103,  595,  595,  503,
-      696,  503,  581,  584,  766,  586,  433,  433,  433,  433,
-      433,  433,  222,  437,  438,  439,  437,  437,  437,  437,
-      437,  437,  437,  440,  697,  715,  833,  441,  441,  441,
-      441,  441,  512,  512,  512,  512,  512,  512,  512,  512,
-      512,  512,  682,  682,  682,  682,  682,  683,  103,  107,
-      833,  441,  441,  441,  441,  441,  441,  833,  591,  433,
-      433,  433,  433,  433,  433,  433,  433,  433,  433,  463,
-
-      721,  466,  466,  466,  466,  466,  467,  464,  464,  464,
-      464,  399,  399,  399,  399,  399,  399,  399,  399,  399,
-      399,  102,  102,  102,  102,  399,  399,  399,  399,  399,
-      357,  222,  569,  569,  569,  569,  569,  569,  705,  596,
-      596,  627,  503,  628,  628,  628,  628,  628,  628,  399,
-      399,  399,  399,  399,  399,  482,  483,  484,  482,  482,
-      482,  482,  482,  482,  482,  573,  573,  573,  573,  573,
-      573,  573,  573,  573,  573,  611,  612,  613,  611,  611,
-      611,  611,  611,  611,  611,  715,  715,  720,  720,  720,
-      715,  103,  415,  552,  416,  416,  416,  416,  416,  416,
-
-      416,  416,  416,  416,  415,  617,  416,  416,  416,  416,
-      416,  416,  416,  416,  416,  416,  489,  490,  491,  489,
-      489,  489,  489,  489,  489,  489,  492,  748,  748,  779,
-      493,  493,  493,  493,  493,  563,  563,  563,  563,  563,
-      563,  563,  563,  563,  563,  781,  109,  129,  761,  109,
-      222,  749,  749,  780,  493,  493,  493,  493,  493,  493,
-      494,  432,  497,  497,  497,  497,  497,  498,  495,  495,
-      495,  495,  357,  222,  501,  501,  501,  501,  501,  501,
-      501,  501,  501,  501,  432,  654,  103,  833,  500,  500,
-      500,  500,  500,  552,  833,  615,  615,  615,  615,  615,
-
-      615,  172,  172,  172,  715,  554,  617,  654,  714,  654,
-      655,  833,  500,  500,  500,  500,  500,  500,  357,  222,
-      502,  502,  502,  502,  502,  502,  502,  502,  502,  502,
-      503,  754,  722,  103,  504,  504,  504,  504,  504,  619,
-      619,  619,  619,  619,  619,  619,  619,  619,  619,  594,
-      595,  595,  595,  595,  595,  595,  806,  103,  504,  504,
-      504,  504,  504,  504,  222,  508,  509,  510,  508,  508,
-      508,  508,  508,  508,  508,  511,  222,  357,  222,  512,
-      512,  512,  512,  512,  357,  222,  222,  503,  222,  503,
-      833,  222,  215,  704,  103,  215,  571,  503,  552,  571,
-
-      748,  779,  571,  512,  512,  512,  512,  512,  512,  833,
-      617,  504,  504,  504,  504,  504,  504,  504,  504,  504,
-      504,  102,  595,  595,  749,  780,  326,  102,  326,  755,
-      102,  102,  755,  102,  102,  102,  129,  129,  129,  129,
-      129,  129,  129,  129,  129,  129,  129,  129,  752,  102,
-      129,  129,  129,  129,  129,  129,  129,  129,  129,  129,
-      129,  129,  129,  129,  513,  129,  129,  129,  129,  129,
-      129,  129,  103,  129,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
-      102,  545,  546,  546,  546,  546,  546,  546,  546,  546,
-
-      546,  546,  357,  222,  634,  634,  634,  634,  634,  634,
-      172,  172,  172,  552,  571,  637,  637,  637,  637,  637,
-      637,  637,  637,  637,  637,  679,  743,  743,  103,  552,
-      833,  553,  553,  553,  553,  553,  553,  553,  553,  553,
-      553,  554,  679,  129,  833,  555,  555,  555,  555,  555,
-      656,  657,  658,  659,  656,  656,  656,  656,  656,  656,
-      357,  222,  694,  694,  694,  694,  694,  694,  833,  555,
-      555,  555,  555,  555,  555,  559,  560,  561,  559,  559,
-      559,  559,  559,  559,  559,  562,  779,  798,  759,  563,
-      563,  563,  563,  563,  666,  666,  666,  666,  666,  666,
-
-      666,  666,  666,  666,  327,  464,  327,  464,  357,  222,
-      780,  799,  222,  563,  563,  563,  563,  563,  563,  833,
-      571,  555,  555,  555,  555,  555,  555,  555,  555,  555,
-      555,  357,  222,  569,  569,  569,  569,  569,  569,  569,
-      569,  569,  569,  503,  798,  833,  222,  568,  568,  568,
-      568,  568,  667,  667,  667,  667,  667,  668,  669,  669,
-      669,  669,  708,  222,  709,  710,  711,  833,  799,  833,
-      617,  568,  568,  568,  568,  568,  568,  357,  222,  570,
-      570,  570,  570,  570,  570,  570,  570,  570,  570,  571,
-      760,  833,  833,  572,  572,  572,  572,  572,  626,  626,
-
-      626,  626,  626,  626,  626,  626,  626,  626,  723,  744,
-      744,  708,  712,  709,  710,  711,  833,  572,  572,  572,
-      572,  572,  572,  222,  576,  577,  578,  576,  576,  576,
-      576,  576,  576,  576,  554,  798,  788,  670,  579,  579,
-      579,  579,  579,  552,  552,  677,  677,  677,  677,  677,
-      677,  465,  495,  465,  495,  617,  679,  670,  222,  799,
-      670,  714,  579,  579,  579,  579,  579,  579,  833,  571,
-      572,  572,  572,  572,  572,  572,  572,  572,  572,  572,
-      102,  129,  496,  464,  496,  464,  102,  707,  707,  102,
-      102,  707,  102,  102,  102,  129,  129,  129,  129,  129,
-
-      129,  129,  129,  129,  129,  707,  707,  707,  102,  129,
-      129,  129,  129,  129,  129,  129,  580,  129,  129,  129,
-      129,  129,  129,  129,  129,  129,  129,  129,  129,  129,
-      129,  103,  129,  102,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
-      594,  597,  597,  597,  597,  597,  598,  595,  595,  595,
-      595,  190,  715,  715,  552,  190,  201,  201,  201,  201,
-      201,  201,  201,  201,  201,  201,  734,  190,  701,  627,
-      201,  201,  201,  603,  201,  201,  201,  201,  201,  201,
-      201,  201,  201,  201,  201,  201,  201,  201,  201,  201,
-
-      201,  201,  627,  203,  190,  190,  190,  190,  190,  190,
-      190,  190,  190,  190,  190,  190,  190,  190,  190,  190,
-      190,  606,  607,  608,  609,  606,  606,  606,  606,  606,
-      606,  681,  681,  681,  681,  681,  681,  681,  681,  681,
-      681,  689,  690,  691,  689,  689,  689,  689,  689,  689,
-      689,  737,  737,  737,  737,  737,  738,  103,  545,  546,
-      546,  546,  546,  546,  546,  546,  546,  546,  546,  727,
-      728,  729,  727,  727,  727,  727,  727,  727,  727,  670,
-      627,  671,  671,  671,  671,  671,  671,  715,  554,  716,
-      716,  716,  716,  716,  716,  103,  552,  833,  615,  615,
-
-      615,  615,  615,  615,  615,  615,  615,  615,  554,  734,
-      670,  670,  614,  614,  614,  614,  614,  688,  688,  688,
-      688,  688,  688,  688,  688,  688,  688,  833,  488,  833,
-      833,  833,  495,  628,  495,  628,  614,  614,  614,  614,
-      614,  614,  552,  552,  616,  616,  616,  616,  616,  616,
-      616,  616,  616,  616,  617,  734,  663,  662,  618,  618,
-      618,  618,  618,  552,  661,  732,  732,  732,  732,  732,
-      732,  629,  671,  629,  671,  679,  672,  712,  672,  628,
-      660,  628,  618,  618,  618,  618,  618,  618,  622,  623,
-      624,  622,  622,  622,  622,  622,  622,  622,  625,  716,
-
-      594,  716,  626,  626,  626,  626,  626,  736,  736,  736,
-      736,  736,  736,  736,  736,  736,  736,  594,  717,  708,
-      717,  709,  710,  711,  594,  103,  626,  626,  626,  626,
-      626,  626,  833,  650,  618,  618,  618,  618,  618,  618,
-      618,  618,  618,  618,  627,  649,  630,  630,  630,  630,
-      630,  631,  628,  628,  628,  628,  357,  222,  634,  634,
-      634,  634,  634,  634,  634,  634,  634,  634,  571,  712,
-      103,  222,  633,  633,  633,  633,  633,  833,  627,  709,
-      710,  711,  833,  627,  833,  833,  711,  777,  777,  777,
-      777,  777,  778,  671,  488,  671,  633,  633,  633,  633,
-
-      633,  633,  357,  222,  635,  635,  635,  635,  635,  635,
-      635,  635,  635,  635,  767,  768,  767,  768,  636,  636,
-      636,  636,  636,  775,  355,  605,  775,  712,  602,  784,
-      775,  784,  712,  222,  743,  743,  743,  743,  743,  743,
-      601,  600,  636,  636,  636,  636,  636,  636,  833,  599,
-      636,  636,  636,  636,  636,  636,  636,  636,  636,  636,
-      102,  713,  594,  713,  713,  713,  102,  713,  713,  102,
-      102,  713,  102,  102,  102,  129,  129,  129,  129,  129,
-      129,  129,  129,  129,  129,  713,  713,  713,  102,  129,
-      129,  129,  129,  129,  129,  129,  129,  129,  129,  129,
-
-      129,  129,  129,  129,  129,  129,  129,  640,  129,  129,
-      129,  103,  129,  102,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
-      645,  766,  594,  767,  767,  767,  767,  767,  767,  190,
-      785,  589,  785,  190,  201,  201,  201,  201,  201,  201,
-      201,  201,  201,  201,  646,  190,  588,  494,  201,  201,
-      201,  201,  201,  201,  201,  201,  201,  201,  201,  201,
-      201,  201,  201,  201,  201,  201,  201,  201,  201,  201,
-      494,  203,  190,  190,  190,  190,  190,  190,  190,  190,
-      190,  190,  190,  190,  190,  190,  190,  190,  190,  664,
-
-      494,  665,  665,  665,  665,  665,  665,  665,  665,  665,
-      665,  756,  757,  758,  756,  756,  756,  756,  756,  756,
-      756,  742,  742,  742,  742,  742,  742,  742,  742,  742,
-      742,  811,  811,  811,  811,  811,  811,  103,  670,  488,
-      673,  673,  673,  673,  673,  674,  671,  671,  671,  671,
-      552,  355,  677,  677,  677,  677,  677,  677,  677,  677,
-      677,  677,  617,  817,  287,  817,  676,  676,  676,  676,
-      676,  552,  544,  773,  773,  773,  773,  773,  773,  818,
-      543,  818,  552,  734,  797,  797,  797,  797,  797,  797,
-      676,  676,  676,  676,  676,  676,  552,  542,  678,  678,
-
-      678,  678,  678,  678,  678,  678,  678,  678,  679,  539,
-      538,  463,  680,  680,  680,  680,  680,  776,  776,  776,
-      776,  776,  776,  776,  776,  776,  776,  783,  463,  784,
-      784,  784,  784,  784,  784,  463,  680,  680,  680,  680,
-      680,  680,  684,  685,  686,  684,  684,  684,  684,  684,
-      684,  684,  687,  530,  529,  103,  688,  688,  688,  688,
-      688,  755,  755,  755,  755,  755,  755,  755,  755,  755,
-      755,  103,  761,  103,  762,  762,  762,  762,  762,  762,
-      688,  688,  688,  688,  688,  688,  833,  103,  680,  680,
-      680,  680,  680,  680,  680,  680,  680,  680,  357,  222,
-
-      694,  694,  694,  694,  694,  694,  694,  694,  694,  694,
-      103,  494,  494,  488,  693,  693,  693,  693,  693,  755,
-      755,  755,  755,  755,  755,  755,  755,  755,  755,  816,
-      355,  817,  817,  817,  817,  817,  817,  287,  693,  693,
-      693,  693,  693,  693,  715,  287,  718,  718,  718,  718,
-      718,  719,  720,  720,  720,  720,  724,  725,  726,  724,
-      724,  724,  724,  724,  724,  724,  792,  793,  794,  792,
-      792,  792,  792,  792,  792,  792,  803,  804,  805,  803,
-      803,  803,  803,  803,  803,  803,  830,  830,  830,  830,
-      830,  830,  103,  664,  481,  665,  665,  665,  665,  665,
-
-      665,  665,  665,  665,  665,  811,  811,  811,  811,  811,
-      811,  811,  811,  811,  811,  812,  812,  812,  812,  812,
-      812,  812,  812,  812,  812,  480,  815,  479,  478,  815,
-      477,  103,  552,  815,  732,  732,  732,  732,  732,  732,
-      732,  732,  732,  732,  679,  476,  475,  474,  731,  731,
-      731,  731,  731,  813,  813,  813,  813,  813,  814,  811,
-      811,  811,  811,  806,  473,  807,  807,  807,  807,  807,
-      807,  472,  731,  731,  731,  731,  731,  731,  552,  471,
-      733,  733,  733,  733,  733,  733,  733,  733,  733,  733,
-      734,  470,  469,  468,  735,  735,  735,  735,  735,  833,
-
-      463,  103,  811,  811,  811,  811,  811,  811,  811,  811,
-      811,  811,  463,  389,  458,  457,  451,  450,  735,  735,
-      735,  735,  735,  735,  739,  740,  741,  739,  739,  739,
-      739,  739,  739,  739,  449,  448,  447,  446,  742,  742,
-      742,  742,  742,  811,  811,  811,  811,  811,  811,  811,
-      811,  811,  811,  445,  444,  443,  827,  827,  827,  827,
-      827,  827,  742,  742,  742,  742,  742,  742,  833,  442,
-      735,  735,  735,  735,  735,  735,  735,  735,  735,  735,
-      222,  745,  745,  745,  745,  745,  746,  743,  743,  743,
-      743,  761,  103,  762,  762,  762,  762,  762,  762,  762,
-
-      762,  762,  762,  761,  424,  763,  763,  763,  763,  763,
-      763,  763,  763,  763,  763,  761,  355,  764,  764,  764,
-      764,  764,  765,  762,  762,  762,  762,  766,  287,  769,
-      769,  769,  769,  769,  770,  767,  767,  767,  767,  552,
-      420,  773,  773,  773,  773,  773,  773,  773,  773,  773,
-      773,  734,  287,  127,  414,  772,  772,  772,  772,  772,
-      824,  825,  826,  824,  824,  824,  824,  824,  824,  824,
-      413,  412,  409,  408,  407,  406,  405,  404,  403,  772,
-      772,  772,  772,  772,  772,  552,  325,  774,  774,  774,
-      774,  774,  774,  774,  774,  774,  774,  325,  325,  389,
-
-      391,  775,  775,  775,  775,  775,  830,  830,  830,  830,
-      830,  830,  830,  830,  830,  830,  389,  390,  389,  383,
-      382,  381,  380,  379,  378,  775,  775,  775,  775,  775,
-      775,  783,  377,  786,  786,  786,  786,  786,  787,  784,
-      784,  784,  784,  102,  376,  789,  790,  791,  789,  789,
-      789,  789,  789,  789,  789,  761,  371,  762,  762,  762,
-      762,  762,  762,  762,  762,  762,  762,  761,  121,  762,
-      762,  762,  762,  762,  762,  762,  762,  762,  762,  552,
-      287,  797,  797,  797,  797,  797,  797,  797,  797,  797,
-      797,  806,  355,  807,  807,  807,  807,  807,  807,  807,
-
-      807,  807,  807,  806,  287,  808,  808,  808,  808,  808,
-      808,  808,  808,  808,  808,  806,  127,  809,  809,  809,
-      809,  809,  810,  807,  807,  807,  807,  816,  107,  819,
-      819,  819,  819,  819,  820,  817,  817,  817,  817,  102,
-      345,  821,  822,  823,  821,  821,  821,  821,  821,  821,
-      821,  806,  341,  807,  807,  807,  807,  807,  807,  807,
-      807,  807,  807,  806,  340,  807,  807,  807,  807,  807,
-      807,  807,  807,  807,  807,  827,  827,  827,  827,  827,
-      827,  827,  827,  827,  827,  824,  824,  824,  824,  824,
-      824,  824,  824,  824,  824,  831,  831,  831,  831,  831,
-
-      832,  830,  830,  830,  830,  339,  338,  337,  336,  335,
-      334,  103,  821,  821,  821,  821,  821,  821,  821,  821,
-      821,  821,  830,  830,  830,  830,  830,  830,  830,  830,
-      830,  830,  333,  332,  194,  325,  325,  256,  322,  319,
-      318,  317,  316,  315,  310,  309,  308,  307,  103,  828,
-      828,  828,  828,  828,  829,  827,  827,  827,  827,  306,
-      305,  304,  303,  302,  301,  300,  299,  298,  297,  127,
-      119,  107,  107,  275,  274,  273,  272,  266,  265,  264,
-      263,  833,  191,  256,  179,  103,  827,  827,  827,  827,
-      827,  827,  827,  827,  827,  827,  180,  174,  174,  166,
-
-      254,  160,  160,  247,  246,  245,  244,  243,  240,  239,
-      238,  237,  236,  230,  229,  228,  227,  226,  127,  102,
-      127,  193,  103,   62,   62,   62,   62,   62,   62,   62,
-       62,   62,   62,   62,   62,   62,   62,   62,   62,   62,
-       62,   62,   62,   62,   33,   33,   33,   33,   33,   33,
+       35,   35,   35,   36,   37,   38,   38,   38,   38,   39,
+       40,   41,   38,   42,   43,   44,   45,   38,   38,   38,
+       38,   38,   46,   16,   47,   47,   47,   47,   47,   47,
+       16,   16,   16,   16,   16,   16,   16,   16,   48,   16,
+       16,   49,  131,   56,  184,   50,  131,   57,  139,  131,
+      141,   56,  134,   58,  131,   57,   59,  133,   17,   64,
+       65,   58,   66,  140,   59,  160,  178,  155,   66,  135,
+
+      113,   51,   52,  156,  136,  161,   53,  105,  158,  174,
+      145,   60,   66,   67,   54,   61,   38,   55,   38,   60,
+      114,  204,  177,   61,   38,  183,   38,   17,   64,   65,
+      179,   66,  207,   80,   18,   81,   82,   66,  185,   68,
+       62,   80,   18,   81,   82,  119,  119,  115,   62,  119,
+      119,   66,   67,  181,  145,  214,  177,   17,   18,   19,
+       73,   69,  186,  187,  215,  182,   74,   75,   76,  119,
+      126,  126,  126,  126,  126,  127,  113,  105,   68,   17,
+       18,   19,   77,   69,   83,  105,  146,  183,  105,  226,
+      204,  105,   83,  208,  120,  147,  189,  146,  255,  400,
+
+      228,   17,   18,   19,   73,   69,  167,  257,   78,  861,
+       74,   75,   76,  125,  125,  125,  125,  125,  125,  125,
+      125,  125,  125,  190,  148,  105,   77,  247,  105,  861,
+       70,   71,   71,   71,   71,   71,   71,   71,   71,   71,
+       71,   71,   71,   71,   71,   71,   71,   71,   71,   17,
+       18,   19,   78,   69,  149,  150,  115,  844,  160,  151,
+      201,  201,  201,  201,  201,  202,  426,  152,  161,  427,
+      153,  200,  200,  200,  200,  200,  200,  200,  200,  200,
+      200,  111,  111,  111,  111,  111,  111,  111,  111,  111,
+      111,  224,  224,  224,  224,  224,  224,  174,  145,  844,
+
+       70,   71,   71,   71,   71,   71,   71,   71,   71,   71,
+       71,   71,   71,   71,   71,   71,   71,   71,   71,   33,
+       17,   18,   19,   33,   33,   84,   23,   24,   33,   85,
+       26,   33,   33,   86,   87,   88,   89,   87,   87,   87,
+       87,   87,   87,   87,   31,   90,   33,   33,   91,   92,
+       92,   92,   93,   94,   95,   95,   95,   95,   96,   97,
+       98,   95,   99,   95,  100,   95,   95,   95,   95,   95,
+       95,   70,   33,  101,  101,  101,  101,  101,  101,  102,
+      102,  102,  102,  102,  102,  102,  102,  103,  102,  102,
+      109,  105,  174,  145,  174,  145,  248,  105,  104,  109,
+
+      110,  105,  261,  111,  111,  111,  111,  111,  111,  111,
+      111,  111,  111,  121,  258,  122,  122,  122,  122,  122,
+      122,  122,  122,  122,  122,  123,  186,  187,  285,  124,
+      124,  124,  124,  124,  124,  401,  184,  165,  165,  236,
+      237,  165,  165,  105,  256,  238,  239,  105,  105,  240,
+      105,  241,  105,  259,  124,  124,  124,  124,  124,  124,
+      104,  165,  254,  105,  324,  331,  104,  105,  331,  104,
+      104,  105,  104,  104,  104,  130,  130,  130,  130,  130,
+      130,  130,  130,  130,  130,  123,  166,  183,  104,  130,
+      130,  130,  130,  130,  130,  131,  131,  131,  131,  132,
+
+      131,  131,  131,  131,  131,  131,  131,  131,  131,  131,
+      131,  131,  105,  131,  124,  124,  124,  124,  124,  124,
+      104,  104,  104,  104,  104,  104,  104,  104,  104,  104,
+      104,  131,  131,  131,  131,  131,  131,  131,  131,  131,
+      131,  861,  105,  109,  333,  131,  131,  131,  131,  131,
+      131,  105,  470,  174,  145,  131,  111,  111,  111,  111,
+      111,  111,  111,  111,  111,  111,  331,  105,  105,  407,
+      104,  104,  104,  104,  104,  104,  144,  145,  104,  104,
+      104,  334,  104,  104,  844,  105,  104,  224,  224,  224,
+      224,  224,  224,  224,  224,  224,  224,  330,  185,  844,
+
+      104,  104,  104,  104,  177,  124,  124,  124,  124,  124,
+      124,  124,  124,  124,  124,  109,  170,  145,  171,  113,
+      172,  365,  365,  365,  171,  110,  172,  105,  111,  111,
+      111,  111,  111,  111,  111,  111,  111,  111,  148,  861,
+      172,  172,  354,  355,  556,  356,  104,  183,  104,  104,
+      104,  191,  104,  104,  861,  176,  104,  191,  176,  176,
+      191,  381,  109,  191,  191,  176,  190,  172,  149,  150,
+      104,  104,  104,  151,  861,  154,  109,  193,  387,  191,
+      176,  152,  385,  123,  153,  382,  173,  386,  226,  861,
+      861,  861,  861,  861,  861,  861,  861,  861,  861,  298,
+
+      105,  190,  388,  194,  191,  119,  402,  844,  119,  119,
+      105,  119,  119,  119,  119,  416,  226,  119,  119,  112,
+      417,  112,  112,  406,  105,  112,  112,  298,  472,  112,
+      409,  193,  119,  119,  224,  224,  224,  224,  224,  224,
+      224,  224,  224,  224,  112,  112,  111,  111,  111,  111,
+      111,  111,  111,  111,  111,  111,  830,  196,  119,  193,
+      105,  105,  197,  193,  198,  198,  198,  198,  198,  198,
+      198,  198,  198,  198,  123,  193,  331,  381,  199,  199,
+      199,  199,  199,  199,  193,  193,  193,  193,  193,  193,
+      193,  193,  193,  193,  193,  193,  193,  193,  193,  193,
+
+      193,  382,  471,  199,  199,  199,  199,  199,  199,  193,
+      193,  193,  193,  193,  193,  193,  193,  193,  193,  193,
+      861,  387,  193,  193,  193,  193,  193,  193,  193,  193,
+      193,  193,  861,  105,  630,  204,  193,  193,  193,  193,
+      193,  193,  226,  576,  116,  388,  116,  116,  116,  398,
+      116,  116,  399,  298,  116,  267,  267,  267,  267,  267,
+      267,  193,  193,  193,  193,  193,  193,  193,  116,  116,
+      116,  193,  203,  203,  203,  203,  203,  203,  203,  203,
+      203,  203,  123,  193,  105,  381,  203,  203,  203,  203,
+      203,  203,  204,  204,  204,  204,  205,  204,  204,  204,
+
+      204,  204,  204,  204,  204,  204,  204,  204,  204,  382,
+      206,  199,  199,  199,  199,  199,  199,  193,  193,  193,
+      193,  193,  193,  193,  193,  193,  193,  193,  204,  204,
+      204,  204,  204,  204,  204,  204,  204,  204,  861,  109,
+      668,  131,  204,  204,  204,  204,  204,  204,  105,  762,
+      119,  119,  204,  474,  119,  119,  861,  861,  861,  861,
+      861,  861,  861,  861,  861,  861,  387,  193,  193,  193,
+      193,  193,  193,  861,  119,  199,  199,  199,  199,  199,
+      199,  199,  199,  199,  199,  118,  113,  104,  104,  118,
+      388,  104,  104,  321,  322,  118,  323,  473,  105,  120,
+
+      288,  288,  288,  288,  288,  289,  861,  477,  551,  118,
+      118,  104,  220,  221,  222,  220,  220,  220,  220,  220,
+      220,  220,  165,  165,  274,  275,  165,  165,  105,  811,
+      276,  277,  105,  190,  278,  105,  279,  164,  131,  104,
+      104,  164,  608,  104,  104,  557,  165,  164,  431,  105,
+      223,  223,  223,  223,  223,  223,  223,  223,  223,  223,
+      131,  164,  164,  104,  223,  223,  223,  223,  223,  223,
+      605,  166,  263,  264,  265,  263,  263,  263,  263,  263,
+      263,  263,  104,  104,  104,  104,  667,  105,  131,  223,
+      223,  223,  223,  223,  223,  229,  229,  229,  229,  229,
+
+      229,  229,  229,  229,  229,  123,  123,  811,  478,  229,
+      229,  229,  229,  229,  229,  267,  267,  267,  267,  267,
+      267,  267,  267,  267,  267,  374,  374,  374,  374,  374,
+      375,  105,  109,  105,  223,  223,  223,  223,  223,  223,
+      131,  131,  131,  131,  131,  131,  131,  131,  131,  131,
+      861,  408,  369,  226,  131,  131,  131,  131,  131,  131,
+      188,  105,  188,  188,  371,  191,  188,  188,  105,  109,
+      188,  191,  479,  480,  191,  861,  226,  191,  191,  104,
+      104,  104,  104,  104,  104,  188,  188,  371,  615,  861,
+      119,  193,  226,  191,  119,  191,  811,  191,  191,  191,
+
+      119,  191,  191,  298,  335,  191,  336,  336,  336,  336,
+      336,  336,  226,  861,  119,  119,  105,  194,  191,  191,
+      191,  191,  119,  371,  554,  119,  119,  555,  119,  119,
+      119,  119,  535,  861,  119,  119,  267,  267,  267,  267,
+      267,  267,  267,  267,  267,  267,  576,  861,  193,  119,
+      119,  219,  219,  219,  219,  219,  219,  219,  219,  219,
+      219,  219,  219,  219,  219,  219,  219,  219,  219,  219,
+      219,  861,  105,  762,  196,  119,  266,  266,  266,  266,
+      266,  266,  266,  266,  266,  266,  369,  226,  617,  536,
+      266,  266,  266,  266,  266,  266,  287,  287,  287,  287,
+
+      287,  287,  287,  287,  287,  287,  451,  451,  451,  451,
+      451,  452,  369,  226,  538,  266,  266,  266,  266,  266,
+      266,  193,  861,  226,  371,  193,  268,  268,  268,  268,
+      268,  268,  268,  268,  268,  268,  123,  193,  539,  543,
+      268,  268,  268,  268,  268,  268,  204,  204,  204,  204,
+      204,  204,  204,  204,  204,  204,  204,  204,  204,  204,
+      204,  204,  204,  544,  206,  266,  266,  266,  266,  266,
+      266,  193,  193,  193,  193,  193,  193,  193,  193,  193,
+      193,  193,  204,  204,  204,  204,  204,  204,  204,  204,
+      204,  204,  861,  707,  861,  861,  204,  204,  204,  204,
+
+      204,  204,  303,  303,  303,  303,  303,  303,  303,  303,
+      303,  303,  104,  104,  104,  104,  369,  226,  861,  861,
+      861,  193,  193,  193,  193,  193,  193,  285,  448,  286,
+      286,  286,  286,  286,  286,  286,  286,  286,  286,  165,
+      537,  861,  545,  165,  861,  105,  727,  131,  131,  165,
+      373,  373,  373,  373,  373,  373,  373,  373,  373,  373,
+      607,  540,  612,  165,  165,  861,  105,  104,  226,  290,
+      290,  290,  290,  290,  290,  290,  290,  290,  290,  371,
+      794,  546,  547,  290,  290,  290,  290,  290,  290,  410,
+      411,  412,  410,  410,  410,  410,  410,  410,  410,  526,
+
+      526,  526,  526,  526,  527,  794,  548,  569,  290,  290,
+      290,  290,  290,  290,  292,  293,  294,  294,  294,  294,
+      294,  294,  294,  294,  295,  549,  533,  538,  296,  296,
+      296,  296,  296,  296,  442,  443,  444,  442,  442,  442,
+      442,  442,  442,  442,  672,  105,  131,  564,  543,  550,
+      534,  539,  565,  296,  296,  296,  296,  296,  296,  226,
+      299,  300,  301,  299,  299,  299,  299,  299,  299,  299,
+      302,  105,  544,  681,  303,  303,  303,  303,  303,  303,
+      380,  380,  380,  380,  380,  380,  380,  380,  380,  380,
+      481,  794,  482,  482,  482,  482,  482,  482,  811,  303,
+
+      303,  303,  303,  303,  303,  304,  304,  304,  304,  304,
+      304,  304,  304,  304,  304,  123,  547,  549,  533,  304,
+      304,  304,  304,  304,  304,  369,  226,  446,  446,  446,
+      446,  446,  446,  131,  697,  697,  697,  371,  538,  606,
+      548,  550,  534,  811,  290,  290,  290,  290,  290,  290,
+      131,  131,  131,  131,  131,  131,  131,  131,  131,  131,
+      861,  726,  539,  131,  131,  131,  131,  131,  131,  131,
+      450,  450,  450,  450,  450,  450,  450,  450,  450,  450,
+      431,  226,  432,  432,  432,  432,  432,  432,  226,  104,
+      104,  104,  104,  104,  104,  335,  543,  338,  338,  338,
+
+      338,  338,  339,  336,  336,  336,  336,  340,  340,  340,
+      340,  340,  340,  340,  340,  340,  340,  123,  226,  105,
+      544,  340,  340,  340,  340,  340,  340,  457,  457,  457,
+      457,  457,  457,  457,  457,  457,  457,  572,  572,  572,
+      572,  572,  573,  731,  732,  226,  340,  340,  340,  340,
+      340,  340,  341,  341,  341,  341,  341,  341,  341,  341,
+      341,  341,  861,  226,  547,  707,  341,  341,  341,  341,
+      341,  341,  226,  105,  448,  369,  226,  521,  521,  521,
+      521,  521,  521,  448,  610,  369,  226,  448,  548,  131,
+      618,  340,  340,  340,  340,  340,  340,  358,  359,  360,
+
+      358,  358,  358,  358,  358,  358,  358,  525,  525,  525,
+      525,  525,  525,  525,  525,  525,  525,  558,  559,  560,
+      558,  558,  558,  558,  558,  558,  558,  581,  581,  581,
+      581,  581,  582,  643,  105,  363,  363,  364,  365,  365,
+      365,  365,  365,  365,  365,  295,  369,  226,  370,  370,
+      370,  370,  370,  370,  370,  370,  370,  370,  371,  549,
+      109,  629,  372,  372,  372,  372,  372,  372,  571,  571,
+      571,  571,  571,  571,  571,  571,  571,  571,  204,  671,
+      794,  861,  723,  550,  131,  131,  794,  372,  372,  372,
+      372,  372,  372,  226,  376,  377,  378,  376,  376,  376,
+
+      376,  376,  376,  376,  379,  861,  369,  226,  380,  380,
+      380,  380,  380,  380,  728,  743,  669,  541,  448,  131,
+      733,  743,  542,  513,  513,  513,  513,  513,  513,  513,
+      513,  513,  513,  380,  380,  380,  380,  380,  380,  861,
+      670,  372,  372,  372,  372,  372,  372,  372,  372,  372,
+      372,  413,  413,  413,  413,  413,  413,  413,  413,  413,
+      413,  743,  778,  131,  131,  413,  413,  413,  413,  413,
+      413,  580,  580,  580,  580,  580,  580,  580,  580,  580,
+      580,  514,  673,  515,  515,  515,  515,  515,  515,  692,
+      413,  413,  413,  413,  413,  413,  414,  414,  414,  414,
+
+      414,  414,  414,  414,  414,  414,  674,  743,  673,  675,
+      414,  414,  414,  414,  414,  414,  588,  589,  590,  588,
+      588,  588,  588,  588,  588,  588,  779,  131,  105,  131,
+      369,  226,  674,  676,  742,  413,  413,  413,  413,  413,
+      413,  431,  523,  432,  432,  432,  432,  432,  432,  432,
+      432,  432,  432,  431,  576,  433,  433,  433,  433,  433,
+      433,  433,  433,  433,  433,  431,  578,  434,  434,  434,
+      434,  434,  435,  432,  432,  432,  432,  437,  437,  437,
+      437,  437,  437,  437,  437,  437,  437,  295,  369,  226,
+      446,  446,  446,  446,  446,  446,  446,  446,  446,  446,
+
+      371,  679,  109,  675,  445,  445,  445,  445,  445,  445,
+      532,  532,  532,  532,  532,  532,  532,  532,  532,  532,
+      598,  598,  598,  598,  598,  599,  809,  676,  131,  445,
+      445,  445,  445,  445,  445,  369,  226,  447,  447,  447,
+      447,  447,  447,  447,  447,  447,  447,  448,  861,  226,
+      131,  449,  449,  449,  449,  449,  449,  680,  861,  131,
+      523,  369,  226,  593,  593,  593,  593,  593,  593,  609,
+      578,  669,  724,  523,  731,  732,  449,  449,  449,  449,
+      449,  449,  226,  453,  454,  455,  453,  453,  453,  453,
+      453,  453,  453,  456,  782,  670,  725,  457,  457,  457,
+
+      457,  457,  457,  597,  597,  597,  597,  597,  597,  597,
+      597,  597,  597,  104,  104,  104,  104,  673,  131,  131,
+      810,  109,  457,  457,  457,  457,  457,  457,  861,  611,
+      449,  449,  449,  449,  449,  449,  449,  449,  449,  449,
+      481,  674,  484,  484,  484,  484,  484,  485,  482,  482,
+      482,  482,  413,  413,  413,  413,  413,  413,  413,  413,
+      413,  413,  105,  109,  105,  675,  413,  413,  413,  413,
+      413,  413,  616,  637,  638,  639,  637,  637,  637,  637,
+      637,  637,  637,  646,  646,  646,  646,  646,  647,  676,
+      732,  413,  413,  413,  413,  413,  413,  502,  503,  504,
+
+      502,  502,  502,  502,  502,  502,  502,  587,  587,  587,
+      587,  587,  587,  587,  587,  587,  587,  576,  576,  641,
+      641,  641,  641,  641,  641,  226,  829,  830,  781,  578,
+      578,  692,  105,  789,  105,  431,  448,  432,  432,  432,
+      432,  432,  432,  432,  432,  432,  432,  431,  734,  432,
+      432,  432,  432,  432,  432,  432,  432,  432,  432,  509,
+      510,  511,  509,  509,  509,  509,  509,  509,  509,  512,
+      105,  682,  105,  513,  513,  513,  513,  513,  513,  645,
+      645,  645,  645,  645,  645,  645,  645,  645,  645,  824,
+      824,  824,  824,  682,  226,  682,  682,  780,  513,  513,
+
+      513,  513,  513,  513,  514,  523,  517,  517,  517,  517,
+      517,  518,  515,  515,  515,  515,  369,  226,  521,  521,
+      521,  521,  521,  521,  521,  521,  521,  521,  448,  369,
+      226,  724,  520,  520,  520,  520,  520,  520,  369,  226,
+      576,  523,  861,  226,  664,  664,  664,  664,  664,  665,
+      595,  131,  643,  861,  595,  725,  226,  520,  520,  520,
+      520,  520,  520,  369,  226,  522,  522,  522,  522,  522,
+      522,  522,  522,  522,  522,  523,  336,  861,  336,  524,
+      524,  524,  524,  524,  524,  369,  226,  660,  660,  660,
+      660,  660,  660,  829,  830,  751,  226,  595,  710,  710,
+
+      710,  710,  710,  711,  524,  524,  524,  524,  524,  524,
+      226,  528,  529,  530,  528,  528,  528,  528,  528,  528,
+      528,  531,  682,  226,  861,  532,  532,  532,  532,  532,
+      532,  663,  663,  663,  663,  663,  663,  663,  663,  663,
+      663,  175,  175,  175,  682,  861,  682,  683,  861,  861,
+      532,  532,  532,  532,  532,  532,  861,  643,  524,  524,
+      524,  524,  524,  524,  524,  524,  524,  524,  104,  533,
+      750,  105,  111,  861,  104,  111,  219,  104,  104,  219,
+      104,  104,  104,  131,  131,  131,  131,  131,  131,  131,
+      131,  131,  131,  534,  749,  643,  104,  131,  131,  131,
+
+      131,  131,  131,  131,  131,  131,  131,  131,  131,  131,
+      131,  131,  131,  131,  131,  131,  131,  131,  131,  131,
+      105,  131,  104,  104,  104,  104,  104,  104,  104,  104,
+      104,  104,  104,  104,  104,  104,  104,  104,  104,  569,
+      570,  570,  570,  570,  570,  570,  570,  570,  570,  570,
+      684,  685,  686,  687,  684,  684,  684,  684,  684,  684,
+      619,  620,  620,  620,  620,  620,  620,  694,  694,  694,
+      694,  694,  694,  694,  694,  694,  694,  105,  576,  576,
+      577,  577,  577,  577,  577,  577,  577,  577,  577,  577,
+      578,  643,  620,  620,  579,  579,  579,  579,  579,  579,
+
+      695,  695,  695,  695,  695,  696,  697,  697,  697,  697,
+      653,  578,  654,  654,  654,  654,  654,  654,  698,  579,
+      579,  579,  579,  579,  579,  583,  584,  585,  583,  583,
+      583,  583,  583,  583,  583,  586,  698,  724,  776,  587,
+      587,  587,  587,  587,  587,  652,  652,  652,  652,  652,
+      652,  652,  652,  652,  652,  743,  698,  748,  748,  748,
+      226,  725,  777,  743,  587,  587,  587,  587,  587,  587,
+      861,  523,  579,  579,  579,  579,  579,  579,  579,  579,
+      579,  579,  369,  226,  593,  593,  593,  593,  593,  593,
+      593,  593,  593,  593,  523,  776,  621,  621,  592,  592,
+
+      592,  592,  592,  592,  576,  576,  705,  705,  705,  705,
+      705,  705,  175,  175,  175,  743,  643,  707,  736,  777,
+      737,  738,  739,  592,  592,  592,  592,  592,  592,  369,
+      226,  594,  594,  594,  594,  594,  594,  594,  594,  594,
+      594,  595,  131,  620,  620,  596,  596,  596,  596,  596,
+      596,  709,  709,  709,  709,  709,  709,  709,  709,  709,
+      709,  369,  226,  722,  722,  722,  722,  722,  722,  740,
+      596,  596,  596,  596,  596,  596,  226,  600,  601,  602,
+      600,  600,  600,  600,  600,  600,  600,  776,  729,  807,
+      861,  603,  603,  603,  603,  603,  603,  717,  718,  719,
+
+      717,  717,  717,  717,  717,  717,  717,  337,  482,  337,
+      482,  777,  226,  808,  861,  807,  603,  603,  603,  603,
+      603,  603,  861,  595,  596,  596,  596,  596,  596,  596,
+      596,  596,  596,  596,  104,  787,  131,  771,  771,  808,
+      104,  735,  735,  104,  104,  735,  104,  104,  104,  131,
+      131,  131,  131,  131,  131,  131,  131,  131,  131,  735,
+      735,  735,  104,  131,  131,  131,  131,  131,  131,  131,
+      131,  604,  131,  131,  131,  131,  131,  131,  131,  131,
+      131,  131,  131,  131,  131,  131,  105,  131,  104,  104,
+      104,  104,  104,  104,  104,  104,  104,  104,  104,  104,
+
+      104,  104,  104,  104,  104,  619,  622,  622,  622,  622,
+      622,  623,  620,  620,  620,  620,  193,  772,  772,  861,
+      193,  204,  204,  204,  204,  204,  204,  204,  204,  204,
+      204,  707,  193,  653,  807,  204,  204,  204,  204,  204,
+      204,  204,  204,  204,  204,  204,  204,  204,  204,  204,
+      204,  204,  204,  204,  204,  626,  204,  204,  808,  206,
+      193,  193,  193,  193,  193,  193,  193,  193,  193,  193,
+      193,  193,  193,  193,  193,  193,  193,  632,  633,  634,
+      635,  632,  632,  632,  632,  632,  632,  369,  226,  736,
+      653,  737,  738,  739,  483,  515,  483,  515,  576,  595,
+
+      755,  756,  757,  755,  755,  755,  755,  755,  755,  755,
+      707,  653,  578,  834,  105,  569,  570,  570,  570,  570,
+      570,  570,  570,  570,  570,  570,  698,  826,  699,  699,
+      699,  699,  699,  699,  765,  765,  765,  765,  765,  766,
+      742,  716,  716,  716,  716,  716,  716,  716,  716,  716,
+      716,  827,  105,  105,  576,  698,  641,  641,  641,  641,
+      641,  641,  641,  641,  641,  641,  578,  576,  576,  642,
+      642,  642,  642,  642,  642,  642,  642,  642,  642,  643,
+      762,  861,  826,  644,  644,  644,  644,  644,  644,  576,
+      698,  760,  760,  760,  760,  760,  760,  516,  508,  516,
+
+      861,  707,  861,  861,  861,  861,  827,  691,  644,  644,
+      644,  644,  644,  644,  648,  649,  650,  648,  648,  648,
+      648,  648,  648,  648,  651,  690,  689,  788,  652,  652,
+      652,  652,  652,  652,  764,  764,  764,  764,  764,  764,
+      764,  764,  764,  764,  482,  515,  482,  515,  654,  226,
+      654,  740,  688,  652,  652,  652,  652,  652,  652,  861,
+      595,  644,  644,  644,  644,  644,  644,  644,  644,  644,
+      644,  653,  619,  656,  656,  656,  656,  656,  657,  654,
+      654,  654,  654,  369,  226,  660,  660,  660,  660,  660,
+      660,  660,  660,  660,  660,  595,  619,  861,  826,  659,
+
+      659,  659,  659,  659,  659,  736,  619,  737,  738,  739,
+      861,  861,  737,  738,  739,  861,  105,  861,  861,  739,
+      678,  861,  827,  762,  659,  659,  659,  659,  659,  659,
+      369,  226,  661,  661,  661,  661,  661,  661,  661,  661,
+      661,  661,  816,  576,  677,  131,  662,  662,  662,  662,
+      662,  662,  655,  105,  655,  762,  740,  699,  700,  699,
+      700,  740,  654,  744,  654,  744,  740,  745,  699,  745,
+      699,  662,  662,  662,  662,  662,  662,  861,  226,  662,
+      662,  662,  662,  662,  662,  662,  662,  662,  662,  104,
+      741,  653,  741,  741,  741,  104,  741,  741,  104,  104,
+
+      741,  104,  104,  104,  131,  131,  131,  131,  131,  131,
+      131,  131,  131,  131,  741,  741,  741,  104,  131,  131,
+      131,  131,  131,  131,  131,  131,  131,  131,  131,  131,
+      131,  131,  131,  131,  131,  131,  131,  666,  131,  131,
+      131,  105,  131,  104,  104,  104,  104,  104,  104,  104,
+      104,  104,  104,  104,  104,  104,  104,  104,  104,  104,
+      669,  743,  653,  744,  744,  744,  744,  744,  744,  193,
+      795,  508,  795,  193,  204,  204,  204,  204,  204,  204,
+      204,  204,  204,  204,  670,  193,  367,  631,  204,  204,
+      204,  204,  204,  204,  204,  204,  204,  204,  204,  204,
+
+      204,  204,  204,  204,  204,  204,  204,  204,  204,  204,
+      204,  628,  206,  193,  193,  193,  193,  193,  193,  193,
+      193,  193,  193,  193,  193,  193,  193,  193,  193,  193,
+      692,  627,  693,  693,  693,  693,  693,  693,  693,  693,
+      693,  693,  784,  785,  786,  784,  784,  784,  784,  784,
+      784,  784,  770,  770,  770,  770,  770,  770,  770,  770,
+      770,  770,  805,  805,  805,  805,  805,  806,  783,  105,
+      698,  783,  701,  701,  701,  701,  701,  702,  699,  699,
+      699,  699,  576,  625,  705,  705,  705,  705,  705,  705,
+      705,  705,  705,  705,  643,  576,  624,  706,  706,  706,
+
+      706,  706,  706,  706,  706,  706,  706,  707,  796,  619,
+      796,  708,  708,  708,  708,  708,  708,  576,  619,  801,
+      801,  801,  801,  801,  801,  812,  614,  812,  794,  762,
+      795,  795,  795,  795,  795,  795,  708,  708,  708,  708,
+      708,  708,  712,  713,  714,  712,  712,  712,  712,  712,
+      712,  712,  715,  813,  613,  813,  716,  716,  716,  716,
+      716,  716,  804,  804,  804,  804,  804,  804,  804,  804,
+      804,  804,  226,  771,  771,  771,  771,  771,  771,  514,
+      514,  716,  716,  716,  716,  716,  716,  861,  514,  708,
+      708,  708,  708,  708,  708,  708,  708,  708,  708,  369,
+
+      226,  722,  722,  722,  722,  722,  722,  722,  722,  722,
+      722,  743,  508,  746,  746,  746,  746,  746,  747,  748,
+      748,  748,  748,  752,  753,  754,  752,  752,  752,  752,
+      752,  752,  752,  783,  783,  783,  783,  783,  783,  783,
+      783,  783,  783,  783,  783,  783,  783,  783,  783,  783,
+      783,  783,  783,  839,  839,  839,  839,  839,  839,  367,
+      105,  692,  295,  693,  693,  693,  693,  693,  693,  693,
+      693,  693,  693,  845,  568,  845,  789,  567,  790,  790,
+      790,  790,  790,  790,  820,  821,  822,  820,  820,  820,
+      820,  820,  820,  820,  858,  858,  858,  858,  858,  858,
+
+      105,  576,  566,  760,  760,  760,  760,  760,  760,  760,
+      760,  760,  760,  707,  576,  105,  761,  761,  761,  761,
+      761,  761,  761,  761,  761,  761,  762,  846,  563,  846,
+      763,  763,  763,  763,  763,  763,  831,  832,  833,  831,
+      831,  831,  831,  831,  831,  831,  811,  562,  812,  812,
+      812,  812,  812,  812,  561,  763,  763,  763,  763,  763,
+      763,  767,  768,  769,  767,  767,  767,  767,  767,  767,
+      767,  481,  481,  481,  553,  770,  770,  770,  770,  770,
+      770,  839,  839,  839,  839,  839,  839,  839,  839,  839,
+      839,  834,  552,  835,  835,  835,  835,  835,  835,  105,
+
+      770,  770,  770,  770,  770,  770,  861,  105,  763,  763,
+      763,  763,  763,  763,  763,  763,  763,  763,  226,  773,
+      773,  773,  773,  773,  774,  771,  771,  771,  771,  789,
+      105,  790,  790,  790,  790,  790,  790,  790,  790,  790,
+      790,  789,  105,  791,  791,  791,  791,  791,  791,  791,
+      791,  791,  791,  789,  105,  792,  792,  792,  792,  792,
+      793,  790,  790,  790,  790,  794,  514,  797,  797,  797,
+      797,  797,  798,  795,  795,  795,  795,  576,  514,  801,
+      801,  801,  801,  801,  801,  801,  801,  801,  801,  762,
+      576,  508,  802,  802,  802,  802,  802,  802,  802,  802,
+
+      802,  802,  367,  295,  295,  501,  803,  803,  803,  803,
+      803,  803,  840,  840,  840,  840,  840,  840,  840,  840,
+      840,  840,  844,  500,  845,  845,  845,  845,  845,  845,
+      499,  803,  803,  803,  803,  803,  803,  861,  498,  803,
+      803,  803,  803,  803,  803,  803,  803,  803,  803,  811,
+      497,  814,  814,  814,  814,  814,  815,  812,  812,  812,
+      812,  104,  496,  817,  818,  819,  817,  817,  817,  817,
+      817,  817,  817,  789,  495,  790,  790,  790,  790,  790,
+      790,  790,  790,  790,  790,  789,  494,  790,  790,  790,
+      790,  790,  790,  790,  790,  790,  790,  576,  493,  825,
+
+      825,  825,  825,  825,  825,  825,  825,  825,  825,  834,
+      492,  835,  835,  835,  835,  835,  835,  835,  835,  835,
+      835,  834,  491,  836,  836,  836,  836,  836,  836,  836,
+      836,  836,  836,  834,  490,  837,  837,  837,  837,  837,
+      838,  835,  835,  835,  835,  841,  841,  841,  841,  841,
+      842,  839,  839,  839,  839,  844,  489,  847,  847,  847,
+      847,  847,  848,  845,  845,  845,  845,  104,  488,  849,
+      850,  851,  849,  849,  849,  849,  849,  849,  849,  834,
+      487,  835,  835,  835,  835,  835,  835,  835,  835,  835,
+      835,  834,  486,  835,  835,  835,  835,  835,  835,  835,
+
+      835,  835,  835,  839,  839,  839,  839,  839,  839,  839,
+      839,  839,  839,  839,  839,  839,  839,  839,  839,  839,
+      839,  839,  839,  852,  853,  854,  852,  852,  852,  852,
+      852,  852,  852,  855,  855,  855,  855,  855,  855,  855,
+      855,  855,  855,  858,  858,  858,  858,  858,  858,  858,
+      858,  858,  858,  852,  852,  852,  852,  852,  852,  852,
+      852,  852,  852,  855,  855,  855,  855,  855,  855,  861,
+      105,  849,  849,  849,  849,  849,  849,  849,  849,  849,
+      849,  859,  859,  859,  859,  859,  860,  858,  858,  858,
+      858,  843,  481,  481,  843,  403,  476,  475,  843,  469,
+
+      105,  468,  467,  466,  465,  464,  463,  462,  105,  856,
+      856,  856,  856,  856,  857,  855,  855,  855,  855,  858,
+      858,  858,  858,  858,  858,  858,  858,  858,  858,  461,
+      460,  459,  458,  440,  367,  295,  436,  295,  129,  430,
+      429,  428,  425,  424,  423,  422,  105,  855,  855,  855,
+      855,  855,  855,  855,  855,  855,  855,  421,  420,  419,
+      418,  415,  335,  335,  335,  403,  405,  403,  404,  403,
+      397,  396,  395,  394,  393,  392,  391,  390,  389,  384,
+      383,  123,  295,  367,  105,   63,   63,   63,   63,   63,
+       63,   63,   63,   63,   63,   63,   63,   63,   63,   63,
+
+       63,   63,   63,   63,   63,   63,   33,   33,   33,   33,
        33,   33,   33,   33,   33,   33,   33,   33,   33,   33,
-       33,   33,   33,   33,   33,   71,   71,   71,   71,   71,
-       71,   71,   71,   71,   71,   71,   71,   71,   71,   71,
-       71,   71,   71,   71,   71,   71,   78,   78,   78,   78,
-       78,   78,   78,   78,   78,   78,   78,   78,   78,   78,
-
-       78,   78,   78,   78,   78,   78,   78,  102,  115,  214,
-      107,  105,  104,  103,  102,  209,  102,  102,  102,  102,
-      208,  207,  102,  102,  102,  102,  102,  102,  106,  106,
-      106,  106,  106,  106,  106,  106,  106,  106,  106,  106,
-      106,  106,  106,  106,  106,  106,  106,  106,  106,  110,
-      206,  205,  201,  180,  110,  174,  110,  166,  110,  110,
-      110,  110,  110,  136,  110,  110,  110,  110,  110,  110,
-      114,  133,  160,  159,  156,  154,  140,  114,  139,  114,
-      114,  114,  114,  138,  135,  114,  114,  114,  114,  114,
-      114,  116,  134,  129,  116,  116,  127,  116,  116,  115,
-
-      116,  116,  116,  116,  105,  104,  116,  116,  116,  116,
-      116,  116,  126,  126,  103,  126,  833,  833,  833,  126,
-      161,  833,  833,  161,  161,  833,  161,  161,  833,  161,
-      161,  161,  161,  833,  833,  161,  161,  161,  161,  161,
-      161,  165,  833,  833,  165,  165,  833,  165,  165,  833,
-      165,  165,  165,  165,  833,  165,  165,  165,  833,  165,
-      165,  165,  173,  833,  833,  173,  833,  833,  173,  173,
-      833,  173,  173,  173,  173,  173,  833,  173,  173,  173,
-      173,  173,  173,  177,  177,  177,  177,  177,  177,  177,
-      177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
-
-      177,  177,  177,  177,  179,  179,  833,  179,  833,  179,
-      179,  179,  179,  179,  179,  179,  179,  179,  179,  179,
-      179,  179,  179,  179,  179,  185,  833,  833,  833,  833,
-      185,  833,  185,  833,  185,  185,  185,  185,  185,  833,
-      185,  185,  185,  185,  185,  185,  189,  833,  833,  833,
-      833,  833,  833,  189,  833,  189,  189,  189,  189,  833,
-      189,  189,  189,  189,  189,  189,  189,  192,  833,  833,
-      192,  192,  833,  192,  192,  833,  192,  192,  192,  192,
-      833,  192,  192,  192,  192,  192,  192,  192,  212,  212,
-      212,  212,  212,  212,  212,  212,  212,  212,  212,  212,
-
-      212,  212,  212,  212,  212,  212,  212,  212,  212,  213,
-      213,  833,  213,  213,  213,  213,  213,  213,  213,  213,
-      213,  213,  213,  213,  213,  213,  213,  213,  213,  213,
-      117,  833,  833,  117,  117,  833,  117,  117,  833,  117,
-      117,  117,  117,  833,  833,  117,  117,  117,  117,  117,
-      117,  126,  126,  833,  126,  833,  833,  833,  126,  221,
-      221,  833,  221,  833,  833,  833,  221,  223,  223,  223,
-      833,  223,  833,  833,  833,  223,  161,  833,  833,  161,
-      161,  833,  161,  161,  833,  161,  161,  161,  161,  833,
-      833,  161,  161,  161,  161,  161,  161,  162,  833,  833,
-
-      162,  162,  833,  162,  162,  833,  162,  162,  162,  162,
-      833,  833,  162,  162,  162,  162,  162,  162,  165,  833,
-      833,  165,  165,  833,  165,  165,  833,  165,  165,  165,
-      165,  833,  165,  165,  165,  833,  165,  165,  165,  173,
-      833,  833,  173,  833,  833,  173,  173,  833,  173,  173,
-      173,  173,  173,  833,  173,  173,  173,  173,  173,  173,
-      188,  833,  833,  833,  833,  833,  833,  188,  833,  188,
-      188,  188,  188,  833,  833,  188,  188,  188,  188,  188,
-      188,  189,  833,  833,  833,  833,  833,  833,  189,  833,
-      189,  189,  189,  189,  833,  189,  189,  189,  189,  189,
-
-      189,  189,  192,  833,  833,  192,  192,  833,  192,  192,
-      833,  192,  192,  192,  192,  833,  192,  192,  192,  192,
-      192,  192,  192,  203,  833,  833,  203,  203,  833,  203,
-      276,  276,  276,  276,  276,  276,  276,  276,  276,  276,
-      276,  276,  276,  276,  276,  276,  276,  276,  276,  276,
-      276,  283,  283,  833,  283,  833,  833,  833,  283,  289,
-      289,  289,  833,  289,  833,  833,  833,  289,  349,  349,
-      833,  349,  833,  833,  833,  349,  350,  350,  833,  350,
-      833,  833,  833,  350,  354,  354,  833,  354,  833,  833,
-      833,  354,  356,  356,  356,  833,  356,  833,  833,  833,
-
-      356,  203,  833,  833,  203,  203,  833,  203,  420,  420,
-      833,  420,  833,  833,  833,  420,  422,  422,  833,  422,
-      833,  833,  833,  422,  423,  423,  833,  423,  833,  833,
-      833,  423,  425,  425,  425,  833,  425,  833,  833,  833,
-      425,  429,  429,  429,  429,  833,  429,  833,  833,  833,
-      429,  485,  485,  833,  485,  833,  833,  833,  485,  486,
-      486,  833,  486,  833,  833,  833,  486,  487,  487,  833,
-      487,  833,  833,  833,  487,  499,  499,  499,  833,  499,
-      833,  833,  833,  499,  500,  500,  500,  500,  833,  500,
-      833,  833,  833,  500,  212,  212,  212,  212,  212,  212,
-
-      212,  212,  212,  212,  212,  212,  212,  212,  212,  212,
-      212,  212,  212,  212,  212,  550,  550,  833,  550,  833,
-      833,  833,  550,  551,  551,  833,  551,  833,  833,  833,
-      551,  567,  567,  567,  833,  567,  833,  833,  833,  567,
-      568,  568,  568,  568,  833,  568,  833,  833,  833,  568,
-      212,  212,  212,  212,  212,  212,  212,  212,  212,  212,
-      212,  212,  212,  212,  212,  212,  212,  212,  212,  212,
-      212,  203,  833,  833,  203,  203,  833,  203,  190,  833,
-      833,  833,  190,  190,  833,  190,  190,  190,  833,  833,
-      190,  190,  610,  610,  833,  610,  833,  833,  833,  610,
-
-      614,  833,  614,  614,  833,  614,  833,  833,  833,  614,
-      632,  632,  632,  833,  632,  833,  833,  833,  632,  633,
-      633,  633,  633,  833,  633,  833,  833,  833,  633,  579,
-      579,  833,  833,  579,  833,  833,  833,  579,  212,  212,
-      212,  212,  212,  212,  212,  212,  212,  212,  212,  212,
-      212,  212,  212,  212,  212,  212,  212,  212,  212,  203,
-      833,  833,  203,  203,  833,  203,  190,  833,  833,  833,
-      190,  190,  833,  190,  190,  190,  833,  833,  190,  190,
-      675,  675,  833,  675,  833,  833,  833,  675,  676,  833,
-      676,  676,  833,  676,  833,  833,  833,  676,  692,  692,
-
-      692,  833,  692,  833,  833,  833,  692,  693,  693,  693,
-      833,  833,  693,  833,  833,  833,  693,  702,  702,  702,
-      702,  702,  702,  702,  702,  702,  702,  702,  702,  702,
-      702,  702,  702,  702,  702,  702,  702,  702,  707,  707,
-      833,  707,  707,  707,  833,  707,  833,  707,  707,  707,
-      707,  833,  833,  707,  707,  707,  707,  707,  707,  713,
-      713,  833,  713,  713,  713,  833,  713,  833,  713,  713,
-      713,  713,  833,  833,  713,  713,  713,  713,  713,  713,
-      203,  833,  833,  833,  833,  833,  833,  833,  833,  833,
-      833,  203,  203,  833,  203,  203,  833,  203,  730,  730,
-
-      833,  730,  833,  833,  833,  730,  731,  833,  731,  731,
-      833,  731,  833,  833,  833,  731,  747,  747,  833,  833,
-      747,  833,  833,  833,  747,  713,  833,  833,  833,  833,
-      833,  833,  713,  833,  713,  713,  713,  713,  833,  833,
-      713,  713,  713,  713,  713,  713,  771,  771,  833,  771,
-      833,  833,  833,  771,  772,  833,  772,  772,  833,  772,
-      833,  833,  833,  772,  795,  795,  833,  795,  833,  833,
-      833,  795,  796,  833,  796,  833,  833,  796,  833,  833,
-      833,  796,  800,  800,  800,  800,  800,  800,  800,  800,
-      800,  800,  800,  800,  800,  800,  800,  800,  800,  800,
-
-      800,  800,  800,   15,  833,  833,  833,  833,  833,  833,
-      833,  833,  833,  833,  833,  833,  833,  833,  833,  833,
-      833,  833,  833,  833,  833,  833,  833,  833,  833,  833,
-      833,  833,  833,  833,  833,  833,  833,  833,  833,  833,
-      833,  833,  833,  833,  833,  833,  833,  833,  833,  833,
-      833,  833,  833,  833,  833,  833,  833,  833,  833,  833,
-      833,  833,  833,  833,  833,  833,  833,  833,  833,  833,
-      833,  833,  833,  833
+       33,   33,   33,   33,   33,   33,   33,   72,   72,   72,
+       72,   72,   72,   72,   72,   72,   72,   72,   72,   72,
+       72,   72,   72,   72,   72,   72,   72,   72,   79,   79,
+       79,   79,   79,   79,   79,   79,   79,   79,   79,   79,
+       79,   79,   79,   79,   79,   79,   79,   79,   79,  104,
+      295,  129,  109,  357,  353,  352,  104,  351,  104,  104,
+      104,  104,  350,  349,  104,  104,  104,  104,  104,  104,
+      108,  108,  108,  108,  108,  108,  108,  108,  108,  108,
+
+      108,  108,  108,  108,  108,  108,  108,  108,  108,  108,
+      108,  112,  348,  347,  346,  345,  112,  344,  112,  343,
+      112,  112,  112,  112,  112,  342,  112,  112,  112,  112,
+      112,  112,  116,  197,  335,  335,  262,  332,  329,  116,
+      328,  116,  116,  116,  116,  327,  326,  116,  116,  116,
+      116,  116,  116,  118,  325,  320,  118,  118,  319,  118,
+      118,  318,  118,  118,  118,  118,  317,  316,  118,  118,
+      118,  118,  118,  118,  128,  128,  315,  128,  314,  313,
+      312,  128,  164,  311,  310,  164,  164,  309,  164,  164,
+      308,  164,  164,  164,  164,  307,  306,  164,  164,  164,
+
+      164,  164,  164,  168,  305,  129,  168,  168,  121,  168,
+      168,  109,  168,  168,  168,  168,  109,  168,  168,  168,
+      283,  168,  168,  168,  176,  282,  281,  176,  280,  273,
+      176,  176,  272,  176,  176,  176,  176,  176,  271,  176,
+      176,  176,  176,  176,  176,  180,  180,  180,  180,  180,
+      180,  180,  180,  180,  180,  180,  180,  180,  180,  180,
+      180,  180,  180,  180,  180,  180,  182,  182,  270,  182,
+      269,  182,  182,  182,  182,  182,  182,  182,  182,  182,
+      182,  182,  182,  182,  182,  182,  182,  188,  861,  194,
+      262,  182,  188,  183,  188,  177,  188,  188,  188,  188,
+
+      188,  177,  188,  188,  188,  188,  188,  188,  192,  169,
+      260,  163,  163,  253,  252,  192,  251,  192,  192,  192,
+      192,  250,  192,  192,  192,  192,  192,  192,  192,  195,
+      249,  246,  195,  195,  245,  195,  195,  244,  195,  195,
+      195,  195,  243,  195,  195,  195,  195,  195,  195,  195,
+      216,  216,  216,  216,  216,  216,  216,  216,  216,  216,
+      216,  216,  216,  216,  216,  216,  216,  216,  216,  216,
+      216,  217,  217,  242,  217,  217,  217,  217,  217,  217,
+      217,  217,  217,  217,  217,  217,  217,  217,  217,  217,
+      217,  217,  119,  235,  234,  119,  119,  233,  119,  119,
+
+      232,  119,  119,  119,  119,  231,  230,  119,  119,  119,
+      119,  119,  119,  128,  128,  129,  128,  104,  129,  196,
+      128,  225,  225,  117,  225,  218,  109,  107,  225,  227,
+      227,  227,  106,  227,  105,  213,  212,  227,  164,  211,
+      210,  164,  164,  209,  164,  164,  204,  164,  164,  164,
+      164,  183,  177,  164,  164,  164,  164,  164,  164,  165,
+      169,  139,  165,  165,  136,  165,  165,  163,  165,  165,
+      165,  165,  162,  159,  165,  165,  165,  165,  165,  165,
+      168,  157,  143,  168,  168,  142,  168,  168,  141,  168,
+      168,  168,  168,  138,  168,  168,  168,  137,  168,  168,
+
+      168,  176,  131,  129,  176,  117,  107,  176,  176,  106,
+      176,  176,  176,  176,  176,  105,  176,  176,  176,  176,
+      176,  176,  182,  182,  861,  182,  861,  182,  182,  182,
+      182,  182,  182,  182,  182,  182,  182,  182,  182,  182,
+      182,  182,  182,  191,  861,  861,  861,  861,  861,  861,
+      191,  861,  191,  191,  191,  191,  861,  861,  191,  191,
+      191,  191,  191,  191,  192,  861,  861,  861,  861,  861,
+      861,  192,  861,  192,  192,  192,  192,  861,  192,  192,
+      192,  192,  192,  192,  192,  195,  861,  861,  195,  195,
+      861,  195,  195,  861,  195,  195,  195,  195,  861,  195,
+
+      195,  195,  195,  195,  195,  195,  206,  861,  861,  206,
+      206,  861,  206,  284,  284,  284,  284,  284,  284,  284,
+      284,  284,  284,  284,  284,  284,  284,  284,  284,  284,
+      284,  284,  284,  284,  291,  291,  861,  291,  861,  861,
+      861,  291,  297,  297,  297,  861,  297,  861,  861,  861,
+      297,  361,  361,  861,  361,  861,  861,  861,  361,  362,
+      362,  861,  362,  861,  861,  861,  362,  366,  366,  861,
+      366,  861,  861,  861,  366,  368,  368,  368,  861,  368,
+      861,  861,  861,  368,  206,  861,  861,  206,  206,  861,
+      206,  436,  436,  861,  436,  861,  861,  861,  436,  438,
+
+      438,  861,  438,  861,  861,  861,  438,  439,  439,  861,
+      439,  861,  861,  861,  439,  441,  441,  441,  861,  441,
+      861,  861,  861,  441,  445,  445,  445,  445,  861,  445,
+      861,  861,  861,  445,  505,  505,  861,  505,  861,  861,
+      861,  505,  506,  506,  861,  506,  861,  861,  861,  506,
+      507,  507,  861,  507,  861,  861,  861,  507,  519,  519,
+      519,  861,  519,  861,  861,  861,  519,  520,  520,  520,
+      520,  861,  520,  861,  861,  861,  520,  216,  216,  216,
+      216,  216,  216,  216,  216,  216,  216,  216,  216,  216,
+      216,  216,  216,  216,  216,  216,  216,  216,  574,  574,
+
+      861,  574,  861,  861,  861,  574,  575,  575,  861,  575,
+      861,  861,  861,  575,  591,  591,  591,  861,  591,  861,
+      861,  861,  591,  592,  592,  592,  592,  861,  592,  861,
+      861,  861,  592,  216,  216,  216,  216,  216,  216,  216,
+      216,  216,  216,  216,  216,  216,  216,  216,  216,  216,
+      216,  216,  216,  216,  206,  861,  861,  206,  206,  861,
+      206,  193,  861,  861,  861,  193,  193,  861,  193,  193,
+      193,  861,  861,  193,  193,  636,  636,  861,  636,  861,
+      861,  861,  636,  640,  861,  640,  640,  861,  640,  861,
+      861,  861,  640,  658,  658,  658,  861,  658,  861,  861,
+
+      861,  658,  659,  659,  659,  659,  861,  659,  861,  861,
+      861,  659,  603,  603,  861,  861,  603,  861,  861,  861,
+      603,  216,  216,  216,  216,  216,  216,  216,  216,  216,
+      216,  216,  216,  216,  216,  216,  216,  216,  216,  216,
+      216,  216,  206,  861,  861,  206,  206,  861,  206,  193,
+      861,  861,  861,  193,  193,  861,  193,  193,  193,  861,
+      861,  193,  193,  703,  703,  861,  703,  861,  861,  861,
+      703,  704,  861,  704,  704,  861,  704,  861,  861,  861,
+      704,  720,  720,  720,  861,  720,  861,  861,  861,  720,
+      721,  721,  721,  861,  861,  721,  861,  861,  861,  721,
+
+      730,  730,  730,  730,  730,  730,  730,  730,  730,  730,
+      730,  730,  730,  730,  730,  730,  730,  730,  730,  730,
+      730,  735,  735,  861,  735,  735,  735,  861,  735,  861,
+      735,  735,  735,  735,  861,  861,  735,  735,  735,  735,
+      735,  735,  741,  741,  861,  741,  741,  741,  861,  741,
+      861,  741,  741,  741,  741,  861,  861,  741,  741,  741,
+      741,  741,  741,  206,  861,  861,  861,  861,  861,  861,
+      861,  861,  861,  861,  206,  206,  861,  206,  206,  861,
+      206,  758,  758,  861,  758,  861,  861,  861,  758,  759,
+      861,  759,  759,  861,  759,  861,  861,  861,  759,  775,
+
+      775,  861,  861,  775,  861,  861,  861,  775,  741,  861,
+      861,  861,  861,  861,  861,  741,  861,  741,  741,  741,
+      741,  861,  861,  741,  741,  741,  741,  741,  741,  799,
+      799,  861,  799,  861,  861,  861,  799,  800,  861,  800,
+      800,  861,  800,  861,  861,  861,  800,  823,  823,  861,
+      823,  861,  861,  861,  823,  824,  861,  824,  861,  861,
+      824,  861,  861,  861,  824,  828,  828,  828,  828,  828,
+      828,  828,  828,  828,  828,  828,  828,  828,  828,  828,
+      828,  828,  828,  828,  828,  828,   15,  861,  861,  861,
+      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
+
+      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
+      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
+      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
+      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
+      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
+      861,  861,  861,  861,  861,  861,  861,  861
     } ;
 
-static yyconst short int yy_chk[5675] =
+static yyconst short int yy_chk[5659] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -1300,623 +1308,621 @@ static yyconst short int yy_chk[5675] =
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        2,  553,    3,   38,    2,   53,    3,   50,   38,   51,
-        4,   36,    3,  553,    4,    3,   11,   11,   11,   11,
-        4,   22,   36,    4,   41,    5,    5,    5,   51,    5,
-
-        2,    2,   50,   53,    2,    5,   69,   69,   41,    3,
-      827,   22,    2,    3,    3,    2,    3,    4,   55,    5,
-        5,    4,    4,  151,    4,    6,    6,    6,   55,    6,
-      819,   12,   12,   12,   12,    6,   11,   22,    3,   77,
-       77,   73,   47,   27,   27,    5,    4,   27,   27,    6,
-        6,   47,   48,   79,    9,    9,    9,    9,    9,   75,
-       47,  167,  167,    9,    9,    9,   73,   27,   30,   30,
-       30,   30,   30,   30,   80,    6,    7,    7,    7,    9,
-        7,   12,   48,   48,   75,  151,   48,   61,  144,   82,
-       82,   27,   82,  144,   48,   92,   61,   48,   10,   10,
-
-       10,   10,   10,   79,    9,   61,   92,   10,   10,   10,
-       29,   29,   29,   29,   29,   29,   29,   29,   29,   29,
-      164,  818,   80,   10,  182,  164,    7,    7,    7,    7,
+        1,    2,   51,    3,   80,    2,   36,    3,   42,   37,
+       54,    4,   37,    3,   52,    4,    3,   36,    5,    5,
+        5,    4,    5,   42,    4,   56,   74,   51,    5,   39,
+
+       22,    2,    2,   52,   39,   56,    2,  855,   54,   70,
+       70,    3,    5,    5,    2,    3,    3,    2,    3,    4,
+       22,   93,   74,    4,    4,   80,    4,    6,    6,    6,
+       76,    6,   93,   11,   11,   11,   11,    6,   81,    5,
+        3,   12,   12,   12,   12,   27,   27,   22,    4,   27,
+       27,    6,    6,   78,   78,  103,   76,    9,    9,    9,
+        9,    9,   83,   83,  103,   83,    9,    9,    9,   27,
+       30,   30,   30,   30,   30,   30,   84,   48,    6,    7,
+        7,    7,    9,    7,   11,  155,   48,   81,   62,  129,
+       94,  157,   12,   94,   27,   48,   84,   62,  155,  322,
+
+      129,   10,   10,   10,   10,   10,   62,  157,    9,  112,
+       10,   10,   10,   29,   29,   29,   29,   29,   29,   29,
+       29,   29,   29,   84,   49,  146,   10,  146,  322,  112,
         7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
-        7,    7,    7,    7,    7,    8,    8,    8,   10,    8,
-       87,   87,   87,   87,   87,   87,   87,   87,   87,   87,
-       88,   88,   88,   88,   88,   88,  101,  103,  282,  103,
-      103,  103,  182,  103,  103,  101,  152,  103,  108,  108,
-      108,  108,  108,  108,  108,  108,  108,  108,  143,  152,
-      143,  103,  103,  103,  282,    8,    8,    8,    8,    8,
+        7,    7,    7,    7,    7,    7,    7,    7,    7,    8,
+        8,    8,   10,    8,   49,   49,  112,  847,  160,   49,
+       89,   89,   89,   89,   89,   89,  354,   49,  160,  354,
+       49,   88,   88,   88,   88,   88,   88,   88,   88,   88,
+       88,  110,  110,  110,  110,  110,  110,  110,  110,  110,
+      110,  127,  127,  127,  127,  127,  127,  170,  170,  846,
 
         8,    8,    8,    8,    8,    8,    8,    8,    8,    8,
-        8,    8,    8,    8,   13,   13,   13,   13,   13,   13,
+        8,    8,    8,    8,    8,    8,    8,    8,    8,   13,
+       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
        13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
        13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
        13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
        13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
        13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
        13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
-       13,   13,   13,   13,   21,  127,  156,  817,   83,  171,
-      171,  278,  156,  181,   21,  804,  127,   21,   21,   21,
-
-       21,   21,   21,   21,   21,   21,   21,   28,   83,   28,
-       28,   28,   28,   28,   28,   28,   28,   28,   28,   28,
-      155,  183,  183,   28,   28,   28,   28,   28,  154,  278,
-      297,   58,   58,  155,   83,   58,   58,  125,  125,  125,
-      125,  125,  125,  181,  154,   28,  157,   28,   28,   28,
-       28,   28,   28,   34,  297,   58,  157,  518,  252,   34,
-      252,  518,   34,   34,  323,   34,   34,   34,   34,   34,
-       34,   34,   34,   34,   34,   34,   34,   34,   34,   58,
-      323,   34,   34,   34,   34,   34,   34,   34,   34,   34,
+       21,  147,  144,  144,  174,  174,  147,  167,  156,  154,
+
+       21,  158,  167,   21,   21,   21,   21,   21,   21,   21,
+       21,   21,   21,   28,  158,   28,   28,   28,   28,   28,
+       28,   28,   28,   28,   28,   28,  186,  186,  286,   28,
+       28,   28,   28,   28,   28,  323,  184,   59,   59,  138,
+      138,   59,   59,  144,  156,  138,  138,  159,  257,  138,
+      248,  138,   28,  159,   28,   28,   28,   28,   28,   28,
+       34,   59,  154,  255,  248,  257,   34,  286,  255,   34,
+       34,  323,   34,   34,   34,   34,   34,   34,   34,   34,
+       34,   34,   34,   34,   34,   34,   59,  184,   34,   34,
        34,   34,   34,   34,   34,   34,   34,   34,   34,   34,
 
        34,   34,   34,   34,   34,   34,   34,   34,   34,   34,
        34,   34,   34,   34,   34,   34,   34,   34,   34,   34,
-       34,   34,   34,   37,   37,   37,   37,   37,   37,   37,
-       37,   37,   37,   37,  223,  803,  248,   37,   37,   37,
-       37,   37,  251,  153,  242,  223,   37,  109,  109,  109,
-      109,  109,  109,  109,  109,  109,  109,  253,  242,  251,
-      313,   37,   37,   37,   37,   37,   37,   45,   45,   45,
-       45,   45,  253,   45,   45,  321,  321,   45,  123,  123,
-      123,  123,  123,  123,  123,  123,  123,  123,  153,  248,
-      110,   45,   45,   45,   46,  313,   46,   46,   46,   46,
-
-       46,   46,   46,   46,   46,   46,   49,   67,   67,   67,
-      110,   67,  314,  112,  800,   67,   49,   67,  314,   49,
-       49,   49,   49,   49,   49,   49,   49,   49,   49,  135,
-      255,   67,   67,  112,  135,  135,  110,  289,  135,  174,
-      135,   84,  174,  174,  255,  141,  141,   84,  289,  174,
-       84,  116,  116,   84,   84,  116,  116,   67,  185,  112,
-      443,  443,  178,  178,  174,   49,   68,   84,  249,   84,
-      186,  241,  241,  249,  241,  116,   68,  384,  185,   68,
-       68,   68,   68,   68,   68,   68,   68,   68,   68,  300,
-      186,  299,   84,   84,   85,  141,  299,   85,   85,  116,
-
-       85,   85,   85,   85,  185,  241,   85,   85,  113,  384,
-      113,  113,  178,  300,  113,  113,  186,  797,  113,  385,
-       85,   85,   85,  124,  124,  124,  124,  124,  124,  124,
-      124,  124,  124,  113,  113,  159,  159,  159,  159,  159,
-      159,  159,  159,  159,  159,   85,   85,   86,  320,  385,
-       86,   86,   86,   86,   86,   86,   86,   86,   86,   86,
-       86,   86,   86,   86,  332,  334,   86,   86,   86,   86,
-       86,   86,   86,   86,   86,   86,   86,   86,   86,   86,
-       86,   86,   86,   86,   86,   86,   86,   86,  332,  334,
-       86,   86,   86,   86,   86,   86,   86,   86,   86,   86,
-
-       86,   86,   86,   86,   86,   86,   86,   89,  320,   89,
-       89,   89,   89,   89,   89,   89,   89,   89,   89,   89,
-      286,  286,  286,   89,   89,   89,   89,   89,  274,  274,
-      115,  274,  115,  115,  115,  342,  115,  115,  342,  386,
-      115,  199,  199,  199,  199,  199,  199,   89,   89,   89,
-       89,   89,   89,   90,  115,  115,  115,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-      369,  386,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   90,  369,   90,   90,   90,   90,   90,
-
-       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-       90,   90,   90,   93,   93,   93,   93,   93,   93,   93,
-       93,   93,   93,   93,  392,  374,  324,   93,   93,   93,
-       93,   93,  324,  356,  161,  161,   93,  207,  161,  161,
-      333,  795,  207,  207,  356,  333,  207,  145,  207,  374,
-      470,   93,   93,   93,   93,   93,   93,   99,  161,   99,
-       99,   99,   99,   99,   99,   99,   99,   99,   99,  118,
-      456,  118,  118,  118,  470,  118,  118,  145,  145,  118,
-      456,  145,  161,  218,  218,  218,  218,  218,  218,  145,
-      312,  392,  145,  118,  118,  118,  119,  119,  119,  119,
-
-      119,  119,  119,  119,  119,  119,  170,  170,  170,  170,
-      170,  170,  170,  170,  170,  170,  358,  358,  312,  163,
-      394,  163,  163,  163,  393,  163,  163,  786,  358,  163,
-      416,  394,  119,  120,  120,  120,  120,  120,  120,  120,
-      120,  120,  120,  163,  163,  163,  393,  120,  120,  120,
-      120,  120,  194,  194,  194,  194,  194,  194,  194,  194,
-      194,  194,  281,  281,  281,  281,  472,  444,  416,  444,
-      785,  120,  120,  120,  120,  120,  120,  128,  128,  128,
-      128,  128,  128,  128,  128,  128,  128,  128,  322,  475,
-      472,  128,  128,  128,  128,  128,  197,  197,  197,  197,
-
-      197,  197,  197,  197,  197,  197,  293,  293,  293,  293,
-      293,  293,  784,  475,  322,  128,  128,  128,  128,  128,
-      128,  129,  129,  129,  129,  129,  129,  129,  129,  129,
-      129,  129,  322,  546,  387,  129,  129,  129,  129,  129,
-      187,  311,  187,  187,  311,  189,  187,  187,  388,  449,
-      187,  189,  449,  388,  189,  360,  360,  189,  189,  129,
-      129,  129,  129,  129,  129,  187,  187,  360,  387,  462,
-      546,  189,  425,  189,  191,  311,  191,  191,  191,  462,
-      191,  191,  775,  425,  191,  198,  198,  198,  198,  198,
-      198,  198,  198,  198,  198,  429,  189,  189,  191,  191,
-
-      191,  192,  774,  461,  192,  192,  429,  192,  192,  192,
-      192,  193,  395,  192,  192,  193,  533,  395,  430,  430,
-      461,  193,  431,  431,  445,  447,  446,  192,  192,  192,
-      430,  446,  533,  446,  431,  193,  193,  214,  214,  214,
-      214,  214,  214,  214,  214,  214,  214,  459,  445,  447,
-      543,  772,  192,  192,  195,  195,  195,  195,  195,  195,
-      195,  195,  195,  195,  771,  543,  445,  447,  195,  195,
-      195,  195,  195,  215,  215,  215,  215,  215,  215,  215,
-      215,  215,  215,  329,  531,  329,  329,  329,  329,  329,
-      329,  476,  195,  195,  195,  195,  195,  195,  200,  528,
-
-      769,  459,  200,  200,  200,  200,  200,  200,  200,  200,
-      200,  200,  200,  200,  200,  476,  528,  200,  200,  200,
-      200,  200,  200,  200,  200,  200,  200,  200,  200,  200,
-      200,  200,  200,  200,  200,  200,  200,  200,  200,  531,
-      200,  200,  200,  200,  200,  200,  200,  200,  200,  200,
-      200,  200,  200,  200,  200,  200,  200,  200,  201,  201,
-      201,  201,  201,  201,  201,  201,  201,  201,  201,  581,
-      516,  581,  201,  201,  201,  201,  201,  217,  217,  217,
-      217,  217,  217,  217,  217,  217,  217,  366,  366,  366,
-      366,  366,  366,  450,  516,  451,  201,  201,  201,  201,
-
-      201,  201,  216,  768,  216,  216,  216,  216,  216,  216,
-      216,  216,  216,  216,  254,  448,  471,  450,  254,  451,
-      448,  471,  582,  582,  254,  290,  290,  290,  290,  290,
-      290,  290,  290,  290,  290,  450,  767,  451,  254,  254,
-      216,  219,  460,  219,  219,  219,  219,  219,  219,  219,
-      219,  219,  219,  460,  520,  524,  526,  219,  219,  219,
-      219,  219,  292,  292,  292,  292,  292,  292,  292,  292,
-      292,  292,  439,  439,  439,  439,  439,  439,  520,  524,
-      526,  219,  219,  219,  219,  219,  219,  222,  222,  222,
-      222,  222,  222,  222,  222,  222,  222,  222,  635,  635,
-
-      534,  222,  222,  222,  222,  222,  325,  325,  325,  325,
-      325,  325,  325,  325,  325,  325,  467,  534,  467,  467,
-      467,  467,  467,  467,  757,  222,  222,  222,  222,  222,
-      222,  224,  224,  224,  224,  224,  224,  224,  224,  224,
-      224,  224,  224,  584,  604,  584,  224,  224,  224,  224,
-      224,  357,  357,  357,  357,  357,  357,  357,  357,  357,
-      357,  484,  484,  484,  484,  484,  484,  591,  604,  591,
-      224,  224,  224,  224,  224,  224,  225,  225,  225,  225,
-      225,  225,  225,  225,  225,  225,  225,  585,  636,  636,
-      225,  225,  225,  225,  225,  359,  359,  359,  359,  359,
-
-      359,  359,  359,  359,  359,  491,  491,  491,  491,  491,
-      491,  585,  643,  643,  225,  225,  225,  225,  225,  225,
-      226,  226,  226,  226,  226,  226,  226,  226,  226,  226,
-      226,  651,  651,  585,  226,  226,  226,  226,  226,  363,
-      363,  363,  363,  363,  363,  363,  363,  609,  609,  609,
-      419,  363,  419,  419,  419,  419,  419,  419,  226,  226,
-      226,  226,  226,  226,  259,  756,  259,  259,  259,  259,
-      259,  259,  259,  259,  259,  259,  260,  260,  260,  260,
-      260,  260,  260,  260,  260,  260,  260,  642,  419,  642,
-      260,  260,  260,  260,  260,  365,  365,  365,  365,  365,
-
-      365,  365,  365,  365,  365,  498,  747,  498,  498,  498,
-      498,  498,  498,  745,  260,  260,  260,  260,  260,  260,
-      262,  262,  262,  262,  262,  262,  262,  262,  262,  262,
-      549,  549,  549,  549,  262,  262,  262,  262,  262,  432,
-      432,  432,  432,  432,  432,  432,  432,  432,  432,  510,
-      510,  510,  510,  510,  510,  694,  694,  744,  262,  262,
-      262,  262,  262,  262,  277,  277,  277,  277,  277,  277,
-      277,  277,  277,  277,  433,  433,  436,  436,  436,  436,
-      436,  436,  436,  436,  700,  700,  433,  555,  436,  438,
-      438,  438,  438,  438,  438,  438,  438,  438,  438,  555,
-
-      277,  285,  285,  285,  285,  285,  285,  285,  285,  285,
-      285,  285,  291,  291,  291,  291,  291,  291,  291,  291,
-      291,  291,  291,  291,  291,  703,  703,  645,  291,  291,
-      291,  291,  291,  463,  463,  463,  463,  463,  463,  463,
-      463,  463,  463,  515,  522,  583,  586,  743,  522,  515,
-      583,  645,  291,  291,  291,  291,  291,  291,  294,  294,
-      294,  294,  294,  294,  294,  294,  294,  294,  294,  294,
-      586,  590,  590,  294,  294,  294,  294,  294,  483,  483,
-      483,  483,  483,  483,  483,  483,  483,  483,  640,  644,
-      731,  640,  586,  499,  644,  753,  753,  294,  294,  294,
-
-      294,  294,  294,  295,  499,  295,  295,  295,  295,  295,
-      295,  295,  295,  295,  295,  330,  330,  330,  330,  330,
-      330,  330,  330,  330,  330,  705,  590,  647,  660,  330,
-      330,  330,  330,  330,  488,  488,  488,  488,  488,  488,
-      488,  488,  488,  488,  561,  561,  561,  561,  561,  561,
-      730,  647,  660,  330,  330,  330,  330,  330,  330,  331,
-      331,  331,  331,  331,  331,  331,  331,  331,  331,  699,
-      650,  699,  653,  331,  331,  331,  331,  331,  490,  490,
-      490,  490,  490,  490,  490,  490,  490,  490,  653,  705,
-      782,  782,  650,  500,  650,  650,  728,  331,  331,  331,
-
-      331,  331,  331,  346,  500,  346,  346,  346,  346,  346,
-      346,  346,  346,  346,  346,  347,  615,  347,  347,  347,
-      347,  347,  347,  347,  347,  347,  347,  348,  615,  348,
-      348,  348,  348,  348,  348,  348,  348,  348,  348,  351,
-      351,  351,  351,  351,  351,  351,  351,  351,  351,  351,
-      361,  361,  361,  361,  361,  361,  361,  361,  361,  361,
-      361,  361,  361,  801,  801,  641,  361,  361,  361,  361,
-      361,  494,  494,  494,  494,  494,  494,  494,  494,  494,
-      494,  578,  578,  578,  578,  578,  578,  665,  669,  641,
-      361,  361,  361,  361,  361,  361,  364,  364,  364,  364,
-
-      364,  364,  364,  364,  364,  364,  364,  364,  364,  501,
-      501,  641,  364,  364,  364,  364,  364,  502,  502,  504,
-      504,  501,  514,  519,  523,  665,  669,  902,  902,  502,
-      696,  504,  514,  519,  727,  523,  364,  364,  364,  364,
-      364,  364,  367,  367,  367,  367,  367,  367,  367,  367,
-      367,  367,  367,  367,  696,  720,  661,  367,  367,  367,
-      367,  367,  503,  503,  503,  503,  503,  503,  503,  503,
-      503,  503,  624,  624,  624,  624,  624,  624,  532,  652,
-      661,  367,  367,  367,  367,  367,  367,  368,  532,  368,
-      368,  368,  368,  368,  368,  368,  368,  368,  368,  398,
-
-      661,  398,  398,  398,  398,  398,  398,  398,  398,  398,
-      398,  399,  399,  399,  399,  399,  399,  399,  399,  399,
-      399,  668,  668,  668,  668,  399,  399,  399,  399,  399,
-      507,  507,  507,  507,  507,  507,  507,  507,  652,  903,
-      903,  631,  507,  631,  631,  631,  631,  631,  631,  399,
-      399,  399,  399,  399,  399,  415,  415,  415,  415,  415,
-      415,  415,  415,  415,  415,  509,  509,  509,  509,  509,
-      509,  509,  509,  509,  509,  552,  552,  552,  552,  552,
-      552,  552,  552,  552,  552,  659,  718,  659,  659,  659,
-      717,  415,  417,  616,  417,  417,  417,  417,  417,  417,
-
-      417,  417,  417,  417,  418,  616,  418,  418,  418,  418,
-      418,  418,  418,  418,  418,  418,  424,  424,  424,  424,
-      424,  424,  424,  424,  424,  424,  424,  721,  748,  759,
-      424,  424,  424,  424,  424,  554,  554,  554,  554,  554,
-      554,  554,  554,  554,  554,  751,  844,  751,  762,  844,
-      567,  721,  748,  759,  424,  424,  424,  424,  424,  424,
-      428,  567,  428,  428,  428,  428,  428,  428,  428,  428,
-      428,  428,  434,  434,  434,  434,  434,  434,  434,  434,
-      434,  434,  434,  434,  434,  592,  762,  662,  434,  434,
-      434,  434,  434,  558,  618,  558,  558,  558,  558,  558,
-
-      558,  847,  847,  847,  716,  558,  618,  592,  713,  592,
-      592,  662,  434,  434,  434,  434,  434,  434,  437,  437,
-      437,  437,  437,  437,  437,  437,  437,  437,  437,  437,
-      437,  711,  662,  592,  437,  437,  437,  437,  437,  560,
-      560,  560,  560,  560,  560,  560,  560,  560,  560,  598,
-      598,  598,  598,  598,  598,  598,  807,  706,  437,  437,
-      437,  437,  437,  437,  440,  440,  440,  440,  440,  440,
-      440,  440,  440,  440,  440,  440,  568,  569,  569,  440,
-      440,  440,  440,  440,  570,  570,  632,  568,  633,  569,
-      572,  572,  856,  702,  807,  856,  570,  632,  677,  633,
-
-      698,  750,  572,  440,  440,  440,  440,  440,  440,  441,
-      677,  441,  441,  441,  441,  441,  441,  441,  441,  441,
-      441,  442,  914,  914,  698,  750,  873,  442,  873,  936,
-      442,  442,  936,  442,  442,  442,  442,  442,  442,  442,
-      442,  442,  442,  442,  442,  442,  698,  750,  701,  442,
-      442,  442,  442,  442,  442,  442,  442,  442,  442,  442,
-      442,  442,  442,  442,  442,  442,  442,  442,  442,  442,
-      442,  442,  442,  442,  442,  442,  442,  442,  442,  442,
-      442,  442,  442,  442,  442,  442,  442,  442,  442,  442,
-      442,  482,  482,  482,  482,  482,  482,  482,  482,  482,
-
-      482,  482,  575,  575,  575,  575,  575,  575,  575,  575,
-      864,  864,  864,  678,  575,  577,  577,  577,  577,  577,
-      577,  577,  577,  577,  577,  678,  933,  933,  482,  489,
-      680,  489,  489,  489,  489,  489,  489,  489,  489,  489,
-      489,  489,  680,  695,  722,  489,  489,  489,  489,  489,
-      594,  594,  594,  594,  594,  594,  594,  594,  594,  594,
-      639,  639,  639,  639,  639,  639,  639,  639,  722,  489,
-      489,  489,  489,  489,  489,  492,  492,  492,  492,  492,
-      492,  492,  492,  492,  492,  492,  779,  788,  722,  492,
-      492,  492,  492,  492,  607,  607,  607,  607,  607,  607,
-
-      607,  607,  607,  607,  874,  885,  874,  885,  634,  634,
-      779,  788,  693,  492,  492,  492,  492,  492,  492,  493,
-      634,  493,  493,  493,  493,  493,  493,  493,  493,  493,
-      493,  505,  505,  505,  505,  505,  505,  505,  505,  505,
-      505,  505,  505,  505,  798,  723,  690,  505,  505,  505,
-      505,  505,  608,  608,  608,  608,  608,  608,  608,  608,
-      608,  608,  654,  689,  654,  654,  654,  663,  798,  723,
-      676,  505,  505,  505,  505,  505,  505,  508,  508,  508,
-      508,  508,  508,  508,  508,  508,  508,  508,  508,  508,
-      723,  663,  760,  508,  508,  508,  508,  508,  617,  617,
-
-      617,  617,  617,  617,  617,  617,  617,  617,  663,  934,
-      934,  655,  654,  655,  655,  655,  760,  508,  508,  508,
-      508,  508,  508,  511,  511,  511,  511,  511,  511,  511,
-      511,  511,  511,  511,  675,  781,  760,  673,  511,  511,
-      511,  511,  511,  621,  732,  621,  621,  621,  621,  621,
-      621,  886,  890,  886,  890,  621,  732,  672,  692,  781,
-      671,  655,  511,  511,  511,  511,  511,  511,  512,  692,
-      512,  512,  512,  512,  512,  512,  512,  512,  512,  512,
-      513,  781,  891,  895,  891,  895,  513,  712,  712,  513,
-      513,  712,  513,  513,  513,  513,  513,  513,  513,  513,
-
-      513,  513,  513,  513,  513,  712,  712,  712,  513,  513,
-      513,  513,  513,  513,  513,  513,  513,  513,  513,  513,
-      513,  513,  513,  513,  513,  513,  513,  513,  513,  513,
-      513,  513,  513,  513,  513,  513,  513,  513,  513,  513,
-      513,  513,  513,  513,  513,  513,  513,  513,  513,  513,
-      537,  537,  537,  537,  537,  537,  537,  537,  537,  537,
-      537,  542,  657,  656,  733,  542,  542,  542,  542,  542,
-      542,  542,  542,  542,  542,  542,  733,  542,  649,  630,
-      542,  542,  542,  542,  542,  542,  542,  542,  542,  542,
-      542,  542,  542,  542,  542,  542,  542,  542,  542,  542,
-
-      542,  542,  629,  542,  542,  542,  542,  542,  542,  542,
-      542,  542,  542,  542,  542,  542,  542,  542,  542,  542,
-      542,  545,  545,  545,  545,  545,  545,  545,  545,  545,
-      545,  623,  623,  623,  623,  623,  623,  623,  623,  623,
-      623,  627,  627,  627,  627,  627,  627,  627,  627,  627,
-      627,  686,  686,  686,  686,  686,  686,  545,  547,  547,
-      547,  547,  547,  547,  547,  547,  547,  547,  547,  670,
-      670,  670,  670,  670,  670,  670,  670,  670,  670,  674,
-      628,  674,  674,  674,  674,  674,  674,  719,  614,  719,
-      719,  719,  719,  719,  719,  547,  556,  735,  556,  556,
-
-      556,  556,  556,  556,  556,  556,  556,  556,  556,  735,
-      612,  611,  556,  556,  556,  556,  556,  679,  679,  679,
-      679,  679,  679,  679,  679,  679,  679,  707,  610,  707,
-      707,  707,  898,  908,  898,  908,  556,  556,  556,  556,
-      556,  556,  559,  773,  559,  559,  559,  559,  559,  559,
-      559,  559,  559,  559,  559,  773,  602,  601,  559,  559,
-      559,  559,  559,  683,  600,  683,  683,  683,  683,  683,
-      683,  909,  917,  909,  917,  683,  918,  707,  918,  921,
-      599,  921,  559,  559,  559,  559,  559,  559,  562,  562,
-      562,  562,  562,  562,  562,  562,  562,  562,  562,  927,
-
-      597,  927,  562,  562,  562,  562,  562,  685,  685,  685,
-      685,  685,  685,  685,  685,  685,  685,  596,  928,  708,
-      928,  708,  708,  708,  595,  593,  562,  562,  562,  562,
-      562,  562,  563,  589,  563,  563,  563,  563,  563,  563,
-      563,  563,  563,  563,  566,  588,  566,  566,  566,  566,
-      566,  566,  566,  566,  566,  566,  573,  573,  573,  573,
-      573,  573,  573,  573,  573,  573,  573,  573,  573,  708,
-      587,  571,  573,  573,  573,  573,  573,  709,  565,  709,
-      709,  709,  710,  564,  710,  710,  710,  741,  741,  741,
-      741,  741,  741,  930,  551,  930,  573,  573,  573,  573,
-
-      573,  573,  576,  576,  576,  576,  576,  576,  576,  576,
-      576,  576,  576,  576,  938,  939,  938,  939,  576,  576,
-      576,  576,  576,  942,  550,  544,  942,  709,  541,  943,
-      942,  943,  710,  746,  746,  746,  746,  746,  746,  746,
-      540,  539,  576,  576,  576,  576,  576,  576,  579,  538,
-      579,  579,  579,  579,  579,  579,  579,  579,  579,  579,
-      580,  714,  536,  714,  714,  714,  580,  714,  714,  580,
-      580,  714,  580,  580,  580,  580,  580,  580,  580,  580,
-      580,  580,  580,  580,  580,  714,  714,  714,  580,  580,
-      580,  580,  580,  580,  580,  580,  580,  580,  580,  580,
-
-      580,  580,  580,  580,  580,  580,  580,  580,  580,  580,
-      580,  580,  580,  580,  580,  580,  580,  580,  580,  580,
-      580,  580,  580,  580,  580,  580,  580,  580,  580,  580,
-      603,  770,  535,  770,  770,  770,  770,  770,  770,  603,
-      944,  530,  944,  603,  603,  603,  603,  603,  603,  603,
-      603,  603,  603,  603,  603,  603,  529,  497,  603,  603,
-      603,  603,  603,  603,  603,  603,  603,  603,  603,  603,
-      603,  603,  603,  603,  603,  603,  603,  603,  603,  603,
-      496,  603,  603,  603,  603,  603,  603,  603,  603,  603,
-      603,  603,  603,  603,  603,  603,  603,  603,  603,  606,
-
-      495,  606,  606,  606,  606,  606,  606,  606,  606,  606,
-      606,  715,  715,  715,  715,  715,  715,  715,  715,  715,
-      715,  734,  734,  734,  734,  734,  734,  734,  734,  734,
-      734,  814,  814,  814,  814,  814,  814,  606,  613,  487,
-      613,  613,  613,  613,  613,  613,  613,  613,  613,  613,
-      619,  486,  619,  619,  619,  619,  619,  619,  619,  619,
-      619,  619,  619,  949,  485,  949,  619,  619,  619,  619,
-      619,  738,  481,  738,  738,  738,  738,  738,  738,  950,
-      474,  950,  778,  738,  778,  778,  778,  778,  778,  778,
-      619,  619,  619,  619,  619,  619,  622,  473,  622,  622,
-
-      622,  622,  622,  622,  622,  622,  622,  622,  622,  469,
-      468,  466,  622,  622,  622,  622,  622,  740,  740,  740,
-      740,  740,  740,  740,  740,  740,  740,  787,  465,  787,
-      787,  787,  787,  787,  787,  464,  622,  622,  622,  622,
-      622,  622,  625,  625,  625,  625,  625,  625,  625,  625,
-      625,  625,  625,  458,  457,  455,  625,  625,  625,  625,
-      625,  754,  754,  754,  754,  754,  754,  754,  754,  754,
-      754,  454,  765,  453,  765,  765,  765,  765,  765,  765,
-      625,  625,  625,  625,  625,  625,  626,  452,  626,  626,
-      626,  626,  626,  626,  626,  626,  626,  626,  637,  637,
-
-      637,  637,  637,  637,  637,  637,  637,  637,  637,  637,
-      765,  427,  426,  423,  637,  637,  637,  637,  637,  755,
-      755,  755,  755,  755,  755,  755,  755,  755,  755,  820,
-      422,  820,  820,  820,  820,  820,  820,  421,  637,  637,
-      637,  637,  637,  637,  658,  420,  658,  658,  658,  658,
-      658,  658,  658,  658,  658,  658,  664,  664,  664,  664,
-      664,  664,  664,  664,  664,  664,  766,  766,  766,  766,
-      766,  766,  766,  766,  766,  766,  783,  783,  783,  783,
-      783,  783,  783,  783,  783,  783,  832,  832,  832,  832,
-      832,  832,  664,  666,  414,  666,  666,  666,  666,  666,
-
-      666,  666,  666,  666,  666,  792,  792,  792,  792,  792,
-      792,  792,  792,  792,  792,  793,  793,  793,  793,  793,
-      793,  793,  793,  793,  793,  413,  948,  412,  411,  948,
-      410,  666,  681,  948,  681,  681,  681,  681,  681,  681,
-      681,  681,  681,  681,  681,  409,  408,  407,  681,  681,
-      681,  681,  681,  794,  794,  794,  794,  794,  794,  794,
-      794,  794,  794,  810,  406,  810,  810,  810,  810,  810,
-      810,  405,  681,  681,  681,  681,  681,  681,  684,  404,
-      684,  684,  684,  684,  684,  684,  684,  684,  684,  684,
-      684,  403,  402,  401,  684,  684,  684,  684,  684,  400,
-
-      397,  810,  812,  812,  812,  812,  812,  812,  812,  812,
-      812,  812,  396,  391,  390,  389,  383,  381,  684,  684,
-      684,  684,  684,  684,  687,  687,  687,  687,  687,  687,
-      687,  687,  687,  687,  380,  379,  378,  377,  687,  687,
-      687,  687,  687,  813,  813,  813,  813,  813,  813,  813,
-      813,  813,  813,  376,  373,  372,  829,  829,  829,  829,
-      829,  829,  687,  687,  687,  687,  687,  687,  688,  371,
-      688,  688,  688,  688,  688,  688,  688,  688,  688,  688,
-      691,  691,  691,  691,  691,  691,  691,  691,  691,  691,
-      691,  724,  829,  724,  724,  724,  724,  724,  724,  724,
-
-      724,  724,  724,  725,  355,  725,  725,  725,  725,  725,
-      725,  725,  725,  725,  725,  726,  354,  726,  726,  726,
-      726,  726,  726,  726,  726,  726,  726,  729,  353,  729,
-      729,  729,  729,  729,  729,  729,  729,  729,  729,  736,
-      352,  736,  736,  736,  736,  736,  736,  736,  736,  736,
-      736,  736,  350,  349,  345,  736,  736,  736,  736,  736,
-      816,  816,  816,  816,  816,  816,  816,  816,  816,  816,
-      344,  343,  341,  340,  339,  338,  337,  336,  335,  736,
-      736,  736,  736,  736,  736,  739,  328,  739,  739,  739,
-      739,  739,  739,  739,  739,  739,  739,  327,  326,  319,
-
-      318,  739,  739,  739,  739,  739,  824,  824,  824,  824,
-      824,  824,  824,  824,  824,  824,  317,  316,  315,  309,
-      307,  306,  305,  304,  303,  739,  739,  739,  739,  739,
-      739,  758,  302,  758,  758,  758,  758,  758,  758,  758,
-      758,  758,  758,  761,  301,  761,  761,  761,  761,  761,
-      761,  761,  761,  761,  761,  763,  298,  763,  763,  763,
-      763,  763,  763,  763,  763,  763,  763,  764,  296,  764,
-      764,  764,  764,  764,  764,  764,  764,  764,  764,  776,
-      288,  776,  776,  776,  776,  776,  776,  776,  776,  776,
-      776,  789,  287,  789,  789,  789,  789,  789,  789,  789,
-
-      789,  789,  789,  790,  284,  790,  790,  790,  790,  790,
-      790,  790,  790,  790,  790,  791,  283,  791,  791,  791,
-      791,  791,  791,  791,  791,  791,  791,  805,  276,  805,
-      805,  805,  805,  805,  805,  805,  805,  805,  805,  806,
-      275,  806,  806,  806,  806,  806,  806,  806,  806,  806,
-      806,  808,  273,  808,  808,  808,  808,  808,  808,  808,
-      808,  808,  808,  809,  272,  809,  809,  809,  809,  809,
-      809,  809,  809,  809,  809,  821,  821,  821,  821,  821,
-      821,  821,  821,  821,  821,  825,  825,  825,  825,  825,
-      825,  825,  825,  825,  825,  826,  826,  826,  826,  826,
-
-      826,  826,  826,  826,  826,  271,  270,  269,  268,  267,
-      266,  821,  822,  822,  822,  822,  822,  822,  822,  822,
-      822,  822,  831,  831,  831,  831,  831,  831,  831,  831,
-      831,  831,  265,  264,  261,  258,  257,  256,  250,  247,
-      246,  245,  244,  243,  240,  239,  238,  237,  822,  823,
-      823,  823,  823,  823,  823,  823,  823,  823,  823,  236,
-      235,  234,  233,  232,  231,  230,  229,  228,  227,  221,
-      220,  213,  212,  211,  210,  209,  208,  206,  205,  204,
-      202,  196,  188,  184,  180,  823,  828,  828,  828,  828,
-      828,  828,  828,  828,  828,  828,  179,  177,  173,  166,
-
-      162,  160,  158,  150,  149,  148,  147,  146,  140,  139,
-      138,  137,  136,  134,  133,  132,  131,  130,  126,  122,
-      121,  117,  828,  834,  834,  834,  834,  834,  834,  834,
-      834,  834,  834,  834,  834,  834,  834,  834,  834,  834,
-      834,  834,  834,  834,  835,  835,  835,  835,  835,  835,
-      835,  835,  835,  835,  835,  835,  835,  835,  835,  835,
-      835,  835,  835,  835,  835,  836,  836,  836,  836,  836,
-      836,  836,  836,  836,  836,  836,  836,  836,  836,  836,
-      836,  836,  836,  836,  836,  836,  837,  837,  837,  837,
-      837,  837,  837,  837,  837,  837,  837,  837,  837,  837,
-
-      837,  837,  837,  837,  837,  837,  837,  838,  114,  111,
-      106,  105,  104,  102,  838,   98,  838,  838,  838,  838,
-       97,   96,  838,  838,  838,  838,  838,  838,  839,  839,
-      839,  839,  839,  839,  839,  839,  839,  839,  839,  839,
-      839,  839,  839,  839,  839,  839,  839,  839,  839,  840,
-       95,   94,   91,   78,  840,   71,  840,   64,  840,  840,
-      840,  840,  840,   60,  840,  840,  840,  840,  840,  840,
-      841,   59,   57,   56,   54,   52,   44,  841,   43,  841,
-      841,  841,  841,   42,   40,  841,  841,  841,  841,  841,
-      841,  842,   39,   35,  842,  842,   31,  842,  842,   25,
-
-      842,  842,  842,  842,   19,   17,  842,  842,  842,  842,
-      842,  842,  843,  843,   16,  843,   15,    0,    0,  843,
-      845,    0,    0,  845,  845,    0,  845,  845,    0,  845,
-      845,  845,  845,    0,    0,  845,  845,  845,  845,  845,
-      845,  846,    0,    0,  846,  846,    0,  846,  846,    0,
-      846,  846,  846,  846,    0,  846,  846,  846,    0,  846,
-      846,  846,  848,    0,    0,  848,    0,    0,  848,  848,
-        0,  848,  848,  848,  848,  848,    0,  848,  848,  848,
-      848,  848,  848,  849,  849,  849,  849,  849,  849,  849,
-      849,  849,  849,  849,  849,  849,  849,  849,  849,  849,
-
-      849,  849,  849,  849,  850,  850,    0,  850,    0,  850,
-      850,  850,  850,  850,  850,  850,  850,  850,  850,  850,
-      850,  850,  850,  850,  850,  851,    0,    0,    0,    0,
-      851,    0,  851,    0,  851,  851,  851,  851,  851,    0,
-      851,  851,  851,  851,  851,  851,  852,    0,    0,    0,
-        0,    0,    0,  852,    0,  852,  852,  852,  852,    0,
-      852,  852,  852,  852,  852,  852,  852,  853,    0,    0,
-      853,  853,    0,  853,  853,    0,  853,  853,  853,  853,
-        0,  853,  853,  853,  853,  853,  853,  853,  854,  854,
-      854,  854,  854,  854,  854,  854,  854,  854,  854,  854,
-
-      854,  854,  854,  854,  854,  854,  854,  854,  854,  855,
-      855,    0,  855,  855,  855,  855,  855,  855,  855,  855,
-      855,  855,  855,  855,  855,  855,  855,  855,  855,  855,
-      857,    0,    0,  857,  857,    0,  857,  857,    0,  857,
-      857,  857,  857,    0,    0,  857,  857,  857,  857,  857,
-      857,  858,  858,    0,  858,    0,    0,    0,  858,  859,
-      859,    0,  859,    0,    0,    0,  859,  860,  860,  860,
-        0,  860,    0,    0,    0,  860,  861,    0,    0,  861,
-      861,    0,  861,  861,    0,  861,  861,  861,  861,    0,
-        0,  861,  861,  861,  861,  861,  861,  862,    0,    0,
-
-      862,  862,    0,  862,  862,    0,  862,  862,  862,  862,
-        0,    0,  862,  862,  862,  862,  862,  862,  863,    0,
-        0,  863,  863,    0,  863,  863,    0,  863,  863,  863,
-      863,    0,  863,  863,  863,    0,  863,  863,  863,  865,
-        0,    0,  865,    0,    0,  865,  865,    0,  865,  865,
-      865,  865,  865,    0,  865,  865,  865,  865,  865,  865,
-      866,    0,    0,    0,    0,    0,    0,  866,    0,  866,
-      866,  866,  866,    0,    0,  866,  866,  866,  866,  866,
-      866,  867,    0,    0,    0,    0,    0,    0,  867,    0,
-      867,  867,  867,  867,    0,  867,  867,  867,  867,  867,
-
-      867,  867,  868,    0,    0,  868,  868,    0,  868,  868,
-        0,  868,  868,  868,  868,    0,  868,  868,  868,  868,
-      868,  868,  868,  869,    0,    0,  869,  869,    0,  869,
-      870,  870,  870,  870,  870,  870,  870,  870,  870,  870,
-      870,  870,  870,  870,  870,  870,  870,  870,  870,  870,
-      870,  871,  871,    0,  871,    0,    0,    0,  871,  872,
-      872,  872,    0,  872,    0,    0,    0,  872,  875,  875,
-        0,  875,    0,    0,    0,  875,  876,  876,    0,  876,
-        0,    0,    0,  876,  877,  877,    0,  877,    0,    0,
-        0,  877,  878,  878,  878,    0,  878,    0,    0,    0,
-
-      878,  879,    0,    0,  879,  879,    0,  879,  880,  880,
-        0,  880,    0,    0,    0,  880,  881,  881,    0,  881,
-        0,    0,    0,  881,  882,  882,    0,  882,    0,    0,
-        0,  882,  883,  883,  883,    0,  883,    0,    0,    0,
-      883,  884,  884,  884,  884,    0,  884,    0,    0,    0,
-      884,  887,  887,    0,  887,    0,    0,    0,  887,  888,
-      888,    0,  888,    0,    0,    0,  888,  889,  889,    0,
-      889,    0,    0,    0,  889,  892,  892,  892,    0,  892,
-        0,    0,    0,  892,  893,  893,  893,  893,    0,  893,
-        0,    0,    0,  893,  894,  894,  894,  894,  894,  894,
+       34,   34,   34,   34,   34,   34,   34,   34,   34,   34,
+       34,   38,   38,   38,   38,   38,   38,   38,   38,   38,
+       38,   38,  258,  254,  258,   38,   38,   38,   38,   38,
+       38,  259,  398,  181,  181,   38,  111,  111,  111,  111,
+      111,  111,  111,  111,  111,  111,  259,  261,  331,  331,
+       38,   38,   38,   38,   38,   38,   46,   46,   46,   46,
+       46,  261,   46,   46,  845,  398,   46,  125,  125,  125,
+      125,  125,  125,  125,  125,  125,  125,  254,  185,  832,
+
+       46,   46,   46,   47,  181,   47,   47,   47,   47,   47,
+       47,   47,   47,   47,   47,   50,   68,   68,   68,  114,
+       68,  294,  294,  294,   68,   50,   68,  479,   50,   50,
+       50,   50,   50,   50,   50,   50,   50,   50,  148,  114,
+       68,   68,  282,  282,  479,  282,  105,  185,  105,  105,
+      105,   85,  105,  105,  188,  177,  105,   85,  177,  177,
+       85,  305,  330,   85,   85,  177,  114,   68,  148,  148,
+      105,  105,  105,  148,  188,   50,   69,   85,  309,   85,
+      177,  148,  308,  290,  148,  305,   69,  308,  227,   69,
+       69,   69,   69,   69,   69,   69,   69,   69,   69,  227,
+
+      324,  188,  309,   85,   85,   86,  324,  831,   86,   86,
+      290,   86,   86,   86,   86,  344,  297,   86,   86,  115,
+      344,  115,  115,  330,  334,  115,  115,  297,  400,  115,
+      334,   86,   86,   86,  126,  126,  126,  126,  126,  126,
+      126,  126,  126,  126,  115,  115,  162,  162,  162,  162,
+      162,  162,  162,  162,  162,  162,  828,   86,   86,   87,
+      333,  400,   87,   87,   87,   87,   87,   87,   87,   87,
+       87,   87,   87,   87,   87,   87,  333,  342,   87,   87,
+       87,   87,   87,   87,   87,   87,   87,   87,   87,   87,
+       87,   87,   87,   87,   87,   87,   87,   87,   87,   87,
 
+       87,  342,  399,   87,   87,   87,   87,   87,   87,   87,
+       87,   87,   87,   87,   87,   87,   87,   87,   87,   87,
+       90,  345,   90,   90,   90,   90,   90,   90,   90,   90,
+       90,   90,   90,  399,  567,  567,   90,   90,   90,   90,
+       90,   90,  368,  825,  117,  345,  117,  117,  117,  321,
+      117,  117,  321,  368,  117,  202,  202,  202,  202,  202,
+      202,   90,   90,   90,   90,   90,   90,   91,  117,  117,
+      117,   91,   91,   91,   91,   91,   91,   91,   91,   91,
+       91,   91,   91,   91,  321,  381,   91,   91,   91,   91,
+       91,   91,   91,   91,   91,   91,   91,   91,   91,   91,
+
+       91,   91,   91,   91,   91,   91,   91,   91,   91,  381,
+       91,   91,   91,   91,   91,   91,   91,   91,   91,   91,
+       91,   91,   91,   91,   91,   91,   91,   91,   95,   95,
+       95,   95,   95,   95,   95,   95,   95,   95,   95,  406,
+      606,  606,   95,   95,   95,   95,   95,   95,  402,  823,
+      118,  118,   95,  402,  118,  118,  173,  173,  173,  173,
+      173,  173,  173,  173,  173,  173,  387,   95,   95,   95,
+       95,   95,   95,  101,  118,  101,  101,  101,  101,  101,
+      101,  101,  101,  101,  101,  120,  189,  120,  120,  120,
+      387,  120,  120,  247,  247,  120,  247,  401,  474,  118,
+
+      222,  222,  222,  222,  222,  222,  189,  406,  474,  120,
+      120,  120,  121,  121,  121,  121,  121,  121,  121,  121,
+      121,  121,  164,  164,  211,  211,  164,  164,  247,  814,
+      211,  211,  401,  189,  211,  480,  211,  166,  541,  166,
+      166,  166,  541,  166,  166,  480,  164,  166,  432,  121,
+      122,  122,  122,  122,  122,  122,  122,  122,  122,  122,
+      536,  166,  166,  166,  122,  122,  122,  122,  122,  122,
+      536,  164,  197,  197,  197,  197,  197,  197,  197,  197,
+      197,  197,  289,  289,  289,  289,  605,  432,  605,  122,
+      122,  122,  122,  122,  122,  130,  130,  130,  130,  130,
+
+      130,  130,  130,  130,  130,  130,  332,  813,  407,  130,
+      130,  130,  130,  130,  130,  200,  200,  200,  200,  200,
+      200,  200,  200,  200,  200,  301,  301,  301,  301,  301,
+      301,  407,  554,  332,  130,  130,  130,  130,  130,  130,
+      131,  131,  131,  131,  131,  131,  131,  131,  131,  131,
+      131,  332,  370,  370,  131,  131,  131,  131,  131,  131,
+      190,  408,  190,  190,  370,  192,  190,  190,  409,  477,
+      190,  192,  408,  409,  192,  372,  372,  192,  192,  131,
+      131,  131,  131,  131,  131,  190,  190,  372,  554,  459,
+      196,  192,  441,  192,  196,  194,  812,  194,  194,  194,
+
+      196,  194,  194,  441,  339,  194,  339,  339,  339,  339,
+      339,  339,  445,  459,  196,  196,  478,  192,  192,  194,
+      194,  194,  195,  445,  477,  195,  195,  478,  195,  195,
+      195,  195,  459,  803,  195,  195,  201,  201,  201,  201,
+      201,  201,  201,  201,  201,  201,  802,  460,  195,  195,
+      195,  218,  218,  218,  218,  218,  218,  218,  218,  218,
+      218,  219,  219,  219,  219,  219,  219,  219,  219,  219,
+      219,  460,  556,  800,  195,  195,  198,  198,  198,  198,
+      198,  198,  198,  198,  198,  198,  661,  661,  556,  460,
+      198,  198,  198,  198,  198,  198,  221,  221,  221,  221,
+
+      221,  221,  221,  221,  221,  221,  378,  378,  378,  378,
+      378,  378,  446,  446,  462,  198,  198,  198,  198,  198,
+      198,  203,  662,  662,  446,  203,  203,  203,  203,  203,
+      203,  203,  203,  203,  203,  203,  203,  203,  462,  465,
+      203,  203,  203,  203,  203,  203,  203,  203,  203,  203,
+      203,  203,  203,  203,  203,  203,  203,  203,  203,  203,
+      203,  203,  203,  465,  203,  203,  203,  203,  203,  203,
+      203,  203,  203,  203,  203,  203,  203,  203,  203,  203,
+      203,  203,  204,  204,  204,  204,  204,  204,  204,  204,
+      204,  204,  204,  799,  466,  461,  204,  204,  204,  204,
+
+      204,  204,  298,  298,  298,  298,  298,  298,  298,  298,
+      298,  298,  573,  573,  573,  573,  447,  447,  466,  461,
+      463,  204,  204,  204,  204,  204,  204,  220,  447,  220,
+      220,  220,  220,  220,  220,  220,  220,  220,  220,  260,
+      461,  467,  466,  260,  463,  551,  671,  671,  540,  260,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      540,  463,  551,  260,  260,  467,  220,  223,  519,  223,
+      223,  223,  223,  223,  223,  223,  223,  223,  223,  519,
+      797,  467,  468,  223,  223,  223,  223,  223,  223,  335,
+      335,  335,  335,  335,  335,  335,  335,  335,  335,  455,
+
+      455,  455,  455,  455,  455,  796,  468,  570,  223,  223,
+      223,  223,  223,  223,  226,  226,  226,  226,  226,  226,
+      226,  226,  226,  226,  226,  469,  486,  489,  226,  226,
+      226,  226,  226,  226,  369,  369,  369,  369,  369,  369,
+      369,  369,  369,  369,  609,  570,  609,  491,  492,  469,
+      486,  489,  491,  226,  226,  226,  226,  226,  226,  228,
+      228,  228,  228,  228,  228,  228,  228,  228,  228,  228,
+      228,  616,  492,  616,  228,  228,  228,  228,  228,  228,
+      371,  371,  371,  371,  371,  371,  371,  371,  371,  371,
+      485,  795,  485,  485,  485,  485,  485,  485,  785,  228,
+
+      228,  228,  228,  228,  228,  229,  229,  229,  229,  229,
+      229,  229,  229,  229,  229,  229,  495,  496,  533,  229,
+      229,  229,  229,  229,  229,  375,  375,  375,  375,  375,
+      375,  375,  375,  537,  635,  635,  635,  375,  538,  537,
+      495,  496,  533,  784,  229,  229,  229,  229,  229,  229,
+      230,  230,  230,  230,  230,  230,  230,  230,  230,  230,
+      230,  668,  538,  668,  230,  230,  230,  230,  230,  230,
+      377,  377,  377,  377,  377,  377,  377,  377,  377,  377,
+      435,  775,  435,  435,  435,  435,  435,  435,  773,  230,
+      230,  230,  230,  230,  230,  265,  543,  265,  265,  265,
+
+      265,  265,  265,  265,  265,  265,  265,  266,  266,  266,
+      266,  266,  266,  266,  266,  266,  266,  266,  772,  435,
+      543,  266,  266,  266,  266,  266,  266,  448,  448,  448,
+      448,  448,  448,  448,  448,  448,  448,  504,  504,  504,
+      504,  504,  504,  679,  679,  771,  266,  266,  266,  266,
+      266,  266,  268,  268,  268,  268,  268,  268,  268,  268,
+      268,  268,  449,  449,  547,  759,  268,  268,  268,  268,
+      268,  268,  520,  557,  449,  452,  452,  452,  452,  452,
+      452,  452,  452,  520,  545,  722,  722,  452,  547,  545,
+      557,  268,  268,  268,  268,  268,  268,  285,  285,  285,
+
+      285,  285,  285,  285,  285,  285,  285,  454,  454,  454,
+      454,  454,  454,  454,  454,  454,  454,  481,  481,  481,
+      481,  481,  481,  481,  481,  481,  481,  511,  511,  511,
+      511,  511,  511,  758,  285,  293,  293,  293,  293,  293,
+      293,  293,  293,  293,  293,  293,  299,  299,  299,  299,
+      299,  299,  299,  299,  299,  299,  299,  299,  299,  549,
+      680,  566,  299,  299,  299,  299,  299,  299,  503,  503,
+      503,  503,  503,  503,  503,  503,  503,  503,  566,  608,
+      756,  464,  666,  549,  608,  666,  755,  299,  299,  299,
+      299,  299,  299,  302,  302,  302,  302,  302,  302,  302,
+
+      302,  302,  302,  302,  302,  464,  521,  521,  302,  302,
+      302,  302,  302,  302,  672,  748,  607,  464,  521,  672,
+      680,  746,  464,  508,  508,  508,  508,  508,  508,  508,
+      508,  508,  508,  302,  302,  302,  302,  302,  302,  303,
+      607,  303,  303,  303,  303,  303,  303,  303,  303,  303,
+      303,  340,  340,  340,  340,  340,  340,  340,  340,  340,
+      340,  745,  727,  607,  727,  340,  340,  340,  340,  340,
+      340,  510,  510,  510,  510,  510,  510,  510,  510,  510,
+      510,  518,  610,  518,  518,  518,  518,  518,  518,  693,
+      340,  340,  340,  340,  340,  340,  341,  341,  341,  341,
+
+      341,  341,  341,  341,  341,  341,  610,  744,  629,  630,
+      341,  341,  341,  341,  341,  341,  514,  514,  514,  514,
+      514,  514,  514,  514,  514,  514,  728,  728,  693,  610,
+      522,  522,  629,  630,  741,  341,  341,  341,  341,  341,
+      341,  358,  522,  358,  358,  358,  358,  358,  358,  358,
+      358,  358,  358,  359,  577,  359,  359,  359,  359,  359,
+      359,  359,  359,  359,  359,  360,  577,  360,  360,  360,
+      360,  360,  360,  360,  360,  360,  360,  363,  363,  363,
+      363,  363,  363,  363,  363,  363,  363,  363,  373,  373,
+      373,  373,  373,  373,  373,  373,  373,  373,  373,  373,
+
+      373,  615,  615,  611,  373,  373,  373,  373,  373,  373,
+      523,  523,  523,  523,  523,  523,  523,  523,  523,  523,
+      530,  530,  530,  530,  530,  530,  779,  611,  779,  373,
+      373,  373,  373,  373,  373,  376,  376,  376,  376,  376,
+      376,  376,  376,  376,  376,  376,  376,  376,  524,  524,
+      611,  376,  376,  376,  376,  376,  376,  615,  579,  542,
+      524,  527,  527,  527,  527,  527,  527,  527,  527,  542,
+      579,  669,  667,  527,  731,  731,  376,  376,  376,  376,
+      376,  376,  379,  379,  379,  379,  379,  379,  379,  379,
+      379,  379,  379,  379,  739,  669,  667,  379,  379,  379,
+
+      379,  379,  379,  529,  529,  529,  529,  529,  529,  529,
+      529,  529,  529,  696,  696,  696,  696,  673,  546,  667,
+      781,  781,  379,  379,  379,  379,  379,  379,  380,  546,
+      380,  380,  380,  380,  380,  380,  380,  380,  380,  380,
+      412,  673,  412,  412,  412,  412,  412,  412,  412,  412,
+      412,  412,  413,  413,  413,  413,  413,  413,  413,  413,
+      413,  413,  555,  733,  734,  675,  413,  413,  413,  413,
+      413,  413,  555,  576,  576,  576,  576,  576,  576,  576,
+      576,  576,  576,  585,  585,  585,  585,  585,  585,  675,
+      730,  413,  413,  413,  413,  413,  413,  431,  431,  431,
+
+      431,  431,  431,  431,  431,  431,  431,  578,  578,  578,
+      578,  578,  578,  578,  578,  578,  578,  582,  641,  582,
+      582,  582,  582,  582,  582,  591,  810,  810,  733,  582,
+      641,  697,  681,  790,  431,  433,  591,  433,  433,  433,
+      433,  433,  433,  433,  433,  433,  433,  434,  681,  434,
+      434,  434,  434,  434,  434,  434,  434,  434,  434,  440,
+      440,  440,  440,  440,  440,  440,  440,  440,  440,  440,
+      697,  678,  790,  440,  440,  440,  440,  440,  440,  584,
+      584,  584,  584,  584,  584,  584,  584,  584,  584,  806,
+      806,  806,  806,  678,  592,  678,  678,  729,  440,  440,
+
+      440,  440,  440,  440,  444,  592,  444,  444,  444,  444,
+      444,  444,  444,  444,  444,  444,  450,  450,  450,  450,
+      450,  450,  450,  450,  450,  450,  450,  450,  450,  593,
+      593,  688,  450,  450,  450,  450,  450,  450,  594,  594,
+      642,  593,  596,  596,  602,  602,  602,  602,  602,  602,
+      594,  723,  642,  691,  596,  688,  721,  450,  450,  450,
+      450,  450,  450,  453,  453,  453,  453,  453,  453,  453,
+      453,  453,  453,  453,  453,  453,  902,  691,  902,  453,
+      453,  453,  453,  453,  453,  599,  599,  599,  599,  599,
+      599,  599,  599,  829,  829,  691,  718,  599,  650,  650,
+
+      650,  650,  650,  650,  453,  453,  453,  453,  453,  453,
+      456,  456,  456,  456,  456,  456,  456,  456,  456,  456,
+      456,  456,  617,  717,  690,  456,  456,  456,  456,  456,
+      456,  601,  601,  601,  601,  601,  601,  601,  601,  601,
+      601,  875,  875,  875,  617,  644,  617,  617,  690,  689,
+      456,  456,  456,  456,  456,  456,  457,  644,  457,  457,
+      457,  457,  457,  457,  457,  457,  457,  457,  458,  458,
+      690,  617,  872,  689,  458,  872,  884,  458,  458,  884,
+      458,  458,  458,  458,  458,  458,  458,  458,  458,  458,
+      458,  458,  458,  458,  689,  704,  458,  458,  458,  458,
+
+      458,  458,  458,  458,  458,  458,  458,  458,  458,  458,
+      458,  458,  458,  458,  458,  458,  458,  458,  458,  458,
+      458,  458,  458,  458,  458,  458,  458,  458,  458,  458,
+      458,  458,  458,  458,  458,  458,  458,  458,  458,  502,
+      502,  502,  502,  502,  502,  502,  502,  502,  502,  502,
+      619,  619,  619,  619,  619,  619,  619,  619,  619,  619,
+      623,  623,  623,  623,  623,  623,  623,  633,  633,  633,
+      633,  633,  633,  633,  633,  633,  633,  502,  509,  705,
+      509,  509,  509,  509,  509,  509,  509,  509,  509,  509,
+      509,  705,  931,  931,  509,  509,  509,  509,  509,  509,
+
+      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
+      657,  703,  657,  657,  657,  657,  657,  657,  701,  509,
+      509,  509,  509,  509,  509,  512,  512,  512,  512,  512,
+      512,  512,  512,  512,  512,  512,  700,  724,  749,  512,
+      512,  512,  512,  512,  512,  643,  643,  643,  643,  643,
+      643,  643,  643,  643,  643,  687,  699,  687,  687,  687,
+      658,  724,  749,  685,  512,  512,  512,  512,  512,  512,
+      513,  658,  513,  513,  513,  513,  513,  513,  513,  513,
+      513,  513,  525,  525,  525,  525,  525,  525,  525,  525,
+      525,  525,  525,  525,  525,  726,  932,  932,  525,  525,
+
+      525,  525,  525,  525,  647,  706,  647,  647,  647,  647,
+      647,  647,  892,  892,  892,  684,  647,  706,  682,  726,
+      682,  682,  682,  525,  525,  525,  525,  525,  525,  528,
+      528,  528,  528,  528,  528,  528,  528,  528,  528,  528,
+      528,  528,  726,  943,  943,  528,  528,  528,  528,  528,
+      528,  649,  649,  649,  649,  649,  649,  649,  649,  649,
+      649,  665,  665,  665,  665,  665,  665,  665,  665,  682,
+      528,  528,  528,  528,  528,  528,  531,  531,  531,  531,
+      531,  531,  531,  531,  531,  531,  531,  776,  677,  778,
+      750,  531,  531,  531,  531,  531,  531,  653,  653,  653,
+
+      653,  653,  653,  653,  653,  653,  653,  903,  914,  903,
+      914,  776,  659,  778,  750,  787,  531,  531,  531,  531,
+      531,  531,  532,  659,  532,  532,  532,  532,  532,  532,
+      532,  532,  532,  532,  535,  750,  778,  962,  962,  787,
+      535,  740,  740,  535,  535,  740,  535,  535,  535,  535,
+      535,  535,  535,  535,  535,  535,  535,  535,  535,  740,
+      740,  740,  535,  535,  535,  535,  535,  535,  535,  535,
+      535,  535,  535,  535,  535,  535,  535,  535,  535,  535,
+      535,  535,  535,  535,  535,  535,  535,  535,  535,  535,
+      535,  535,  535,  535,  535,  535,  535,  535,  535,  535,
+
+      535,  535,  535,  535,  535,  560,  560,  560,  560,  560,
+      560,  560,  560,  560,  560,  560,  563,  963,  963,  708,
+      563,  563,  563,  563,  563,  563,  563,  563,  563,  563,
+      563,  708,  563,  656,  807,  563,  563,  563,  563,  563,
+      563,  563,  563,  563,  563,  563,  563,  563,  563,  563,
+      563,  563,  563,  563,  563,  563,  563,  563,  807,  563,
+      563,  563,  563,  563,  563,  563,  563,  563,  563,  563,
+      563,  563,  563,  563,  563,  563,  563,  569,  569,  569,
+      569,  569,  569,  569,  569,  569,  569,  660,  660,  683,
+      655,  683,  683,  683,  915,  919,  915,  919,  760,  660,
+
+      698,  698,  698,  698,  698,  698,  698,  698,  698,  698,
+      760,  654,  640,  835,  569,  571,  571,  571,  571,  571,
+      571,  571,  571,  571,  571,  571,  702,  816,  702,  702,
+      702,  702,  702,  702,  714,  714,  714,  714,  714,  714,
+      683,  707,  707,  707,  707,  707,  707,  707,  707,  707,
+      707,  816,  835,  571,  580,  638,  580,  580,  580,  580,
+      580,  580,  580,  580,  580,  580,  580,  583,  761,  583,
+      583,  583,  583,  583,  583,  583,  583,  583,  583,  583,
+      761,  751,  826,  583,  583,  583,  583,  583,  583,  711,
+      637,  711,  711,  711,  711,  711,  711,  920,  636,  920,
+
+      735,  711,  735,  735,  735,  751,  826,  628,  583,  583,
+      583,  583,  583,  583,  586,  586,  586,  586,  586,  586,
+      586,  586,  586,  586,  586,  627,  625,  751,  586,  586,
+      586,  586,  586,  586,  713,  713,  713,  713,  713,  713,
+      713,  713,  713,  713,  924,  927,  924,  927,  937,  720,
+      937,  735,  624,  586,  586,  586,  586,  586,  586,  587,
+      720,  587,  587,  587,  587,  587,  587,  587,  587,  587,
+      587,  590,  622,  590,  590,  590,  590,  590,  590,  590,
+      590,  590,  590,  597,  597,  597,  597,  597,  597,  597,
+      597,  597,  597,  597,  597,  597,  621,  788,  809,  597,
+
+      597,  597,  597,  597,  597,  736,  620,  736,  736,  736,
+      737,  763,  737,  737,  737,  738,  618,  738,  738,  738,
+      614,  788,  809,  763,  597,  597,  597,  597,  597,  597,
+      600,  600,  600,  600,  600,  600,  600,  600,  600,  600,
+      600,  600,  788,  801,  613,  809,  600,  600,  600,  600,
+      600,  600,  938,  612,  938,  801,  736,  946,  947,  946,
+      947,  737,  950,  956,  950,  956,  738,  957,  959,  957,
+      959,  600,  600,  600,  600,  600,  600,  603,  595,  603,
+      603,  603,  603,  603,  603,  603,  603,  603,  603,  604,
+      742,  589,  742,  742,  742,  604,  742,  742,  604,  604,
+
+      742,  604,  604,  604,  604,  604,  604,  604,  604,  604,
+      604,  604,  604,  604,  742,  742,  742,  604,  604,  604,
+      604,  604,  604,  604,  604,  604,  604,  604,  604,  604,
+      604,  604,  604,  604,  604,  604,  604,  604,  604,  604,
+      604,  604,  604,  604,  604,  604,  604,  604,  604,  604,
+      604,  604,  604,  604,  604,  604,  604,  604,  604,  604,
+      626,  747,  588,  747,  747,  747,  747,  747,  747,  626,
+      967,  575,  967,  626,  626,  626,  626,  626,  626,  626,
+      626,  626,  626,  626,  626,  626,  574,  568,  626,  626,
+      626,  626,  626,  626,  626,  626,  626,  626,  626,  626,
+
+      626,  626,  626,  626,  626,  626,  626,  626,  626,  626,
+      626,  565,  626,  626,  626,  626,  626,  626,  626,  626,
+      626,  626,  626,  626,  626,  626,  626,  626,  626,  626,
+      632,  564,  632,  632,  632,  632,  632,  632,  632,  632,
+      632,  632,  743,  743,  743,  743,  743,  743,  743,  743,
+      743,  743,  762,  762,  762,  762,  762,  762,  762,  762,
+      762,  762,  769,  769,  769,  769,  769,  769,  965,  632,
+      639,  965,  639,  639,  639,  639,  639,  639,  639,  639,
+      639,  639,  645,  562,  645,  645,  645,  645,  645,  645,
+      645,  645,  645,  645,  645,  648,  561,  648,  648,  648,
+
+      648,  648,  648,  648,  648,  648,  648,  648,  968,  559,
+      968,  648,  648,  648,  648,  648,  648,  766,  558,  766,
+      766,  766,  766,  766,  766,  971,  553,  971,  798,  766,
+      798,  798,  798,  798,  798,  798,  648,  648,  648,  648,
+      648,  648,  651,  651,  651,  651,  651,  651,  651,  651,
+      651,  651,  651,  972,  552,  972,  651,  651,  651,  651,
+      651,  651,  768,  768,  768,  768,  768,  768,  768,  768,
+      768,  768,  774,  774,  774,  774,  774,  774,  774,  517,
+      516,  651,  651,  651,  651,  651,  651,  652,  515,  652,
+      652,  652,  652,  652,  652,  652,  652,  652,  652,  663,
+
+      663,  663,  663,  663,  663,  663,  663,  663,  663,  663,
+      663,  686,  507,  686,  686,  686,  686,  686,  686,  686,
+      686,  686,  686,  692,  692,  692,  692,  692,  692,  692,
+      692,  692,  692,  782,  782,  782,  782,  782,  782,  782,
+      782,  782,  782,  783,  783,  783,  783,  783,  783,  783,
+      783,  783,  783,  842,  842,  842,  842,  842,  842,  506,
+      692,  694,  505,  694,  694,  694,  694,  694,  694,  694,
+      694,  694,  694,  977,  501,  977,  793,  494,  793,  793,
+      793,  793,  793,  793,  794,  794,  794,  794,  794,  794,
+      794,  794,  794,  794,  860,  860,  860,  860,  860,  860,
+
+      694,  709,  493,  709,  709,  709,  709,  709,  709,  709,
+      709,  709,  709,  709,  712,  793,  712,  712,  712,  712,
+      712,  712,  712,  712,  712,  712,  712,  978,  490,  978,
+      712,  712,  712,  712,  712,  712,  811,  811,  811,  811,
+      811,  811,  811,  811,  811,  811,  815,  488,  815,  815,
+      815,  815,  815,  815,  487,  712,  712,  712,  712,  712,
+      712,  715,  715,  715,  715,  715,  715,  715,  715,  715,
+      715,  484,  483,  482,  476,  715,  715,  715,  715,  715,
+      715,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  838,  475,  838,  838,  838,  838,  838,  838,  473,
+
+      715,  715,  715,  715,  715,  715,  716,  472,  716,  716,
+      716,  716,  716,  716,  716,  716,  716,  716,  719,  719,
+      719,  719,  719,  719,  719,  719,  719,  719,  719,  752,
+      838,  752,  752,  752,  752,  752,  752,  752,  752,  752,
+      752,  753,  471,  753,  753,  753,  753,  753,  753,  753,
+      753,  753,  753,  754,  470,  754,  754,  754,  754,  754,
+      754,  754,  754,  754,  754,  757,  443,  757,  757,  757,
+      757,  757,  757,  757,  757,  757,  757,  764,  442,  764,
+      764,  764,  764,  764,  764,  764,  764,  764,  764,  764,
+      767,  439,  767,  767,  767,  767,  767,  767,  767,  767,
+
+      767,  767,  438,  437,  436,  430,  767,  767,  767,  767,
+      767,  767,  821,  821,  821,  821,  821,  821,  821,  821,
+      821,  821,  848,  429,  848,  848,  848,  848,  848,  848,
+      428,  767,  767,  767,  767,  767,  767,  770,  427,  770,
+      770,  770,  770,  770,  770,  770,  770,  770,  770,  786,
+      426,  786,  786,  786,  786,  786,  786,  786,  786,  786,
+      786,  789,  425,  789,  789,  789,  789,  789,  789,  789,
+      789,  789,  789,  791,  424,  791,  791,  791,  791,  791,
+      791,  791,  791,  791,  791,  792,  423,  792,  792,  792,
+      792,  792,  792,  792,  792,  792,  792,  804,  422,  804,
+
+      804,  804,  804,  804,  804,  804,  804,  804,  804,  817,
+      421,  817,  817,  817,  817,  817,  817,  817,  817,  817,
+      817,  818,  420,  818,  818,  818,  818,  818,  818,  818,
+      818,  818,  818,  819,  419,  819,  819,  819,  819,  819,
+      819,  819,  819,  819,  819,  822,  822,  822,  822,  822,
+      822,  822,  822,  822,  822,  833,  418,  833,  833,  833,
+      833,  833,  833,  833,  833,  833,  833,  834,  417,  834,
+      834,  834,  834,  834,  834,  834,  834,  834,  834,  836,
+      416,  836,  836,  836,  836,  836,  836,  836,  836,  836,
+      836,  837,  415,  837,  837,  837,  837,  837,  837,  837,
+
+      837,  837,  837,  840,  840,  840,  840,  840,  840,  840,
+      840,  840,  840,  841,  841,  841,  841,  841,  841,  841,
+      841,  841,  841,  844,  844,  844,  844,  844,  844,  844,
+      844,  844,  844,  849,  849,  849,  849,  849,  849,  849,
+      849,  849,  849,  852,  852,  852,  852,  852,  852,  852,
+      852,  852,  852,  853,  853,  853,  853,  853,  853,  853,
+      853,  853,  853,  857,  857,  857,  857,  857,  857,  414,
+      849,  850,  850,  850,  850,  850,  850,  850,  850,  850,
+      850,  854,  854,  854,  854,  854,  854,  854,  854,  854,
+      854,  976,  411,  410,  976,  405,  404,  403,  976,  397,
+
+      857,  395,  394,  393,  392,  391,  390,  389,  850,  851,
+      851,  851,  851,  851,  851,  851,  851,  851,  851,  859,
+      859,  859,  859,  859,  859,  859,  859,  859,  859,  386,
+      385,  384,  383,  367,  366,  365,  364,  362,  361,  357,
+      356,  355,  353,  352,  351,  350,  851,  856,  856,  856,
+      856,  856,  856,  856,  856,  856,  856,  349,  348,  347,
+      346,  343,  338,  337,  336,  329,  328,  327,  326,  325,
+      319,  317,  316,  315,  314,  313,  312,  311,  310,  307,
+      306,  304,  296,  295,  856,  862,  862,  862,  862,  862,
+      862,  862,  862,  862,  862,  862,  862,  862,  862,  862,
+
+      862,  862,  862,  862,  862,  862,  863,  863,  863,  863,
+      863,  863,  863,  863,  863,  863,  863,  863,  863,  863,
+      863,  863,  863,  863,  863,  863,  863,  864,  864,  864,
+      864,  864,  864,  864,  864,  864,  864,  864,  864,  864,
+      864,  864,  864,  864,  864,  864,  864,  864,  865,  865,
+      865,  865,  865,  865,  865,  865,  865,  865,  865,  865,
+      865,  865,  865,  865,  865,  865,  865,  865,  865,  866,
+      292,  291,  284,  283,  281,  280,  866,  279,  866,  866,
+      866,  866,  278,  277,  866,  866,  866,  866,  866,  866,
+      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
+
+      867,  867,  867,  867,  867,  867,  867,  867,  867,  867,
+      867,  868,  276,  275,  274,  273,  868,  272,  868,  271,
+      868,  868,  868,  868,  868,  270,  868,  868,  868,  868,
+      868,  868,  869,  267,  264,  263,  262,  256,  253,  869,
+      252,  869,  869,  869,  869,  251,  250,  869,  869,  869,
+      869,  869,  869,  870,  249,  246,  870,  870,  245,  870,
+      870,  244,  870,  870,  870,  870,  243,  242,  870,  870,
+      870,  870,  870,  870,  871,  871,  241,  871,  240,  239,
+      238,  871,  873,  237,  236,  873,  873,  235,  873,  873,
+      234,  873,  873,  873,  873,  233,  232,  873,  873,  873,
+
+      873,  873,  873,  874,  231,  225,  874,  874,  224,  874,
+      874,  217,  874,  874,  874,  874,  216,  874,  874,  874,
+      215,  874,  874,  874,  876,  214,  213,  876,  212,  210,
+      876,  876,  209,  876,  876,  876,  876,  876,  208,  876,
+      876,  876,  876,  876,  876,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
+      877,  877,  877,  877,  877,  877,  878,  878,  207,  878,
+      205,  878,  878,  878,  878,  878,  878,  878,  878,  878,
+      878,  878,  878,  878,  878,  878,  878,  879,  199,  191,
+      187,  183,  879,  182,  879,  180,  879,  879,  879,  879,
+
+      879,  176,  879,  879,  879,  879,  879,  879,  880,  169,
+      165,  163,  161,  153,  152,  880,  151,  880,  880,  880,
+      880,  150,  880,  880,  880,  880,  880,  880,  880,  881,
+      149,  143,  881,  881,  142,  881,  881,  141,  881,  881,
+      881,  881,  140,  881,  881,  881,  881,  881,  881,  881,
+      882,  882,  882,  882,  882,  882,  882,  882,  882,  882,
+      882,  882,  882,  882,  882,  882,  882,  882,  882,  882,
+      882,  883,  883,  139,  883,  883,  883,  883,  883,  883,
+      883,  883,  883,  883,  883,  883,  883,  883,  883,  883,
+      883,  883,  885,  137,  136,  885,  885,  135,  885,  885,
+
+      134,  885,  885,  885,  885,  133,  132,  885,  885,  885,
+      885,  885,  885,  886,  886,  128,  886,  124,  123,  119,
+      886,  887,  887,  116,  887,  113,  108,  107,  887,  888,
+      888,  888,  106,  888,  104,  100,   99,  888,  889,   98,
+       97,  889,  889,   96,  889,  889,   92,  889,  889,  889,
+      889,   79,   72,  889,  889,  889,  889,  889,  889,  890,
+       65,   61,  890,  890,   60,  890,  890,   58,  890,  890,
+      890,  890,   57,   55,  890,  890,  890,  890,  890,  890,
+      891,   53,   45,  891,  891,   44,  891,  891,   43,  891,
+      891,  891,  891,   41,  891,  891,  891,   40,  891,  891,
+
+      891,  893,   35,   31,  893,   25,   19,  893,  893,   17,
+      893,  893,  893,  893,  893,   16,  893,  893,  893,  893,
+      893,  893,  894,  894,   15,  894,    0,  894,  894,  894,
       894,  894,  894,  894,  894,  894,  894,  894,  894,  894,
-      894,  894,  894,  894,  894,  896,  896,    0,  896,    0,
-        0,    0,  896,  897,  897,    0,  897,    0,    0,    0,
-      897,  899,  899,  899,    0,  899,    0,    0,    0,  899,
-      900,  900,  900,  900,    0,  900,    0,    0,    0,  900,
-      901,  901,  901,  901,  901,  901,  901,  901,  901,  901,
-      901,  901,  901,  901,  901,  901,  901,  901,  901,  901,
-      901,  904,    0,    0,  904,  904,    0,  904,  905,    0,
-        0,    0,  905,  905,    0,  905,  905,  905,    0,    0,
-      905,  905,  906,  906,    0,  906,    0,    0,    0,  906,
-
-      907,    0,  907,  907,    0,  907,    0,    0,    0,  907,
-      910,  910,  910,    0,  910,    0,    0,    0,  910,  911,
-      911,  911,  911,    0,  911,    0,    0,    0,  911,  912,
-      912,    0,    0,  912,    0,    0,    0,  912,  913,  913,
-      913,  913,  913,  913,  913,  913,  913,  913,  913,  913,
-      913,  913,  913,  913,  913,  913,  913,  913,  913,  915,
-        0,    0,  915,  915,    0,  915,  916,    0,    0,    0,
-      916,  916,    0,  916,  916,  916,    0,    0,  916,  916,
-      919,  919,    0,  919,    0,    0,    0,  919,  920,    0,
-      920,  920,    0,  920,    0,    0,    0,  920,  922,  922,
-
+      894,  894,  894,  895,    0,    0,    0,    0,    0,    0,
+      895,    0,  895,  895,  895,  895,    0,    0,  895,  895,
+      895,  895,  895,  895,  896,    0,    0,    0,    0,    0,
+        0,  896,    0,  896,  896,  896,  896,    0,  896,  896,
+      896,  896,  896,  896,  896,  897,    0,    0,  897,  897,
+        0,  897,  897,    0,  897,  897,  897,  897,    0,  897,
+
+      897,  897,  897,  897,  897,  897,  898,    0,    0,  898,
+      898,    0,  898,  899,  899,  899,  899,  899,  899,  899,
+      899,  899,  899,  899,  899,  899,  899,  899,  899,  899,
+      899,  899,  899,  899,  900,  900,    0,  900,    0,    0,
+        0,  900,  901,  901,  901,    0,  901,    0,    0,    0,
+      901,  904,  904,    0,  904,    0,    0,    0,  904,  905,
+      905,    0,  905,    0,    0,    0,  905,  906,  906,    0,
+      906,    0,    0,    0,  906,  907,  907,  907,    0,  907,
+        0,    0,    0,  907,  908,    0,    0,  908,  908,    0,
+      908,  909,  909,    0,  909,    0,    0,    0,  909,  910,
+
+      910,    0,  910,    0,    0,    0,  910,  911,  911,    0,
+      911,    0,    0,    0,  911,  912,  912,  912,    0,  912,
+        0,    0,    0,  912,  913,  913,  913,  913,    0,  913,
+        0,    0,    0,  913,  916,  916,    0,  916,    0,    0,
+        0,  916,  917,  917,    0,  917,    0,    0,    0,  917,
+      918,  918,    0,  918,    0,    0,    0,  918,  921,  921,
+      921,    0,  921,    0,    0,    0,  921,  922,  922,  922,
       922,    0,  922,    0,    0,    0,  922,  923,  923,  923,
-        0,    0,  923,    0,    0,    0,  923,  924,  924,  924,
-      924,  924,  924,  924,  924,  924,  924,  924,  924,  924,
-      924,  924,  924,  924,  924,  924,  924,  924,  925,  925,
-        0,  925,  925,  925,    0,  925,    0,  925,  925,  925,
-      925,    0,    0,  925,  925,  925,  925,  925,  925,  926,
-      926,    0,  926,  926,  926,    0,  926,    0,  926,  926,
-      926,  926,    0,    0,  926,  926,  926,  926,  926,  926,
-      929,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,  929,  929,    0,  929,  929,    0,  929,  931,  931,
-
-        0,  931,    0,    0,    0,  931,  932,    0,  932,  932,
-        0,  932,    0,    0,    0,  932,  935,  935,    0,    0,
-      935,    0,    0,    0,  935,  937,    0,    0,    0,    0,
-        0,    0,  937,    0,  937,  937,  937,  937,    0,    0,
-      937,  937,  937,  937,  937,  937,  940,  940,    0,  940,
-        0,    0,    0,  940,  941,    0,  941,  941,    0,  941,
-        0,    0,    0,  941,  945,  945,    0,  945,    0,    0,
-        0,  945,  946,    0,  946,    0,    0,  946,    0,    0,
-        0,  946,  947,  947,  947,  947,  947,  947,  947,  947,
-      947,  947,  947,  947,  947,  947,  947,  947,  947,  947,
-
-      947,  947,  947,  833,  833,  833,  833,  833,  833,  833,
-      833,  833,  833,  833,  833,  833,  833,  833,  833,  833,
-      833,  833,  833,  833,  833,  833,  833,  833,  833,  833,
-      833,  833,  833,  833,  833,  833,  833,  833,  833,  833,
-      833,  833,  833,  833,  833,  833,  833,  833,  833,  833,
-      833,  833,  833,  833,  833,  833,  833,  833,  833,  833,
-      833,  833,  833,  833,  833,  833,  833,  833,  833,  833,
-      833,  833,  833,  833
+      923,  923,  923,  923,  923,  923,  923,  923,  923,  923,
+      923,  923,  923,  923,  923,  923,  923,  923,  925,  925,
+
+        0,  925,    0,    0,    0,  925,  926,  926,    0,  926,
+        0,    0,    0,  926,  928,  928,  928,    0,  928,    0,
+        0,    0,  928,  929,  929,  929,  929,    0,  929,    0,
+        0,    0,  929,  930,  930,  930,  930,  930,  930,  930,
+      930,  930,  930,  930,  930,  930,  930,  930,  930,  930,
+      930,  930,  930,  930,  933,    0,    0,  933,  933,    0,
+      933,  934,    0,    0,    0,  934,  934,    0,  934,  934,
+      934,    0,    0,  934,  934,  935,  935,    0,  935,    0,
+        0,    0,  935,  936,    0,  936,  936,    0,  936,    0,
+        0,    0,  936,  939,  939,  939,    0,  939,    0,    0,
+
+        0,  939,  940,  940,  940,  940,    0,  940,    0,    0,
+        0,  940,  941,  941,    0,    0,  941,    0,    0,    0,
+      941,  942,  942,  942,  942,  942,  942,  942,  942,  942,
+      942,  942,  942,  942,  942,  942,  942,  942,  942,  942,
+      942,  942,  944,    0,    0,  944,  944,    0,  944,  945,
+        0,    0,    0,  945,  945,    0,  945,  945,  945,    0,
+        0,  945,  945,  948,  948,    0,  948,    0,    0,    0,
+      948,  949,    0,  949,  949,    0,  949,    0,    0,    0,
+      949,  951,  951,  951,    0,  951,    0,    0,    0,  951,
+      952,  952,  952,    0,    0,  952,    0,    0,    0,  952,
+
+      953,  953,  953,  953,  953,  953,  953,  953,  953,  953,
+      953,  953,  953,  953,  953,  953,  953,  953,  953,  953,
+      953,  954,  954,    0,  954,  954,  954,    0,  954,    0,
+      954,  954,  954,  954,    0,    0,  954,  954,  954,  954,
+      954,  954,  955,  955,    0,  955,  955,  955,    0,  955,
+        0,  955,  955,  955,  955,    0,    0,  955,  955,  955,
+      955,  955,  955,  958,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  958,  958,    0,  958,  958,    0,
+      958,  960,  960,    0,  960,    0,    0,    0,  960,  961,
+        0,  961,  961,    0,  961,    0,    0,    0,  961,  964,
+
+      964,    0,    0,  964,    0,    0,    0,  964,  966,    0,
+        0,    0,    0,    0,    0,  966,    0,  966,  966,  966,
+      966,    0,    0,  966,  966,  966,  966,  966,  966,  969,
+      969,    0,  969,    0,    0,    0,  969,  970,    0,  970,
+      970,    0,  970,    0,    0,    0,  970,  973,  973,    0,
+      973,    0,    0,    0,  973,  974,    0,  974,    0,    0,
+      974,    0,    0,    0,  974,  975,  975,  975,  975,  975,
+      975,  975,  975,  975,  975,  975,  975,  975,  975,  975,
+      975,  975,  975,  975,  975,  975,  861,  861,  861,  861,
+      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
+
+      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
+      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
+      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
+      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
+      861,  861,  861,  861,  861,  861,  861,  861,  861,  861,
+      861,  861,  861,  861,  861,  861,  861,  861
     } ;
 
 static yy_state_type yy_last_accepting_state;
@@ -2039,7 +2045,7 @@ int (*trace_print)(const char *msg) = sudoers_trace_print;
 
 #define WANTDIGEST 6
 
-#line 2042 "lex.sudoers.c"
+#line 2048 "lex.sudoers.c"
 
 /* Macros after this point can all be overridden by user definitions in
  * section 1.
@@ -2195,7 +2201,7 @@ YY_DECL
 
 #line 120 "toke.l"
 
-#line 2198 "lex.sudoers.c"
+#line 2204 "lex.sudoers.c"
 
        if ( yy_init )
                {
@@ -2247,13 +2253,13 @@ yy_match:
                        while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                                {
                                yy_current_state = (int) yy_def[yy_current_state];
-                               if ( yy_current_state >= 834 )
+                               if ( yy_current_state >= 862 )
                                        yy_c = yy_meta[(unsigned int) yy_c];
                                }
                        yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
                        ++yy_cp;
                        }
-               while ( yy_base[yy_current_state] != 5604 );
+               while ( yy_base[yy_current_state] != 5587 );
 
 yy_find_action:
                yy_act = yy_accept[yy_current_state];
@@ -2723,15 +2729,31 @@ YY_RULE_SETUP
 case 36:
 YY_RULE_SETUP
 #line 457 "toke.l"
+{
+                               LEXTRACE("FOLLOW ");
+                               LEXRETURN(FOLLOW);
+                       }
+       YY_BREAK
+case 37:
+YY_RULE_SETUP
+#line 462 "toke.l"
+{
+                               LEXTRACE("NOFOLLOW ");
+                               LEXRETURN(NOFOLLOW);
+                       }
+       YY_BREAK
+case 38:
+YY_RULE_SETUP
+#line 467 "toke.l"
 {
                            /* empty group or netgroup */
                            LEXTRACE("ERROR ");
                            LEXRETURN(ERROR);
                        }
        YY_BREAK
-case 37:
+case 39:
 YY_RULE_SETUP
-#line 463 "toke.l"
+#line 473 "toke.l"
 {
                            /* netgroup */
                            if (!fill(sudoerstext, sudoersleng))
@@ -2740,9 +2762,9 @@ YY_RULE_SETUP
                            LEXRETURN(NETGROUP);
                        }
        YY_BREAK
-case 38:
+case 40:
 YY_RULE_SETUP
-#line 471 "toke.l"
+#line 481 "toke.l"
 {
                            /* group */
                            if (!fill(sudoerstext, sudoersleng))
@@ -2751,9 +2773,9 @@ YY_RULE_SETUP
                            LEXRETURN(USERGROUP);
                        }
        YY_BREAK
-case 39:
+case 41:
 YY_RULE_SETUP
-#line 479 "toke.l"
+#line 489 "toke.l"
 {
                            if (!fill(sudoerstext, sudoersleng))
                                yyterminate();
@@ -2761,9 +2783,9 @@ YY_RULE_SETUP
                            LEXRETURN(NTWKADDR);
                        }
        YY_BREAK
-case 40:
+case 42:
 YY_RULE_SETUP
-#line 486 "toke.l"
+#line 496 "toke.l"
 {
                            if (!fill(sudoerstext, sudoersleng))
                                yyterminate();
@@ -2771,9 +2793,9 @@ YY_RULE_SETUP
                            LEXRETURN(NTWKADDR);
                        }
        YY_BREAK
-case 41:
+case 43:
 YY_RULE_SETUP
-#line 493 "toke.l"
+#line 503 "toke.l"
 {
                            if (!ipv6_valid(sudoerstext)) {
                                LEXTRACE("ERROR ");
@@ -2785,9 +2807,9 @@ YY_RULE_SETUP
                            LEXRETURN(NTWKADDR);
                        }
        YY_BREAK
-case 42:
+case 44:
 YY_RULE_SETUP
-#line 504 "toke.l"
+#line 514 "toke.l"
 {
                            if (!ipv6_valid(sudoerstext)) {
                                LEXTRACE("ERROR ");
@@ -2799,18 +2821,18 @@ YY_RULE_SETUP
                            LEXRETURN(NTWKADDR);
                        }
        YY_BREAK
-case 43:
+case 45:
 YY_RULE_SETUP
-#line 515 "toke.l"
+#line 525 "toke.l"
 {
                            LEXTRACE("ALL ");
                            LEXRETURN(ALL);
 
                        }
        YY_BREAK
-case 44:
+case 46:
 YY_RULE_SETUP
-#line 521 "toke.l"
+#line 531 "toke.l"
 {
 #ifdef HAVE_SELINUX
                            LEXTRACE("ROLE ");
@@ -2820,9 +2842,9 @@ YY_RULE_SETUP
 #endif
                        }
        YY_BREAK
-case 45:
+case 47:
 YY_RULE_SETUP
-#line 530 "toke.l"
+#line 540 "toke.l"
 {
 #ifdef HAVE_SELINUX
                            LEXTRACE("TYPE ");
@@ -2832,9 +2854,9 @@ YY_RULE_SETUP
 #endif
                        }
        YY_BREAK
-case 46:
+case 48:
 YY_RULE_SETUP
-#line 538 "toke.l"
+#line 548 "toke.l"
 {
 #ifdef HAVE_PRIV_SET
                            LEXTRACE("PRIVS ");
@@ -2844,9 +2866,9 @@ YY_RULE_SETUP
 #endif
                        }
        YY_BREAK
-case 47:
+case 49:
 YY_RULE_SETUP
-#line 547 "toke.l"
+#line 557 "toke.l"
 {
 #ifdef HAVE_PRIV_SET
                            LEXTRACE("LIMITPRIVS ");
@@ -2856,9 +2878,9 @@ YY_RULE_SETUP
 #endif
                        }
        YY_BREAK
-case 48:
+case 50:
 YY_RULE_SETUP
-#line 556 "toke.l"
+#line 566 "toke.l"
 {
                        got_alias:
                            if (!fill(sudoerstext, sudoersleng))
@@ -2867,9 +2889,9 @@ YY_RULE_SETUP
                            LEXRETURN(ALIAS);
                        }
        YY_BREAK
-case 49:
+case 51:
 YY_RULE_SETUP
-#line 564 "toke.l"
+#line 574 "toke.l"
 {
                            /* XXX - no way to specify digest for command */
                            /* no command args allowed for Defaults!/path */
@@ -2879,9 +2901,9 @@ YY_RULE_SETUP
                            LEXRETURN(COMMAND);
                        }
        YY_BREAK
-case 50:
+case 52:
 YY_RULE_SETUP
-#line 573 "toke.l"
+#line 583 "toke.l"
 {
                            digest_len = SHA224_DIGEST_LENGTH;
                            BEGIN WANTDIGEST;
@@ -2889,9 +2911,9 @@ YY_RULE_SETUP
                            LEXRETURN(SHA224_TOK);
                        }
        YY_BREAK
-case 51:
+case 53:
 YY_RULE_SETUP
-#line 580 "toke.l"
+#line 590 "toke.l"
 {
                            digest_len = SHA256_DIGEST_LENGTH;
                            BEGIN WANTDIGEST;
@@ -2899,9 +2921,9 @@ YY_RULE_SETUP
                            LEXRETURN(SHA256_TOK);
                        }
        YY_BREAK
-case 52:
+case 54:
 YY_RULE_SETUP
-#line 587 "toke.l"
+#line 597 "toke.l"
 {
                            digest_len = SHA384_DIGEST_LENGTH;
                            BEGIN WANTDIGEST;
@@ -2909,9 +2931,9 @@ YY_RULE_SETUP
                            LEXRETURN(SHA384_TOK);
                        }
        YY_BREAK
-case 53:
+case 55:
 YY_RULE_SETUP
-#line 594 "toke.l"
+#line 604 "toke.l"
 {
                            digest_len = SHA512_DIGEST_LENGTH;
                            BEGIN WANTDIGEST;
@@ -2919,9 +2941,9 @@ YY_RULE_SETUP
                            LEXRETURN(SHA512_TOK);
                        }
        YY_BREAK
-case 54:
+case 56:
 YY_RULE_SETUP
-#line 601 "toke.l"
+#line 611 "toke.l"
 {
                            BEGIN GOTCMND;
                            LEXTRACE("COMMAND ");
@@ -2929,9 +2951,9 @@ YY_RULE_SETUP
                                yyterminate();
                        }                       /* sudo -e */
        YY_BREAK
-case 55:
+case 57:
 YY_RULE_SETUP
-#line 608 "toke.l"
+#line 618 "toke.l"
 {
                            /* directories can't have args... */
                            if (sudoerstext[sudoersleng - 1] == '/') {
@@ -2947,9 +2969,9 @@ YY_RULE_SETUP
                            }
                        }                       /* a pathname */
        YY_BREAK
-case 56:
+case 58:
 YY_RULE_SETUP
-#line 623 "toke.l"
+#line 633 "toke.l"
 {
                            LEXTRACE("BEGINSTR ");
                            sudoerslval.string = NULL;
@@ -2957,9 +2979,9 @@ YY_RULE_SETUP
                            BEGIN INSTR;
                        }
        YY_BREAK
-case 57:
+case 59:
 YY_RULE_SETUP
-#line 630 "toke.l"
+#line 640 "toke.l"
 {
                            /* a word */
                            if (!fill(sudoerstext, sudoersleng))
@@ -2968,49 +2990,49 @@ YY_RULE_SETUP
                            LEXRETURN(WORD);
                        }
        YY_BREAK
-case 58:
+case 60:
 YY_RULE_SETUP
-#line 638 "toke.l"
+#line 648 "toke.l"
 {
                            LEXTRACE("( ");
                            LEXRETURN('(');
                        }
        YY_BREAK
-case 59:
+case 61:
 YY_RULE_SETUP
-#line 643 "toke.l"
+#line 653 "toke.l"
 {
                            LEXTRACE(") ");
                            LEXRETURN(')');
                        }
        YY_BREAK
-case 60:
+case 62:
 YY_RULE_SETUP
-#line 648 "toke.l"
+#line 658 "toke.l"
 {
                            LEXTRACE(", ");
                            LEXRETURN(',');
                        }                       /* return ',' */
        YY_BREAK
-case 61:
+case 63:
 YY_RULE_SETUP
-#line 653 "toke.l"
+#line 663 "toke.l"
 {
                            LEXTRACE("= ");
                            LEXRETURN('=');
                        }                       /* return '=' */
        YY_BREAK
-case 62:
+case 64:
 YY_RULE_SETUP
-#line 658 "toke.l"
+#line 668 "toke.l"
 {
                            LEXTRACE(": ");
                            LEXRETURN(':');
                        }                       /* return ':' */
        YY_BREAK
-case 63:
+case 65:
 YY_RULE_SETUP
-#line 663 "toke.l"
+#line 673 "toke.l"
 {
                            if (sudoersleng & 1) {
                                LEXTRACE("!");
@@ -3018,9 +3040,9 @@ YY_RULE_SETUP
                            }
                        }
        YY_BREAK
-case 64:
+case 66:
 YY_RULE_SETUP
-#line 670 "toke.l"
+#line 680 "toke.l"
 {
                            if (YY_START == INSTR) {
                                LEXTRACE("ERROR ");
@@ -3033,25 +3055,25 @@ YY_RULE_SETUP
                            LEXRETURN(COMMENT);
                        }                       /* return newline */
        YY_BREAK
-case 65:
+case 67:
 YY_RULE_SETUP
-#line 682 "toke.l"
+#line 692 "toke.l"
 {                      /* throw away space/tabs */
                            sawspace = true;    /* but remember for fill_args */
                        }
        YY_BREAK
-case 66:
+case 68:
 YY_RULE_SETUP
-#line 686 "toke.l"
+#line 696 "toke.l"
 {
                            sawspace = true;    /* remember for fill_args */
                            sudolineno++;
                            continued = true;
                        }                       /* throw away EOL after \ */
        YY_BREAK
-case 67:
+case 69:
 YY_RULE_SETUP
-#line 692 "toke.l"
+#line 702 "toke.l"
 {
                            if (sudoerstext[sudoersleng - 1] == '\n') {
                                /* comment ending in a newline */
@@ -3066,9 +3088,9 @@ YY_RULE_SETUP
                            LEXRETURN(COMMENT);
                        }                       /* comment, not uid/gid */
        YY_BREAK
-case 68:
+case 70:
 YY_RULE_SETUP
-#line 706 "toke.l"
+#line 716 "toke.l"
 {
                            LEXTRACE("ERROR ");
                            LEXRETURN(ERROR);
@@ -3081,7 +3103,7 @@ case YY_STATE_EOF(STARTDEFS):
 case YY_STATE_EOF(INDEFS):
 case YY_STATE_EOF(INSTR):
 case YY_STATE_EOF(WANTDIGEST):
-#line 711 "toke.l"
+#line 721 "toke.l"
 {
                            if (YY_START != INITIAL) {
                                BEGIN INITIAL;
@@ -3092,12 +3114,12 @@ case YY_STATE_EOF(WANTDIGEST):
                                yyterminate();
                        }
        YY_BREAK
-case 69:
+case 71:
 YY_RULE_SETUP
-#line 721 "toke.l"
+#line 731 "toke.l"
 ECHO;
        YY_BREAK
-#line 3100 "lex.sudoers.c"
+#line 3122 "lex.sudoers.c"
 
        case YY_END_OF_BUFFER:
                {
@@ -3388,7 +3410,7 @@ static yy_state_type yy_get_previous_state YY_PROTO(( void ))
                while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                        {
                        yy_current_state = (int) yy_def[yy_current_state];
-                       if ( yy_current_state >= 834 )
+                       if ( yy_current_state >= 862 )
                                yy_c = yy_meta[(unsigned int) yy_c];
                        }
                yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@@ -3423,11 +3445,11 @@ yy_state_type yy_current_state;
        while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                {
                yy_current_state = (int) yy_def[yy_current_state];
-               if ( yy_current_state >= 834 )
+               if ( yy_current_state >= 862 )
                        yy_c = yy_meta[(unsigned int) yy_c];
                }
        yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-       yy_is_jam = (yy_current_state == 833);
+       yy_is_jam = (yy_current_state == 861);
 
        return yy_is_jam ? 0 : yy_current_state;
        }
@@ -3988,7 +4010,7 @@ int main()
        return 0;
        }
 #endif
-#line 721 "toke.l"
+#line 731 "toke.l"
 
 struct path_list {
     SLIST_ENTRY(path_list) entries;
index 93b4ac695537df17f56a7080c7558eb8c482d2f2..000660a86b912763ffbf1efa0b8664b84af30892 100644 (file)
@@ -454,6 +454,16 @@ NOMAIL[[:blank:]]*:        {
                                LEXRETURN(NOMAIL);
                        }
 
+FOLLOW[[:blank:]]*:    {
+                               LEXTRACE("FOLLOW ");
+                               LEXRETURN(FOLLOW);
+                       }
+
+NOFOLLOW[[:blank:]]*:  {
+                               LEXTRACE("NOFOLLOW ");
+                               LEXRETURN(NOFOLLOW);
+                       }
+
 <INITIAL,GOTDEFS>(\+|\%|\%:) {
                            /* empty group or netgroup */
                            LEXTRACE("ERROR ");
index 9ae2751e0df06e7e9b00eaaed9f7000e951d7ae3..200852fa780c0ac08762610fe643bada0bd12610 100644 (file)
@@ -667,7 +667,7 @@ print_defaults_json(FILE *fp, int indent, bool need_comma)
            if (type == -1) {
                sudo_warnx(U_("unknown defaults entry `%s'"), def->var);
                /* XXX - just pass it through as a string anyway? */
-               break;;
+               break;
            }
            fputs(",\n", fp);
        }
@@ -738,23 +738,6 @@ print_aliases_json(FILE *fp, int indent, bool need_comma)
     debug_return_bool(need_comma);
 }
 
-/* XXX these are all duplicated w/ parse.c */
-#define RUNAS_CHANGED(cs1, cs2) \
-       (cs1 == NULL || cs2 == NULL || \
-        cs1->runasuserlist != cs2->runasuserlist || \
-        cs1->runasgrouplist != cs2->runasgrouplist)
-
-#define TAG_SET(tt) \
-       ((tt) != UNSPEC && (tt) != IMPLIED)
-
-#define TAGS_CHANGED(ot, nt) \
-       ((TAG_SET((nt).log_input) && (nt).log_input != (ot).log_input) || \
-        (TAG_SET((nt).log_output) && (nt).log_output != (ot).log_output) || \
-        (TAG_SET((nt).noexec) && (nt).noexec != (ot).noexec) || \
-        (TAG_SET((nt).nopasswd) && (nt).nopasswd != (ot).nopasswd) || \
-        (TAG_SET((nt).setenv) && (nt).setenv != (ot).setenv) || \
-        (TAG_SET((nt).send_mail) && (nt).send_mail != (ot).send_mail))
-
 /*
  * Print a Cmnd_Spec in JSON format at the specified indent level.
  * A pointer to the next Cmnd_Spec is passed in to make it possible to
@@ -799,56 +782,59 @@ print_cmndspec_json(FILE *fp, struct cmndspec *cs, struct cmndspec **nextp,
     }
 
     /* Print tags */
-    if (cs->tags.log_input != UNSPEC || cs->tags.log_output != UNSPEC ||
-       cs->tags.noexec != UNSPEC || cs->tags.nopasswd != UNSPEC ||
-       cs->tags.send_mail != UNSPEC || cs->tags.setenv != UNSPEC) {
+    if (TAGS_SET(cs->tags)) {
+       struct cmndtag tag = cs->tags;
+
        fprintf(fp, "%*s\"Options\": [\n", indent, "");
        indent += 4;
-       if (cs->tags.nopasswd != UNSPEC) {
+       if (tag.nopasswd != UNSPEC) {
            value.type = JSON_BOOL;
-           value.u.boolean = !cs->tags.nopasswd;
-           last_one = cs->tags.noexec == UNSPEC &&
-               cs->tags.send_mail == UNSPEC && cs->tags.setenv == UNSPEC &&
-               cs->tags.log_input == UNSPEC && cs->tags.log_output == UNSPEC;
+           value.u.boolean = !tag.nopasswd;
+           tag.nopasswd = UNSPEC;
            print_pair_json(fp, "{ ", "authenticate", &value,
-               last_one ? " }\n" : " },\n", indent);
+               TAGS_SET(tag) ? " },\n" : " }\n", indent);
        }
-       if (cs->tags.noexec != UNSPEC) {
+       if (tag.noexec != UNSPEC) {
            value.type = JSON_BOOL;
-           value.u.boolean = cs->tags.noexec;
-           last_one = cs->tags.send_mail == UNSPEC &&
-               cs->tags.setenv == UNSPEC && cs->tags.log_input == UNSPEC &&
-               cs->tags.log_output == UNSPEC;
+           value.u.boolean = tag.noexec;
+           tag.noexec = UNSPEC;
            print_pair_json(fp, "{ ", "noexec", &value,
-               last_one ? " }\n" : " },\n", indent);
+               TAGS_SET(tag) ? " },\n" : " }\n", indent);
        }
-       if (cs->tags.send_mail != UNSPEC) {
+       if (tag.send_mail != UNSPEC) {
            value.type = JSON_BOOL;
-           value.u.boolean = cs->tags.send_mail;
-           last_one = cs->tags.setenv == UNSPEC &&
-               cs->tags.log_input == UNSPEC && cs->tags.log_output == UNSPEC;
+           value.u.boolean = tag.send_mail;
+           tag.send_mail = UNSPEC;
            print_pair_json(fp, "{ ", "send_mail", &value,
-               last_one ? " }\n" : " },\n", indent);
+               TAGS_SET(tag) ? " },\n" : " }\n", indent);
        }
-       if (cs->tags.setenv != UNSPEC) {
+       if (tag.setenv != UNSPEC) {
            value.type = JSON_BOOL;
-           value.u.boolean = cs->tags.setenv;
-           last_one = cs->tags.log_input == UNSPEC &&
-               cs->tags.log_output == UNSPEC;
+           value.u.boolean = tag.setenv;
+           tag.setenv = UNSPEC;
            print_pair_json(fp, "{ ", "setenv", &value,
-               last_one ? " }\n" : " },\n", indent);
+               TAGS_SET(tag) ? " },\n" : " }\n", indent);
+       }
+       if (tag.follow != UNSPEC) {
+           value.type = JSON_BOOL;
+           value.u.boolean = tag.follow;
+           tag.follow = UNSPEC;
+           print_pair_json(fp, "{ ", "sudoedit_follow", &value,
+               TAGS_SET(tag) ? " },\n" : " }\n", indent);
        }
-       if (cs->tags.log_input != UNSPEC) {
+       if (tag.log_input != UNSPEC) {
            value.type = JSON_BOOL;
-           value.u.boolean = cs->tags.log_input;
-           last_one = cs->tags.log_output == UNSPEC;
+           value.u.boolean = tag.log_input;
+           tag.log_input = UNSPEC;
            print_pair_json(fp, "{ ", "log_input", &value,
-               last_one ? " }\n" : " },\n", indent);
+               TAGS_SET(tag) ? " },\n" : " }\n", indent);
        }
-       if (cs->tags.log_output != UNSPEC) {
+       if (tag.log_output != UNSPEC) {
            value.type = JSON_BOOL;
-           value.u.boolean = cs->tags.log_output;
-           print_pair_json(fp, "{ ", "log_output", &value, " }\n", indent);
+           value.u.boolean = tag.log_output;
+           tag.log_output = UNSPEC;
+           print_pair_json(fp, "{ ", "log_output", &value,
+               TAGS_SET(tag) ? " },\n" : " }\n", indent);
        }
        indent -= 4;
        fprintf(fp, "%*s],\n", indent, "");
index 89e8f7c26c1f1051788b92e6bcd08eb54c2506ae..dbf2dcdc0eacd619711c49504b94de7364f3e3e8 100644 (file)
@@ -120,13 +120,20 @@ static int
 sesh_sudoedit(int argc, char *argv[])
 {
     int i, oflags_dst, post, ret = SESH_ERR_FAILURE;
-    int fd_src = -1, fd_dst = -1;
+    int fd_src = -1, fd_dst = -1, follow = 0;
     ssize_t nread, nwritten;
     struct stat sb;
     struct timespec times[2];
     char buf[BUFSIZ];
     debug_decl(sesh_sudoedit, SUDO_DEBUG_EDIT)
 
+    /* Check for -h flag (don't follow links). */
+    if (strcmp(argv[2], "-h") == 0) {
+       argv++;
+       argc--;
+       follow = O_NOFOLLOW;
+    }
+
     if (argc < 3)
        debug_return_int(SESH_ERR_FAILURE);
 
@@ -160,7 +167,7 @@ sesh_sudoedit(int argc, char *argv[])
      * so that it's ensured that the temporary files are
      * created by us and that we are not opening any symlinks.
      */
-    oflags_dst = O_WRONLY|O_TRUNC|O_CREAT|(post ? 0 : O_EXCL);
+    oflags_dst = O_WRONLY|O_TRUNC|O_CREAT|(post ? follow : O_EXCL);
     for (i = 0; i < argc - 1; i += 2) {
        const char *path_src = argv[i];
        const char *path_dst = argv[i + 1];
@@ -169,7 +176,7 @@ sesh_sudoedit(int argc, char *argv[])
         * doesn't exist, that's OK, we'll create an empty
         * destination file.
         */
-       if ((fd_src = open(path_src, O_RDONLY, 0600)) < 0) {
+       if ((fd_src = open(path_src, O_RDONLY|follow, 0600)) < 0) {
            if (errno != ENOENT) {
                sudo_warn("%s", path_src);
                if (post) {
index 3e35df15083b4eca8a8b83359332ebcad3b35ff4..bfda114e1d1855ded25d79a23d96d7f8f465c424 100644 (file)
@@ -715,6 +715,11 @@ command_info_to_details(char * const info[], struct command_details *details)
                        SET(details->flags, CD_SUDOEDIT);
                    break;
                }
+               if (strncmp("sudoedit_follow=", info[i], sizeof("sudoedit_follow=") - 1) == 0) {
+                   if (sudo_strtobool(info[i] + sizeof("sudoedit_follow=") - 1) == true)
+                       SET(details->flags, CD_SUDOEDIT_FOLLOW);
+                   break;
+               }
                break;
            case 't':
                if (strncmp("timeout=", info[i], sizeof("timeout=") - 1) == 0) {
index 83f3c73a2b9cb4ac3b5edd5a104cb303b547df71..4536845c66a93c752818e5d9735a028fa84e4564 100644 (file)
@@ -111,22 +111,23 @@ struct user_details {
     int ts_lines;
 };
 
-#define CD_SET_UID             0x0001
-#define CD_SET_EUID            0x0002
-#define CD_SET_GID             0x0004
-#define CD_SET_EGID            0x0008
-#define CD_PRESERVE_GROUPS     0x0010
-#define CD_NOEXEC              0x0020
-#define CD_SET_PRIORITY                0x0040
-#define CD_SET_UMASK           0x0080
-#define CD_SET_TIMEOUT         0x0100
-#define CD_SUDOEDIT            0x0200
-#define CD_BACKGROUND          0x0400
-#define CD_RBAC_ENABLED                0x0800
-#define CD_USE_PTY             0x1000
-#define CD_SET_UTMP            0x2000
-#define CD_EXEC_BG             0x4000
-#define CD_SUDOEDIT_COPY       0x8000
+#define CD_SET_UID             0x00001
+#define CD_SET_EUID            0x00002
+#define CD_SET_GID             0x00004
+#define CD_SET_EGID            0x00008
+#define CD_PRESERVE_GROUPS     0x00010
+#define CD_NOEXEC              0x00020
+#define CD_SET_PRIORITY                0x00040
+#define CD_SET_UMASK           0x00080
+#define CD_SET_TIMEOUT         0x00100
+#define CD_SUDOEDIT            0x00200
+#define CD_BACKGROUND          0x00400
+#define CD_RBAC_ENABLED                0x00800
+#define CD_USE_PTY             0x01000
+#define CD_SET_UTMP            0x02000
+#define CD_EXEC_BG             0x04000
+#define CD_SUDOEDIT_COPY       0x08000
+#define CD_SUDOEDIT_FOLLOW     0x10000
 
 struct preserved_fd {
     TAILQ_ENTRY(preserved_fd) entries;
index 66460b06094ae559de24a9baa3bd923aaf5988e2..0df6890e02753ac8e120ae1194f3b60320666c61 100644 (file)
@@ -57,8 +57,8 @@
 struct tempfile {
     char *tfile;
     char *ofile;
-    struct timespec omtim;
     off_t osize;
+    struct timespec omtim;
 };
 
 static char edit_tmpdir[MAX(sizeof(_PATH_VARTMP), sizeof(_PATH_TMP))];
@@ -157,6 +157,50 @@ sudo_edit_mktemp(const char *ofile, char **tfile)
     debug_return_int(tfd);
 }
 
+#ifdef O_NOFOLLOW
+static int
+sudo_edit_open(const char *path, int oflags, mode_t mode, int sflags)
+{
+    if (!ISSET(sflags, CD_SUDOEDIT_FOLLOW))
+       oflags |= O_NOFOLLOW;
+    return open(path, oflags, mode);
+}
+#else
+static int
+sudo_edit_open(const char *path, int oflags, mode_t mode, int sflags)
+{
+    struct stat sb1, sb2;
+    int fd;
+
+    fd = open(path, oflags, mode);
+    if (fd == -1 || ISSET(sflags, CD_SUDOEDIT_FOLLOW))
+       return fd;
+
+    /*
+     * Treat [fl]stat() failure like an open() failure.
+     */
+    if (fstat(fd, &sb1) == -1 || lstat(path, &sb2) == -1) {
+       const int serrno = errno;
+       close(fd);
+       errno = serrno;
+       return -1;
+    }
+
+    /*
+     * Make sure we did not open a link and that what we opened
+     * matches what is currently on the file system.
+     */
+    if (S_ISLNK(sb2.st_mode) ||
+       sb1.st_dev != sb2.st_dev || sb1.st_ino != sb2.st_ino) {
+       close(fd);
+       errno = ELOOP;
+       return -1;
+    }
+
+    return fd;
+}
+#endif /* O_NOFOLLOW */
+
 /*
  * Create temporary copies of files[] and store the temporary path name
  * along with the original name, size and mtime in tf.
@@ -182,7 +226,8 @@ sudo_edit_create_tfiles(struct command_details *command_details,
        rc = -1;
        switch_user(command_details->euid, command_details->egid,
            command_details->ngroups, command_details->groups);
-       if ((ofd = open(files[i], O_RDONLY, 0644)) != -1 || errno == ENOENT) {
+       ofd = sudo_edit_open(files[i], O_RDONLY, 0644, command_details->flags);
+       if (ofd != -1 || errno == ENOENT) {
            if (ofd == -1) {
                memset(&sb, 0, sizeof(sb));             /* new file */
                rc = 0;
@@ -192,11 +237,17 @@ sudo_edit_create_tfiles(struct command_details *command_details,
        }
        switch_user(ROOT_UID, user_details.egid,
            user_details.ngroups, user_details.groups);
-       if (rc || (ofd != -1 && !S_ISREG(sb.st_mode))) {
-           if (rc)
-               sudo_warn("%s", files[i]);
+       if (ofd != -1 && !S_ISREG(sb.st_mode)) {
+           sudo_warnx(U_("%s: not a regular file"), files[i]);
+           close(ofd);
+           continue;
+       }
+       if (rc == -1) {
+           /* open() or fstat() error. */
+           if (ofd == -1 && errno == ELOOP)
+               sudo_warnx(U_("%s: is a symbolic link"), files[i]);
            else
-               sudo_warnx(U_("%s: not a regular file"), files[i]);
+               sudo_warn("%s", files[i]);
            if (ofd != -1)
                close(ofd);
            continue;
@@ -275,9 +326,9 @@ sudo_edit_copy_tfiles(struct command_details *command_details,
            "seteuid(%u)", user_details.uid);
        if (seteuid(user_details.uid) != 0)
            sudo_fatal("seteuid(%d)", (int)user_details.uid);
-       if ((tfd = open(tf[i].tfile, O_RDONLY, 0644)) != -1) {
+       tfd = sudo_edit_open(tf[i].tfile, O_RDONLY, 0644, 0);
+       if (tfd != -1)
            rc = fstat(tfd, &sb);
-       }
        sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
            "seteuid(%u)", ROOT_UID);
        if (seteuid(ROOT_UID) != 0)
@@ -309,7 +360,8 @@ sudo_edit_copy_tfiles(struct command_details *command_details,
        }
        switch_user(command_details->euid, command_details->egid,
            command_details->ngroups, command_details->groups);
-       ofd = open(tf[i].ofile, O_WRONLY|O_TRUNC|O_CREAT, 0644);
+       ofd = sudo_edit_open(tf[i].ofile, O_WRONLY|O_TRUNC|O_CREAT, 0644,
+           command_details->flags);
        switch_user(ROOT_UID, user_details.egid,
            user_details.ngroups, user_details.groups);
        if (ofd == -1) {
@@ -368,7 +420,7 @@ selinux_edit_create_tfiles(struct command_details *command_details,
     command_details->command = _PATH_SUDO_SESH;
     command_details->flags |= CD_SUDOEDIT_COPY;
     
-    sesh_nargs = 3 + (nfiles * 2) + 1;
+    sesh_nargs = 4 + (nfiles * 2) + 1;
     sesh_args = sesh_ap = reallocarray(NULL, sesh_nargs, sizeof(char *));
     if (sesh_args == NULL) {
        sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
@@ -376,6 +428,8 @@ selinux_edit_create_tfiles(struct command_details *command_details,
     }
     *sesh_ap++ = "sesh";
     *sesh_ap++ = "-e";
+    if (!ISSET(command_details->flags, CD_SUDOEDIT_FOLLOW))
+       *sesh_ap++ = "-h";
     *sesh_ap++ = "0";
 
     for (i = 0; i < nfiles; i++) {
@@ -406,7 +460,7 @@ selinux_edit_create_tfiles(struct command_details *command_details,
     }
     *sesh_ap = NULL;
 
-    /* Run sesh -e 0 <o1> <t1> ... <on> <tn> */
+    /* Run sesh -e [-h] 0 <o1> <t1> ... <on> <tn> */
     command_details->argv = sesh_args;
     rc = run_command(command_details);
     switch (rc) {