From 4abd2a6cf42f2ce9d628e1aeb25686c1ac6bfbb4 Mon Sep 17 00:00:00 2001 From: "Todd C. Miller" Date: Thu, 26 Jul 2012 13:49:21 -0400 Subject: [PATCH] Merge in Solaris privilege support by Darren Moffat and John Zolnowsky --- NEWS | 4 + configure.in | 4 +- doc/CONTRIBUTORS | 2 + doc/Makefile.in | 2 +- doc/contributors.pod | 2 + doc/sudoers.cat | 29 +- doc/sudoers.man.in | 43 +- doc/sudoers.man.pl | 43 +- doc/sudoers.mdoc.in | 39 +- doc/sudoers.pod | 35 +- plugins/sudoers/def_data.c | 8 + plugins/sudoers/def_data.h | 4 + plugins/sudoers/def_data.in | 6 + plugins/sudoers/gram.c | 699 ++++++----- plugins/sudoers/gram.h | 3 + plugins/sudoers/gram.y | 67 +- plugins/sudoers/parse.c | 13 + plugins/sudoers/parse.h | 15 +- plugins/sudoers/sudoers.c | 16 + plugins/sudoers/sudoers.h | 6 + plugins/sudoers/testsudoers.c | 6 + plugins/sudoers/toke.c | 2158 +++++++++++++++++---------------- plugins/sudoers/toke.l | 17 + src/sudo.c | 42 + src/sudo.h | 8 + 25 files changed, 1872 insertions(+), 1399 deletions(-) diff --git a/NEWS b/NEWS index 1aa183abb..d62f59437 100644 --- a/NEWS +++ b/NEWS @@ -36,6 +36,10 @@ What's new in Sudo 1.8.6? * The sudo manuals are now formatted in mdoc. Versions using the legacy man macros are provided for systems that lack mdoc. + * New support for Solaris privilege sets. This makes it possible + to specify fine-grained privileges in the sudoers file on Solaris + 10 and above. + What's new in Sudo 1.8.5p2? * Fixed use of the SUDO_ASKPASS environment variable which was diff --git a/configure.in b/configure.in index 04586f97e..422964105 100644 --- a/configure.in +++ b/configure.in @@ -48,6 +48,7 @@ AC_SUBST([SUDOERS_GID]) AC_SUBST([DEVEL]) AC_SUBST([BAMAN]) AC_SUBST([LCMAN]) +AC_SUBST([PSMAN]) AC_SUBST([SEMAN]) AC_SUBST([devdir]) AC_SUBST([mansectsu]) @@ -175,6 +176,7 @@ DEVEL= LDAP="#" BAMAN=0 LCMAN=0 +PSMAN=0 SEMAN=0 LIBINTL= ZLIB= @@ -1558,7 +1560,7 @@ case "$host" in : ${mansectform='4'} : ${with_rpath='yes'} test -z "$with_pam" && AUTH_EXCL_DEF="PAM" - AC_CHECK_FUNCS(priv_set) + AC_CHECK_FUNCS(priv_set, [PSMAN=1]) ;; *-*-aix*) # To get all prototypes (so we pass -Wall) diff --git a/doc/CONTRIBUTORS b/doc/CONTRIBUTORS index 65ff3274b..880cfb8dc 100644 --- a/doc/CONTRIBUTORS +++ b/doc/CONTRIBUTORS @@ -96,6 +96,7 @@ you believe you should be listed, please send a note to sudo@sudo.ws. Michael Meskes Todd C. Miller Loic Minier + Darren Moffat Jan Thomas Moldung Charles Morris Andreas Mueller @@ -163,3 +164,4 @@ you believe you should be listed, please send a note to sudo@sudo.ws. Marco van Wieringen David Wood Gustavo Zacarias + John Zolnowsky diff --git a/doc/Makefile.in b/doc/Makefile.in index 3d430833b..ef64a74c5 100644 --- a/doc/Makefile.in +++ b/doc/Makefile.in @@ -95,7 +95,7 @@ Makefile: $(srcdir)/Makefile.in varsub: $(top_srcdir)/configure.in @if [ -n "$(DEVEL)" ]; then \ - printf 's#@%s@#1#\ns#@%s@#1#\ns#@%s@#1#\ns#@%s@#/etc#g\ns#@%s@#/usr/local#g\ns#@%s@#5#g\ns#@%s@#8#g\ns#@%s@#%s#\n' SEMAN BAMAN LCMAN sysconfdir prefix mansectform mansectsu PACKAGE_VERSION $(VERSION) > $@; \ + printf 's#@%s@#1#\ns#@%s@#1#\ns#@%s@#1#\ns#@%s@#1#\ns#@%s@#/etc#g\ns#@%s@#/usr/local#g\ns#@%s@#5#g\ns#@%s@#8#g\ns#@%s@#%s#\n' SEMAN BAMAN LCMAN PSMAN sysconfdir prefix mansectform mansectsu PACKAGE_VERSION $(VERSION) > $@; \ sed -n '/Begin initial values for man page substitution/,/End initial values for man page substitution/{;p;}' $(top_srcdir)/configure.in | sed -e '/^#/d' -e 's/^/s#@/' -e 's/=[\\"]*/@#/' -e 's/[\\"]*$$/#g/' >> $@; \ fi diff --git a/doc/contributors.pod b/doc/contributors.pod index a9464c7ba..2189aad4a 100644 --- a/doc/contributors.pod +++ b/doc/contributors.pod @@ -99,6 +99,7 @@ you believe you should be listed, please send a note to sudo@sudo.ws. Michael Meskes Todd C. Miller Loic Minier + Darren Moffat Jan Thomas Moldung Charles Morris Andreas Mueller @@ -166,3 +167,4 @@ you believe you should be listed, please send a note to sudo@sudo.ws. Marco van Wieringen David Wood Gustavo Zacarias + John Zolnowsky diff --git a/doc/sudoers.cat b/doc/sudoers.cat index 39bf9f960..f45565aca 100644 --- a/doc/sudoers.cat +++ b/doc/sudoers.cat @@ -339,12 +339,14 @@ SSUUDDOOEERRSS FFIILLEE FFOORRMMAATT Cmnd_Spec_List ::= Cmnd_Spec | Cmnd_Spec ',' Cmnd_Spec_List - Cmnd_Spec ::= Runas_Spec? SELinux_Spec? Tag_Spec* Cmnd + Cmnd_Spec ::= Runas_Spec? SELinux_Spec? Solaris_Priv_Spec? Tag_Spec* Cmnd Runas_Spec ::= '(' Runas_List? (':' Runas_List)? ')' SELinux_Spec ::= ('ROLE=role' | 'TYPE=type') + Solaris_Priv_Spec ::= ('PRIVS=privset' | 'LIMITPRIVS=privset') + Tag_Spec ::= ('NOPASSWD:' | 'PASSWD:' | 'NOEXEC:' | 'EXEC:' | 'SETENV:' | 'NOSETENV:' | 'LOG_INPUT:' | 'NOLOG_INPUT:' | 'LOG_OUTPUT:' | 'NOLOG_OUTPUT:') @@ -432,6 +434,12 @@ SSUUDDOOEERRSS FFIILLEE FFOORRMMAATT in _s_u_d_o_e_r_s. A role or type specified on the command line, however, will supercede the values in _s_u_d_o_e_r_s. + SSoollaarriiss__PPrriivv__SSppeecc + On Solaris systems, _s_u_d_o_e_r_s entries may optionally specify Solaris + privilege set and/or limit privilege set associated with a command. If + privileges or limit privileges are specified with the command it will + override any default values specified in _s_u_d_o_e_r_s. + TTaagg__SSppeecc A command may have zero or more tags associated with it. There are ten possible tag values: NOPASSWD, PASSWD, NOEXEC, EXEC, SETENV, NOSETENV, @@ -1108,6 +1116,13 @@ SSUUDDOOEERRSS OOPPTTIIOONNSS unique combination of digits and letters, similar to the mktemp(3) function. + limitprivs The default Solaris limit privileges to use when + constructing a new privilege set for a command. This + bounds all privileges of the executing process. The + default limit privileges may be overridden on a per- + command basis in _s_u_d_o_e_r_s. This option is only + available if ssuuddooeerrss is built on Solaris 10 or higher. + mailsub Subject of the mail sent to the _m_a_i_l_t_o user. The escape %h will expand to the host name of the machine. Default is ``*** SECURITY information for %h ***''. @@ -1142,11 +1157,21 @@ SSUUDDOOEERRSS OOPPTTIIOONNSS The default value is ``Password:''. + privs The default Solaris privileges to use when constructing + a new privilege set for a command. This is passed to + the executing process via the inherited privilege set, + but is bounded by the limit privileges. If the _p_r_i_v_s + option is specified but the _l_i_m_i_t_p_r_i_v_s option is not, + the limit privileges of the executing process is set to + _p_r_i_v_s. The default privileges may be overridden on a + per-command basis in _s_u_d_o_e_r_s. This option is only + available if ssuuddooeerrss is built on Solaris 10 or higher. + role The default SELinux role to use when constructing a new security context to run the command. The default role may be overridden on a per-command basis in _s_u_d_o_e_r_s or via command line options. This option is only - available whe ssuuddoo is built with SELinux support. + available when ssuuddoo is built with SELinux support. runas_default The default user to run commands as if the --uu option is not specified on the command line. This defaults to diff --git a/doc/sudoers.man.in b/doc/sudoers.man.in index e494a34d9..633b66885 100644 --- a/doc/sudoers.man.in +++ b/doc/sudoers.man.in @@ -742,12 +742,14 @@ User_Spec ::= User_List Host_List '=' Cmnd_Spec_List \e Cmnd_Spec_List ::= Cmnd_Spec | Cmnd_Spec ',' Cmnd_Spec_List -Cmnd_Spec ::= Runas_Spec? SELinux_Spec? Tag_Spec* Cmnd +Cmnd_Spec ::= Runas_Spec? SELinux_Spec? Solaris_Priv_Spec? Tag_Spec* Cmnd Runas_Spec ::= '(' Runas_List? (':' Runas_List)? ')' SELinux_Spec ::= ('ROLE=role' | 'TYPE=type') +Solaris_Priv_Spec ::= ('PRIVS=privset' | 'LIMITPRIVS=privset') + Tag_Spec ::= ('NOPASSWD:' | 'PASSWD:' | 'NOEXEC:' | 'EXEC:' | 'SETENV:' | 'NOSETENV:' | 'LOG_INPUT:' | 'NOLOG_INPUT:' | 'LOG_OUTPUT:' | 'NOLOG_OUTPUT:') @@ -951,6 +953,14 @@ specified in A role or type specified on the command line, however, will supercede the values in \fIsudoers\fR. +.SS "Solaris_Priv_Spec" +On Solaris systems, +\fIsudoers\fR +entries may optionally specify Solaris privilege set and/or limit +privilege set associated with a command. +If privileges or limit privileges are specified with the command +it will override any default values specified in +\fIsudoers\fR. .SS "Tag_Spec" A command may have zero or more tags associated with it. There are @@ -2398,6 +2408,16 @@ mktemp(3) function. .PD .TP 18n +limitprivs +The default Solaris limit privileges to use when constructing a new +privilege set for a command. +This bounds all privileges of the executing process. +The default limit privileges may be overridden on a per-command basis in +\fIsudoers\fR. +This option is only available if +\fBsudoers\fR +is built on Solaris 10 or higher. +.TP 18n mailsub Subject of the mail sent to the \fImailto\fR @@ -2463,16 +2483,33 @@ The default value is .RE .PD 0 .TP 18n +privs +The default Solaris privileges to use when constructing a new +privilege set for a command. +This is passed to the executing process via the inherited privilege set, +but is bounded by the limit privileges. +If the +\fIprivs\fR +option is specified but the +\fIlimitprivs\fR +option is not, the limit privileges of the executing process is set to +\fIprivs\fR. +The default privileges may be overridden on a per-command basis in +\fIsudoers\fR. +This option is only available if +\fBsudoers\fR +is built on Solaris 10 or higher. +.PD +.TP 18n role The default SELinux role to use when constructing a new security context to run the command. The default role may be overridden on a per-command basis in \fIsudoers\fR or via command line options. -This option is only available whe +This option is only available when \fBsudo\fR is built with SELinux support. -.PD .TP 18n runas_default The default user to run commands as if the diff --git a/doc/sudoers.man.pl b/doc/sudoers.man.pl index 6e5da2c28..92dccaa2c 100644 --- a/doc/sudoers.man.pl +++ b/doc/sudoers.man.pl @@ -4,33 +4,54 @@ BEGIN { $cond = -1; } -# Initialize the numeric register we use for conditionals +# Initialize the numeric registers we use for conditionals if ($cond == -1) { - $_ = ".nr SL \@SEMAN\@\n.nr BA \@BAMAN\@\n.nr LC \@LCMAN\@\n.\\\"\n$_"; + $prefix = ""; + $prefix = "$prefix.nr BA \@BAMAN\@\n"; + $prefix = "$prefix.nr LC \@LCMAN\@\n"; + $prefix = "$prefix.nr PS \@PSMAN\@\n"; + $prefix = "$prefix.nr SL \@SEMAN\@\n"; + $_ = "$prefix.\\\"\n$_"; $cond = 0; } -# Make SELinux_Spec conditional -if (/(.*)SELinux_Spec\? (.*)$/) { - $_ = ".ie \\n(SL $_.el $1$2\n"; +# Make SELinux_Spec and Solaris_Priv_Spec conditional +if (/(.*) SELinux_Spec\? Solaris_Priv_Spec(.*)$/) { + $_ = "$1\\*(S+$2\n"; + $prefix = ""; + $prefix = "$prefix.ds S+\n"; + $prefix = "$prefix.if \\n(SL .as S+ \" SELinux_Spec?\n"; + $prefix = "$prefix.if \\n(PS .as S+ \" Solaris_Priv_Spec?\n"; + $_ = "$prefix$_"; } elsif (/^(.*SELinux_Spec ::=)/) { $_ = ".if \\n(SL \\{\\\n$_"; +} elsif (/^(.*Solaris_Priv_Spec ::=)/) { + $_ = "\\}\n.if \\n(PS \\{\\\n$_"; } elsif (/^(.*Tag_Spec ::=)/) { $_ = "\\}\n$_"; } +if (/^\.(Sh|SS|IP|PP)/) { + $prefix = $cond ? "\\}\n" : ""; + $cond = 0; +} if (/^\.S[Sh] "SELinux_Spec"/) { - $_ = ".if \\n(SL \\{\\\n$_"; + $_ = "$prefix.if \\n(SL \\{\\\n$_"; $cond = 1; } elsif (/^\.IP "(role|type)"/) { - $_ = ".if \\n(SL \\{\\\n$_"; + $_ = "$prefix.if \\n(SL \\{\\\n$_"; + $cond = 1; +} elsif (/^\.S[Sh] "Solaris_Priv_Spec"/) { + $_ = "$prefix.if \\n(PS \\{\\\n$_"; + $cond = 1; +} elsif (/^\.IP "(privs|limitprivs)"/) { + $_ = "$prefix.if \\n(PS \\{\\\n$_"; $cond = 1; } elsif (/^\.IP "use_loginclass"/) { - $_ = ".if \\n(LC \\{\\\n$_"; + $_ = "$prefix.if \\n(LC \\{\\\n$_"; $cond = 1; -} elsif ($cond && /^\.(Sh|SS|IP|PP)/) { - $_ = "\\}\n$_"; - $cond = 0; +} elsif (/^\.(Sh|SS|IP|PP)/) { + $_ = "$prefix$_"; } # Fix up broken pod2man formatting of F<@foo@/bar> diff --git a/doc/sudoers.mdoc.in b/doc/sudoers.mdoc.in index 5d8dbd1f5..16cee4cbc 100644 --- a/doc/sudoers.mdoc.in +++ b/doc/sudoers.mdoc.in @@ -714,12 +714,14 @@ User_Spec ::= User_List Host_List '=' Cmnd_Spec_List \e Cmnd_Spec_List ::= Cmnd_Spec | Cmnd_Spec ',' Cmnd_Spec_List -Cmnd_Spec ::= Runas_Spec? SELinux_Spec? Tag_Spec* Cmnd +Cmnd_Spec ::= Runas_Spec? SELinux_Spec? Solaris_Priv_Spec? Tag_Spec* Cmnd Runas_Spec ::= '(' Runas_List? (':' Runas_List)? ')' SELinux_Spec ::= ('ROLE=role' | 'TYPE=type') +Solaris_Priv_Spec ::= ('PRIVS=privset' | 'LIMITPRIVS=privset') + Tag_Spec ::= ('NOPASSWD:' | 'PASSWD:' | 'NOEXEC:' | 'EXEC:' | 'SETENV:' | 'NOSETENV:' | 'LOG_INPUT:' | 'NOLOG_INPUT:' | 'LOG_OUTPUT:' | 'NOLOG_OUTPUT:') @@ -898,6 +900,14 @@ specified in A role or type specified on the command line, however, will supercede the values in .Em sudoers . +.Ss Solaris_Priv_Spec +On Solaris systems, +.Em sudoers +entries may optionally specify Solaris privilege set and/or limit +privilege set associated with a command. +If privileges or limit privileges are specified with the command +it will override any default values specified in +.Em sudoers . .Ss Tag_Spec A command may have zero or more tags associated with it. There are @@ -2266,6 +2276,15 @@ will have the replaced with a unique combination of digits and letters, similar to the .Xr mktemp 3 function. +.It limitprivs +The default Solaris limit privileges to use when constructing a new +privilege set for a command. +This bounds all privileges of the executing process. +The default limit privileges may be overridden on a per-command basis in +.Em sudoers . +This option is only available if +.Nm +is built on Solaris 10 or higher. .It mailsub Subject of the mail sent to the .Em mailto @@ -2320,13 +2339,29 @@ character .Pp The default value is .Dq Li @passprompt@ . +.It privs +The default Solaris privileges to use when constructing a new +privilege set for a command. +This is passed to the executing process via the inherited privilege set, +but is bounded by the limit privileges. +If the +.Em privs +option is specified but the +.Em limitprivs +option is not, the limit privileges of the executing process is set to +.Em privs . +The default privileges may be overridden on a per-command basis in +.Em sudoers . +This option is only available if +.Nm +is built on Solaris 10 or higher. .It role The default SELinux role to use when constructing a new security context to run the command. The default role may be overridden on a per-command basis in .Em sudoers or via command line options. -This option is only available whe +This option is only available when .Nm sudo is built with SELinux support. .It runas_default diff --git a/doc/sudoers.pod b/doc/sudoers.pod index 28eb216f1..7c4573382 100644 --- a/doc/sudoers.pod +++ b/doc/sudoers.pod @@ -402,12 +402,14 @@ See L<"SUDOERS OPTIONS"> for a list of supported Defaults parameters. Cmnd_Spec_List ::= Cmnd_Spec | Cmnd_Spec ',' Cmnd_Spec_List - Cmnd_Spec ::= Runas_Spec? SELinux_Spec? Tag_Spec* Cmnd + Cmnd_Spec ::= Runas_Spec? SELinux_Spec? Solaris_Priv_Spec? Tag_Spec* Cmnd Runas_Spec ::= '(' Runas_List? (':' Runas_List)? ')' SELinux_Spec ::= ('ROLE=role' | 'TYPE=type') + Solaris_Priv_Spec ::= ('PRIVS=privset' | 'LIMITPRIVS=privset') + Tag_Spec ::= ('NOPASSWD:' | 'PASSWD:' | 'NOEXEC:' | 'EXEC:' | 'SETENV:' | 'NOSETENV:' | 'LOG_INPUT:' | 'NOLOG_INPUT:' | 'LOG_OUTPUT:' | 'NOLOG_OUTPUT:') @@ -499,6 +501,13 @@ type is specified with the command it will override any default values specified in I. A role or type specified on the command line, however, will supercede the values in I. +=head2 Solaris_Priv_Spec + +On Solaris systems, I entries may optionally specify +a Solaris privilege set and/or limit privilege set associated with a command. +If privileges or limit privileges are specified with the command +it will override any default values specified in I. + =head2 Tag_Spec A command may have zero or more tags associated with it. There are @@ -1279,6 +1288,16 @@ In addition to the escape sequences, path names that end in six or more Cs will have the Cs replaced with a unique combination of digits and letters, similar to the mktemp() function. +=item limitprivs + +The default Solaris limit privileges to use +when constructing a new privilege set for a command. +This bounds all privileges of the executing process. +The default limit privileges may be overridden +on a per-command basis in I. +This option is only available when B is built on +Solaris 10 or higher. + =item mailsub Subject of the mail sent to the I user. The escape C<%h> @@ -1330,12 +1349,24 @@ two consecutive C<%> characters are collapsed into a single C<%> character The default value is "C<@passprompt@>". +=item privs + +The default Solaris privileges to use +when constructing a new privilege set to run the command. +This is passed to the executing process via the inherited privilege set, +but is bounded by the limit privileges. +If the I option is specified but the I option is not, +the limit privileges of the executing process is set to I. +The default privileges may be overridden on a per-command basis in I. +This option is only available when B is built on +Solaris 10 or higher. + =item role The default SELinux role to use when constructing a new security context to run the command. The default role may be overridden on a per-command basis in I or via command line options. -This option is only available whe B is built with SELinux support. +This option is only available when B is built with SELinux support. =item runas_default diff --git a/plugins/sudoers/def_data.c b/plugins/sudoers/def_data.c index 3119df8e5..ff8f21fd7 100644 --- a/plugins/sudoers/def_data.c +++ b/plugins/sudoers/def_data.c @@ -342,6 +342,14 @@ struct sudo_defs_types sudo_defs_table[] = { "utmp_runas", T_FLAG, N_("Set the user in utmp to the runas user, not the invoking user"), NULL, + }, { + "privs", T_STR, + N_("Set of permitted privileges"), + NULL, + }, { + "limitprivs", T_STR, + N_("Set of limit privileges"), + NULL, }, { NULL, 0, NULL } diff --git a/plugins/sudoers/def_data.h b/plugins/sudoers/def_data.h index 43c2b96a6..774b39994 100644 --- a/plugins/sudoers/def_data.h +++ b/plugins/sudoers/def_data.h @@ -158,6 +158,10 @@ #define I_SET_UTMP 78 #define def_utmp_runas (sudo_defs_table[79].sd_un.flag) #define I_UTMP_RUNAS 79 +#define def_privs (sudo_defs_table[80].sd_un.str) +#define I_PRIVS 80 +#define def_limitprivs (sudo_defs_table[81].sd_un.str) +#define I_LIMITPRIVS 81 enum def_tuple { never, diff --git a/plugins/sudoers/def_data.in b/plugins/sudoers/def_data.in index 7b9d4e4b9..430f235bc 100644 --- a/plugins/sudoers/def_data.in +++ b/plugins/sudoers/def_data.in @@ -253,3 +253,9 @@ set_utmp utmp_runas T_FLAG "Set the user in utmp to the runas user, not the invoking user" +privs + T_STR + "Set of permitted privileges" +limitprivs + T_STR + "Set of limit privileges" diff --git a/plugins/sudoers/gram.c b/plugins/sudoers/gram.c index 49c45c97f..4cec3a232 100644 --- a/plugins/sudoers/gram.c +++ b/plugins/sudoers/gram.c @@ -136,11 +136,12 @@ typedef union { struct sudo_command command; struct cmndtag tag; struct selinux_info seinfo; + struct solaris_privs_info privinfo; char *string; int tok; } YYSTYPE; #endif /* YYSTYPE_DEFINED */ -#line 143 "gram.c" +#line 144 "gram.c" #define COMMAND 257 #define ALIAS 258 #define DEFVAR 259 @@ -172,6 +173,8 @@ typedef union { #define ERROR 285 #define TYPE 286 #define ROLE 287 +#define PRIVS 288 +#define LIMITPRIVS 289 #define YYERRCODE 256 #if defined(__cplusplus) || defined(__STDC__) const short yylhs[] = @@ -179,16 +182,17 @@ const short yylhs[] = short yylhs[] = #endif { -1, - 0, 0, 25, 25, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 4, 4, 3, 3, + 0, 0, 28, 28, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 4, 4, 3, 3, 3, 3, 3, 20, 20, 19, 10, 10, 8, 8, 8, 8, 8, 2, 2, 1, 6, 6, 23, 24, - 22, 22, 22, 22, 22, 17, 17, 18, 18, 18, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 5, 5, 5, 28, 28, 31, 9, 9, 29, - 29, 32, 7, 7, 30, 30, 33, 27, 27, 34, - 13, 13, 11, 11, 12, 12, 12, 12, 12, 16, - 16, 14, 14, 15, 15, 15, + 22, 22, 22, 22, 22, 26, 27, 25, 25, 25, + 25, 25, 17, 17, 18, 18, 18, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 5, 5, + 5, 31, 31, 34, 9, 9, 32, 32, 35, 7, + 7, 33, 33, 36, 30, 30, 37, 13, 13, 11, + 11, 12, 12, 12, 12, 12, 16, 16, 14, 14, + 15, 15, 15, }; #if defined(__cplusplus) || defined(__STDC__) const short yylen[] = @@ -199,13 +203,14 @@ short yylen[] = 0, 1, 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 1, 3, 1, 2, 3, 3, 3, 1, 3, 3, 1, 2, 1, 1, - 1, 1, 1, 1, 3, 4, 1, 2, 3, 3, - 0, 1, 1, 2, 2, 0, 3, 1, 3, 2, - 0, 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, + 1, 1, 1, 1, 3, 5, 1, 2, 3, 3, + 0, 1, 1, 2, 2, 3, 3, 0, 1, 1, + 2, 2, 0, 3, 1, 3, 2, 0, 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 yydefred[] = @@ -213,21 +218,22 @@ const short yydefred[] = short yydefred[] = #endif { 0, - 0, 85, 87, 88, 89, 0, 0, 0, 0, 0, - 86, 5, 0, 0, 0, 0, 0, 0, 81, 83, + 0, 92, 94, 95, 96, 0, 0, 0, 0, 0, + 93, 5, 0, 0, 0, 0, 0, 0, 88, 90, 0, 0, 3, 6, 0, 0, 17, 0, 29, 32, - 31, 33, 30, 0, 27, 0, 68, 0, 0, 64, - 63, 62, 0, 37, 73, 0, 0, 0, 65, 0, - 0, 70, 0, 0, 78, 0, 0, 75, 84, 0, + 31, 33, 30, 0, 27, 0, 75, 0, 0, 71, + 70, 69, 0, 37, 80, 0, 0, 0, 72, 0, + 0, 77, 0, 0, 85, 0, 0, 82, 91, 0, 0, 24, 0, 4, 0, 0, 0, 20, 0, 28, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 82, 0, 0, 21, 22, - 23, 18, 69, 74, 0, 66, 0, 71, 0, 79, - 0, 76, 0, 34, 0, 0, 25, 0, 0, 0, - 0, 0, 0, 51, 0, 0, 94, 96, 95, 0, - 90, 92, 0, 0, 47, 35, 0, 0, 0, 44, - 45, 93, 0, 0, 40, 39, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 36, 91, + 0, 0, 0, 0, 0, 89, 0, 0, 21, 22, + 23, 18, 76, 81, 0, 73, 0, 78, 0, 86, + 0, 83, 0, 34, 0, 0, 25, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 101, 103, 102, 0, + 97, 99, 0, 0, 54, 35, 0, 0, 0, 0, + 58, 0, 0, 44, 45, 100, 0, 0, 40, 39, + 0, 0, 0, 51, 52, 98, 46, 47, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 36, }; #if defined(__cplusplus) || defined(__STDC__) const short yydgoto[] = @@ -237,110 +243,112 @@ short yydgoto[] = { 18, 104, 105, 27, 28, 44, 45, 46, 35, 61, 37, 19, 20, 21, 121, 122, 123, 106, 110, 62, 63, - 129, 114, 115, 116, 22, 23, 54, 48, 51, 57, - 49, 52, 58, 55, + 143, 114, 115, 116, 131, 132, 133, 22, 23, 54, + 48, 51, 57, 49, 52, 58, 55, }; #if defined(__cplusplus) || defined(__STDC__) const short yysindex[] = #else short yysindex[] = #endif - { 475, - -270, 0, 0, 0, 0, -29, 567, 594, 594, -2, - 0, 0, -240, -222, -216, -212, -241, 0, 0, 0, - -25, 475, 0, 0, -10, -207, 0, 9, 0, 0, - 0, 0, 0, -235, 0, -33, 0, -31, -31, 0, - 0, 0, -242, 0, 0, -30, -7, 3, 0, -6, - 4, 0, -5, 6, 0, -1, 8, 0, 0, 594, - -20, 0, 10, 0, -205, -196, -194, 0, -29, 0, - 567, 9, 9, 9, 0, -2, 9, 567, -240, -2, - -222, 594, -216, 594, -212, 0, 31, 567, 0, 0, - 0, 0, 0, 0, 26, 0, 28, 0, 29, 0, - 29, 0, 541, 0, 32, -247, 0, 86, -15, 33, - 31, 14, 16, 0, -208, -204, 0, 0, 0, -231, - 0, 0, 38, 86, 0, 0, -179, -178, 491, 0, - 0, 0, 86, 38, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,}; + { 541, + -270, 0, 0, 0, 0, -21, -5, 553, 553, 20, + 0, 0, -242, -229, -216, -214, -240, 0, 0, 0, + -27, 541, 0, 0, -18, -227, 0, 2, 0, 0, + 0, 0, 0, -223, 0, -33, 0, -31, -31, 0, + 0, 0, -243, 0, 0, -24, -12, -6, 0, 3, + 4, 0, 5, 7, 0, 6, 10, 0, 0, 553, + -20, 0, 11, 0, -206, -193, -191, 0, -21, 0, + -5, 2, 2, 2, 0, 20, 2, -5, -242, 20, + -229, 553, -216, 553, -214, 0, 33, -5, 0, 0, + 0, 0, 0, 0, 31, 0, 32, 0, 34, 0, + 34, 0, 513, 0, 35, -226, 0, 86, -25, 36, + 33, 19, 21, -234, -202, -201, 0, 0, 0, -232, + 0, 0, 41, 86, 0, 0, -176, -173, 37, 38, + 0, -198, -195, 0, 0, 0, 86, 41, 0, 0, + -169, -168, 569, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,}; #if defined(__cplusplus) || defined(__STDC__) const short yyrindex[] = #else short yyrindex[] = #endif - { 87, + { 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 90, 0, 0, 1, 0, 0, 177, 0, 0, + 0, 97, 0, 0, 1, 0, 0, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 207, 0, 0, 237, 0, 0, 271, 0, 0, 300, 0, 0, 0, 0, 0, 329, 0, 0, 0, 0, 0, 0, 0, 0, 358, 387, 417, 0, 0, 446, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 463, 0, 0, 0, 0, 0, 0, 0, 30, 0, 59, 0, 89, 0, - 118, 0, 0, 0, 148, 514, 0, 0, 45, 0, - -26, 0, 0, 0, 537, 565, 0, 0, 0, 0, - 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,}; + 118, 0, 0, 0, 148, -28, 0, 0, 60, 0, + 463, 0, 0, 594, 489, 512, 0, 0, 0, 0, + 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, + 0, 623, 653, 0, 0, 0, 0, 63, 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 yygindex[] = #else short yygindex[] = #endif { 0, - -17, 0, 27, 11, 54, -64, 15, 64, 2, 34, - 39, 84, -3, -27, -18, -21, 0, 0, 19, 0, - 0, 0, -12, -4, 0, 88, 0, 0, 0, 0, - 35, 40, 23, 37, + -11, 0, 39, 12, 64, -72, 25, 72, -4, 40, + 49, 93, -1, -23, -8, -9, 0, 0, 28, 0, + 0, 0, -3, 8, 0, -13, -7, 0, 99, 0, + 0, 0, 0, 45, 46, 43, 47, }; -#define YYTABLESIZE 873 +#define YYTABLESIZE 932 #if defined(__cplusplus) || defined(__STDC__) const short yytable[] = #else short yytable[] = #endif { 26, - 19, 26, 26, 26, 38, 39, 46, 34, 36, 24, - 71, 94, 60, 76, 40, 41, 2, 47, 60, 3, - 4, 5, 29, 71, 30, 31, 117, 32, 60, 67, - 43, 118, 66, 19, 67, 50, 42, 11, 112, 113, - 87, 53, 124, 33, 19, 56, 72, 119, 73, 74, - 65, 68, 69, 78, 80, 82, 77, 89, 72, 84, - 79, 81, 67, 83, 147, 85, 90, 88, 91, 71, - 103, 76, 60, 125, 127, 111, 128, 112, 99, 95, - 101, 133, 113, 135, 136, 48, 1, 67, 80, 2, - 50, 72, 49, 126, 97, 92, 75, 70, 86, 109, - 59, 132, 134, 131, 93, 148, 107, 102, 0, 64, - 130, 0, 0, 96, 0, 0, 72, 77, 120, 100, - 98, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 19, 26, 36, 94, 41, 34, 38, 39, 26, 24, + 71, 26, 60, 40, 41, 47, 60, 2, 60, 76, + 3, 4, 5, 71, 66, 117, 67, 34, 50, 74, + 118, 68, 124, 19, 29, 42, 30, 31, 11, 32, + 87, 53, 65, 56, 19, 69, 119, 72, 78, 73, + 74, 79, 43, 129, 130, 33, 89, 77, 79, 112, + 113, 81, 74, 80, 83, 82, 84, 85, 88, 90, + 159, 91, 103, 95, 71, 76, 125, 60, 111, 127, + 99, 128, 101, 112, 137, 113, 139, 74, 87, 140, + 130, 79, 129, 147, 148, 1, 2, 141, 142, 126, + 55, 109, 57, 56, 97, 70, 75, 92, 86, 59, + 93, 136, 135, 146, 138, 107, 79, 84, 120, 145, + 64, 87, 134, 96, 144, 0, 98, 102, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 80, 26, 0, 0, - 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 87, 26, 0, 0, + 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 77, 12, 0, 0, 0, + 0, 0, 0, 0, 0, 84, 12, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 9, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 25, 0, 25, 25, 25, - 46, 46, 29, 0, 30, 31, 10, 32, 0, 9, - 0, 0, 46, 46, 46, 46, 46, 46, 46, 46, - 46, 46, 46, 33, 40, 41, 19, 0, 19, 46, - 46, 19, 19, 19, 19, 19, 19, 19, 19, 10, - 8, 0, 0, 0, 0, 0, 42, 0, 0, 19, - 19, 19, 19, 19, 19, 67, 0, 67, 0, 0, - 67, 67, 67, 67, 67, 67, 67, 67, 0, 11, - 0, 0, 0, 8, 0, 0, 0, 0, 67, 67, - 67, 67, 67, 67, 72, 0, 72, 0, 0, 72, - 72, 72, 72, 72, 72, 72, 72, 0, 7, 0, - 0, 0, 11, 0, 0, 0, 0, 72, 72, 72, - 72, 72, 72, 117, 80, 0, 80, 0, 118, 80, - 80, 80, 80, 80, 80, 80, 80, 15, 0, 0, - 0, 7, 0, 0, 119, 0, 0, 80, 80, 80, - 80, 80, 80, 77, 0, 77, 0, 0, 77, 77, - 77, 77, 77, 77, 77, 77, 13, 0, 0, 0, - 15, 0, 0, 0, 0, 0, 77, 77, 77, 77, - 77, 77, 0, 26, 0, 26, 0, 0, 26, 26, + 0, 0, 0, 0, 0, 25, 0, 25, 41, 41, + 29, 0, 30, 31, 25, 32, 10, 25, 0, 9, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 33, 29, 0, 30, 31, 19, 32, 19, 41, + 41, 19, 19, 19, 19, 19, 19, 19, 19, 10, + 8, 0, 0, 33, 0, 0, 40, 41, 0, 19, + 19, 19, 19, 19, 19, 74, 0, 74, 0, 0, + 74, 74, 74, 74, 74, 74, 74, 74, 42, 11, + 0, 0, 0, 8, 0, 0, 0, 0, 74, 74, + 74, 74, 74, 74, 79, 0, 79, 0, 0, 79, + 79, 79, 79, 79, 79, 79, 79, 0, 7, 0, + 0, 0, 11, 0, 0, 0, 0, 79, 79, 79, + 79, 79, 79, 117, 87, 0, 87, 0, 118, 87, + 87, 87, 87, 87, 87, 87, 87, 15, 0, 0, + 0, 7, 0, 0, 119, 0, 0, 87, 87, 87, + 87, 87, 87, 84, 0, 84, 0, 0, 84, 84, + 84, 84, 84, 84, 84, 84, 13, 0, 0, 0, + 15, 0, 0, 0, 0, 0, 84, 84, 84, 84, + 84, 84, 0, 26, 0, 26, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 14, 0, 0, 13, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 12, 0, 12, 0, 0, 12, 12, 12, @@ -349,45 +357,51 @@ short yytable[] = 12, 0, 9, 0, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, - 9, 0, 10, 0, 10, 0, 0, 10, 10, 10, - 10, 10, 10, 10, 10, 0, 0, 17, 0, 0, + 9, 0, 10, 0, 10, 53, 0, 10, 10, 10, + 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, - 10, 0, 0, 43, 0, 0, 8, 0, 8, 0, + 10, 42, 0, 0, 0, 0, 8, 0, 8, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 0, - 0, 0, 0, 0, 0, 0, 41, 0, 0, 8, + 0, 0, 0, 0, 43, 17, 0, 0, 0, 8, 8, 8, 8, 8, 8, 11, 0, 11, 0, 0, - 11, 11, 11, 11, 11, 11, 11, 11, 0, 42, - 0, 0, 0, 17, 0, 0, 0, 0, 11, 11, - 11, 11, 11, 11, 7, 0, 7, 0, 0, 7, - 7, 7, 7, 7, 7, 7, 7, 43, 108, 34, - 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, + 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, + 108, 0, 0, 17, 0, 0, 0, 0, 11, 11, + 11, 11, 11, 11, 7, 17, 7, 0, 0, 7, + 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, + 0, 43, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 15, 0, 15, 0, 0, 15, 15, - 15, 15, 15, 15, 15, 15, 17, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 13, 0, 13, 0, 0, 13, 13, 13, - 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, + 13, 13, 13, 13, 13, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 13, 13, 13, 0, 14, 0, 14, 0, 0, 14, 14, 14, - 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 16, 0, 16, 0, 0, 16, 16, 16, 16, - 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 16, 16, 16, 16, 16, 16, - 1, 0, 2, 0, 0, 3, 4, 5, 6, 7, - 8, 9, 10, 0, 0, 0, 0, 40, 41, 0, - 0, 0, 0, 11, 12, 13, 14, 15, 16, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 42, - 41, 41, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 42, 42, 0, 0, 0, 2, 0, - 0, 3, 4, 5, 0, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 0, 0, 0, 11, - 0, 43, 43, 0, 29, 0, 30, 31, 0, 32, - 0, 0, 0, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 0, 33, 0, 0, 0, 0, - 0, 2, 0, 0, 3, 4, 5, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 11, + 16, 16, 16, 16, 0, 0, 0, 0, 0, 53, + 53, 0, 0, 0, 16, 16, 16, 16, 16, 16, + 0, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 0, 0, 0, 42, 42, 0, 53, 53, + 53, 53, 0, 0, 0, 0, 0, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 43, 43, + 2, 0, 0, 3, 4, 5, 42, 42, 0, 0, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 11, 0, 0, 0, 0, 1, 0, 2, 43, + 43, 3, 4, 5, 6, 7, 8, 9, 10, 0, + 2, 0, 0, 3, 4, 5, 0, 0, 0, 11, + 12, 13, 14, 15, 16, 40, 41, 0, 0, 0, + 0, 11, 0, 0, 0, 0, 0, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 42, 0, 0, + 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 0, 0, 0, 0, 0, 0, 49, + 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 0, 0, 0, 0, 0, 0, 0, 50, + 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, }; #if defined(__cplusplus) || defined(__STDC__) const short yycheck[] = @@ -395,19 +409,19 @@ const short yycheck[] = short yycheck[] = #endif { 33, - 0, 33, 33, 33, 8, 9, 33, 33, 7, 280, - 44, 76, 44, 44, 257, 258, 258, 258, 44, 261, - 262, 263, 258, 44, 260, 261, 258, 263, 44, 0, - 33, 263, 43, 33, 45, 258, 279, 279, 286, 287, - 61, 258, 58, 279, 44, 258, 36, 279, 38, 39, - 61, 259, 44, 61, 61, 61, 46, 263, 0, 61, - 58, 58, 33, 58, 129, 58, 263, 58, 263, 44, - 40, 44, 44, 41, 61, 44, 61, 286, 82, 78, - 84, 44, 287, 263, 263, 41, 0, 58, 0, 0, - 41, 33, 41, 111, 80, 69, 43, 34, 60, 103, - 17, 120, 124, 116, 71, 133, 88, 85, -1, 22, - 115, -1, -1, 79, -1, -1, 58, 0, 33, 83, - 81, 33, -1, -1, -1, -1, -1, -1, -1, -1, + 0, 33, 7, 76, 33, 33, 8, 9, 33, 280, + 44, 33, 44, 257, 258, 258, 44, 258, 44, 44, + 261, 262, 263, 44, 43, 258, 45, 33, 258, 0, + 263, 259, 58, 33, 258, 279, 260, 261, 279, 263, + 61, 258, 61, 258, 44, 44, 279, 36, 61, 38, + 39, 58, 33, 288, 289, 279, 263, 46, 0, 286, + 287, 58, 33, 61, 58, 61, 61, 58, 58, 263, + 143, 263, 40, 78, 44, 44, 41, 44, 44, 61, + 82, 61, 84, 286, 44, 287, 263, 58, 0, 263, + 289, 33, 288, 263, 263, 0, 0, 61, 61, 111, + 41, 103, 41, 41, 80, 34, 43, 69, 60, 17, + 71, 120, 116, 137, 124, 88, 58, 0, 33, 133, + 22, 33, 115, 79, 132, -1, 81, 85, -1, 83, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 58, 0, -1, -1, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -417,14 +431,14 @@ short yycheck[] = -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 58, 0, -1, -1, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 259, -1, 259, 259, 259, - 257, 258, 258, -1, 260, 261, 0, 263, -1, 33, - -1, -1, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 279, 257, 258, 256, -1, 258, 286, - 287, 261, 262, 263, 264, 265, 266, 267, 268, 33, - 0, -1, -1, -1, -1, -1, 279, -1, -1, 279, + -1, -1, -1, -1, -1, 259, -1, 259, 257, 258, + 258, -1, 260, 261, 259, 263, 0, 259, -1, 33, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 279, 258, -1, 260, 261, 256, 263, 258, 288, + 289, 261, 262, 263, 264, 265, 266, 267, 268, 33, + 0, -1, -1, 279, -1, -1, 257, 258, -1, 279, 280, 281, 282, 283, 284, 256, -1, 258, -1, -1, - 261, 262, 263, 264, 265, 266, 267, 268, -1, 0, + 261, 262, 263, 264, 265, 266, 267, 268, 279, 0, -1, -1, -1, 33, -1, -1, -1, -1, 279, 280, 281, 282, 283, 284, 256, -1, 258, -1, -1, 261, 262, 263, 264, 265, 266, 267, 268, -1, 0, -1, @@ -444,51 +458,57 @@ short yycheck[] = 284, -1, 256, -1, 258, -1, -1, 261, 262, 263, 264, 265, 266, 267, 268, -1, -1, -1, 33, -1, -1, -1, -1, -1, -1, 279, 280, 281, 282, 283, - 284, -1, 256, -1, 258, -1, -1, 261, 262, 263, - 264, 265, 266, 267, 268, -1, -1, 33, -1, -1, + 284, -1, 256, -1, 258, 33, -1, 261, 262, 263, + 264, 265, 266, 267, 268, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 279, 280, 281, 282, 283, - 284, -1, -1, 33, -1, -1, 256, -1, 258, -1, + 284, 33, -1, -1, -1, -1, 256, -1, 258, -1, -1, 261, 262, 263, 264, 265, 266, 267, 268, -1, - -1, -1, -1, -1, -1, -1, 33, -1, -1, 279, + -1, -1, -1, -1, 33, 33, -1, -1, -1, 279, 280, 281, 282, 283, 284, 256, -1, 258, -1, -1, - 261, 262, 263, 264, 265, 266, 267, 268, -1, 33, - -1, -1, -1, 33, -1, -1, -1, -1, 279, 280, - 281, 282, 283, 284, 256, -1, 258, -1, -1, 261, - 262, 263, 264, 265, 266, 267, 268, 33, 58, 33, - -1, -1, -1, -1, -1, -1, -1, 279, 280, 281, + 261, 262, 263, 264, 265, 266, 267, 268, -1, -1, + 58, -1, -1, 33, -1, -1, -1, -1, 279, 280, + 281, 282, 283, 284, 256, 33, 258, -1, -1, 261, + 262, 263, 264, 265, 266, 267, 268, -1, -1, -1, + -1, 33, -1, -1, -1, -1, -1, 279, 280, 281, 282, 283, 284, 256, -1, 258, -1, -1, 261, 262, 263, 264, 265, 266, 267, 268, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, 279, 280, 281, 282, 283, 284, 256, -1, 258, -1, -1, 261, 262, 263, - 264, 265, 266, 267, 268, -1, -1, -1, -1, -1, + 264, 265, 266, 267, 268, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, 279, 280, 281, 282, 283, 284, -1, 256, -1, 258, -1, -1, 261, 262, 263, - 264, 265, 266, 267, 268, -1, -1, -1, -1, -1, + 264, 265, 266, 267, 268, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, 279, 280, 281, 282, 283, 284, 256, -1, 258, -1, -1, 261, 262, 263, 264, - 265, 266, 267, 268, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 279, 280, 281, 282, 283, 284, - 256, -1, 258, -1, -1, 261, 262, 263, 264, 265, - 266, 267, 268, -1, -1, -1, -1, 257, 258, -1, - -1, -1, -1, 279, 280, 281, 282, 283, 284, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 265, 266, 267, 268, -1, -1, -1, -1, -1, 257, + 258, -1, -1, -1, 279, 280, 281, 282, 283, 284, + -1, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, -1, -1, -1, 257, 258, -1, 286, 287, + 288, 289, -1, -1, -1, -1, -1, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 257, 258, + 258, -1, -1, 261, 262, 263, 288, 289, -1, -1, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 279, -1, -1, -1, -1, 256, -1, 258, 288, + 289, 261, 262, 263, 264, 265, 266, 267, 268, -1, + 258, -1, -1, 261, 262, 263, -1, -1, -1, 279, + 280, 281, 282, 283, 284, 257, 258, -1, -1, -1, + -1, 279, -1, -1, -1, -1, -1, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, -1, -1, 257, 258, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 257, 258, -1, -1, -1, 258, -1, - -1, 261, 262, 263, -1, 269, 270, 271, 272, 273, - 274, 275, 276, 277, 278, 279, -1, -1, -1, 279, - -1, 257, 258, -1, 258, -1, 260, 261, -1, 263, - -1, -1, -1, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, -1, 279, -1, -1, -1, -1, - -1, 258, -1, -1, 261, 262, 263, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 279, + 277, 278, 279, -1, -1, -1, -1, -1, -1, 257, + 258, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, -1, -1, -1, -1, -1, -1, -1, 257, + 258, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, }; #define YYFINAL 18 #ifndef YYDEBUG #define YYDEBUG 0 #endif -#define YYMAXTOKEN 287 +#define YYMAXTOKEN 289 #if YYDEBUG #if defined(__cplusplus) || defined(__STDC__) const char * const yyname[] = @@ -507,7 +527,7 @@ char *yyname[] = "DEFAULTS_HOST","DEFAULTS_USER","DEFAULTS_RUNAS","DEFAULTS_CMND","NOPASSWD", "PASSWD","NOEXEC","EXEC","SETENV","NOSETENV","LOG_INPUT","NOLOG_INPUT", "LOG_OUTPUT","NOLOG_OUTPUT","ALL","COMMENT","HOSTALIAS","CMNDALIAS","USERALIAS", -"RUNASALIAS","ERROR","TYPE","ROLE", +"RUNASALIAS","ERROR","TYPE","ROLE","PRIVS","LIMITPRIVS", }; #if defined(__cplusplus) || defined(__STDC__) const char * const yyrule[] = @@ -550,7 +570,7 @@ char *yyrule[] = "host : WORD", "cmndspeclist : cmndspec", "cmndspeclist : cmndspeclist ',' cmndspec", -"cmndspec : runasspec selinux cmndtag opcmnd", +"cmndspec : runasspec selinux solarisprivs cmndtag opcmnd", "opcmnd : cmnd", "opcmnd : '!' cmnd", "rolespec : ROLE '=' WORD", @@ -560,6 +580,13 @@ char *yyrule[] = "selinux : typespec", "selinux : rolespec typespec", "selinux : typespec rolespec", +"privsspec : PRIVS '=' WORD", +"limitprivsspec : LIMITPRIVS '=' WORD", +"solarisprivs :", +"solarisprivs : privsspec", +"solarisprivs : limitprivsspec", +"solarisprivs : privsspec limitprivsspec", +"solarisprivs : limitprivsspec privsspec", "runasspec :", "runasspec : '(' runaslist ')'", "runaslist : userlist", @@ -638,7 +665,7 @@ short *yyss; short *yysslim; YYSTYPE *yyvs; int yystacksize; -#line 611 "gram.y" +#line 658 "gram.y" static struct defaults * new_default(char *var, char *val, int op) { @@ -747,6 +774,9 @@ init_parser(const char *path, int quiet) #ifdef HAVE_SELINUX char *role = NULL, *type = NULL; #endif /* HAVE_SELINUX */ +#ifdef HAVE_PRIV_SET + char *privs = NULL, *limitprivs = NULL; +#endif /* HAVE_PRIV_SET */ while ((m = tq_pop(&priv->hostlist)) != NULL) { efree(m->name); @@ -764,6 +794,17 @@ init_parser(const char *path, int quiet) efree(cs->type); } #endif /* HAVE_SELINUX */ +#ifdef HAVE_PRIV_SET + /* Only free the first instance of privs/limitprivs. */ + if (cs->privs != privs) { + privs = cs->privs; + efree(cs->privs); + } + if (cs->limitprivs != limitprivs) { + limitprivs = cs->limitprivs; + efree(cs->limitprivs); + } +#endif /* HAVE_PRIV_SET */ if (tq_last(&cs->runasuserlist) != runasuser) { runasuser = tq_last(&cs->runasuserlist); while ((m = tq_pop(&cs->runasuserlist)) != NULL) { @@ -827,7 +868,7 @@ init_parser(const char *path, int quiet) debug_return; } -#line 778 "gram.c" +#line 819 "gram.c" /* allocate initial stack or double stack size, up to YYMAXDEPTH */ #if defined(__cplusplus) || defined(__STDC__) static int yygrowstack(void) @@ -845,22 +886,20 @@ static int yygrowstack() return -1; else if ((newsize *= 2) > YYMAXDEPTH) newsize = YYMAXDEPTH; - i = yyssp - yyss; #ifdef SIZE_MAX #define YY_SIZE_MAX SIZE_MAX #else #define YY_SIZE_MAX 0x7fffffff #endif - if (!newsize || YY_SIZE_MAX / newsize < sizeof *newss) + if (YY_SIZE_MAX / newsize < sizeof *newss) goto bail; + i = yyssp - yyss; newss = yyss ? (short *)realloc(yyss, newsize * sizeof *newss) : (short *)malloc(newsize * sizeof *newss); /* overflow check above */ if (newss == NULL) goto bail; yyss = newss; yyssp = newss + i; - if (!newsize || YY_SIZE_MAX / newsize < sizeof *newvs) - goto bail; newvs = yyvs ? (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs) : (YYSTYPE *)malloc(newsize * sizeof *newvs); /* overflow check above */ if (newvs == NULL) @@ -1033,127 +1072,127 @@ yyreduce: switch (yyn) { case 1: -#line 192 "gram.y" +#line 198 "gram.y" { ; } break; case 5: -#line 200 "gram.y" +#line 206 "gram.y" { ; } break; case 6: -#line 203 "gram.y" +#line 209 "gram.y" { yyerrok; } break; case 7: -#line 206 "gram.y" +#line 212 "gram.y" { add_userspec(yyvsp[-1].member, yyvsp[0].privilege); } break; case 8: -#line 209 "gram.y" +#line 215 "gram.y" { ; } break; case 9: -#line 212 "gram.y" +#line 218 "gram.y" { ; } break; case 10: -#line 215 "gram.y" +#line 221 "gram.y" { ; } break; case 11: -#line 218 "gram.y" +#line 224 "gram.y" { ; } break; case 12: -#line 221 "gram.y" +#line 227 "gram.y" { add_defaults(DEFAULTS, NULL, yyvsp[0].defaults); } break; case 13: -#line 224 "gram.y" +#line 230 "gram.y" { add_defaults(DEFAULTS_USER, yyvsp[-1].member, yyvsp[0].defaults); } break; case 14: -#line 227 "gram.y" +#line 233 "gram.y" { add_defaults(DEFAULTS_RUNAS, yyvsp[-1].member, yyvsp[0].defaults); } break; case 15: -#line 230 "gram.y" +#line 236 "gram.y" { add_defaults(DEFAULTS_HOST, yyvsp[-1].member, yyvsp[0].defaults); } break; case 16: -#line 233 "gram.y" +#line 239 "gram.y" { add_defaults(DEFAULTS_CMND, yyvsp[-1].member, yyvsp[0].defaults); } break; case 18: -#line 239 "gram.y" +#line 245 "gram.y" { list_append(yyvsp[-2].defaults, yyvsp[0].defaults); yyval.defaults = yyvsp[-2].defaults; } break; case 19: -#line 245 "gram.y" +#line 251 "gram.y" { yyval.defaults = new_default(yyvsp[0].string, NULL, true); } break; case 20: -#line 248 "gram.y" +#line 254 "gram.y" { yyval.defaults = new_default(yyvsp[0].string, NULL, false); } break; case 21: -#line 251 "gram.y" +#line 257 "gram.y" { yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, true); } break; case 22: -#line 254 "gram.y" +#line 260 "gram.y" { yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, '+'); } break; case 23: -#line 257 "gram.y" +#line 263 "gram.y" { yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, '-'); } break; case 25: -#line 263 "gram.y" +#line 269 "gram.y" { list_append(yyvsp[-2].privilege, yyvsp[0].privilege); yyval.privilege = yyvsp[-2].privilege; } break; case 26: -#line 269 "gram.y" +#line 275 "gram.y" { struct privilege *p = ecalloc(1, sizeof(*p)); list2tq(&p->hostlist, yyvsp[-2].member); @@ -1164,51 +1203,51 @@ case 26: } break; case 27: -#line 279 "gram.y" +#line 285 "gram.y" { yyval.member = yyvsp[0].member; yyval.member->negated = false; } break; case 28: -#line 283 "gram.y" +#line 289 "gram.y" { yyval.member = yyvsp[0].member; yyval.member->negated = true; } break; case 29: -#line 289 "gram.y" +#line 295 "gram.y" { yyval.member = new_member(yyvsp[0].string, ALIAS); } break; case 30: -#line 292 "gram.y" +#line 298 "gram.y" { yyval.member = new_member(NULL, ALL); } break; case 31: -#line 295 "gram.y" +#line 301 "gram.y" { yyval.member = new_member(yyvsp[0].string, NETGROUP); } break; case 32: -#line 298 "gram.y" +#line 304 "gram.y" { yyval.member = new_member(yyvsp[0].string, NTWKADDR); } break; case 33: -#line 301 "gram.y" +#line 307 "gram.y" { yyval.member = new_member(yyvsp[0].string, WORD); } break; case 35: -#line 307 "gram.y" +#line 313 "gram.y" { list_append(yyvsp[-2].cmndspec, yyvsp[0].cmndspec); #ifdef HAVE_SELINUX @@ -1218,6 +1257,13 @@ case 35: if (yyvsp[0].cmndspec->type == NULL) yyvsp[0].cmndspec->type = yyvsp[0].cmndspec->prev->type; #endif /* HAVE_SELINUX */ +#ifdef HAVE_PRIV_SET + /* propagate privs & limitprivs */ + if (yyvsp[0].cmndspec->privs == NULL) + yyvsp[0].cmndspec->privs = yyvsp[0].cmndspec->prev->privs; + if (yyvsp[0].cmndspec->limitprivs == NULL) + yyvsp[0].cmndspec->limitprivs = yyvsp[0].cmndspec->prev->limitprivs; +#endif /* HAVE_PRIV_SET */ /* propagate tags and runas list */ if (yyvsp[0].cmndspec->tags.nopasswd == UNSPEC) yyvsp[0].cmndspec->tags.nopasswd = yyvsp[0].cmndspec->prev->tags.nopasswd; @@ -1241,20 +1287,24 @@ case 35: } break; case 36: -#line 339 "gram.y" +#line 352 "gram.y" { struct cmndspec *cs = ecalloc(1, sizeof(*cs)); - if (yyvsp[-3].runas != NULL) { - list2tq(&cs->runasuserlist, yyvsp[-3].runas->runasusers); - list2tq(&cs->runasgrouplist, yyvsp[-3].runas->runasgroups); - efree(yyvsp[-3].runas); + if (yyvsp[-4].runas != NULL) { + list2tq(&cs->runasuserlist, yyvsp[-4].runas->runasusers); + list2tq(&cs->runasgrouplist, yyvsp[-4].runas->runasgroups); + efree(yyvsp[-4].runas); } else { tq_init(&cs->runasuserlist); tq_init(&cs->runasgrouplist); } #ifdef HAVE_SELINUX - cs->role = yyvsp[-2].seinfo.role; - cs->type = yyvsp[-2].seinfo.type; + cs->role = yyvsp[-3].seinfo.role; + cs->type = yyvsp[-3].seinfo.type; +#endif +#ifdef HAVE_PRIV_SET + cs->privs = yyvsp[-2].privinfo.privs; + cs->limitprivs = yyvsp[-2].privinfo.limitprivs; #endif cs->tags = yyvsp[-1].tag; cs->cmnd = yyvsp[0].member; @@ -1268,183 +1318,230 @@ case 36: } break; case 37: -#line 365 "gram.y" +#line 382 "gram.y" { yyval.member = yyvsp[0].member; yyval.member->negated = false; } break; case 38: -#line 369 "gram.y" +#line 386 "gram.y" { yyval.member = yyvsp[0].member; yyval.member->negated = true; } break; case 39: -#line 375 "gram.y" +#line 392 "gram.y" { yyval.string = yyvsp[0].string; } break; case 40: -#line 380 "gram.y" +#line 397 "gram.y" { yyval.string = yyvsp[0].string; } break; case 41: -#line 385 "gram.y" +#line 402 "gram.y" { yyval.seinfo.role = NULL; yyval.seinfo.type = NULL; } break; case 42: -#line 389 "gram.y" +#line 406 "gram.y" { yyval.seinfo.role = yyvsp[0].string; yyval.seinfo.type = NULL; } break; case 43: -#line 393 "gram.y" +#line 410 "gram.y" { yyval.seinfo.type = yyvsp[0].string; yyval.seinfo.role = NULL; } break; case 44: -#line 397 "gram.y" +#line 414 "gram.y" { yyval.seinfo.role = yyvsp[-1].string; yyval.seinfo.type = yyvsp[0].string; } break; case 45: -#line 401 "gram.y" +#line 418 "gram.y" { yyval.seinfo.type = yyvsp[-1].string; yyval.seinfo.role = yyvsp[0].string; } break; case 46: -#line 407 "gram.y" +#line 424 "gram.y" { - yyval.runas = NULL; + yyval.string = yyvsp[0].string; } break; case 47: -#line 410 "gram.y" +#line 428 "gram.y" { - yyval.runas = yyvsp[-1].runas; + yyval.string = yyvsp[0].string; } break; case 48: -#line 415 "gram.y" +#line 433 "gram.y" +{ + yyval.privinfo.privs = NULL; + yyval.privinfo.limitprivs = NULL; + } +break; +case 49: +#line 437 "gram.y" +{ + yyval.privinfo.privs = yyvsp[0].string; + yyval.privinfo.limitprivs = NULL; + } +break; +case 50: +#line 441 "gram.y" +{ + yyval.privinfo.privs = NULL; + yyval.privinfo.limitprivs = yyvsp[0].string; + } +break; +case 51: +#line 445 "gram.y" +{ + yyval.privinfo.privs = yyvsp[-1].string; + yyval.privinfo.limitprivs = yyvsp[0].string; + } +break; +case 52: +#line 449 "gram.y" +{ + yyval.privinfo.limitprivs = yyvsp[-1].string; + yyval.privinfo.privs = yyvsp[0].string; + } +break; +case 53: +#line 454 "gram.y" +{ + yyval.runas = NULL; + } +break; +case 54: +#line 457 "gram.y" +{ + yyval.runas = yyvsp[-1].runas; + } +break; +case 55: +#line 462 "gram.y" { yyval.runas = ecalloc(1, sizeof(struct runascontainer)); yyval.runas->runasusers = yyvsp[0].member; /* $$->runasgroups = NULL; */ } break; -case 49: -#line 420 "gram.y" +case 56: +#line 467 "gram.y" { yyval.runas = ecalloc(1, sizeof(struct runascontainer)); yyval.runas->runasusers = yyvsp[-2].member; yyval.runas->runasgroups = yyvsp[0].member; } break; -case 50: -#line 425 "gram.y" +case 57: +#line 472 "gram.y" { yyval.runas = ecalloc(1, sizeof(struct runascontainer)); /* $$->runasusers = NULL; */ yyval.runas->runasgroups = yyvsp[0].member; } break; -case 51: -#line 432 "gram.y" +case 58: +#line 479 "gram.y" { yyval.tag.nopasswd = yyval.tag.noexec = yyval.tag.setenv = yyval.tag.log_input = yyval.tag.log_output = UNSPEC; } break; -case 52: -#line 436 "gram.y" +case 59: +#line 483 "gram.y" { yyval.tag.nopasswd = true; } break; -case 53: -#line 439 "gram.y" +case 60: +#line 486 "gram.y" { yyval.tag.nopasswd = false; } break; -case 54: -#line 442 "gram.y" +case 61: +#line 489 "gram.y" { yyval.tag.noexec = true; } break; -case 55: -#line 445 "gram.y" +case 62: +#line 492 "gram.y" { yyval.tag.noexec = false; } break; -case 56: -#line 448 "gram.y" +case 63: +#line 495 "gram.y" { yyval.tag.setenv = true; } break; -case 57: -#line 451 "gram.y" +case 64: +#line 498 "gram.y" { yyval.tag.setenv = false; } break; -case 58: -#line 454 "gram.y" +case 65: +#line 501 "gram.y" { yyval.tag.log_input = true; } break; -case 59: -#line 457 "gram.y" +case 66: +#line 504 "gram.y" { yyval.tag.log_input = false; } break; -case 60: -#line 460 "gram.y" +case 67: +#line 507 "gram.y" { yyval.tag.log_output = true; } break; -case 61: -#line 463 "gram.y" +case 68: +#line 510 "gram.y" { yyval.tag.log_output = false; } break; -case 62: -#line 468 "gram.y" +case 69: +#line 515 "gram.y" { yyval.member = new_member(NULL, ALL); } break; -case 63: -#line 471 "gram.y" +case 70: +#line 518 "gram.y" { yyval.member = new_member(yyvsp[0].string, ALIAS); } break; -case 64: -#line 474 "gram.y" +case 71: +#line 521 "gram.y" { struct sudo_command *c = ecalloc(1, sizeof(*c)); c->cmnd = yyvsp[0].command.cmnd; @@ -1452,8 +1549,8 @@ case 64: yyval.member = new_member((char *)c, COMMAND); } break; -case 67: -#line 486 "gram.y" +case 74: +#line 533 "gram.y" { char *s; if ((s = alias_add(yyvsp[-2].string, HOSTALIAS, yyvsp[0].member)) != NULL) { @@ -1462,15 +1559,15 @@ case 67: } } break; -case 69: -#line 496 "gram.y" +case 76: +#line 543 "gram.y" { list_append(yyvsp[-2].member, yyvsp[0].member); yyval.member = yyvsp[-2].member; } break; -case 72: -#line 506 "gram.y" +case 79: +#line 553 "gram.y" { char *s; if ((s = alias_add(yyvsp[-2].string, CMNDALIAS, yyvsp[0].member)) != NULL) { @@ -1479,15 +1576,15 @@ case 72: } } break; -case 74: -#line 516 "gram.y" +case 81: +#line 563 "gram.y" { list_append(yyvsp[-2].member, yyvsp[0].member); yyval.member = yyvsp[-2].member; } break; -case 77: -#line 526 "gram.y" +case 84: +#line 573 "gram.y" { char *s; if ((s = alias_add(yyvsp[-2].string, RUNASALIAS, yyvsp[0].member)) != NULL) { @@ -1496,8 +1593,8 @@ case 77: } } break; -case 80: -#line 539 "gram.y" +case 87: +#line 586 "gram.y" { char *s; if ((s = alias_add(yyvsp[-2].string, USERALIAS, yyvsp[0].member)) != NULL) { @@ -1506,97 +1603,97 @@ case 80: } } break; -case 82: -#line 549 "gram.y" +case 89: +#line 596 "gram.y" { list_append(yyvsp[-2].member, yyvsp[0].member); yyval.member = yyvsp[-2].member; } break; -case 83: -#line 555 "gram.y" +case 90: +#line 602 "gram.y" { yyval.member = yyvsp[0].member; yyval.member->negated = false; } break; -case 84: -#line 559 "gram.y" +case 91: +#line 606 "gram.y" { yyval.member = yyvsp[0].member; yyval.member->negated = true; } break; -case 85: -#line 565 "gram.y" +case 92: +#line 612 "gram.y" { yyval.member = new_member(yyvsp[0].string, ALIAS); } break; -case 86: -#line 568 "gram.y" +case 93: +#line 615 "gram.y" { yyval.member = new_member(NULL, ALL); } break; -case 87: -#line 571 "gram.y" +case 94: +#line 618 "gram.y" { yyval.member = new_member(yyvsp[0].string, NETGROUP); } break; -case 88: -#line 574 "gram.y" +case 95: +#line 621 "gram.y" { yyval.member = new_member(yyvsp[0].string, USERGROUP); } break; -case 89: -#line 577 "gram.y" +case 96: +#line 624 "gram.y" { yyval.member = new_member(yyvsp[0].string, WORD); } break; -case 91: -#line 583 "gram.y" +case 98: +#line 630 "gram.y" { list_append(yyvsp[-2].member, yyvsp[0].member); yyval.member = yyvsp[-2].member; } break; -case 92: -#line 589 "gram.y" +case 99: +#line 636 "gram.y" { yyval.member = yyvsp[0].member; yyval.member->negated = false; } break; -case 93: -#line 593 "gram.y" +case 100: +#line 640 "gram.y" { yyval.member = yyvsp[0].member; yyval.member->negated = true; } break; -case 94: -#line 599 "gram.y" +case 101: +#line 646 "gram.y" { yyval.member = new_member(yyvsp[0].string, ALIAS); } break; -case 95: -#line 602 "gram.y" +case 102: +#line 649 "gram.y" { yyval.member = new_member(NULL, ALL); } break; -case 96: -#line 605 "gram.y" +case 103: +#line 652 "gram.y" { yyval.member = new_member(yyvsp[0].string, WORD); } break; -#line 1547 "gram.c" +#line 1644 "gram.c" } yyssp -= yym; yystate = *yyssp; diff --git a/plugins/sudoers/gram.h b/plugins/sudoers/gram.h index 2bec42054..05cd90d1f 100644 --- a/plugins/sudoers/gram.h +++ b/plugins/sudoers/gram.h @@ -29,6 +29,8 @@ #define ERROR 285 #define TYPE 286 #define ROLE 287 +#define PRIVS 288 +#define LIMITPRIVS 289 #ifndef YYSTYPE_DEFINED #define YYSTYPE_DEFINED typedef union { @@ -40,6 +42,7 @@ typedef union { struct sudo_command command; struct cmndtag tag; struct selinux_info seinfo; + struct solaris_privs_info privinfo; char *string; int tok; } YYSTYPE; diff --git a/plugins/sudoers/gram.y b/plugins/sudoers/gram.y index 0315f2437..51e61c783 100644 --- a/plugins/sudoers/gram.y +++ b/plugins/sudoers/gram.y @@ -123,6 +123,7 @@ yyerror(const char *s) struct sudo_command command; struct cmndtag tag; struct selinux_info seinfo; + struct solaris_privs_info privinfo; char *string; int tok; } @@ -161,6 +162,8 @@ yyerror(const char *s) %token ERROR %token TYPE /* SELinux type */ %token ROLE /* SELinux role */ +%token PRIVS /* Solaris privileges */ +%token LIMITPRIVS /* Solaris limit privileges */ %type cmndspec %type cmndspeclist @@ -186,6 +189,9 @@ yyerror(const char *s) %type selinux %type rolespec %type typespec +%type solarisprivs +%type privsspec +%type limitprivsspec %% @@ -313,6 +319,13 @@ cmndspeclist : cmndspec if ($3->type == NULL) $3->type = $3->prev->type; #endif /* HAVE_SELINUX */ +#ifdef HAVE_PRIV_SET + /* propagate privs & limitprivs */ + if ($3->privs == NULL) + $3->privs = $3->prev->privs; + if ($3->limitprivs == NULL) + $3->limitprivs = $3->prev->limitprivs; +#endif /* HAVE_PRIV_SET */ /* propagate tags and runas list */ if ($3->tags.nopasswd == UNSPEC) $3->tags.nopasswd = $3->prev->tags.nopasswd; @@ -336,7 +349,7 @@ cmndspeclist : cmndspec } ; -cmndspec : runasspec selinux cmndtag opcmnd { +cmndspec : runasspec selinux solarisprivs cmndtag opcmnd { struct cmndspec *cs = ecalloc(1, sizeof(*cs)); if ($1 != NULL) { list2tq(&cs->runasuserlist, $1->runasusers); @@ -350,8 +363,12 @@ cmndspec : runasspec selinux cmndtag opcmnd { cs->role = $2.role; cs->type = $2.type; #endif - cs->tags = $3; - cs->cmnd = $4; +#ifdef HAVE_PRIV_SET + cs->privs = $3.privs; + cs->limitprivs = $3.limitprivs; +#endif + cs->tags = $4; + cs->cmnd = $5; cs->prev = cs; cs->next = NULL; /* sudo "ALL" implies the SETENV tag */ @@ -404,6 +421,36 @@ selinux : /* empty */ { } ; +privsspec : PRIVS '=' WORD { + $$ = $3; + } + ; +limitprivsspec : LIMITPRIVS '=' WORD { + $$ = $3; + } + ; + +solarisprivs : /* empty */ { + $$.privs = NULL; + $$.limitprivs = NULL; + } + | privsspec { + $$.privs = $1; + $$.limitprivs = NULL; + } + | limitprivsspec { + $$.privs = NULL; + $$.limitprivs = $1; + } + | privsspec limitprivsspec { + $$.privs = $1; + $$.limitprivs = $2; + } + | limitprivsspec privsspec { + $$.limitprivs = $1; + $$.privs = $2; + } + runasspec : /* empty */ { $$ = NULL; } @@ -716,6 +763,9 @@ init_parser(const char *path, int quiet) #ifdef HAVE_SELINUX char *role = NULL, *type = NULL; #endif /* HAVE_SELINUX */ +#ifdef HAVE_PRIV_SET + char *privs = NULL, *limitprivs = NULL; +#endif /* HAVE_PRIV_SET */ while ((m = tq_pop(&priv->hostlist)) != NULL) { efree(m->name); @@ -733,6 +783,17 @@ init_parser(const char *path, int quiet) efree(cs->type); } #endif /* HAVE_SELINUX */ +#ifdef HAVE_PRIV_SET + /* Only free the first instance of privs/limitprivs. */ + if (cs->privs != privs) { + privs = cs->privs; + efree(cs->privs); + } + if (cs->limitprivs != limitprivs) { + limitprivs = cs->limitprivs; + efree(cs->limitprivs); + } +#endif /* HAVE_PRIV_SET */ if (tq_last(&cs->runasuserlist) != runasuser) { runasuser = tq_last(&cs->runasuserlist); while ((m = tq_pop(&cs->runasuserlist)) != NULL) { diff --git a/plugins/sudoers/parse.c b/plugins/sudoers/parse.c index 4937145f5..544c2a62c 100644 --- a/plugins/sudoers/parse.c +++ b/plugins/sudoers/parse.c @@ -239,6 +239,13 @@ sudo_file_lookup(struct sudo_nss *nss, int validated, int pwflag) if (user_type == NULL) user_type = cs->type ? estrdup(cs->type) : def_type; #endif /* HAVE_SELINUX */ +#ifdef HAVE_PRIV_SET + /* Set Solaris privilege sets */ + if (runas_privs == NULL) + runas_privs = cs->privs ? estrdup(cs->privs) : def_privs; + if (runas_limitprivs == NULL) + runas_limitprivs = cs->limitprivs ? estrdup(cs->limitprivs) : def_limitprivs; +#endif /* HAVE_PRIV_SET */ goto matched2; } } @@ -281,6 +288,12 @@ sudo_file_append_cmnd(struct cmndspec *cs, struct cmndtag *tags, struct member *m; debug_decl(sudo_file_append_cmnd, SUDO_DEBUG_NSS) +#ifdef HAVE_PRIV_SET + if (cs->privs) + lbuf_append(lbuf, "PRIVS=\"%s\" ", cs->privs); + if (cs->limitprivs) + lbuf_append(lbuf, "LIMITPRIVS=\"%s\" ", cs->limitprivs); +#endif /* HAVE_PRIV_SET */ #ifdef HAVE_SELINUX if (cs->role) lbuf_append(lbuf, "ROLE=%s ", cs->role); diff --git a/plugins/sudoers/parse.h b/plugins/sudoers/parse.h index 3b1a5b50d..9c53fb82f 100644 --- a/plugins/sudoers/parse.h +++ b/plugins/sudoers/parse.h @@ -57,7 +57,17 @@ struct selinux_info { }; /* - * The parses sudoers file is stored as a collection of linked lists, + * Solaris privileges container struct + * Currently just contains permitted and limit privileges. + * It could have PFEXEC and PRIV_AWARE flags added in the future. + */ +struct solaris_privs_info { + char *privs; + char *limitprivs; +}; + +/* + * The parsed sudoers file is stored as a collection of linked lists, * modelled after the yacc grammar. * * Other than the alias struct, which is stored in a red-black tree, @@ -111,6 +121,9 @@ struct cmndspec { #ifdef HAVE_SELINUX char *role, *type; /* SELinux role and type */ #endif +#ifdef HAVE_PRIV_SET + char *privs, *limitprivs; /* Solaris privilege sets */ +#endif }; /* diff --git a/plugins/sudoers/sudoers.c b/plugins/sudoers/sudoers.c index b0a18e8dd..14db320f3 100644 --- a/plugins/sudoers/sudoers.c +++ b/plugins/sudoers/sudoers.c @@ -697,6 +697,12 @@ sudoers_policy_main(int argc, char * const argv[], int pwflag, char *env_add[], if (user_type != NULL) command_info[info_len++] = fmt_string("selinux_type", user_type); #endif /* HAVE_SELINUX */ +#ifdef HAVE_PRIV_SET + if (runas_privs != NULL) + command_info[info_len++] = fmt_string("runas_privs", runas_privs); + if (runas_limitprivs != NULL) + command_info[info_len++] = fmt_string("runas_limitprivs", runas_limitprivs); +#endif /* HAVE_SELINUX */ /* Must audit before uid change. */ audit_success(NewArgv); @@ -1312,6 +1318,16 @@ deserialize_info(char * const args[], char * const settings[], char * const user def_use_loginclass = true; continue; } +#ifdef HAVE_PRIV_SET + if (MATCHES(*cur, "runas_privs=")) { + def_privs = *cur + sizeof("runas_privs=") - 1; + continue; + } + if (MATCHES(*cur, "runas_limitprivs=")) { + def_limitprivs = *cur + sizeof("runas_limitprivs=") - 1; + continue; + } +#endif /* HAVE_PRIV_SET */ #ifdef HAVE_SELINUX if (MATCHES(*cur, "selinux_role=")) { user_role = *cur + sizeof("selinux_role=") - 1; diff --git a/plugins/sudoers/sudoers.h b/plugins/sudoers/sudoers.h index 8a4bad766..c573fb22c 100644 --- a/plugins/sudoers/sudoers.h +++ b/plugins/sudoers/sudoers.h @@ -80,6 +80,10 @@ struct sudo_user { #ifdef HAVE_SELINUX char *role; char *type; +#endif +#ifdef HAVE_PRIV_SET + char *privs; + char *limitprivs; #endif char *cwd; char *iolog_file; @@ -185,6 +189,8 @@ struct sudo_user { #define user_role (sudo_user.role) #define user_type (sudo_user.type) #define user_closefrom (sudo_user.closefrom) +#define runas_privs (sudo_user.privs) +#define runas_limitprivs (sudo_user.limitprivs) #ifdef __TANDEM # define ROOT_UID 65535 diff --git a/plugins/sudoers/testsudoers.c b/plugins/sudoers/testsudoers.c index f71eb8349..cbca1671d 100644 --- a/plugins/sudoers/testsudoers.c +++ b/plugins/sudoers/testsudoers.c @@ -636,6 +636,12 @@ print_privilege(struct privilege *priv) if (cs->type) printf("TYPE=%s ", cs->type); #endif /* HAVE_SELINUX */ +#ifdef HAVE_PRIV_SET + if (cs->privs) + printf("PRIVS=%s ", cs->privs); + if (cs->limitprivs) + printf("LIMITPRIVS=%s ", cs->limitprivs); +#endif /* HAVE_PRIV_SET */ if (cs->tags.nopasswd != UNSPEC && cs->tags.nopasswd != tags.nopasswd) printf("%sPASSWD: ", cs->tags.nopasswd ? "NO" : ""); if (cs->tags.noexec != UNSPEC && cs->tags.noexec != tags.noexec) diff --git a/plugins/sudoers/toke.c b/plugins/sudoers/toke.c index 40bc1472f..219f8b584 100644 --- a/plugins/sudoers/toke.c +++ b/plugins/sudoers/toke.c @@ -289,77 +289,79 @@ static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); *yy_cp = '\0'; \ yy_c_buf_p = yy_cp; -#define YY_NUM_RULES 59 -#define YY_END_OF_BUFFER 60 -static yyconst short int yy_accept[607] = +#define YY_NUM_RULES 61 +#define YY_END_OF_BUFFER 62 +static yyconst short int yy_accept[622] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 60, 47, 55, 54, 53, 46, 58, 32, - 48, 49, 32, 50, 47, 47, 47, 47, 52, 51, - 58, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 58, 47, 47, 55, 58, 42, 42, 42, 42, - 42, 2, 58, 1, 47, 47, 17, 16, 17, 16, - 16, 58, 58, 58, 3, 9, 8, 9, 4, 9, - 5, 58, 13, 13, 13, 11, 12, 47, 0, 55, - 53, 0, 57, 0, 47, 34, 0, 32, 0, 33, - 0, 45, 45, 0, 47, 47, 0, 47, 47, 47, - - 47, 0, 37, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 47, 56, 47, 55, 0, 0, 0, - 0, 0, 0, 47, 47, 47, 47, 47, 2, 1, - 0, 1, 43, 43, 0, 47, 17, 17, 15, 14, - 15, 0, 0, 3, 9, 0, 6, 7, 9, 9, - 13, 0, 13, 13, 0, 10, 0, 0, 0, 34, - 34, 0, 0, 47, 47, 47, 47, 47, 0, 0, - 37, 37, 42, 39, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 47, 0, 0, 0, 0, 0, - 0, 47, 47, 47, 47, 47, 0, 47, 10, 0, - - 47, 47, 47, 47, 47, 47, 0, 38, 38, 38, - 0, 0, 37, 37, 37, 37, 37, 37, 37, 42, - 42, 42, 42, 42, 42, 42, 42, 40, 42, 41, - 47, 0, 0, 0, 0, 0, 0, 47, 47, 47, - 47, 47, 47, 47, 0, 0, 38, 38, 38, 0, - 37, 37, 0, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 0, 25, 42, 42, 42, 42, - 42, 42, 42, 42, 47, 0, 0, 0, 0, 47, - 47, 47, 47, 47, 47, 47, 47, 0, 38, 0, - 37, 37, 37, 0, 0, 0, 37, 37, 37, 37, - - 37, 37, 37, 37, 37, 37, 37, 37, 37, 42, - 42, 42, 42, 42, 42, 42, 42, 47, 0, 0, - 0, 47, 47, 47, 35, 35, 35, 0, 0, 37, - 37, 37, 37, 37, 37, 37, 0, 0, 0, 0, + 0, 0, 62, 49, 57, 56, 55, 48, 60, 32, + 50, 51, 32, 52, 49, 49, 49, 49, 54, 53, + 60, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 60, 49, 49, 57, 60, 44, 44, 44, 44, + 44, 2, 60, 1, 49, 44, 44, 49, 17, 16, + 17, 16, 16, 60, 60, 60, 3, 9, 8, 9, + 4, 9, 5, 60, 13, 13, 13, 11, 12, 49, + 0, 57, 55, 0, 59, 0, 49, 34, 0, 32, + 0, 33, 0, 47, 47, 0, 49, 49, 0, 49, + + 49, 49, 49, 0, 37, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 49, 58, 49, + 57, 0, 0, 0, 0, 0, 0, 49, 49, 49, + 49, 49, 2, 1, 0, 1, 45, 45, 0, 49, + 17, 17, 15, 14, 15, 0, 0, 3, 9, 0, + 6, 7, 9, 9, 13, 0, 13, 13, 0, 10, + 0, 0, 0, 34, 34, 0, 0, 49, 49, 49, + 49, 49, 0, 0, 37, 37, 44, 39, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 49, 0, 0, 0, 0, 0, 0, 49, 49, 49, + + 49, 49, 0, 49, 10, 0, 49, 49, 49, 49, + 49, 49, 0, 38, 38, 38, 0, 0, 37, 37, + 37, 37, 37, 37, 37, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 40, 44, 41, 49, 0, + 0, 0, 0, 0, 0, 49, 49, 49, 49, 49, + 49, 49, 0, 0, 38, 38, 38, 0, 37, 37, 0, 37, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 42, 42, 0, 24, 42, - 42, 42, 42, 0, 23, 0, 26, 47, 0, 0, - 0, 47, 47, 47, 47, 35, 35, 35, 35, 0, - 37, 0, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 0, 0, 0, 37, 37, 37, 37, + 37, 37, 0, 25, 44, 44, 44, 44, 44, 44, + 44, 44, 42, 44, 49, 0, 0, 0, 0, 49, + 49, 49, 49, 49, 49, 49, 49, 0, 38, 0, - 37, 37, 37, 37, 37, 37, 37, 37, 37, 42, - 42, 42, 42, 42, 42, 44, 0, 0, 0, 47, - 20, 43, 36, 36, 36, 36, 37, 0, 0, 0, - 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 0, 0, 0, 0, 0, 37, 37, - 37, 37, 37, 37, 37, 37, 42, 42, 42, 42, - 0, 22, 0, 27, 0, 20, 0, 0, 47, 0, - 47, 47, 47, 36, 36, 36, 36, 0, 0, 0, + 37, 37, 37, 0, 0, 0, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 49, 0, + 0, 0, 49, 49, 49, 35, 35, 35, 0, 0, + 37, 37, 37, 37, 37, 37, 37, 0, 0, 0, 0, 0, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 44, 44, 44, 0, + 24, 44, 44, 44, 44, 0, 23, 0, 26, 49, + 0, 0, 0, 49, 49, 49, 49, 35, 35, 35, + 35, 0, 37, 0, 37, 37, 37, 37, 37, 37, - 37, 37, 0, 30, 42, 42, 42, 0, 0, 0, - 18, 0, 21, 20, 0, 0, 0, 0, 0, 20, - 0, 47, 47, 47, 0, 0, 0, 37, 37, 37, + 37, 37, 37, 37, 37, 0, 0, 0, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 0, 28, 42, 42, 21, - 0, 0, 20, 47, 47, 47, 47, 47, 0, 0, + 37, 44, 44, 44, 44, 44, 44, 44, 46, 0, + 0, 0, 49, 20, 45, 36, 36, 36, 36, 37, 0, 0, 0, 37, 37, 37, 37, 37, 37, 37, - 37, 0, 31, 42, 0, 47, 47, 47, 37, 37, - 37, 37, 37, 37, 0, 29, 0, 0, 19, 47, - 47, 47, 47, 47, 37, 37, 37, 37, 37, 35, + 37, 37, 37, 37, 37, 37, 0, 0, 0, 0, + 0, 37, 37, 37, 37, 37, 37, 37, 37, 44, + 44, 44, 44, 44, 0, 22, 0, 27, 0, 20, + 0, 0, 49, 0, 49, 49, 49, 36, 36, 36, + 36, 0, 0, 0, 0, 0, 37, 37, 37, 37, - 35, 35, 35, 35, 35, 0 + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 43, 0, 30, 44, + 44, 44, 0, 0, 0, 18, 0, 21, 20, 0, + 0, 0, 0, 0, 20, 0, 49, 49, 49, 0, + 0, 0, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 0, 28, 44, 44, 21, 0, 0, 20, 49, 49, + 49, 49, 49, 0, 0, 0, 0, 0, 37, 37, + 37, 37, 37, 37, 37, 37, 0, 31, 44, 0, + 49, 49, 49, 37, 37, 37, 37, 37, 37, 0, + + 29, 0, 0, 19, 49, 49, 49, 49, 49, 37, + 37, 37, 37, 37, 35, 35, 35, 35, 35, 35, + 0 } ; static yyconst int yy_ec[256] = @@ -371,13 +373,13 @@ static yyconst int yy_ec[256] = 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 22, 22, 23, 24, 1, 1, 25, 26, 10, 27, 28, 29, 30, 31, 32, 29, - 33, 34, 35, 36, 36, 37, 36, 38, 39, 40, - 36, 41, 42, 43, 44, 45, 46, 47, 48, 36, - 10, 49, 10, 1, 50, 1, 51, 52, 53, 54, + 33, 34, 35, 36, 36, 37, 38, 39, 40, 41, + 36, 42, 43, 44, 45, 46, 47, 48, 49, 36, + 10, 50, 10, 1, 51, 1, 52, 53, 54, 55, - 55, 56, 57, 57, 58, 57, 57, 59, 60, 61, - 62, 57, 57, 63, 64, 65, 66, 57, 57, 57, - 57, 57, 1, 1, 1, 1, 1, 1, 1, 1, + 56, 57, 58, 58, 59, 58, 58, 60, 61, 62, + 63, 58, 58, 64, 65, 66, 67, 58, 58, 58, + 58, 58, 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, @@ -394,587 +396,583 @@ static yyconst int yy_ec[256] = 1, 1, 1, 1, 1 } ; -static yyconst int yy_meta[67] = +static yyconst int yy_meta[68] = { 0, 1, 2, 3, 4, 5, 6, 1, 7, 7, 1, 1, 8, 1, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 12, 13, 7, 1, 11, 11, 11, 11, 11, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 14, 15, - 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 14, + 15, 16, 16, 16, 16, 16, 16, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15 } ; -static yyconst short int yy_base[671] = +static yyconst short int yy_base[686] = { 0, - 0, 65, 67, 72, 99, 114, 162, 227, 292, 340, - 86, 125, 2840, 2790, 2836, 3665, 2833, 3665, 387, 70, - 3665, 3665, 2771, 3665, 136, 397, 133, 159, 2795, 3665, - 3665, 453, 2781, 33, 504, 2770, 2767, 2777, 2765, 2771, - 2754, 559, 170, 19, 165, 583, 38, 49, 2739, 68, - 2727, 81, 219, 2771, 305, 48, 0, 3665, 2761, 3665, - 0, 250, 639, 119, 0, 2709, 3665, 108, 3665, 112, - 3665, 140, 2699, 98, 121, 3665, 195, 2693, 661, 2739, - 2736, 2736, 3665, 227, 247, 300, 316, 152, 354, 2681, - 686, 373, 2670, 711, 352, 722, 2692, 2669, 375, 414, - - 302, 2656, 57, 763, 0, 2628, 2625, 2614, 505, 2602, - 2606, 2599, 2601, 202, 3665, 153, 546, 2572, 2565, 2549, - 2537, 2524, 200, 110, 244, 28, 111, 252, 171, 2578, - 422, 2577, 565, 2529, 818, 262, 0, 2573, 179, 3665, - 3665, 599, 269, 0, 2513, 453, 3665, 3665, 2512, 548, - 2490, 2533, 206, 253, 323, 2535, 2524, 2513, 607, 615, - 306, 722, 586, 831, 867, 903, 939, 2499, 2456, 980, - 333, 1022, 1063, 0, 2430, 2394, 2363, 2364, 2374, 2369, - 2327, 2330, 2329, 2328, 266, 2289, 2283, 2272, 2274, 2279, - 409, 334, 2279, 145, 335, 83, 672, 278, 2327, 2325, - - 627, 259, 1106, 1142, 741, 210, 2293, 2279, 683, 513, - 2275, 2271, 352, 747, 1178, 780, 788, 1220, 815, 2270, - 400, 325, 2261, 2258, 2248, 2246, 2242, 0, 2240, 0, - 489, 2223, 2213, 2198, 2211, 2198, 420, 407, 529, 490, - 491, 1263, 1299, 1335, 2235, 2234, 839, 2234, 2232, 2228, - 2226, 528, 848, 657, 856, 665, 1371, 0, 877, 1382, - 886, 894, 1424, 913, 570, 3665, 2208, 2197, 2201, 2178, - 2185, 2194, 2194, 2176, 558, 2169, 2152, 2150, 648, 626, - 530, 559, 923, 336, 1467, 1503, 964, 2171, 2140, 2139, - 2138, 1537, 551, 1000, 1041, 1082, 653, 694, 797, 1049, - - 923, 1580, 0, 1116, 1591, 1090, 1008, 1633, 1125, 2121, - 2082, 747, 686, 2064, 2071, 786, 926, 905, 2080, 2033, - 679, 634, 544, 915, 1675, 1710, 1745, 2052, 2043, 2033, - 1150, 1781, 1158, 1133, 1822, 1197, 1166, 2028, 1239, 1273, - 1207, 950, 951, 962, 991, 1247, 1073, 1865, 0, 1283, - 1876, 1307, 1315, 1918, 1323, 1987, 1968, 1188, 3665, 1967, - 1951, 1929, 1913, 1286, 3665, 1336, 3665, 707, 1897, 1889, - 786, 930, 764, 1298, 1358, 1041, 1960, 1995, 1400, 1927, - 1879, 1348, 708, 1406, 1348, 2031, 0, 559, 2042, 1441, - 1449, 2083, 1477, 1487, 1513, 1523, 1230, 1290, 1458, 1548, - - 1557, 1602, 2126, 0, 1613, 2137, 1650, 1565, 1660, 1806, - 1779, 1680, 1675, 1359, 1406, 1626, 1601, 1577, 897, 938, - 1695, 1589, 2180, 2216, 2252, 2288, 1611, 1686, 1720, 1731, - 1563, 1478, 1504, 1694, 1524, 2324, 0, 617, 2335, 1753, - 1761, 2376, 1769, 1798, 1550, 1808, 1841, 1851, 1335, 1358, - 1887, 714, 825, 2419, 0, 926, 1407, 1468, 1430, 1431, - 1547, 3665, 1616, 3665, 1381, 1731, 1045, 1512, 1575, 1908, - 1913, 1970, 1498, 2429, 2465, 1947, 1611, 1981, 1264, 2006, - 2016, 2061, 1198, 1181, 1732, 1782, 2067, 1842, 2501, 0, - 1181, 2512, 2100, 1904, 2553, 2110, 2155, 2164, 2189, 1769, - - 1142, 1232, 1634, 3665, 1699, 1095, 1077, 1025, 1046, 1306, - 3665, 384, 981, 2211, 2218, 2238, 2243, 2263, 2288, 2249, - 2307, 2596, 2632, 2668, 2304, 2354, 2395, 983, 894, 1902, - 1928, 2362, 1929, 2704, 0, 1428, 2715, 2403, 2437, 2445, - 867, 2454, 2474, 2483, 831, 1982, 3665, 1983, 782, 3665, - 1511, 2489, 2529, 2537, 1895, 2758, 2794, 2573, 2579, 650, - 2607, 2617, 2642, 629, 525, 1931, 447, 347, 2650, 0, - 1528, 2019, 3665, 2044, 1805, 2830, 2866, 2902, 2676, 2684, - 2692, 323, 0, 316, 2067, 3665, 166, 1845, 3665, 2733, - 1945, 2938, 2974, 2743, 3665, 2767, 2777, 2658, 3665, 2805, - - 2813, 2847, 63, 2855, 2881, 3665, 3023, 3039, 3055, 3071, - 3087, 3103, 3119, 3135, 3151, 3157, 3173, 3189, 2025, 3205, - 3221, 3237, 3253, 3269, 3285, 3301, 3307, 3314, 3330, 3346, - 3352, 3359, 3365, 3371, 3377, 3384, 3390, 3396, 3402, 3409, - 3417, 3423, 3429, 3435, 3442, 3450, 3456, 3462, 3469, 3477, - 3483, 3491, 3498, 3506, 3512, 3520, 3527, 3535, 3551, 3567, - 3583, 3589, 3597, 3604, 3610, 3618, 3624, 3632, 3648, 1295 + 0, 66, 68, 76, 119, 124, 173, 239, 148, 197, + 82, 90, 2937, 2886, 2933, 3595, 2929, 3595, 165, 65, + 3595, 3595, 2882, 3595, 130, 293, 173, 146, 2907, 3595, + 3595, 350, 2893, 42, 402, 41, 2889, 74, 2888, 2895, + 2876, 458, 197, 57, 219, 482, 38, 207, 2854, 37, + 2851, 117, 249, 2880, 326, 2841, 2852, 105, 0, 3595, + 2875, 3595, 0, 469, 424, 143, 0, 2828, 3595, 48, + 3595, 223, 3595, 155, 2827, 202, 97, 3595, 252, 2817, + 504, 2855, 2852, 2852, 3595, 258, 504, 312, 526, 201, + 548, 2796, 557, 528, 2795, 582, 579, 614, 2820, 2829, + + 593, 601, 266, 2818, 182, 656, 0, 2796, 2791, 2766, + 2761, 296, 2727, 2725, 2713, 2696, 2691, 426, 3595, 87, + 659, 2659, 2663, 2655, 2650, 2651, 257, 196, 318, 276, + 258, 288, 436, 2694, 631, 2693, 655, 2644, 690, 303, + 0, 2681, 168, 3595, 3595, 701, 352, 0, 2634, 723, + 3595, 3595, 2633, 447, 2632, 2676, 467, 461, 433, 2670, + 2659, 2600, 720, 733, 206, 755, 759, 771, 781, 791, + 828, 2581, 2570, 870, 453, 913, 955, 0, 2563, 2557, + 2540, 2523, 2530, 2541, 2536, 2516, 2502, 2496, 2475, 2473, + 277, 2442, 2436, 2402, 2404, 2407, 477, 436, 2405, 424, + + 401, 292, 813, 488, 2454, 2450, 845, 438, 855, 890, + 756, 465, 2428, 2418, 930, 554, 2409, 2408, 463, 898, + 999, 939, 972, 1042, 980, 2403, 490, 2378, 500, 2380, + 2338, 2327, 2325, 2321, 2310, 0, 2305, 0, 508, 2274, + 2238, 2212, 2211, 2176, 515, 517, 615, 527, 529, 1018, + 1061, 1086, 2212, 2210, 1026, 2209, 2203, 2171, 2166, 565, + 1069, 754, 1096, 802, 1123, 0, 1106, 1134, 1151, 1159, + 1177, 1196, 601, 3595, 2136, 2137, 2127, 2131, 2090, 2090, + 2084, 2078, 0, 2062, 607, 2056, 2024, 2025, 573, 576, + 578, 676, 1204, 591, 1221, 1239, 1231, 2064, 2031, 2006, + + 2004, 1274, 676, 1256, 1293, 1318, 682, 808, 815, 1301, + 819, 1328, 0, 1339, 1350, 1367, 1247, 1393, 1377, 1955, + 1915, 1888, 742, 692, 1884, 1891, 794, 980, 777, 1889, + 1856, 652, 945, 680, 820, 1411, 1420, 1436, 1842, 1824, + 1800, 1446, 1473, 1455, 1266, 1515, 1492, 1500, 1809, 1534, + 1559, 1544, 1009, 1052, 1569, 1571, 1580, 1590, 1601, 0, + 1612, 1623, 1590, 1463, 1666, 1642, 1762, 1737, 1740, 1108, + 3595, 1696, 1672, 1662, 1628, 1157, 3595, 1158, 3595, 774, + 1514, 1500, 730, 1152, 697, 913, 1650, 805, 1686, 1709, + 1695, 1516, 1500, 1721, 1222, 1730, 1474, 1744, 0, 830, + + 1755, 1772, 1571, 1797, 1782, 1816, 1841, 1851, 1284, 1377, + 1832, 1861, 1861, 1872, 1883, 0, 1894, 1905, 1872, 1824, + 1924, 1414, 1400, 1375, 1336, 1331, 1159, 1483, 1312, 1274, + 1260, 1539, 606, 1730, 1238, 1949, 1959, 1969, 1984, 1256, + 1994, 2004, 2019, 1245, 1535, 1915, 1932, 1950, 2029, 0, + 874, 2040, 2057, 2065, 2082, 2101, 2109, 1214, 2126, 2136, + 2146, 1633, 1675, 2154, 924, 966, 2165, 0, 1003, 1092, + 1731, 1087, 1056, 1052, 2042, 3595, 2063, 3595, 1017, 2147, + 1126, 624, 1311, 2187, 2192, 2183, 1756, 2193, 2203, 2230, + 1979, 2238, 992, 2248, 2265, 2275, 830, 811, 1970, 2194, + + 2281, 2214, 2291, 0, 1111, 2302, 2319, 2256, 2344, 2329, + 2362, 2371, 2387, 1807, 813, 1170, 0, 2065, 3595, 2228, + 738, 713, 680, 731, 1201, 3595, 900, 653, 2409, 2414, + 2419, 2424, 2418, 2436, 2445, 2446, 2459, 2469, 2480, 2494, + 2504, 2515, 569, 531, 2215, 2217, 2523, 2221, 2533, 0, + 1278, 2544, 2561, 2569, 2588, 519, 2597, 2606, 2615, 492, + 2304, 3595, 2393, 452, 3595, 1416, 2621, 2629, 2637, 1981, + 2647, 2657, 2672, 2682, 345, 2692, 2707, 2717, 305, 264, + 2303, 245, 191, 2725, 0, 1477, 2441, 3595, 2444, 1632, + 2735, 2745, 2755, 2770, 2780, 2790, 90, 0, 92, 2482, + + 3595, 100, 1647, 3595, 2798, 1982, 2808, 2818, 2833, 3595, + 2843, 2853, 2763, 3595, 2868, 2876, 2884, 19, 2892, 2903, + 3595, 2953, 2969, 2985, 3001, 3017, 3033, 3049, 3065, 3081, + 3087, 3103, 3119, 1676, 3135, 3151, 3167, 3183, 3199, 3215, + 3231, 3237, 3244, 3260, 3276, 3282, 3289, 3295, 3301, 3307, + 3314, 3320, 3326, 3332, 3339, 3347, 3353, 3359, 3365, 3372, + 3380, 3386, 3392, 3399, 3407, 3413, 3421, 3428, 3436, 3442, + 3450, 3457, 3465, 3481, 3497, 3513, 3519, 3527, 3534, 3540, + 3548, 3554, 3562, 3578, 2159 } ; -static yyconst short int yy_def[671] = +static yyconst short int yy_def[686] = { 0, - 606, 1, 1, 1, 607, 607, 608, 608, 609, 609, - 610, 610, 606, 611, 606, 606, 606, 606, 612, 613, - 606, 606, 614, 606, 615, 611, 26, 26, 616, 606, - 606, 606, 32, 32, 32, 35, 35, 35, 35, 35, - 35, 611, 26, 611, 606, 612, 32, 32, 35, 35, - 35, 606, 606, 606, 617, 611, 618, 606, 618, 606, - 618, 606, 612, 606, 619, 620, 606, 620, 606, 620, - 606, 621, 622, 622, 622, 606, 606, 611, 611, 606, - 606, 623, 606, 624, 606, 613, 606, 625, 613, 614, - 614, 615, 626, 611, 611, 26, 616, 96, 96, 96, - - 96, 627, 628, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 611, 606, 611, 606, 606, 606, 606, - 606, 606, 623, 611, 96, 611, 611, 611, 606, 606, - 606, 606, 617, 629, 611, 611, 618, 618, 606, 606, - 606, 624, 606, 619, 620, 620, 606, 606, 620, 620, - 622, 606, 622, 622, 606, 606, 623, 630, 606, 606, - 625, 625, 606, 611, 611, 611, 96, 167, 631, 606, - 632, 606, 104, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 611, 606, 606, 606, 606, 606, - 623, 611, 167, 611, 611, 611, 606, 611, 606, 630, - - 611, 611, 611, 611, 611, 611, 633, 634, 634, 209, - 635, 634, 636, 172, 606, 215, 215, 606, 215, 35, + 621, 1, 1, 1, 622, 622, 623, 623, 624, 624, + 625, 625, 621, 626, 621, 621, 621, 621, 627, 628, + 621, 621, 629, 621, 630, 626, 26, 26, 631, 621, + 621, 621, 32, 32, 32, 35, 35, 35, 35, 35, + 35, 626, 26, 626, 621, 627, 32, 32, 35, 35, + 35, 621, 621, 621, 632, 35, 35, 626, 633, 621, + 633, 621, 633, 621, 627, 621, 634, 635, 621, 635, + 621, 635, 621, 636, 637, 637, 637, 621, 621, 626, + 626, 621, 621, 638, 621, 639, 621, 628, 621, 640, + 628, 629, 629, 630, 641, 626, 626, 26, 631, 98, + + 98, 98, 98, 642, 643, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 626, 621, 626, + 621, 621, 621, 621, 621, 621, 638, 626, 98, 626, + 626, 626, 621, 621, 621, 621, 632, 644, 626, 626, + 633, 633, 621, 621, 621, 639, 621, 634, 635, 635, + 621, 621, 635, 635, 637, 621, 637, 637, 621, 621, + 638, 645, 621, 621, 640, 640, 621, 626, 626, 626, + 98, 171, 646, 621, 647, 621, 106, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 611, 606, 606, 606, 606, 606, 623, 611, 611, 611, - 611, 611, 611, 611, 606, 637, 637, 247, 637, 638, - 639, 640, 606, 641, 218, 641, 641, 257, 641, 606, - 260, 260, 606, 260, 606, 606, 35, 35, 35, 35, - 35, 35, 35, 35, 611, 606, 606, 606, 623, 611, - 611, 611, 611, 611, 611, 611, 611, 642, 642, 643, - 644, 606, 606, 606, 606, 606, 645, 645, 646, 263, - - 646, 646, 302, 646, 606, 305, 305, 606, 305, 35, - 35, 35, 35, 35, 35, 35, 35, 611, 606, 606, - 623, 611, 611, 611, 611, 611, 611, 606, 647, 648, - 292, 606, 332, 332, 606, 332, 606, 606, 606, 606, - 606, 606, 649, 649, 650, 308, 650, 650, 348, 650, - 606, 351, 351, 606, 351, 35, 35, 606, 606, 35, - 35, 35, 35, 606, 606, 606, 606, 611, 606, 606, - 623, 611, 611, 611, 611, 611, 611, 611, 611, 606, - 651, 606, 652, 335, 652, 652, 386, 386, 606, 389, - 389, 606, 389, 606, 606, 606, 606, 653, 653, 654, - - 354, 654, 654, 403, 654, 606, 406, 406, 406, 35, - 35, 35, 35, 35, 35, 611, 606, 606, 623, 611, - 611, 611, 611, 611, 611, 611, 606, 606, 606, 606, - 655, 655, 656, 392, 656, 656, 436, 436, 606, 439, - 439, 606, 439, 606, 606, 606, 606, 606, 606, 657, - 657, 658, 658, 658, 454, 454, 35, 35, 35, 35, - 606, 606, 606, 606, 606, 606, 659, 623, 611, 660, - 661, 611, 611, 611, 611, 611, 611, 606, 606, 606, - 606, 606, 606, 662, 662, 663, 442, 663, 663, 489, - 489, 606, 492, 492, 606, 492, 606, 606, 606, 606, - - 664, 664, 606, 606, 35, 35, 35, 606, 659, 659, - 606, 623, 611, 660, 660, 660, 660, 606, 660, 661, - 661, 611, 611, 611, 606, 606, 606, 606, 665, 665, - 666, 495, 666, 666, 534, 534, 606, 537, 537, 537, - 606, 606, 606, 606, 606, 606, 606, 35, 35, 606, - 623, 606, 606, 611, 611, 611, 611, 611, 606, 606, - 606, 606, 606, 606, 667, 667, 668, 668, 668, 569, - 569, 606, 606, 35, 669, 611, 611, 611, 606, 606, - 606, 606, 670, 670, 606, 606, 669, 669, 606, 611, - 611, 611, 611, 611, 606, 606, 606, 606, 606, 611, - - 611, 611, 611, 611, 611, 0, 606, 606, 606, 606, - 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, - 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, - 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, - 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, - 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, - 606, 606, 606, 606, 606, 606, 606, 606, 606, 606 + 626, 621, 621, 621, 621, 621, 638, 626, 171, 626, + + 626, 626, 621, 626, 621, 645, 626, 626, 626, 626, + 626, 626, 648, 649, 649, 215, 650, 649, 651, 176, + 621, 221, 221, 621, 221, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 626, 621, + 621, 621, 621, 621, 638, 626, 626, 626, 626, 626, + 626, 626, 621, 652, 652, 255, 652, 653, 654, 655, + 621, 656, 224, 656, 656, 265, 656, 621, 268, 268, + 621, 268, 621, 621, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 626, 621, 621, 621, 638, 626, + 626, 626, 626, 626, 626, 626, 626, 657, 657, 658, + + 659, 621, 621, 621, 621, 621, 660, 660, 661, 271, + 661, 661, 312, 661, 621, 315, 315, 621, 315, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 626, 621, + 621, 638, 626, 626, 626, 626, 626, 626, 621, 662, + 663, 302, 621, 343, 343, 621, 343, 621, 621, 621, + 621, 621, 621, 664, 664, 665, 318, 665, 665, 359, + 665, 621, 362, 362, 621, 362, 35, 35, 35, 621, + 621, 35, 35, 35, 35, 621, 621, 621, 621, 626, + 621, 621, 638, 626, 626, 626, 626, 626, 626, 626, + 626, 621, 666, 621, 667, 346, 667, 667, 398, 398, + + 621, 401, 401, 621, 401, 621, 621, 621, 621, 668, + 668, 669, 365, 669, 669, 415, 669, 621, 418, 418, + 418, 35, 35, 35, 35, 35, 35, 35, 626, 621, + 621, 638, 626, 626, 626, 626, 626, 626, 626, 621, + 621, 621, 621, 670, 670, 671, 404, 671, 671, 449, + 449, 621, 452, 452, 621, 452, 621, 621, 621, 621, + 621, 621, 672, 672, 673, 673, 673, 467, 467, 35, + 35, 35, 35, 35, 621, 621, 621, 621, 621, 621, + 674, 638, 626, 675, 676, 626, 626, 626, 626, 626, + 626, 621, 621, 621, 621, 621, 621, 677, 677, 678, + + 455, 678, 678, 503, 503, 621, 506, 506, 621, 506, + 621, 621, 621, 621, 679, 679, 35, 621, 621, 35, + 35, 35, 621, 674, 674, 621, 638, 626, 675, 675, + 675, 675, 621, 675, 676, 676, 626, 626, 626, 621, + 621, 621, 621, 680, 680, 681, 509, 681, 681, 549, + 549, 621, 552, 552, 552, 621, 621, 621, 621, 621, + 621, 621, 35, 35, 621, 638, 621, 621, 626, 626, + 626, 626, 626, 621, 621, 621, 621, 621, 621, 682, + 682, 683, 683, 683, 584, 584, 621, 621, 35, 684, + 626, 626, 626, 621, 621, 621, 621, 685, 685, 621, + + 621, 684, 684, 621, 626, 626, 626, 626, 626, 621, + 621, 621, 621, 621, 626, 626, 626, 626, 626, 626, + 0, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621 } ; -static yyconst short int yy_nxt[3732] = +static yyconst short int yy_nxt[3663] = { 0, 14, 15, 16, 17, 18, 19, 20, 21, 22, 14, 23, 24, 14, 14, 25, 26, 27, 28, 26, 26, 26, 26, 26, 29, 30, 31, 14, 32, 33, 33, - 33, 34, 35, 35, 35, 35, 36, 37, 35, 38, - 39, 40, 41, 35, 35, 35, 35, 35, 42, 14, - 43, 43, 43, 43, 43, 43, 14, 14, 14, 14, - 14, 14, 14, 44, 14, 14, 45, 79, 52, 105, - 46, 170, 53, 52, 105, 87, 79, 53, 54, 107, - 172, 55, 129, 54, 116, 105, 55, 74, 16, 75, - 76, 194, 130, 88, 47, 48, 79, 124, 49, 153, - - 15, 58, 59, 125, 60, 50, 111, 35, 51, 35, - 60, 79, 35, 136, 35, 15, 58, 59, 89, 60, - 143, 115, 60, 61, 154, 60, 74, 16, 75, 76, - 56, 79, 147, 127, 77, 56, 148, 60, 61, 93, - 93, 150, 115, 93, 93, 238, 152, 62, 99, 99, - 99, 99, 99, 99, 99, 99, 146, 87, 79, 79, - 146, 93, 62, 15, 16, 17, 117, 63, 589, 152, - 192, 195, 129, 77, 100, 100, 100, 100, 100, 101, - 143, 115, 130, 78, 94, 98, 98, 98, 98, 98, - 98, 98, 98, 79, 118, 119, 155, 156, 120, 151, - - 162, 79, 83, 143, 115, 121, 185, 153, 122, 238, - 64, 65, 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, 15, 16, - 17, 131, 63, 97, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 79, 139, 115, 140, 152, 141, 154, 78, 79, 140, - 191, 141, 85, 85, 85, 85, 85, 85, 85, 85, - 143, 115, 201, 141, 141, 64, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 15, 16, 17, 67, 63, 141, 193, - - 79, 152, 68, 69, 70, 606, 196, 79, 134, 134, - 79, 606, 134, 134, 79, 198, 71, 168, 168, 168, - 168, 168, 168, 606, 155, 156, 79, 231, 159, 382, - 134, 160, 160, 160, 160, 160, 160, 160, 160, 241, - 72, 15, 16, 17, 67, 63, 532, 170, 89, 283, - 68, 69, 70, 135, 162, 86, 214, 86, 86, 267, - 606, 86, 86, 268, 71, 86, 170, 164, 165, 166, - 164, 164, 164, 164, 164, 214, 93, 93, 86, 86, - 93, 93, 79, 79, 79, 240, 83, 238, 72, 83, - 168, 168, 168, 168, 168, 168, 168, 168, 93, 84, - - 79, 265, 85, 85, 85, 85, 85, 85, 85, 85, - 95, 83, 96, 96, 96, 96, 96, 96, 96, 96, - 97, 94, 83, 266, 98, 98, 98, 98, 98, 168, - 168, 168, 168, 168, 168, 168, 168, 85, 85, 85, - 85, 85, 85, 85, 85, 79, 551, 98, 98, 98, - 98, 98, 98, 78, 145, 79, 280, 145, 145, 78, - 382, 237, 78, 78, 145, 78, 78, 78, 104, 104, - 104, 104, 104, 104, 104, 104, 97, 145, 279, 78, - 104, 104, 104, 104, 104, 105, 105, 105, 105, 106, - 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, - - 105, 79, 105, 98, 98, 98, 98, 98, 98, 78, - 78, 78, 78, 78, 78, 78, 78, 78, 78, 105, - 105, 105, 105, 105, 105, 105, 105, 606, 249, 249, - 249, 105, 105, 105, 105, 105, 177, 79, 79, 79, - 105, 178, 170, 275, 179, 282, 180, 117, 532, 143, - 115, 214, 97, 238, 78, 78, 78, 78, 78, 78, - 114, 115, 78, 78, 78, 170, 78, 78, 134, 134, - 78, 265, 134, 134, 214, 118, 119, 79, 79, 120, - 431, 431, 78, 78, 78, 83, 121, 93, 323, 122, - 134, 93, 79, 266, 281, 84, 146, 93, 85, 85, - - 85, 85, 85, 85, 85, 85, 79, 79, 373, 93, - 93, 318, 324, 135, 606, 606, 606, 606, 606, 606, - 606, 606, 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, 484, 484, - 123, 83, 242, 243, 244, 242, 242, 242, 242, 242, - 83, 142, 487, 322, 606, 606, 606, 606, 606, 606, - 606, 606, 78, 559, 78, 78, 78, 170, 78, 78, - 253, 170, 78, 134, 79, 79, 255, 134, 606, 170, - 255, 83, 79, 134, 78, 78, 78, 90, 255, 90, - 90, 90, 372, 90, 90, 134, 134, 90, 247, 247, - - 248, 249, 249, 249, 249, 249, 211, 253, 170, 90, - 90, 90, 92, 321, 78, 78, 92, 255, 78, 78, - 360, 382, 92, 161, 361, 161, 161, 253, 170, 161, - 161, 384, 371, 161, 92, 92, 78, 167, 167, 167, - 167, 167, 167, 167, 167, 161, 161, 161, 358, 167, - 167, 167, 167, 167, 201, 79, 202, 202, 202, 202, - 202, 202, 219, 219, 219, 219, 219, 219, 219, 219, - 359, 416, 167, 167, 167, 167, 167, 167, 173, 173, - 173, 173, 173, 173, 173, 173, 97, 364, 83, 79, - 173, 173, 173, 173, 173, 257, 257, 257, 257, 257, - - 257, 257, 257, 258, 258, 258, 258, 258, 259, 365, - 253, 170, 79, 167, 167, 167, 167, 167, 167, 133, - 300, 78, 78, 133, 574, 78, 78, 421, 606, 133, - 256, 256, 256, 256, 256, 256, 256, 256, 606, 170, - 419, 133, 133, 78, 201, 170, 202, 202, 202, 202, - 202, 202, 202, 202, 289, 289, 289, 289, 289, 289, - 289, 289, 211, 294, 295, 296, 294, 294, 294, 294, - 294, 264, 264, 264, 264, 264, 264, 264, 264, 79, - 201, 170, 203, 203, 203, 203, 203, 203, 203, 203, - 253, 170, 298, 298, 298, 298, 298, 298, 467, 83, - - 255, 302, 302, 302, 302, 302, 302, 302, 302, 303, - 303, 303, 303, 303, 304, 79, 201, 487, 204, 204, - 204, 204, 204, 205, 202, 202, 606, 366, 301, 301, - 301, 301, 301, 301, 301, 301, 606, 170, 325, 326, - 327, 325, 325, 325, 325, 325, 300, 501, 501, 367, - 468, 79, 78, 79, 206, 206, 206, 206, 206, 206, - 206, 206, 368, 79, 170, 170, 206, 206, 206, 206, - 206, 79, 374, 255, 300, 253, 170, 283, 79, 284, - 284, 284, 284, 284, 284, 300, 79, 420, 469, 206, - 206, 206, 206, 206, 206, 208, 209, 210, 210, 210, - - 210, 210, 210, 211, 253, 170, 434, 212, 212, 212, - 212, 212, 79, 337, 346, 338, 338, 338, 338, 338, - 338, 338, 338, 349, 349, 349, 349, 349, 350, 79, - 212, 212, 212, 212, 212, 212, 170, 215, 216, 217, - 215, 215, 215, 215, 215, 218, 510, 511, 511, 219, - 219, 219, 219, 219, 337, 375, 339, 339, 339, 339, - 339, 339, 339, 339, 309, 309, 309, 309, 309, 309, - 309, 309, 219, 219, 219, 219, 219, 219, 220, 220, - 220, 220, 220, 220, 220, 220, 606, 170, 550, 79, - 220, 220, 220, 220, 220, 337, 346, 340, 340, 340, - - 340, 340, 341, 338, 338, 348, 348, 348, 348, 348, - 348, 348, 348, 206, 206, 206, 206, 206, 206, 201, - 549, 202, 202, 202, 202, 202, 202, 202, 202, 253, - 170, 344, 344, 344, 344, 344, 344, 548, 606, 300, - 347, 347, 347, 347, 347, 347, 347, 347, 387, 387, - 387, 387, 387, 388, 79, 201, 170, 202, 202, 202, - 202, 202, 202, 202, 202, 336, 336, 336, 336, 336, - 336, 336, 336, 386, 386, 386, 386, 386, 386, 386, - 386, 394, 395, 396, 394, 394, 394, 394, 394, 358, - 79, 253, 170, 254, 254, 254, 254, 254, 254, 254, - - 254, 255, 529, 529, 434, 256, 256, 256, 256, 256, - 606, 359, 385, 385, 385, 385, 385, 385, 385, 385, - 337, 384, 338, 338, 338, 338, 338, 338, 256, 256, - 256, 256, 256, 256, 170, 260, 261, 262, 260, 260, - 260, 260, 260, 263, 170, 253, 170, 264, 264, 264, - 264, 264, 337, 300, 338, 338, 338, 338, 338, 338, - 338, 338, 355, 355, 355, 355, 355, 355, 355, 355, - 264, 264, 264, 264, 264, 264, 283, 478, 284, 284, - 284, 284, 284, 284, 284, 284, 337, 364, 338, 338, - 338, 338, 338, 338, 338, 338, 253, 170, 399, 399, - - 399, 399, 399, 399, 170, 599, 346, 510, 511, 365, - 599, 79, 283, 346, 285, 285, 285, 285, 285, 285, - 285, 285, 403, 403, 403, 403, 403, 403, 403, 403, - 404, 404, 404, 404, 404, 405, 606, 366, 402, 402, - 402, 402, 402, 402, 402, 402, 79, 79, 283, 170, - 286, 286, 286, 286, 286, 287, 284, 284, 346, 367, - 461, 606, 422, 428, 429, 430, 428, 428, 428, 428, - 428, 384, 170, 423, 424, 425, 426, 423, 423, 423, - 423, 401, 462, 79, 253, 170, 298, 298, 298, 298, - 298, 298, 298, 298, 255, 253, 170, 299, 299, 299, - - 299, 299, 299, 299, 299, 300, 79, 463, 503, 301, - 301, 301, 301, 301, 375, 376, 376, 376, 376, 376, - 376, 393, 393, 393, 393, 393, 393, 393, 393, 464, - 504, 508, 301, 301, 301, 301, 301, 301, 170, 305, - 306, 307, 305, 305, 305, 305, 305, 308, 79, 565, - 565, 309, 309, 309, 309, 309, 436, 436, 436, 436, - 436, 436, 436, 436, 437, 437, 437, 437, 437, 438, - 507, 253, 170, 506, 309, 309, 309, 309, 309, 309, - 283, 346, 284, 284, 284, 284, 284, 284, 284, 284, - 606, 382, 435, 435, 435, 435, 435, 435, 435, 435, - - 444, 384, 445, 445, 445, 445, 445, 445, 445, 445, - 505, 472, 575, 83, 83, 79, 283, 382, 284, 284, - 284, 284, 284, 284, 284, 284, 444, 434, 446, 446, - 446, 446, 446, 446, 446, 446, 444, 606, 447, 447, - 447, 447, 447, 448, 445, 445, 79, 434, 461, 583, - 583, 79, 332, 333, 334, 332, 332, 332, 332, 332, - 335, 253, 170, 444, 336, 336, 336, 336, 336, 512, - 462, 401, 409, 409, 409, 409, 409, 409, 409, 409, - 455, 455, 455, 455, 455, 456, 384, 336, 336, 336, - 336, 336, 336, 253, 170, 344, 344, 344, 344, 344, - - 344, 344, 344, 300, 253, 170, 345, 345, 345, 345, - 345, 345, 345, 345, 346, 606, 170, 463, 347, 347, - 347, 347, 347, 79, 472, 401, 253, 170, 451, 451, - 451, 451, 451, 451, 331, 503, 401, 79, 513, 464, - 466, 347, 347, 347, 347, 347, 347, 170, 351, 352, - 353, 351, 351, 351, 351, 351, 354, 504, 465, 79, - 355, 355, 355, 355, 355, 454, 454, 454, 454, 454, - 454, 454, 454, 606, 79, 453, 453, 453, 453, 453, - 453, 453, 453, 355, 355, 355, 355, 355, 355, 375, - 376, 376, 376, 376, 376, 376, 376, 376, 470, 478, - - 546, 479, 479, 479, 479, 479, 479, 479, 479, 443, - 443, 443, 443, 443, 443, 443, 443, 460, 470, 459, - 470, 471, 547, 79, 375, 377, 377, 377, 377, 377, - 377, 377, 377, 478, 470, 480, 480, 480, 480, 480, - 480, 480, 480, 79, 478, 382, 481, 481, 481, 481, - 481, 482, 479, 479, 470, 434, 470, 470, 79, 375, - 378, 378, 378, 378, 378, 379, 376, 376, 489, 489, - 489, 489, 489, 489, 489, 489, 490, 490, 490, 490, - 490, 491, 606, 170, 488, 488, 488, 488, 488, 488, - 488, 488, 401, 79, 382, 382, 383, 383, 383, 383, - - 383, 383, 383, 383, 384, 487, 588, 589, 385, 385, - 385, 385, 385, 497, 498, 499, 497, 497, 497, 497, - 497, 444, 458, 445, 445, 445, 445, 445, 445, 445, - 445, 385, 385, 385, 385, 385, 385, 389, 390, 391, - 389, 389, 389, 389, 389, 392, 588, 589, 457, 393, - 393, 393, 393, 393, 444, 606, 445, 445, 445, 445, - 445, 445, 445, 445, 444, 487, 445, 445, 445, 445, - 445, 445, 393, 393, 393, 393, 393, 393, 253, 170, - 399, 399, 399, 399, 399, 399, 399, 399, 346, 253, - 170, 400, 400, 400, 400, 400, 400, 400, 400, 401, - - 253, 170, 331, 402, 402, 402, 402, 402, 554, 515, - 401, 516, 517, 518, 515, 382, 516, 517, 518, 535, - 535, 535, 535, 535, 536, 487, 402, 402, 402, 402, - 402, 402, 170, 406, 407, 408, 406, 406, 406, 406, - 406, 382, 606, 79, 382, 409, 409, 409, 409, 409, - 251, 532, 532, 418, 532, 417, 519, 415, 590, 414, - 472, 521, 473, 473, 473, 473, 473, 473, 409, 409, - 409, 409, 409, 409, 375, 376, 376, 376, 376, 376, - 376, 376, 376, 546, 572, 522, 523, 524, 522, 522, - 522, 522, 522, 79, 413, 79, 525, 526, 527, 525, - - 525, 525, 525, 525, 412, 547, 573, 411, 79, 375, - 376, 376, 376, 376, 376, 376, 376, 376, 79, 478, - 572, 479, 479, 479, 479, 479, 479, 479, 479, 478, - 410, 479, 479, 479, 479, 479, 479, 479, 479, 144, - 144, 337, 573, 79, 382, 585, 432, 432, 432, 432, - 432, 432, 432, 432, 384, 382, 331, 433, 433, 433, - 433, 433, 433, 433, 433, 434, 251, 586, 585, 435, - 435, 435, 435, 435, 478, 211, 479, 479, 479, 479, - 479, 479, 496, 496, 496, 496, 496, 496, 496, 496, - 586, 370, 435, 435, 435, 435, 435, 435, 439, 440, - - 441, 439, 439, 439, 439, 439, 442, 369, 363, 362, - 443, 443, 443, 443, 443, 534, 534, 534, 534, 534, - 534, 534, 534, 606, 357, 533, 533, 533, 533, 533, - 533, 533, 533, 443, 443, 443, 443, 443, 443, 253, - 170, 451, 451, 451, 451, 451, 451, 451, 451, 401, - 253, 170, 452, 452, 452, 452, 452, 452, 452, 452, - 356, 331, 251, 211, 453, 453, 453, 453, 453, 170, - 541, 541, 541, 541, 541, 541, 541, 541, 170, 542, - 542, 542, 542, 542, 542, 542, 542, 453, 453, 453, - 453, 453, 453, 472, 211, 473, 473, 473, 473, 473, - - 473, 473, 473, 170, 543, 543, 543, 543, 543, 544, - 541, 541, 606, 276, 606, 606, 606, 320, 319, 515, - 317, 516, 517, 518, 316, 315, 314, 313, 79, 472, - 312, 474, 474, 474, 474, 474, 474, 474, 474, 606, - 311, 516, 517, 518, 606, 310, 606, 606, 518, 292, - 606, 251, 606, 606, 606, 211, 288, 211, 103, 519, - 276, 278, 276, 277, 79, 472, 519, 475, 475, 475, - 475, 475, 476, 477, 477, 552, 276, 274, 553, 553, - 553, 553, 553, 553, 553, 553, 519, 273, 272, 271, - 270, 519, 269, 97, 211, 514, 514, 521, 251, 514, - - 79, 472, 211, 477, 477, 477, 473, 473, 473, 473, - 473, 514, 514, 514, 520, 520, 103, 559, 520, 560, - 560, 560, 560, 560, 560, 560, 560, 83, 199, 239, - 520, 520, 520, 236, 235, 234, 79, 382, 233, 485, - 485, 485, 485, 485, 485, 485, 485, 434, 382, 232, - 486, 486, 486, 486, 486, 486, 486, 486, 487, 230, - 229, 228, 488, 488, 488, 488, 488, 559, 227, 561, - 561, 561, 561, 561, 561, 561, 561, 540, 540, 540, - 540, 540, 540, 540, 540, 488, 488, 488, 488, 488, - 488, 492, 493, 494, 492, 492, 492, 492, 492, 495, - - 226, 225, 224, 496, 496, 496, 496, 496, 559, 223, - 562, 562, 562, 562, 562, 563, 560, 560, 569, 569, - 569, 569, 569, 569, 569, 569, 496, 496, 496, 496, - 496, 496, 253, 170, 502, 502, 502, 502, 502, 502, - 502, 502, 472, 222, 473, 473, 473, 473, 473, 473, - 473, 473, 570, 570, 570, 570, 570, 571, 606, 221, - 568, 568, 568, 568, 568, 568, 568, 568, 170, 541, - 541, 541, 541, 541, 541, 541, 541, 79, 472, 103, - 473, 473, 473, 473, 473, 473, 473, 473, 170, 541, - 541, 541, 541, 541, 541, 541, 541, 170, 541, 541, - - 541, 541, 541, 541, 553, 553, 553, 553, 553, 553, - 553, 553, 95, 79, 382, 83, 530, 530, 530, 530, - 530, 530, 530, 530, 487, 382, 83, 531, 531, 531, - 531, 531, 531, 531, 531, 532, 199, 151, 152, 533, - 533, 533, 533, 533, 553, 553, 553, 553, 553, 553, - 553, 553, 576, 577, 578, 576, 576, 576, 576, 576, - 146, 146, 533, 533, 533, 533, 533, 533, 537, 538, - 539, 537, 537, 537, 537, 537, 138, 197, 132, 132, - 540, 540, 540, 540, 540, 79, 554, 190, 555, 555, - 555, 555, 555, 555, 579, 580, 581, 579, 579, 579, - - 579, 579, 189, 540, 540, 540, 540, 540, 540, 554, - 188, 555, 555, 555, 555, 555, 555, 555, 555, 187, - 559, 79, 560, 560, 560, 560, 560, 560, 560, 560, - 559, 186, 560, 560, 560, 560, 560, 560, 560, 560, - 184, 183, 182, 181, 79, 554, 176, 556, 556, 556, - 556, 556, 556, 556, 556, 559, 175, 560, 560, 560, - 560, 560, 560, 382, 174, 584, 584, 584, 584, 584, - 584, 584, 584, 595, 595, 595, 595, 595, 595, 103, - 79, 554, 78, 557, 557, 557, 557, 557, 558, 555, - 555, 595, 595, 595, 595, 595, 595, 595, 595, 596, - - 596, 596, 596, 596, 596, 596, 596, 597, 597, 597, - 597, 597, 598, 595, 595, 103, 79, 382, 163, 566, - 566, 566, 566, 566, 566, 566, 566, 532, 382, 91, - 567, 567, 567, 567, 567, 567, 567, 567, 83, 81, - 80, 79, 568, 568, 568, 568, 568, 152, 600, 601, - 602, 600, 600, 600, 600, 600, 590, 146, 591, 591, - 591, 591, 591, 591, 138, 568, 568, 568, 568, 568, - 568, 554, 132, 555, 555, 555, 555, 555, 555, 555, - 555, 79, 595, 595, 595, 595, 595, 595, 595, 595, - 128, 79, 595, 595, 595, 595, 595, 595, 595, 595, - - 126, 113, 112, 111, 110, 109, 79, 554, 108, 555, - 555, 555, 555, 555, 555, 555, 555, 105, 103, 91, - 603, 603, 603, 603, 603, 603, 603, 603, 600, 600, - 600, 600, 600, 600, 600, 600, 81, 80, 79, 606, - 606, 606, 79, 590, 606, 591, 591, 591, 591, 591, - 591, 591, 591, 79, 606, 606, 606, 606, 606, 606, - 606, 79, 604, 604, 604, 604, 604, 605, 603, 603, - 603, 603, 603, 603, 603, 603, 603, 603, 79, 590, - 606, 592, 592, 592, 592, 592, 592, 592, 592, 606, - 606, 606, 606, 606, 606, 79, 603, 603, 603, 603, - - 603, 603, 606, 79, 606, 606, 606, 606, 606, 606, - 606, 606, 606, 606, 79, 590, 606, 593, 593, 593, - 593, 593, 594, 591, 591, 606, 606, 606, 606, 79, - 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, - 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, - 79, 590, 606, 591, 591, 591, 591, 591, 591, 591, - 591, 606, 606, 606, 606, 606, 606, 606, 606, 606, - 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, - 606, 606, 606, 606, 606, 606, 79, 590, 606, 591, - 591, 591, 591, 591, 591, 591, 591, 606, 606, 606, - - 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, - 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, - 606, 606, 79, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 31, + 33, 34, 35, 35, 35, 35, 36, 35, 37, 35, + 38, 39, 40, 41, 35, 35, 35, 35, 35, 42, + 14, 43, 43, 43, 43, 43, 43, 14, 14, 14, + 14, 14, 14, 14, 44, 14, 14, 45, 81, 52, + 89, 46, 151, 53, 107, 110, 115, 52, 107, 54, + 111, 53, 55, 76, 16, 77, 78, 54, 90, 109, + 55, 76, 16, 77, 78, 47, 48, 150, 128, 49, + + 158, 113, 604, 131, 56, 394, 81, 50, 57, 35, + 51, 35, 56, 547, 91, 114, 57, 35, 133, 35, + 15, 60, 61, 120, 62, 15, 60, 61, 134, 62, + 62, 79, 58, 95, 95, 62, 81, 95, 95, 79, + 58, 191, 62, 63, 147, 119, 156, 62, 63, 15, + 16, 17, 69, 65, 81, 95, 154, 119, 70, 71, + 72, 102, 102, 102, 102, 102, 103, 85, 64, 147, + 119, 140, 73, 64, 15, 16, 17, 86, 65, 96, + 87, 87, 87, 87, 87, 87, 87, 87, 101, 101, + 101, 101, 101, 101, 101, 101, 174, 74, 15, 16, + + 17, 69, 65, 157, 621, 176, 89, 70, 71, 72, + 80, 621, 100, 100, 100, 100, 100, 100, 100, 100, + 121, 73, 66, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 15, 16, 17, 107, 65, 81, 74, 152, 122, 123, + 166, 156, 124, 159, 160, 166, 155, 198, 394, 85, + 125, 135, 129, 126, 87, 87, 87, 87, 87, 87, + 87, 87, 150, 87, 87, 87, 87, 87, 87, 87, + 87, 172, 172, 172, 172, 172, 172, 547, 66, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + + 67, 67, 67, 67, 67, 67, 97, 81, 98, 98, + 98, 98, 98, 98, 98, 98, 99, 621, 197, 201, + 100, 100, 100, 100, 100, 81, 81, 182, 501, 138, + 138, 80, 183, 138, 138, 621, 184, 81, 185, 239, + 200, 81, 81, 202, 100, 100, 100, 100, 100, 100, + 80, 138, 81, 147, 119, 246, 80, 204, 574, 80, + 80, 91, 80, 80, 80, 106, 106, 106, 106, 106, + 106, 106, 106, 99, 199, 139, 80, 106, 106, 106, + 106, 106, 107, 107, 107, 107, 108, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 81, + + 107, 100, 100, 100, 100, 100, 100, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 107, 107, 107, + 107, 107, 107, 107, 107, 621, 85, 147, 119, 107, + 107, 107, 107, 107, 159, 160, 146, 133, 107, 621, + 621, 621, 621, 621, 621, 621, 621, 134, 147, 119, + 81, 207, 248, 80, 80, 80, 80, 80, 80, 118, + 119, 80, 80, 80, 158, 80, 80, 174, 157, 80, + 143, 119, 144, 81, 145, 81, 220, 174, 144, 85, + 145, 80, 80, 80, 85, 81, 220, 81, 99, 246, + 246, 273, 145, 145, 86, 589, 150, 87, 87, 87, + + 87, 87, 87, 87, 87, 80, 174, 80, 80, 80, + 156, 80, 80, 274, 81, 80, 156, 85, 145, 87, + 87, 87, 87, 87, 87, 87, 87, 80, 80, 80, + 245, 95, 95, 174, 276, 95, 95, 81, 163, 277, + 127, 164, 164, 164, 164, 164, 164, 164, 164, 88, + 249, 88, 88, 95, 501, 88, 88, 81, 92, 88, + 92, 92, 92, 285, 92, 92, 81, 290, 92, 257, + 257, 257, 88, 88, 289, 85, 81, 96, 81, 174, + 92, 92, 92, 94, 292, 80, 80, 94, 220, 80, + 80, 246, 447, 94, 168, 169, 170, 168, 168, 168, + + 168, 168, 273, 333, 293, 94, 94, 80, 172, 172, + 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, + 172, 172, 172, 172, 274, 81, 85, 81, 81, 171, + 171, 171, 171, 171, 171, 171, 171, 334, 99, 332, + 81, 171, 171, 171, 171, 171, 87, 87, 87, 87, + 87, 87, 87, 87, 85, 81, 81, 483, 138, 138, + 121, 329, 138, 138, 81, 171, 171, 171, 171, 171, + 171, 177, 177, 177, 177, 177, 177, 177, 177, 99, + 138, 291, 527, 177, 177, 177, 177, 177, 122, 123, + 174, 137, 124, 80, 80, 137, 174, 80, 80, 220, + + 125, 137, 81, 126, 139, 263, 383, 171, 171, 171, + 171, 171, 171, 137, 137, 80, 621, 621, 621, 621, + 621, 621, 621, 621, 149, 81, 372, 149, 149, 81, + 335, 373, 85, 526, 149, 164, 164, 164, 164, 164, + 164, 164, 164, 370, 565, 385, 81, 149, 164, 164, + 164, 164, 164, 164, 164, 164, 165, 564, 165, 165, + 95, 434, 165, 165, 95, 371, 165, 261, 174, 207, + 95, 208, 208, 208, 208, 208, 208, 263, 165, 165, + 165, 563, 95, 95, 207, 432, 208, 208, 208, 208, + 208, 208, 208, 208, 207, 376, 209, 209, 209, 209, + + 209, 209, 209, 209, 207, 81, 210, 210, 210, 210, + 210, 211, 208, 208, 138, 621, 174, 377, 138, 387, + 81, 261, 174, 81, 138, 263, 81, 174, 261, 174, + 81, 263, 621, 174, 447, 380, 138, 138, 310, 429, + 81, 80, 310, 212, 212, 212, 212, 212, 212, 212, + 212, 444, 444, 396, 81, 212, 212, 212, 212, 212, + 250, 251, 252, 250, 250, 250, 250, 250, 207, 81, + 208, 208, 208, 208, 208, 208, 208, 208, 386, 212, + 212, 212, 212, 212, 212, 214, 215, 216, 216, 216, + 216, 216, 216, 217, 81, 498, 498, 218, 218, 218, + + 218, 218, 85, 207, 81, 208, 208, 208, 208, 208, + 208, 208, 208, 225, 225, 225, 225, 225, 225, 225, + 225, 218, 218, 218, 218, 218, 218, 174, 221, 222, + 223, 221, 221, 221, 221, 221, 224, 261, 174, 81, + 225, 225, 225, 225, 225, 255, 255, 256, 257, 257, + 257, 257, 257, 217, 265, 265, 265, 265, 265, 265, + 265, 265, 81, 566, 225, 225, 225, 225, 225, 225, + 226, 226, 226, 226, 226, 226, 226, 226, 435, 621, + 174, 378, 226, 226, 226, 226, 226, 266, 266, 266, + 266, 266, 267, 621, 81, 264, 264, 264, 264, 264, + + 264, 264, 264, 379, 384, 492, 212, 212, 212, 212, + 212, 212, 261, 174, 262, 262, 262, 262, 262, 262, + 262, 262, 263, 174, 515, 515, 264, 264, 264, 264, + 264, 293, 263, 294, 294, 294, 294, 294, 294, 294, + 294, 299, 299, 299, 299, 299, 299, 299, 299, 217, + 264, 264, 264, 264, 264, 264, 174, 268, 269, 270, + 268, 268, 268, 268, 268, 271, 174, 81, 523, 272, + 272, 272, 272, 272, 293, 310, 295, 295, 295, 295, + 295, 295, 295, 295, 304, 305, 306, 304, 304, 304, + 304, 304, 522, 272, 272, 272, 272, 272, 272, 293, + + 521, 296, 296, 296, 296, 296, 297, 294, 294, 370, + 81, 272, 272, 272, 272, 272, 272, 272, 272, 261, + 174, 308, 308, 308, 308, 308, 308, 525, 526, 263, + 520, 371, 544, 544, 517, 81, 261, 174, 308, 308, + 308, 308, 308, 308, 308, 308, 263, 261, 174, 309, + 309, 309, 309, 309, 309, 309, 309, 310, 376, 378, + 475, 311, 311, 311, 311, 311, 312, 312, 312, 312, + 312, 312, 312, 312, 313, 313, 313, 313, 313, 314, + 377, 379, 476, 261, 174, 311, 311, 311, 311, 311, + 311, 174, 315, 316, 317, 315, 315, 315, 315, 315, + + 318, 81, 525, 526, 319, 319, 319, 319, 319, 621, + 433, 311, 311, 311, 311, 311, 311, 311, 311, 336, + 337, 338, 336, 336, 336, 336, 336, 457, 319, 319, + 319, 319, 319, 319, 293, 394, 294, 294, 294, 294, + 294, 294, 294, 294, 293, 396, 294, 294, 294, 294, + 294, 294, 293, 81, 294, 294, 294, 294, 294, 294, + 294, 294, 360, 360, 360, 360, 360, 361, 396, 348, + 81, 349, 349, 349, 349, 349, 349, 349, 349, 342, + 81, 399, 399, 399, 399, 399, 400, 81, 81, 343, + 344, 345, 343, 343, 343, 343, 343, 346, 174, 580, + + 580, 347, 347, 347, 347, 347, 348, 310, 350, 350, + 350, 350, 350, 350, 350, 350, 319, 319, 319, 319, + 319, 319, 319, 319, 480, 347, 347, 347, 347, 347, + 347, 348, 479, 351, 351, 351, 351, 351, 352, 349, + 349, 261, 174, 355, 355, 355, 355, 355, 355, 355, + 355, 310, 261, 174, 355, 355, 355, 355, 355, 355, + 81, 81, 310, 261, 174, 356, 356, 356, 356, 356, + 356, 356, 356, 357, 474, 528, 473, 358, 358, 358, + 358, 358, 359, 359, 359, 359, 359, 359, 359, 359, + 621, 174, 358, 358, 358, 358, 358, 358, 358, 358, + + 357, 358, 358, 358, 358, 358, 358, 174, 362, 363, + 364, 362, 362, 362, 362, 362, 365, 590, 85, 472, + 366, 366, 366, 366, 366, 387, 388, 388, 388, 388, + 388, 388, 388, 388, 387, 389, 389, 389, 389, 389, + 389, 389, 389, 471, 366, 366, 366, 366, 366, 366, + 387, 390, 390, 390, 390, 390, 391, 388, 388, 470, + 81, 347, 347, 347, 347, 347, 347, 347, 347, 81, + 398, 398, 398, 398, 398, 398, 398, 398, 416, 416, + 416, 416, 416, 417, 477, 81, 394, 621, 395, 395, + 395, 395, 395, 395, 395, 395, 396, 396, 598, 598, + + 397, 397, 397, 397, 397, 621, 478, 397, 397, 397, + 397, 397, 397, 397, 397, 406, 407, 408, 406, 406, + 406, 406, 406, 342, 397, 397, 397, 397, 397, 397, + 401, 402, 403, 401, 401, 401, 401, 401, 404, 259, + 481, 85, 405, 405, 405, 405, 405, 348, 394, 349, + 349, 349, 349, 349, 349, 349, 349, 348, 396, 349, + 349, 349, 349, 349, 349, 431, 405, 405, 405, 405, + 405, 405, 348, 430, 349, 349, 349, 349, 349, 349, + 349, 349, 261, 174, 261, 174, 450, 450, 450, 450, + 450, 451, 310, 482, 357, 366, 366, 366, 366, 366, + + 366, 366, 366, 621, 174, 415, 415, 415, 415, 415, + 415, 415, 415, 357, 261, 174, 411, 411, 411, 411, + 411, 411, 411, 411, 357, 261, 174, 411, 411, 411, + 411, 411, 411, 603, 604, 357, 261, 174, 412, 412, + 412, 412, 412, 412, 412, 412, 413, 174, 603, 604, + 414, 414, 414, 414, 414, 621, 357, 414, 414, 414, + 414, 414, 414, 414, 414, 436, 437, 438, 439, 436, + 436, 436, 436, 428, 414, 414, 414, 414, 414, 414, + 174, 418, 419, 420, 418, 418, 418, 418, 418, 174, + 148, 148, 427, 421, 421, 421, 421, 421, 413, 81, + + 387, 388, 388, 388, 388, 388, 388, 388, 388, 387, + 388, 388, 388, 388, 388, 388, 426, 421, 421, 421, + 421, 421, 421, 387, 388, 388, 388, 388, 388, 388, + 388, 388, 518, 484, 425, 81, 441, 442, 443, 441, + 441, 441, 441, 441, 81, 405, 405, 405, 405, 405, + 405, 405, 405, 484, 519, 484, 485, 394, 81, 445, + 445, 445, 445, 445, 445, 445, 445, 396, 394, 486, + 446, 446, 446, 446, 446, 446, 446, 446, 447, 81, + 424, 423, 448, 448, 448, 448, 448, 449, 449, 449, + 449, 449, 449, 449, 449, 621, 422, 448, 448, 448, + + 448, 448, 448, 448, 448, 81, 448, 448, 448, 448, + 448, 448, 452, 453, 454, 452, 452, 452, 452, 452, + 455, 174, 348, 342, 456, 456, 456, 456, 456, 457, + 413, 458, 458, 458, 458, 458, 458, 458, 458, 468, + 468, 468, 468, 468, 469, 261, 174, 259, 456, 456, + 456, 456, 456, 456, 457, 357, 459, 459, 459, 459, + 459, 459, 459, 459, 457, 217, 460, 460, 460, 460, + 460, 461, 458, 458, 261, 174, 421, 421, 421, 421, + 421, 421, 421, 421, 413, 621, 174, 467, 467, 467, + 467, 467, 467, 467, 467, 413, 261, 174, 464, 464, + + 464, 464, 464, 464, 464, 464, 413, 261, 174, 464, + 464, 464, 464, 464, 464, 382, 381, 413, 261, 174, + 465, 465, 465, 465, 465, 465, 465, 465, 394, 375, + 374, 369, 466, 466, 466, 466, 466, 621, 447, 466, + 466, 466, 466, 466, 466, 466, 466, 456, 456, 456, + 456, 456, 456, 456, 456, 368, 466, 466, 466, 466, + 466, 466, 486, 621, 487, 487, 487, 487, 487, 487, + 487, 487, 486, 447, 488, 488, 488, 488, 488, 488, + 488, 488, 486, 394, 489, 489, 489, 489, 489, 490, + 491, 491, 486, 447, 569, 605, 367, 486, 81, 491, + + 491, 491, 487, 487, 487, 487, 487, 492, 81, 493, + 493, 493, 493, 493, 493, 493, 493, 492, 81, 494, + 494, 494, 494, 494, 494, 494, 494, 342, 81, 259, + 81, 81, 492, 81, 495, 495, 495, 495, 495, 496, + 493, 493, 394, 475, 499, 499, 499, 499, 499, 499, + 499, 499, 447, 394, 217, 500, 500, 500, 500, 500, + 500, 500, 500, 501, 477, 476, 518, 502, 502, 502, + 502, 502, 503, 503, 503, 503, 503, 503, 503, 503, + 504, 504, 504, 504, 504, 505, 478, 217, 519, 286, + 331, 502, 502, 502, 502, 502, 502, 506, 507, 508, + + 506, 506, 506, 506, 506, 509, 330, 328, 327, 510, + 510, 510, 510, 510, 621, 326, 502, 502, 502, 502, + 502, 502, 502, 502, 511, 512, 513, 511, 511, 511, + 511, 511, 325, 510, 510, 510, 510, 510, 510, 457, + 324, 458, 458, 458, 458, 458, 458, 458, 458, 457, + 484, 458, 458, 458, 458, 458, 458, 458, 458, 457, + 323, 458, 458, 458, 458, 458, 458, 261, 174, 614, + 484, 322, 484, 484, 614, 321, 320, 413, 261, 174, + 516, 516, 516, 516, 516, 516, 516, 516, 530, 302, + 531, 532, 533, 530, 259, 531, 532, 533, 537, 538, + + 539, 537, 537, 537, 537, 537, 486, 394, 487, 487, + 487, 487, 487, 487, 487, 487, 486, 501, 487, 487, + 487, 487, 487, 487, 487, 487, 217, 621, 394, 561, + 394, 298, 81, 217, 621, 105, 534, 501, 501, 286, + 547, 536, 81, 486, 547, 487, 487, 487, 487, 487, + 487, 562, 81, 540, 541, 542, 540, 540, 540, 540, + 540, 492, 288, 493, 493, 493, 493, 493, 493, 493, + 493, 550, 550, 550, 550, 550, 551, 286, 492, 81, + 493, 493, 493, 493, 493, 493, 493, 493, 492, 287, + 493, 493, 493, 493, 493, 493, 510, 510, 510, 510, + + 510, 510, 510, 510, 394, 561, 545, 545, 545, 545, + 545, 545, 545, 545, 501, 394, 394, 546, 546, 546, + 546, 546, 546, 546, 546, 547, 547, 562, 286, 548, + 548, 548, 548, 548, 549, 549, 549, 549, 549, 549, + 549, 549, 621, 284, 548, 548, 548, 548, 548, 548, + 548, 548, 283, 548, 548, 548, 548, 548, 548, 552, + 553, 554, 552, 552, 552, 552, 552, 282, 281, 280, + 279, 555, 555, 555, 555, 555, 174, 556, 556, 556, + 556, 556, 556, 556, 556, 174, 557, 557, 557, 557, + 557, 557, 557, 557, 587, 555, 555, 555, 555, 555, + + 555, 174, 558, 558, 558, 558, 558, 559, 556, 556, + 621, 278, 621, 621, 621, 530, 588, 531, 532, 533, + 621, 275, 531, 532, 533, 621, 99, 621, 621, 533, + 567, 217, 259, 568, 568, 568, 568, 568, 568, 568, + 568, 217, 587, 529, 529, 600, 621, 529, 621, 621, + 621, 105, 85, 535, 535, 205, 247, 535, 534, 529, + 529, 529, 244, 534, 588, 243, 242, 601, 534, 535, + 535, 535, 569, 534, 570, 570, 570, 570, 570, 570, + 570, 570, 569, 600, 571, 571, 571, 571, 571, 571, + 571, 571, 241, 569, 536, 572, 572, 572, 572, 572, + + 573, 570, 570, 240, 238, 601, 237, 574, 81, 575, + 575, 575, 575, 575, 575, 575, 575, 574, 81, 576, + 576, 576, 576, 576, 576, 576, 576, 236, 574, 81, + 577, 577, 577, 577, 577, 578, 575, 575, 555, 555, + 555, 555, 555, 555, 555, 555, 394, 235, 581, 581, + 581, 581, 581, 581, 581, 581, 547, 394, 234, 582, + 582, 582, 582, 582, 582, 582, 582, 233, 232, 231, + 230, 583, 583, 583, 583, 583, 584, 584, 584, 584, + 584, 584, 584, 584, 585, 585, 585, 585, 585, 586, + 229, 228, 227, 105, 97, 583, 583, 583, 583, 583, + + 583, 621, 85, 583, 583, 583, 583, 583, 583, 583, + 583, 174, 556, 556, 556, 556, 556, 556, 556, 556, + 174, 556, 556, 556, 556, 556, 556, 556, 556, 174, + 556, 556, 556, 556, 556, 556, 568, 568, 568, 568, + 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, + 568, 568, 591, 592, 593, 591, 591, 591, 591, 591, + 569, 85, 570, 570, 570, 570, 570, 570, 570, 570, + 569, 205, 570, 570, 570, 570, 570, 570, 570, 570, + 155, 156, 150, 150, 142, 569, 81, 570, 570, 570, + 570, 570, 570, 203, 136, 136, 81, 594, 595, 596, + + 594, 594, 594, 594, 594, 574, 81, 575, 575, 575, + 575, 575, 575, 575, 575, 196, 195, 194, 193, 192, + 574, 81, 575, 575, 575, 575, 575, 575, 575, 575, + 574, 190, 575, 575, 575, 575, 575, 575, 394, 189, + 599, 599, 599, 599, 599, 599, 599, 599, 605, 188, + 606, 606, 606, 606, 606, 606, 606, 606, 605, 187, + 607, 607, 607, 607, 607, 607, 607, 607, 605, 186, + 608, 608, 608, 608, 608, 609, 606, 606, 610, 610, + 610, 610, 610, 610, 81, 610, 610, 610, 610, 610, + 610, 610, 610, 181, 81, 611, 611, 611, 611, 611, + + 611, 611, 611, 180, 81, 612, 612, 612, 612, 612, + 613, 610, 610, 615, 616, 617, 615, 615, 615, 615, + 615, 605, 179, 606, 606, 606, 606, 606, 606, 606, + 606, 605, 178, 606, 606, 606, 606, 606, 606, 606, + 606, 105, 80, 105, 167, 93, 605, 81, 606, 606, + 606, 606, 606, 606, 85, 83, 82, 81, 610, 610, + 610, 610, 610, 610, 610, 610, 81, 81, 610, 610, + 610, 610, 610, 610, 610, 610, 156, 150, 142, 113, + 111, 136, 81, 618, 618, 618, 618, 618, 618, 618, + 618, 615, 615, 615, 615, 615, 615, 615, 615, 619, + + 619, 619, 619, 619, 620, 618, 618, 618, 618, 618, + 618, 618, 618, 618, 618, 132, 130, 81, 618, 618, + 618, 618, 618, 618, 117, 81, 116, 115, 112, 107, + 105, 93, 83, 81, 82, 81, 621, 621, 621, 621, + 621, 81, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 81, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, - 66, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 78, 606, 606, - 606, 606, 606, 606, 606, 78, 78, 78, 606, 606, - - 78, 78, 78, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 82, 82, 82, 82, 82, 82, 86, - 606, 606, 606, 606, 86, 606, 606, 86, 86, 86, - 86, 606, 86, 86, 86, 90, 606, 606, 606, 606, - 606, 606, 606, 90, 90, 90, 606, 606, 90, 90, - 90, 92, 606, 606, 92, 92, 606, 92, 606, 92, - 92, 92, 606, 606, 92, 92, 92, 102, 102, 606, - 606, 606, 102, 133, 606, 606, 133, 133, 606, 133, - 606, 133, 133, 133, 606, 606, 133, 133, 133, 137, - 606, 606, 137, 137, 606, 137, 606, 137, 137, 137, - - 606, 137, 606, 137, 137, 145, 606, 606, 145, 606, - 606, 145, 606, 145, 145, 145, 145, 606, 145, 145, - 145, 149, 149, 149, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 149, 149, 149, 149, 151, 151, 606, - 151, 606, 151, 151, 151, 151, 151, 151, 151, 151, - 151, 151, 151, 157, 157, 157, 157, 157, 157, 157, - 157, 157, 157, 157, 157, 157, 157, 157, 157, 158, - 158, 606, 158, 158, 158, 158, 158, 158, 158, 158, - 158, 158, 158, 158, 158, 161, 606, 606, 606, 606, - 161, 606, 606, 161, 161, 161, 606, 606, 161, 161, - - 161, 93, 606, 606, 93, 93, 606, 93, 606, 93, - 93, 93, 606, 606, 93, 93, 93, 169, 169, 606, - 606, 606, 169, 171, 171, 171, 606, 606, 606, 171, - 134, 606, 606, 134, 134, 606, 134, 606, 134, 134, - 134, 606, 606, 134, 134, 134, 200, 200, 200, 200, - 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, - 200, 200, 207, 207, 606, 606, 606, 207, 213, 213, - 213, 606, 606, 606, 213, 245, 245, 606, 606, 606, - 245, 246, 246, 606, 606, 606, 246, 250, 250, 606, - 606, 606, 250, 252, 252, 252, 606, 606, 606, 252, - - 288, 288, 606, 606, 606, 288, 290, 290, 606, 606, - 606, 290, 291, 291, 606, 606, 606, 291, 293, 293, - 293, 606, 606, 606, 293, 297, 297, 297, 297, 606, - 606, 606, 297, 328, 328, 606, 606, 606, 328, 329, - 329, 606, 606, 606, 329, 330, 330, 606, 606, 606, - 330, 342, 342, 342, 606, 606, 606, 342, 343, 343, - 343, 343, 606, 606, 606, 343, 380, 380, 606, 606, - 606, 380, 381, 381, 606, 606, 606, 381, 397, 397, - 397, 606, 606, 606, 397, 398, 398, 398, 398, 606, - 606, 606, 398, 427, 427, 606, 606, 606, 427, 431, - - 606, 431, 431, 606, 606, 606, 431, 449, 449, 449, - 606, 606, 606, 449, 450, 450, 450, 450, 606, 606, - 606, 450, 483, 483, 606, 606, 606, 483, 484, 606, - 484, 484, 606, 606, 606, 484, 500, 500, 500, 606, - 606, 606, 500, 501, 501, 501, 606, 606, 606, 606, - 501, 509, 509, 509, 509, 509, 509, 509, 509, 509, - 509, 509, 509, 509, 509, 509, 509, 514, 514, 606, - 514, 514, 514, 606, 606, 514, 514, 514, 606, 606, - 514, 514, 514, 520, 520, 606, 520, 520, 520, 606, - 606, 520, 520, 520, 606, 606, 520, 520, 520, 528, - - 528, 606, 606, 606, 528, 529, 606, 529, 529, 606, - 606, 606, 529, 545, 545, 606, 606, 606, 606, 545, - 564, 564, 606, 606, 606, 564, 565, 606, 565, 565, - 606, 606, 606, 565, 582, 582, 606, 606, 606, 582, - 583, 606, 583, 606, 606, 606, 606, 583, 587, 587, - 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, - 587, 587, 587, 587, 13, 606, 606, 606, 606, 606, - 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, - 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, - 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, - - 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, - 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, - 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, - 606 + 31, 31, 31, 31, 31, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + + 68, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 80, 621, 621, + 621, 621, 621, 621, 621, 80, 80, 80, 621, 621, + 80, 80, 80, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 88, + 621, 621, 621, 621, 88, 621, 621, 88, 88, 88, + 88, 621, 88, 88, 88, 92, 621, 621, 621, 621, + 621, 621, 621, 92, 92, 92, 621, 621, 92, 92, + 92, 94, 621, 621, 94, 94, 621, 94, 621, 94, + 94, 94, 621, 621, 94, 94, 94, 104, 104, 621, + + 621, 621, 104, 137, 621, 621, 137, 137, 621, 137, + 621, 137, 137, 137, 621, 621, 137, 137, 137, 141, + 621, 621, 141, 141, 621, 141, 621, 141, 141, 141, + 621, 141, 621, 141, 141, 149, 621, 621, 149, 621, + 621, 149, 621, 149, 149, 149, 149, 621, 149, 149, + 149, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 153, 153, 153, 153, 153, 153, 153, 155, 155, 621, + 155, 621, 155, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 161, 161, 161, 161, 161, 161, 161, + 161, 161, 161, 161, 161, 161, 161, 161, 161, 162, + + 162, 621, 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 165, 621, 621, 621, 621, + 165, 621, 621, 165, 165, 165, 621, 621, 165, 165, + 165, 95, 621, 621, 95, 95, 621, 95, 621, 95, + 95, 95, 621, 621, 95, 95, 95, 173, 173, 621, + 621, 621, 173, 175, 175, 175, 621, 621, 621, 175, + 138, 621, 621, 138, 138, 621, 138, 621, 138, 138, + 138, 621, 621, 138, 138, 138, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 213, 213, 621, 621, 621, 213, 219, 219, + + 219, 621, 621, 621, 219, 253, 253, 621, 621, 621, + 253, 254, 254, 621, 621, 621, 254, 258, 258, 621, + 621, 621, 258, 260, 260, 260, 621, 621, 621, 260, + 298, 298, 621, 621, 621, 298, 300, 300, 621, 621, + 621, 300, 301, 301, 621, 621, 621, 301, 303, 303, + 303, 621, 621, 621, 303, 307, 307, 307, 307, 621, + 621, 621, 307, 339, 339, 621, 621, 621, 339, 340, + 340, 621, 621, 621, 340, 341, 341, 621, 621, 621, + 341, 353, 353, 353, 621, 621, 621, 353, 354, 354, + 354, 354, 621, 621, 621, 354, 392, 392, 621, 621, + + 621, 392, 393, 393, 621, 621, 621, 393, 409, 409, + 409, 621, 621, 621, 409, 410, 410, 410, 410, 621, + 621, 621, 410, 440, 440, 621, 621, 621, 440, 444, + 621, 444, 444, 621, 621, 621, 444, 462, 462, 462, + 621, 621, 621, 462, 463, 463, 463, 463, 621, 621, + 621, 463, 497, 497, 621, 621, 621, 497, 498, 621, + 498, 498, 621, 621, 621, 498, 514, 514, 514, 621, + 621, 621, 514, 515, 515, 515, 621, 621, 621, 621, + 515, 524, 524, 524, 524, 524, 524, 524, 524, 524, + 524, 524, 524, 524, 524, 524, 524, 529, 529, 621, + + 529, 529, 529, 621, 621, 529, 529, 529, 621, 621, + 529, 529, 529, 535, 535, 621, 535, 535, 535, 621, + 621, 535, 535, 535, 621, 621, 535, 535, 535, 543, + 543, 621, 621, 621, 543, 544, 621, 544, 544, 621, + 621, 621, 544, 560, 560, 621, 621, 621, 621, 560, + 579, 579, 621, 621, 621, 579, 580, 621, 580, 580, + 621, 621, 621, 580, 597, 597, 621, 621, 621, 597, + 598, 621, 598, 621, 621, 621, 621, 598, 602, 602, + 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, + 602, 602, 602, 602, 13, 621, 621, 621, 621, 621, + + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621 } ; -static yyconst short int yy_chk[3732] = +static yyconst short int yy_chk[3663] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -982,411 +980,403 @@ static yyconst short int yy_chk[3732] = 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, 2, 44, 3, 34, - 2, 103, 3, 4, 47, 20, 126, 4, 3, 34, - 103, 3, 52, 4, 44, 48, 4, 11, 11, 11, - 11, 126, 52, 20, 2, 2, 56, 47, 2, 74, - - 5, 5, 5, 48, 5, 2, 50, 3, 2, 3, - 5, 603, 4, 56, 4, 6, 6, 6, 20, 6, - 64, 64, 5, 5, 75, 6, 12, 12, 12, 12, - 3, 196, 68, 50, 11, 4, 70, 6, 6, 25, - 25, 72, 72, 25, 25, 196, 74, 5, 27, 27, - 27, 27, 27, 27, 27, 27, 68, 88, 124, 127, - 70, 25, 6, 7, 7, 7, 45, 7, 587, 75, - 124, 127, 129, 12, 28, 28, 28, 28, 28, 28, - 139, 139, 129, 43, 25, 43, 43, 43, 43, 43, - 43, 43, 43, 194, 45, 45, 77, 77, 45, 77, - - 88, 116, 123, 114, 114, 45, 116, 153, 45, 194, + 1, 1, 1, 1, 1, 1, 1, 2, 618, 3, + 20, 2, 70, 3, 47, 36, 50, 4, 34, 3, + 36, 4, 3, 11, 11, 11, 11, 4, 20, 34, + 4, 12, 12, 12, 12, 2, 2, 70, 47, 2, + + 77, 38, 602, 50, 3, 599, 44, 2, 3, 3, + 2, 3, 4, 597, 20, 38, 4, 4, 52, 4, + 5, 5, 5, 44, 5, 6, 6, 6, 52, 6, + 5, 11, 3, 25, 25, 6, 120, 25, 25, 12, + 4, 120, 5, 5, 66, 66, 77, 6, 6, 9, + 9, 9, 9, 9, 58, 25, 74, 74, 9, 9, + 9, 28, 28, 28, 28, 28, 28, 19, 5, 143, + 143, 58, 9, 6, 7, 7, 7, 19, 7, 25, + 19, 19, 19, 19, 19, 19, 19, 19, 27, 27, + 27, 27, 27, 27, 27, 27, 105, 9, 10, 10, + + 10, 10, 10, 76, 583, 105, 90, 10, 10, 10, + 43, 165, 43, 43, 43, 43, 43, 43, 43, 43, + 45, 10, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, - 8, 53, 8, 206, 53, 53, 53, 53, 53, 53, - 53, 53, 84, 84, 84, 84, 84, 84, 84, 84, - 114, 62, 62, 62, 153, 62, 154, 125, 206, 62, - 123, 62, 85, 85, 85, 85, 85, 85, 85, 85, - 143, 143, 202, 62, 62, 8, 8, 8, 8, 8, + 8, 8, 8, 48, 8, 128, 10, 72, 45, 45, + 90, 76, 45, 79, 79, 165, 79, 128, 582, 127, + 45, 53, 48, 45, 53, 53, 53, 53, 53, 53, + 53, 53, 72, 86, 86, 86, 86, 86, 86, 86, + 86, 103, 103, 103, 103, 103, 103, 580, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 9, 9, 9, 9, 9, 62, 125, - - 128, 154, 9, 9, 9, 86, 128, 202, 55, 55, - 136, 161, 55, 55, 185, 136, 9, 101, 101, 101, - 101, 101, 101, 86, 155, 155, 198, 185, 87, 584, - 55, 87, 87, 87, 87, 87, 87, 87, 87, 198, - 9, 10, 10, 10, 10, 10, 582, 171, 86, 284, - 10, 10, 10, 55, 161, 89, 171, 89, 89, 222, - 568, 89, 89, 222, 10, 89, 213, 95, 95, 95, - 95, 95, 95, 95, 95, 213, 92, 92, 89, 89, - 92, 92, 192, 195, 284, 195, 512, 192, 10, 19, - 99, 99, 99, 99, 99, 99, 99, 99, 92, 19, - - 95, 221, 19, 19, 19, 19, 19, 19, 19, 19, - 26, 191, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 92, 237, 221, 26, 26, 26, 26, 26, 100, - 100, 100, 100, 100, 100, 100, 100, 131, 131, 131, - 131, 131, 131, 131, 131, 26, 512, 26, 26, 26, - 26, 26, 26, 32, 146, 238, 238, 146, 146, 32, - 567, 191, 32, 32, 146, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 146, 237, 32, + + 8, 8, 8, 8, 8, 8, 26, 131, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 88, 127, 131, + 26, 26, 26, 26, 26, 130, 191, 112, 579, 55, + 55, 129, 112, 55, 55, 88, 112, 132, 112, 191, + 130, 202, 26, 132, 26, 26, 26, 26, 26, 26, + 32, 55, 140, 147, 147, 202, 32, 140, 575, 32, + 32, 88, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 129, 55, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 210, 210, - 210, 35, 35, 35, 35, 35, 109, 231, 240, 241, - 35, 109, 252, 231, 109, 241, 109, 117, 565, 150, - 150, 252, 239, 240, 35, 35, 35, 35, 35, 35, - 42, 42, 42, 42, 42, 293, 42, 42, 133, 133, - 42, 265, 133, 133, 293, 117, 117, 239, 281, 117, - 388, 388, 42, 42, 42, 46, 117, 163, 281, 117, - 133, 163, 323, 265, 239, 46, 150, 163, 46, 46, - - 46, 46, 46, 46, 46, 46, 275, 282, 323, 163, - 163, 275, 282, 133, 142, 142, 142, 142, 142, 142, - 142, 142, 159, 159, 159, 159, 159, 159, 159, 159, - 160, 160, 160, 160, 160, 160, 160, 160, 438, 438, - 46, 63, 201, 201, 201, 201, 201, 201, 201, 201, - 279, 63, 564, 280, 63, 63, 63, 63, 63, 63, - 63, 63, 79, 560, 79, 79, 79, 297, 79, 79, - 254, 254, 79, 197, 280, 201, 297, 197, 256, 256, - 254, 321, 322, 197, 79, 79, 79, 91, 256, 91, - 91, 91, 322, 91, 91, 197, 197, 91, 209, 209, - - 209, 209, 209, 209, 209, 209, 209, 298, 298, 91, - 91, 91, 94, 279, 94, 94, 94, 298, 94, 94, - 313, 383, 94, 162, 313, 162, 162, 452, 452, 162, - 162, 383, 321, 162, 94, 94, 94, 96, 96, 96, - 96, 96, 96, 96, 96, 162, 162, 162, 312, 96, - 96, 96, 96, 96, 205, 368, 205, 205, 205, 205, - 205, 205, 214, 214, 214, 214, 214, 214, 214, 214, - 312, 368, 96, 96, 96, 96, 96, 96, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 316, 371, 205, - 104, 104, 104, 104, 104, 216, 216, 216, 216, 216, - - 216, 216, 216, 217, 217, 217, 217, 217, 217, 316, - 299, 299, 373, 104, 104, 104, 104, 104, 104, 135, - 299, 135, 135, 135, 549, 135, 135, 373, 219, 135, - 219, 219, 219, 219, 219, 219, 219, 219, 453, 453, - 371, 135, 135, 135, 164, 545, 164, 164, 164, 164, - 164, 164, 164, 164, 247, 247, 247, 247, 247, 247, - 247, 247, 247, 253, 253, 253, 253, 253, 253, 253, - 253, 255, 255, 255, 255, 255, 255, 255, 255, 164, - 165, 541, 165, 165, 165, 165, 165, 165, 165, 165, - 259, 259, 259, 259, 259, 259, 259, 259, 419, 419, - - 259, 261, 261, 261, 261, 261, 261, 261, 261, 262, - 262, 262, 262, 262, 262, 165, 166, 529, 166, 166, - 166, 166, 166, 166, 166, 166, 264, 317, 264, 264, - 264, 264, 264, 264, 264, 264, 301, 301, 283, 283, - 283, 283, 283, 283, 283, 283, 301, 456, 456, 317, - 419, 166, 167, 318, 167, 167, 167, 167, 167, 167, - 167, 167, 318, 324, 342, 343, 167, 167, 167, 167, - 167, 283, 324, 342, 343, 344, 344, 287, 372, 287, - 287, 287, 287, 287, 287, 344, 420, 372, 420, 167, - 167, 167, 167, 167, 167, 170, 170, 170, 170, 170, - - 170, 170, 170, 170, 345, 345, 528, 170, 170, 170, - 170, 170, 287, 294, 345, 294, 294, 294, 294, 294, - 294, 294, 294, 307, 307, 307, 307, 307, 307, 513, - 170, 170, 170, 170, 170, 170, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 467, 467, 509, 172, - 172, 172, 172, 172, 295, 376, 295, 295, 295, 295, - 295, 295, 295, 295, 300, 300, 300, 300, 300, 300, - 300, 300, 172, 172, 172, 172, 172, 172, 173, 173, - 173, 173, 173, 173, 173, 173, 347, 347, 508, 376, - 173, 173, 173, 173, 173, 296, 347, 296, 296, 296, - - 296, 296, 296, 296, 296, 306, 306, 306, 306, 306, - 306, 306, 306, 173, 173, 173, 173, 173, 173, 203, - 507, 203, 203, 203, 203, 203, 203, 203, 203, 304, - 304, 304, 304, 304, 304, 304, 304, 506, 309, 304, - 309, 309, 309, 309, 309, 309, 309, 309, 334, 334, - 334, 334, 334, 334, 203, 204, 501, 204, 204, 204, - 204, 204, 204, 204, 204, 331, 331, 331, 331, 331, - 331, 331, 331, 333, 333, 333, 333, 333, 333, 333, - 333, 337, 337, 337, 337, 337, 337, 337, 337, 358, - 204, 215, 215, 215, 215, 215, 215, 215, 215, 215, - - 215, 215, 491, 491, 484, 215, 215, 215, 215, 215, - 336, 358, 336, 336, 336, 336, 336, 336, 336, 336, - 341, 483, 341, 341, 341, 341, 341, 341, 215, 215, - 215, 215, 215, 215, 218, 218, 218, 218, 218, 218, - 218, 218, 218, 218, 397, 502, 502, 218, 218, 218, - 218, 218, 339, 397, 339, 339, 339, 339, 339, 339, - 339, 339, 346, 346, 346, 346, 346, 346, 346, 346, - 218, 218, 218, 218, 218, 218, 242, 479, 242, 242, - 242, 242, 242, 242, 242, 242, 340, 364, 340, 340, - 340, 340, 340, 340, 340, 340, 350, 350, 350, 350, - - 350, 350, 350, 350, 398, 670, 350, 510, 510, 364, - 670, 242, 243, 398, 243, 243, 243, 243, 243, 243, - 243, 243, 352, 352, 352, 352, 352, 352, 352, 352, - 353, 353, 353, 353, 353, 353, 355, 366, 355, 355, - 355, 355, 355, 355, 355, 355, 374, 243, 244, 449, - 244, 244, 244, 244, 244, 244, 244, 244, 449, 366, - 414, 385, 374, 382, 382, 382, 382, 382, 382, 382, - 382, 385, 450, 375, 375, 375, 375, 375, 375, 375, - 375, 450, 414, 244, 257, 257, 257, 257, 257, 257, - 257, 257, 257, 257, 257, 260, 260, 260, 260, 260, - - 260, 260, 260, 260, 260, 260, 375, 415, 457, 260, - 260, 260, 260, 260, 379, 379, 379, 379, 379, 379, - 379, 384, 384, 384, 384, 384, 384, 384, 384, 415, - 457, 465, 260, 260, 260, 260, 260, 260, 263, 263, - 263, 263, 263, 263, 263, 263, 263, 263, 379, 536, - 536, 263, 263, 263, 263, 263, 390, 390, 390, 390, - 390, 390, 390, 390, 391, 391, 391, 391, 391, 391, - 460, 399, 399, 459, 263, 263, 263, 263, 263, 263, - 285, 399, 285, 285, 285, 285, 285, 285, 285, 285, - 393, 432, 393, 393, 393, 393, 393, 393, 393, 393, - - 394, 432, 394, 394, 394, 394, 394, 394, 394, 394, - 458, 473, 551, 551, 468, 285, 286, 433, 286, 286, - 286, 286, 286, 286, 286, 286, 395, 433, 395, 395, - 395, 395, 395, 395, 395, 395, 396, 435, 396, 396, - 396, 396, 396, 396, 396, 396, 473, 435, 461, 571, - 571, 286, 292, 292, 292, 292, 292, 292, 292, 292, - 292, 400, 400, 445, 292, 292, 292, 292, 292, 468, - 461, 400, 401, 401, 401, 401, 401, 401, 401, 401, - 408, 408, 408, 408, 408, 408, 431, 292, 292, 292, - 292, 292, 292, 302, 302, 302, 302, 302, 302, 302, - - 302, 302, 302, 302, 305, 305, 305, 305, 305, 305, - 305, 305, 305, 305, 305, 402, 402, 463, 305, 305, - 305, 305, 305, 469, 477, 402, 405, 405, 405, 405, - 405, 405, 405, 405, 427, 503, 405, 422, 469, 463, - 418, 305, 305, 305, 305, 305, 305, 308, 308, 308, - 308, 308, 308, 308, 308, 308, 308, 503, 417, 477, - 308, 308, 308, 308, 308, 407, 407, 407, 407, 407, - 407, 407, 407, 409, 416, 409, 409, 409, 409, 409, - 409, 409, 409, 308, 308, 308, 308, 308, 308, 325, - 325, 325, 325, 325, 325, 325, 325, 325, 421, 428, - - 505, 428, 428, 428, 428, 428, 428, 428, 428, 434, - 434, 434, 434, 434, 434, 434, 434, 413, 421, 412, - 421, 421, 505, 325, 326, 326, 326, 326, 326, 326, - 326, 326, 326, 429, 466, 429, 429, 429, 429, 429, - 429, 429, 429, 421, 430, 485, 430, 430, 430, 430, - 430, 430, 430, 430, 466, 485, 466, 466, 326, 327, - 327, 327, 327, 327, 327, 327, 327, 327, 440, 440, - 440, 440, 440, 440, 440, 440, 441, 441, 441, 441, - 441, 441, 443, 500, 443, 443, 443, 443, 443, 443, - 443, 443, 500, 327, 332, 486, 332, 332, 332, 332, - - 332, 332, 332, 332, 332, 486, 575, 575, 332, 332, - 332, 332, 332, 444, 444, 444, 444, 444, 444, 444, - 444, 446, 411, 446, 446, 446, 446, 446, 446, 446, - 446, 332, 332, 332, 332, 332, 332, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 588, 588, 410, 335, - 335, 335, 335, 335, 447, 488, 447, 447, 447, 447, - 447, 447, 447, 447, 448, 488, 448, 448, 448, 448, - 448, 448, 335, 335, 335, 335, 335, 335, 348, 348, - 348, 348, 348, 348, 348, 348, 348, 348, 348, 351, - 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, - - 451, 451, 381, 351, 351, 351, 351, 351, 555, 470, - 451, 470, 470, 470, 471, 530, 471, 471, 471, 494, - 494, 494, 494, 494, 494, 530, 351, 351, 351, 351, - 351, 351, 354, 354, 354, 354, 354, 354, 354, 354, - 354, 531, 533, 555, 566, 354, 354, 354, 354, 354, - 380, 531, 533, 370, 566, 369, 470, 363, 591, 362, - 476, 471, 476, 476, 476, 476, 476, 476, 354, 354, - 354, 354, 354, 354, 377, 377, 377, 377, 377, 377, - 377, 377, 377, 546, 548, 472, 472, 472, 472, 472, - 472, 472, 472, 591, 361, 476, 478, 478, 478, 478, - - 478, 478, 478, 478, 360, 546, 548, 357, 377, 378, - 378, 378, 378, 378, 378, 378, 378, 378, 472, 480, - 572, 480, 480, 480, 480, 480, 480, 480, 480, 481, - 356, 481, 481, 481, 481, 481, 481, 481, 481, 619, - 619, 338, 572, 378, 386, 574, 386, 386, 386, 386, - 386, 386, 386, 386, 386, 389, 330, 389, 389, 389, - 389, 389, 389, 389, 389, 389, 329, 574, 585, 389, - 389, 389, 389, 389, 482, 328, 482, 482, 482, 482, - 482, 482, 487, 487, 487, 487, 487, 487, 487, 487, - 585, 320, 389, 389, 389, 389, 389, 389, 392, 392, - - 392, 392, 392, 392, 392, 392, 392, 319, 315, 314, - 392, 392, 392, 392, 392, 493, 493, 493, 493, 493, - 493, 493, 493, 496, 311, 496, 496, 496, 496, 496, - 496, 496, 496, 392, 392, 392, 392, 392, 392, 403, - 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, - 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, - 310, 291, 290, 289, 406, 406, 406, 406, 406, 497, - 497, 497, 497, 497, 497, 497, 497, 497, 498, 498, - 498, 498, 498, 498, 498, 498, 498, 406, 406, 406, - 406, 406, 406, 423, 288, 423, 423, 423, 423, 423, - - 423, 423, 423, 499, 499, 499, 499, 499, 499, 499, - 499, 499, 514, 278, 514, 514, 514, 277, 276, 515, - 274, 515, 515, 515, 273, 272, 271, 270, 423, 424, - 269, 424, 424, 424, 424, 424, 424, 424, 424, 516, - 268, 516, 516, 516, 517, 267, 517, 517, 517, 251, - 520, 250, 520, 520, 520, 249, 248, 246, 245, 514, - 236, 235, 234, 233, 424, 425, 515, 425, 425, 425, - 425, 425, 425, 425, 425, 518, 232, 229, 518, 518, - 518, 518, 518, 518, 518, 518, 516, 227, 226, 225, - 224, 517, 223, 220, 212, 519, 519, 520, 211, 519, - - 425, 426, 208, 426, 426, 426, 426, 426, 426, 426, - 426, 519, 519, 519, 521, 521, 207, 525, 521, 525, - 525, 525, 525, 525, 525, 525, 525, 200, 199, 193, - 521, 521, 521, 190, 189, 188, 426, 436, 187, 436, - 436, 436, 436, 436, 436, 436, 436, 436, 439, 186, - 439, 439, 439, 439, 439, 439, 439, 439, 439, 184, - 183, 182, 439, 439, 439, 439, 439, 526, 181, 526, - 526, 526, 526, 526, 526, 526, 526, 532, 532, 532, - 532, 532, 532, 532, 532, 439, 439, 439, 439, 439, - 439, 442, 442, 442, 442, 442, 442, 442, 442, 442, - - 180, 179, 178, 442, 442, 442, 442, 442, 527, 177, - 527, 527, 527, 527, 527, 527, 527, 527, 538, 538, - 538, 538, 538, 538, 538, 538, 442, 442, 442, 442, - 442, 442, 454, 454, 454, 454, 454, 454, 454, 454, - 454, 454, 474, 176, 474, 474, 474, 474, 474, 474, - 474, 474, 539, 539, 539, 539, 539, 539, 540, 175, - 540, 540, 540, 540, 540, 540, 540, 540, 542, 542, - 542, 542, 542, 542, 542, 542, 542, 474, 475, 169, - 475, 475, 475, 475, 475, 475, 475, 475, 543, 543, - 543, 543, 543, 543, 543, 543, 543, 544, 544, 544, - - 544, 544, 544, 544, 552, 552, 552, 552, 552, 552, - 552, 552, 168, 475, 489, 158, 489, 489, 489, 489, - 489, 489, 489, 489, 489, 492, 157, 492, 492, 492, - 492, 492, 492, 492, 492, 492, 156, 152, 151, 492, - 492, 492, 492, 492, 553, 553, 553, 553, 553, 553, - 553, 553, 554, 554, 554, 554, 554, 554, 554, 554, - 149, 145, 492, 492, 492, 492, 492, 492, 495, 495, - 495, 495, 495, 495, 495, 495, 138, 134, 132, 130, - 495, 495, 495, 495, 495, 554, 558, 122, 558, 558, - 558, 558, 558, 558, 559, 559, 559, 559, 559, 559, - - 559, 559, 121, 495, 495, 495, 495, 495, 495, 522, - 120, 522, 522, 522, 522, 522, 522, 522, 522, 119, - 561, 558, 561, 561, 561, 561, 561, 561, 561, 561, - 562, 118, 562, 562, 562, 562, 562, 562, 562, 562, - 113, 112, 111, 110, 522, 523, 108, 523, 523, 523, - 523, 523, 523, 523, 523, 563, 107, 563, 563, 563, - 563, 563, 563, 569, 106, 569, 569, 569, 569, 569, - 569, 569, 569, 598, 598, 598, 598, 598, 598, 102, - 523, 524, 98, 524, 524, 524, 524, 524, 524, 524, - 524, 579, 579, 579, 579, 579, 579, 579, 579, 580, - - 580, 580, 580, 580, 580, 580, 580, 581, 581, 581, - 581, 581, 581, 581, 581, 97, 524, 534, 93, 534, - 534, 534, 534, 534, 534, 534, 534, 534, 537, 90, - 537, 537, 537, 537, 537, 537, 537, 537, 82, 81, - 80, 78, 537, 537, 537, 537, 537, 73, 590, 590, - 590, 590, 590, 590, 590, 590, 594, 66, 594, 594, - 594, 594, 594, 594, 59, 537, 537, 537, 537, 537, - 537, 556, 54, 556, 556, 556, 556, 556, 556, 556, - 556, 590, 596, 596, 596, 596, 596, 596, 596, 596, - 51, 594, 597, 597, 597, 597, 597, 597, 597, 597, - - 49, 41, 40, 39, 38, 37, 556, 557, 36, 557, - 557, 557, 557, 557, 557, 557, 557, 33, 29, 23, - 600, 600, 600, 600, 600, 600, 600, 600, 601, 601, - 601, 601, 601, 601, 601, 601, 17, 15, 14, 13, - 0, 0, 557, 576, 0, 576, 576, 576, 576, 576, - 576, 576, 576, 600, 0, 0, 0, 0, 0, 0, - 0, 601, 602, 602, 602, 602, 602, 602, 602, 602, - 604, 604, 604, 604, 604, 604, 604, 604, 576, 577, - 0, 577, 577, 577, 577, 577, 577, 577, 577, 0, - 0, 0, 0, 0, 0, 602, 605, 605, 605, 605, - - 605, 605, 0, 604, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 577, 578, 0, 578, 578, 578, - 578, 578, 578, 578, 578, 0, 0, 0, 0, 605, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 578, 592, 0, 592, 592, 592, 592, 592, 592, 592, - 592, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 592, 593, 0, 593, - 593, 593, 593, 593, 593, 593, 593, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 593, 607, 607, 607, 607, 607, 607, 607, - 607, 607, 607, 607, 607, 607, 607, 607, 607, 608, - 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, - 608, 608, 608, 608, 608, 609, 609, 609, 609, 609, - 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, - 609, 610, 610, 610, 610, 610, 610, 610, 610, 610, - 610, 610, 610, 610, 610, 610, 610, 611, 0, 0, - 0, 0, 0, 0, 0, 611, 611, 611, 0, 0, - - 611, 611, 611, 612, 612, 612, 612, 612, 612, 612, - 612, 612, 612, 612, 612, 612, 612, 612, 612, 613, - 0, 0, 0, 0, 613, 0, 0, 613, 613, 613, - 613, 0, 613, 613, 613, 614, 0, 0, 0, 0, - 0, 0, 0, 614, 614, 614, 0, 0, 614, 614, - 614, 615, 0, 0, 615, 615, 0, 615, 0, 615, - 615, 615, 0, 0, 615, 615, 615, 616, 616, 0, - 0, 0, 616, 617, 0, 0, 617, 617, 0, 617, - 0, 617, 617, 617, 0, 0, 617, 617, 617, 618, - 0, 0, 618, 618, 0, 618, 0, 618, 618, 618, - - 0, 618, 0, 618, 618, 620, 0, 0, 620, 0, - 0, 620, 0, 620, 620, 620, 620, 0, 620, 620, - 620, 621, 621, 621, 621, 621, 621, 621, 621, 621, - 621, 621, 621, 621, 621, 621, 621, 622, 622, 0, - 622, 0, 622, 622, 622, 622, 622, 622, 622, 622, - 622, 622, 622, 623, 623, 623, 623, 623, 623, 623, - 623, 623, 623, 623, 623, 623, 623, 623, 623, 624, - 624, 0, 624, 624, 624, 624, 624, 624, 624, 624, - 624, 624, 624, 624, 624, 625, 0, 0, 0, 0, - 625, 0, 0, 625, 625, 625, 0, 0, 625, 625, - - 625, 626, 0, 0, 626, 626, 0, 626, 0, 626, - 626, 626, 0, 0, 626, 626, 626, 627, 627, 0, - 0, 0, 627, 628, 628, 628, 0, 0, 0, 628, - 629, 0, 0, 629, 629, 0, 629, 0, 629, 629, - 629, 0, 0, 629, 629, 629, 630, 630, 630, 630, - 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, - 630, 630, 631, 631, 0, 0, 0, 631, 632, 632, - 632, 0, 0, 0, 632, 633, 633, 0, 0, 0, - 633, 634, 634, 0, 0, 0, 634, 635, 635, 0, - 0, 0, 635, 636, 636, 636, 0, 0, 0, 636, - - 637, 637, 0, 0, 0, 637, 638, 638, 0, 0, - 0, 638, 639, 639, 0, 0, 0, 639, 640, 640, - 640, 0, 0, 0, 640, 641, 641, 641, 641, 0, - 0, 0, 641, 642, 642, 0, 0, 0, 642, 643, - 643, 0, 0, 0, 643, 644, 644, 0, 0, 0, - 644, 645, 645, 645, 0, 0, 0, 645, 646, 646, - 646, 646, 0, 0, 0, 646, 647, 647, 0, 0, - 0, 647, 648, 648, 0, 0, 0, 648, 649, 649, - 649, 0, 0, 0, 649, 650, 650, 650, 650, 0, - 0, 0, 650, 651, 651, 0, 0, 0, 651, 652, - - 0, 652, 652, 0, 0, 0, 652, 653, 653, 653, - 0, 0, 0, 653, 654, 654, 654, 654, 0, 0, - 0, 654, 655, 655, 0, 0, 0, 655, 656, 0, - 656, 656, 0, 0, 0, 656, 657, 657, 657, 0, - 0, 0, 657, 658, 658, 658, 0, 0, 0, 0, - 658, 659, 659, 659, 659, 659, 659, 659, 659, 659, - 659, 659, 659, 659, 659, 659, 659, 660, 660, 0, - 660, 660, 660, 0, 0, 660, 660, 660, 0, 0, - 660, 660, 660, 661, 661, 0, 661, 661, 661, 0, - 0, 661, 661, 661, 0, 0, 661, 661, 661, 662, - - 662, 0, 0, 0, 662, 663, 0, 663, 663, 0, - 0, 0, 663, 664, 664, 0, 0, 0, 0, 664, - 665, 665, 0, 0, 0, 665, 666, 0, 666, 666, - 0, 0, 0, 666, 667, 667, 0, 0, 0, 667, - 668, 0, 668, 0, 0, 0, 0, 668, 669, 669, - 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, - 669, 669, 669, 669, 606, 606, 606, 606, 606, 606, - 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, - 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, - 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, - - 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, - 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, - 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, - 606 + 32, 32, 32, 32, 32, 32, 32, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 65, 118, 118, 35, + 35, 35, 35, 35, 159, 159, 65, 133, 35, 65, + 65, 65, 65, 65, 65, 65, 65, 133, 154, 154, + 201, 208, 201, 35, 35, 35, 35, 35, 35, 42, + 42, 42, 42, 42, 158, 42, 42, 175, 157, 42, + 64, 64, 64, 200, 64, 118, 175, 219, 64, 197, + 64, 42, 42, 42, 46, 198, 219, 208, 212, 200, + 198, 227, 64, 64, 46, 564, 154, 46, 46, 46, + + 46, 46, 46, 46, 46, 81, 560, 81, 81, 81, + 158, 81, 81, 227, 212, 81, 157, 245, 64, 87, + 87, 87, 87, 87, 87, 87, 87, 81, 81, 81, + 197, 94, 94, 556, 229, 94, 94, 204, 89, 229, + 46, 89, 89, 89, 89, 89, 89, 89, 89, 91, + 204, 91, 91, 94, 544, 91, 91, 239, 93, 91, + 93, 93, 93, 239, 93, 93, 246, 246, 93, 216, + 216, 216, 91, 91, 245, 289, 248, 94, 249, 260, + 93, 93, 93, 96, 249, 96, 96, 96, 260, 96, + 96, 248, 543, 96, 97, 97, 97, 97, 97, 97, + + 97, 97, 273, 290, 294, 96, 96, 96, 101, 101, + 101, 101, 101, 101, 101, 101, 102, 102, 102, 102, + 102, 102, 102, 102, 273, 290, 482, 291, 97, 98, + 98, 98, 98, 98, 98, 98, 98, 291, 247, 289, + 294, 98, 98, 98, 98, 98, 135, 135, 135, 135, + 135, 135, 135, 135, 332, 433, 285, 433, 137, 137, + 121, 285, 137, 137, 247, 98, 98, 98, 98, 98, + 98, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 137, 247, 482, 106, 106, 106, 106, 106, 121, 121, + 303, 139, 121, 139, 139, 139, 307, 139, 139, 303, + + 121, 139, 528, 121, 137, 307, 332, 106, 106, 106, + 106, 106, 106, 139, 139, 139, 146, 146, 146, 146, + 146, 146, 146, 146, 150, 292, 324, 150, 150, 334, + 292, 324, 383, 524, 150, 163, 163, 163, 163, 163, + 163, 163, 163, 323, 523, 334, 385, 150, 164, 164, + 164, 164, 164, 164, 164, 164, 166, 522, 166, 166, + 167, 385, 166, 166, 167, 323, 166, 262, 262, 211, + 167, 211, 211, 211, 211, 211, 211, 262, 166, 166, + 166, 521, 167, 167, 168, 383, 168, 168, 168, 168, + 168, 168, 168, 168, 169, 327, 169, 169, 169, 169, + + 169, 169, 169, 169, 170, 211, 170, 170, 170, 170, + 170, 170, 170, 170, 203, 264, 264, 327, 203, 388, + 168, 308, 308, 380, 203, 264, 329, 515, 309, 309, + 169, 308, 311, 311, 498, 329, 203, 203, 309, 380, + 170, 171, 311, 171, 171, 171, 171, 171, 171, 171, + 171, 400, 400, 497, 388, 171, 171, 171, 171, 171, + 207, 207, 207, 207, 207, 207, 207, 207, 209, 335, + 209, 209, 209, 209, 209, 209, 209, 209, 335, 171, + 171, 171, 171, 171, 171, 174, 174, 174, 174, 174, + 174, 174, 174, 174, 207, 451, 451, 174, 174, 174, + + 174, 174, 527, 210, 209, 210, 210, 210, 210, 210, + 210, 210, 210, 220, 220, 220, 220, 220, 220, 220, + 220, 174, 174, 174, 174, 174, 174, 176, 176, 176, + 176, 176, 176, 176, 176, 176, 176, 465, 465, 210, + 176, 176, 176, 176, 176, 215, 215, 215, 215, 215, + 215, 215, 215, 215, 222, 222, 222, 222, 222, 222, + 222, 222, 386, 527, 176, 176, 176, 176, 176, 176, + 177, 177, 177, 177, 177, 177, 177, 177, 386, 466, + 466, 328, 177, 177, 177, 177, 177, 223, 223, 223, + 223, 223, 223, 225, 333, 225, 225, 225, 225, 225, + + 225, 225, 225, 328, 333, 493, 177, 177, 177, 177, + 177, 177, 221, 221, 221, 221, 221, 221, 221, 221, + 221, 221, 221, 353, 469, 469, 221, 221, 221, 221, + 221, 250, 353, 250, 250, 250, 250, 250, 250, 250, + 250, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 221, 221, 221, 221, 221, 221, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 354, 250, 479, 224, + 224, 224, 224, 224, 251, 354, 251, 251, 251, 251, + 251, 251, 251, 251, 261, 261, 261, 261, 261, 261, + 261, 261, 474, 224, 224, 224, 224, 224, 224, 252, + + 473, 252, 252, 252, 252, 252, 252, 252, 252, 370, + 251, 263, 263, 263, 263, 263, 263, 263, 263, 267, + 267, 267, 267, 267, 267, 267, 267, 481, 481, 267, + 472, 370, 505, 505, 470, 252, 265, 265, 265, 265, + 265, 265, 265, 265, 265, 265, 265, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 376, 378, + 427, 268, 268, 268, 268, 268, 269, 269, 269, 269, + 269, 269, 269, 269, 270, 270, 270, 270, 270, 270, + 376, 378, 427, 516, 516, 268, 268, 268, 268, 268, + 268, 271, 271, 271, 271, 271, 271, 271, 271, 271, + + 271, 384, 525, 525, 271, 271, 271, 271, 271, 272, + 384, 272, 272, 272, 272, 272, 272, 272, 272, 293, + 293, 293, 293, 293, 293, 293, 293, 458, 271, 271, + 271, 271, 271, 271, 295, 395, 295, 295, 295, 295, + 295, 295, 295, 295, 297, 395, 297, 297, 297, 297, + 297, 297, 296, 293, 296, 296, 296, 296, 296, 296, + 296, 296, 317, 317, 317, 317, 317, 317, 444, 304, + 295, 304, 304, 304, 304, 304, 304, 304, 304, 440, + 297, 345, 345, 345, 345, 345, 345, 435, 296, 302, + 302, 302, 302, 302, 302, 302, 302, 302, 409, 551, + + 551, 302, 302, 302, 302, 302, 305, 409, 305, 305, + 305, 305, 305, 305, 305, 305, 310, 310, 310, 310, + 310, 310, 310, 310, 431, 302, 302, 302, 302, 302, + 302, 306, 430, 306, 306, 306, 306, 306, 306, 306, + 306, 312, 312, 312, 312, 312, 312, 312, 312, 312, + 312, 312, 314, 314, 314, 314, 314, 314, 314, 314, + 483, 429, 314, 315, 315, 315, 315, 315, 315, 315, + 315, 315, 315, 315, 426, 483, 425, 315, 315, 315, + 315, 315, 316, 316, 316, 316, 316, 316, 316, 316, + 319, 410, 319, 319, 319, 319, 319, 319, 319, 319, + + 410, 315, 315, 315, 315, 315, 315, 318, 318, 318, + 318, 318, 318, 318, 318, 318, 318, 566, 566, 424, + 318, 318, 318, 318, 318, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 337, 337, 337, 337, 337, 337, + 337, 337, 337, 423, 318, 318, 318, 318, 318, 318, + 338, 338, 338, 338, 338, 338, 338, 338, 338, 422, + 336, 342, 342, 342, 342, 342, 342, 342, 342, 337, + 344, 344, 344, 344, 344, 344, 344, 344, 364, 364, + 364, 364, 364, 364, 428, 338, 343, 397, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 397, 586, 586, + + 343, 343, 343, 343, 343, 347, 428, 347, 347, 347, + 347, 347, 347, 347, 347, 348, 348, 348, 348, 348, + 348, 348, 348, 393, 343, 343, 343, 343, 343, 343, + 346, 346, 346, 346, 346, 346, 346, 346, 346, 392, + 432, 432, 346, 346, 346, 346, 346, 350, 445, 350, + 350, 350, 350, 350, 350, 350, 350, 352, 445, 352, + 352, 352, 352, 352, 352, 382, 346, 346, 346, 346, + 346, 346, 351, 381, 351, 351, 351, 351, 351, 351, + 351, 351, 355, 355, 356, 356, 403, 403, 403, 403, + 403, 403, 355, 432, 356, 357, 357, 357, 357, 357, + + 357, 357, 357, 358, 358, 363, 363, 363, 363, 363, + 363, 363, 363, 358, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 361, 361, 361, 361, 361, + 361, 361, 361, 590, 590, 361, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 462, 603, 603, + 362, 362, 362, 362, 362, 366, 462, 366, 366, 366, + 366, 366, 366, 366, 366, 387, 387, 387, 387, 387, + 387, 387, 387, 375, 362, 362, 362, 362, 362, 362, + 365, 365, 365, 365, 365, 365, 365, 365, 365, 463, + 634, 634, 374, 365, 365, 365, 365, 365, 463, 387, + + 389, 389, 389, 389, 389, 389, 389, 389, 389, 391, + 391, 391, 391, 391, 391, 391, 373, 365, 365, 365, + 365, 365, 365, 390, 390, 390, 390, 390, 390, 390, + 390, 390, 471, 434, 372, 389, 394, 394, 394, 394, + 394, 394, 394, 394, 391, 396, 396, 396, 396, 396, + 396, 396, 396, 434, 471, 434, 434, 398, 390, 398, + 398, 398, 398, 398, 398, 398, 398, 398, 401, 487, + 401, 401, 401, 401, 401, 401, 401, 401, 401, 434, + 369, 368, 401, 401, 401, 401, 401, 402, 402, 402, + 402, 402, 402, 402, 402, 405, 367, 405, 405, 405, + + 405, 405, 405, 405, 405, 487, 401, 401, 401, 401, + 401, 401, 404, 404, 404, 404, 404, 404, 404, 404, + 404, 514, 349, 341, 404, 404, 404, 404, 404, 406, + 514, 406, 406, 406, 406, 406, 406, 406, 406, 420, + 420, 420, 420, 420, 420, 411, 411, 340, 404, 404, + 404, 404, 404, 404, 407, 411, 407, 407, 407, 407, + 407, 407, 407, 407, 408, 339, 408, 408, 408, 408, + 408, 408, 408, 408, 412, 412, 413, 413, 413, 413, + 413, 413, 413, 413, 412, 414, 414, 419, 419, 419, + 419, 419, 419, 419, 419, 414, 415, 415, 415, 415, + + 415, 415, 415, 415, 415, 415, 415, 417, 417, 417, + 417, 417, 417, 417, 417, 331, 330, 417, 418, 418, + 418, 418, 418, 418, 418, 418, 418, 418, 446, 326, + 325, 322, 418, 418, 418, 418, 418, 421, 446, 421, + 421, 421, 421, 421, 421, 421, 421, 447, 447, 447, + 447, 447, 447, 447, 447, 321, 418, 418, 418, 418, + 418, 418, 436, 448, 436, 436, 436, 436, 436, 436, + 436, 436, 437, 448, 437, 437, 437, 437, 437, 437, + 437, 437, 438, 499, 438, 438, 438, 438, 438, 438, + 438, 438, 491, 499, 570, 606, 320, 439, 436, 439, + + 439, 439, 439, 439, 439, 439, 439, 441, 437, 441, + 441, 441, 441, 441, 441, 441, 441, 442, 438, 442, + 442, 442, 442, 442, 442, 442, 442, 301, 491, 300, + 570, 606, 443, 439, 443, 443, 443, 443, 443, 443, + 443, 443, 449, 475, 449, 449, 449, 449, 449, 449, + 449, 449, 449, 452, 299, 452, 452, 452, 452, 452, + 452, 452, 452, 452, 477, 475, 518, 452, 452, 452, + 452, 452, 453, 453, 453, 453, 453, 453, 453, 453, + 454, 454, 454, 454, 454, 454, 477, 298, 518, 288, + 287, 452, 452, 452, 452, 452, 452, 455, 455, 455, + + 455, 455, 455, 455, 455, 455, 286, 284, 282, 455, + 455, 455, 455, 455, 456, 281, 456, 456, 456, 456, + 456, 456, 456, 456, 457, 457, 457, 457, 457, 457, + 457, 457, 280, 455, 455, 455, 455, 455, 455, 459, + 279, 459, 459, 459, 459, 459, 459, 459, 459, 460, + 480, 460, 460, 460, 460, 460, 460, 460, 460, 461, + 278, 461, 461, 461, 461, 461, 461, 464, 464, 685, + 480, 277, 480, 480, 685, 276, 275, 464, 467, 467, + 467, 467, 467, 467, 467, 467, 467, 467, 484, 259, + 484, 484, 484, 485, 258, 485, 485, 485, 486, 486, + + 486, 486, 486, 486, 486, 486, 488, 500, 488, 488, + 488, 488, 488, 488, 488, 488, 489, 500, 489, 489, + 489, 489, 489, 489, 489, 489, 257, 502, 545, 520, + 546, 256, 486, 254, 548, 253, 484, 502, 545, 244, + 546, 485, 488, 490, 548, 490, 490, 490, 490, 490, + 490, 520, 489, 492, 492, 492, 492, 492, 492, 492, + 492, 494, 243, 494, 494, 494, 494, 494, 494, 494, + 494, 508, 508, 508, 508, 508, 508, 242, 495, 490, + 495, 495, 495, 495, 495, 495, 495, 495, 496, 241, + 496, 496, 496, 496, 496, 496, 501, 501, 501, 501, + + 501, 501, 501, 501, 503, 561, 503, 503, 503, 503, + 503, 503, 503, 503, 503, 506, 581, 506, 506, 506, + 506, 506, 506, 506, 506, 506, 581, 561, 240, 506, + 506, 506, 506, 506, 507, 507, 507, 507, 507, 507, + 507, 507, 510, 237, 510, 510, 510, 510, 510, 510, + 510, 510, 235, 506, 506, 506, 506, 506, 506, 509, + 509, 509, 509, 509, 509, 509, 509, 234, 233, 232, + 231, 509, 509, 509, 509, 509, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 512, 512, 512, 512, 512, + 512, 512, 512, 512, 563, 509, 509, 509, 509, 509, + + 509, 513, 513, 513, 513, 513, 513, 513, 513, 513, + 529, 230, 529, 529, 529, 530, 563, 530, 530, 530, + 531, 228, 531, 531, 531, 532, 226, 532, 532, 532, + 533, 218, 217, 533, 533, 533, 533, 533, 533, 533, + 533, 214, 587, 534, 534, 589, 535, 534, 535, 535, + 535, 213, 206, 536, 536, 205, 199, 536, 529, 534, + 534, 534, 196, 530, 587, 195, 194, 589, 531, 536, + 536, 536, 537, 532, 537, 537, 537, 537, 537, 537, + 537, 537, 538, 600, 538, 538, 538, 538, 538, 538, + 538, 538, 193, 539, 535, 539, 539, 539, 539, 539, + + 539, 539, 539, 192, 190, 600, 189, 540, 537, 540, + 540, 540, 540, 540, 540, 540, 540, 541, 538, 541, + 541, 541, 541, 541, 541, 541, 541, 188, 542, 539, + 542, 542, 542, 542, 542, 542, 542, 542, 547, 547, + 547, 547, 547, 547, 547, 547, 549, 187, 549, 549, + 549, 549, 549, 549, 549, 549, 549, 552, 186, 552, + 552, 552, 552, 552, 552, 552, 552, 185, 184, 183, + 182, 552, 552, 552, 552, 552, 553, 553, 553, 553, + 553, 553, 553, 553, 554, 554, 554, 554, 554, 554, + 181, 180, 179, 173, 172, 552, 552, 552, 552, 552, + + 552, 555, 162, 555, 555, 555, 555, 555, 555, 555, + 555, 557, 557, 557, 557, 557, 557, 557, 557, 557, + 558, 558, 558, 558, 558, 558, 558, 558, 558, 559, + 559, 559, 559, 559, 559, 559, 567, 567, 567, 567, + 567, 567, 567, 567, 568, 568, 568, 568, 568, 568, + 568, 568, 569, 569, 569, 569, 569, 569, 569, 569, + 571, 161, 571, 571, 571, 571, 571, 571, 571, 571, + 572, 160, 572, 572, 572, 572, 572, 572, 572, 572, + 156, 155, 153, 149, 142, 573, 569, 573, 573, 573, + 573, 573, 573, 138, 136, 134, 571, 574, 574, 574, + + 574, 574, 574, 574, 574, 576, 572, 576, 576, 576, + 576, 576, 576, 576, 576, 126, 125, 124, 123, 122, + 577, 573, 577, 577, 577, 577, 577, 577, 577, 577, + 578, 117, 578, 578, 578, 578, 578, 578, 584, 116, + 584, 584, 584, 584, 584, 584, 584, 584, 591, 115, + 591, 591, 591, 591, 591, 591, 591, 591, 592, 114, + 592, 592, 592, 592, 592, 592, 592, 592, 593, 113, + 593, 593, 593, 593, 593, 593, 593, 593, 613, 613, + 613, 613, 613, 613, 591, 594, 594, 594, 594, 594, + 594, 594, 594, 111, 592, 595, 595, 595, 595, 595, + + 595, 595, 595, 110, 593, 596, 596, 596, 596, 596, + 596, 596, 596, 605, 605, 605, 605, 605, 605, 605, + 605, 607, 109, 607, 607, 607, 607, 607, 607, 607, + 607, 608, 108, 608, 608, 608, 608, 608, 608, 608, + 608, 104, 100, 99, 95, 92, 609, 605, 609, 609, + 609, 609, 609, 609, 84, 83, 82, 607, 611, 611, + 611, 611, 611, 611, 611, 611, 80, 608, 612, 612, + 612, 612, 612, 612, 612, 612, 75, 68, 61, 57, + 56, 54, 609, 615, 615, 615, 615, 615, 615, 615, + 615, 616, 616, 616, 616, 616, 616, 616, 616, 617, + + 617, 617, 617, 617, 617, 617, 617, 619, 619, 619, + 619, 619, 619, 619, 619, 51, 49, 615, 620, 620, + 620, 620, 620, 620, 41, 616, 40, 39, 37, 33, + 29, 23, 17, 617, 15, 14, 13, 0, 0, 0, + 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 620, 622, 622, 622, 622, 622, 622, 622, + 622, 622, 622, 622, 622, 622, 622, 622, 622, 623, + 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, + 623, 623, 623, 623, 623, 624, 624, 624, 624, 624, + 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, + + 624, 625, 625, 625, 625, 625, 625, 625, 625, 625, + 625, 625, 625, 625, 625, 625, 625, 626, 0, 0, + 0, 0, 0, 0, 0, 626, 626, 626, 0, 0, + 626, 626, 626, 627, 627, 627, 627, 627, 627, 627, + 627, 627, 627, 627, 627, 627, 627, 627, 627, 628, + 0, 0, 0, 0, 628, 0, 0, 628, 628, 628, + 628, 0, 628, 628, 628, 629, 0, 0, 0, 0, + 0, 0, 0, 629, 629, 629, 0, 0, 629, 629, + 629, 630, 0, 0, 630, 630, 0, 630, 0, 630, + 630, 630, 0, 0, 630, 630, 630, 631, 631, 0, + + 0, 0, 631, 632, 0, 0, 632, 632, 0, 632, + 0, 632, 632, 632, 0, 0, 632, 632, 632, 633, + 0, 0, 633, 633, 0, 633, 0, 633, 633, 633, + 0, 633, 0, 633, 633, 635, 0, 0, 635, 0, + 0, 635, 0, 635, 635, 635, 635, 0, 635, 635, + 635, 636, 636, 636, 636, 636, 636, 636, 636, 636, + 636, 636, 636, 636, 636, 636, 636, 637, 637, 0, + 637, 0, 637, 637, 637, 637, 637, 637, 637, 637, + 637, 637, 637, 638, 638, 638, 638, 638, 638, 638, + 638, 638, 638, 638, 638, 638, 638, 638, 638, 639, + + 639, 0, 639, 639, 639, 639, 639, 639, 639, 639, + 639, 639, 639, 639, 639, 640, 0, 0, 0, 0, + 640, 0, 0, 640, 640, 640, 0, 0, 640, 640, + 640, 641, 0, 0, 641, 641, 0, 641, 0, 641, + 641, 641, 0, 0, 641, 641, 641, 642, 642, 0, + 0, 0, 642, 643, 643, 643, 0, 0, 0, 643, + 644, 0, 0, 644, 644, 0, 644, 0, 644, 644, + 644, 0, 0, 644, 644, 644, 645, 645, 645, 645, + 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, + 645, 645, 646, 646, 0, 0, 0, 646, 647, 647, + + 647, 0, 0, 0, 647, 648, 648, 0, 0, 0, + 648, 649, 649, 0, 0, 0, 649, 650, 650, 0, + 0, 0, 650, 651, 651, 651, 0, 0, 0, 651, + 652, 652, 0, 0, 0, 652, 653, 653, 0, 0, + 0, 653, 654, 654, 0, 0, 0, 654, 655, 655, + 655, 0, 0, 0, 655, 656, 656, 656, 656, 0, + 0, 0, 656, 657, 657, 0, 0, 0, 657, 658, + 658, 0, 0, 0, 658, 659, 659, 0, 0, 0, + 659, 660, 660, 660, 0, 0, 0, 660, 661, 661, + 661, 661, 0, 0, 0, 661, 662, 662, 0, 0, + + 0, 662, 663, 663, 0, 0, 0, 663, 664, 664, + 664, 0, 0, 0, 664, 665, 665, 665, 665, 0, + 0, 0, 665, 666, 666, 0, 0, 0, 666, 667, + 0, 667, 667, 0, 0, 0, 667, 668, 668, 668, + 0, 0, 0, 668, 669, 669, 669, 669, 0, 0, + 0, 669, 670, 670, 0, 0, 0, 670, 671, 0, + 671, 671, 0, 0, 0, 671, 672, 672, 672, 0, + 0, 0, 672, 673, 673, 673, 0, 0, 0, 0, + 673, 674, 674, 674, 674, 674, 674, 674, 674, 674, + 674, 674, 674, 674, 674, 674, 674, 675, 675, 0, + + 675, 675, 675, 0, 0, 675, 675, 675, 0, 0, + 675, 675, 675, 676, 676, 0, 676, 676, 676, 0, + 0, 676, 676, 676, 0, 0, 676, 676, 676, 677, + 677, 0, 0, 0, 677, 678, 0, 678, 678, 0, + 0, 0, 678, 679, 679, 0, 0, 0, 0, 679, + 680, 680, 0, 0, 0, 680, 681, 0, 681, 681, + 0, 0, 0, 681, 682, 682, 0, 0, 0, 682, + 683, 0, 683, 0, 0, 0, 0, 683, 684, 684, + 684, 684, 684, 684, 684, 684, 684, 684, 684, 684, + 684, 684, 684, 684, 621, 621, 621, 621, 621, 621, + + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 621, 621 } ; static yy_state_type yy_last_accepting_state; @@ -1522,7 +1512,7 @@ int (*trace_print)(const char *msg) = sudoers_trace_print; #define INSTR 5 -#line 1525 "lex.yy.c" +#line 1515 "lex.yy.c" /* Macros after this point can all be overridden by user definitions in * section 1. @@ -1678,7 +1668,7 @@ YY_DECL #line 133 "toke.l" -#line 1681 "lex.yy.c" +#line 1671 "lex.yy.c" if ( yy_init ) { @@ -1730,13 +1720,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 >= 607 ) + if ( yy_current_state >= 622 ) 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] != 3665 ); + while ( yy_base[yy_current_state] != 3595 ); yy_find_action: yy_act = yy_accept[yy_current_state]; @@ -2261,7 +2251,31 @@ YY_RULE_SETUP YY_BREAK case 42: YY_RULE_SETUP -#line 508 "toke.l" +#line 507 "toke.l" +{ +#ifdef HAVE_PRIV_SET + LEXTRACE("PRIVS "); + LEXRETURN(PRIVS); +#else + goto got_alias; +#endif + } + YY_BREAK +case 43: +YY_RULE_SETUP +#line 516 "toke.l" +{ +#ifdef HAVE_PRIV_SET + LEXTRACE("LIMITPRIVS "); + LEXRETURN(LIMITPRIVS); +#else + goto got_alias; +#endif + } + YY_BREAK +case 44: +YY_RULE_SETUP +#line 525 "toke.l" { #ifndef HAVE_SELINUX got_alias: @@ -2272,9 +2286,9 @@ YY_RULE_SETUP LEXRETURN(ALIAS); } YY_BREAK -case 43: +case 45: YY_RULE_SETUP -#line 518 "toke.l" +#line 535 "toke.l" { /* no command args allowed for Defaults!/path */ if (!fill_cmnd(yytext, yyleng)) @@ -2283,9 +2297,9 @@ YY_RULE_SETUP LEXRETURN(COMMAND); } YY_BREAK -case 44: +case 46: YY_RULE_SETUP -#line 526 "toke.l" +#line 543 "toke.l" { BEGIN GOTCMND; LEXTRACE("COMMAND "); @@ -2293,9 +2307,9 @@ YY_RULE_SETUP yyterminate(); } /* sudo -e */ YY_BREAK -case 45: +case 47: YY_RULE_SETUP -#line 533 "toke.l" +#line 550 "toke.l" { /* directories can't have args... */ if (yytext[yyleng - 1] == '/') { @@ -2311,9 +2325,9 @@ YY_RULE_SETUP } } /* a pathname */ YY_BREAK -case 46: +case 48: YY_RULE_SETUP -#line 548 "toke.l" +#line 565 "toke.l" { LEXTRACE("BEGINSTR "); yylval.string = NULL; @@ -2321,9 +2335,9 @@ YY_RULE_SETUP BEGIN INSTR; } YY_BREAK -case 47: +case 49: YY_RULE_SETUP -#line 555 "toke.l" +#line 572 "toke.l" { /* a word */ if (!fill(yytext, yyleng)) @@ -2332,49 +2346,49 @@ YY_RULE_SETUP LEXRETURN(WORD); } YY_BREAK -case 48: +case 50: YY_RULE_SETUP -#line 563 "toke.l" +#line 580 "toke.l" { LEXTRACE("( "); LEXRETURN('('); } YY_BREAK -case 49: +case 51: YY_RULE_SETUP -#line 568 "toke.l" +#line 585 "toke.l" { LEXTRACE(") "); LEXRETURN(')'); } YY_BREAK -case 50: +case 52: YY_RULE_SETUP -#line 573 "toke.l" +#line 590 "toke.l" { LEXTRACE(", "); LEXRETURN(','); } /* return ',' */ YY_BREAK -case 51: +case 53: YY_RULE_SETUP -#line 578 "toke.l" +#line 595 "toke.l" { LEXTRACE("= "); LEXRETURN('='); } /* return '=' */ YY_BREAK -case 52: +case 54: YY_RULE_SETUP -#line 583 "toke.l" +#line 600 "toke.l" { LEXTRACE(": "); LEXRETURN(':'); } /* return ':' */ YY_BREAK -case 53: +case 55: YY_RULE_SETUP -#line 588 "toke.l" +#line 605 "toke.l" { if (yyleng & 1) { LEXTRACE("!"); @@ -2382,9 +2396,9 @@ YY_RULE_SETUP } } YY_BREAK -case 54: +case 56: YY_RULE_SETUP -#line 595 "toke.l" +#line 612 "toke.l" { if (YY_START == INSTR) { LEXTRACE("ERROR "); @@ -2397,25 +2411,25 @@ YY_RULE_SETUP LEXRETURN(COMMENT); } /* return newline */ YY_BREAK -case 55: +case 57: YY_RULE_SETUP -#line 607 "toke.l" +#line 624 "toke.l" { /* throw away space/tabs */ sawspace = true; /* but remember for fill_args */ } YY_BREAK -case 56: +case 58: YY_RULE_SETUP -#line 611 "toke.l" +#line 628 "toke.l" { sawspace = true; /* remember for fill_args */ sudolineno++; continued = true; } /* throw away EOL after \ */ YY_BREAK -case 57: +case 59: YY_RULE_SETUP -#line 617 "toke.l" +#line 634 "toke.l" { BEGIN INITIAL; sudolineno++; @@ -2424,9 +2438,9 @@ YY_RULE_SETUP LEXRETURN(COMMENT); } /* comment, not uid/gid */ YY_BREAK -case 58: +case 60: YY_RULE_SETUP -#line 625 "toke.l" +#line 642 "toke.l" { LEXTRACE("ERROR "); LEXRETURN(ERROR); @@ -2438,7 +2452,7 @@ case YY_STATE_EOF(GOTCMND): case YY_STATE_EOF(STARTDEFS): case YY_STATE_EOF(INDEFS): case YY_STATE_EOF(INSTR): -#line 630 "toke.l" +#line 647 "toke.l" { if (YY_START != INITIAL) { BEGIN INITIAL; @@ -2449,12 +2463,12 @@ case YY_STATE_EOF(INSTR): yyterminate(); } YY_BREAK -case 59: +case 61: YY_RULE_SETUP -#line 640 "toke.l" +#line 657 "toke.l" ECHO; YY_BREAK -#line 2457 "lex.yy.c" +#line 2471 "lex.yy.c" case YY_END_OF_BUFFER: { @@ -2745,7 +2759,7 @@ static yy_state_type yy_get_previous_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 >= 607 ) + if ( yy_current_state >= 622 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; @@ -2780,11 +2794,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 >= 607 ) + if ( yy_current_state >= 622 ) 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 == 606); + yy_is_jam = (yy_current_state == 621); return yy_is_jam ? 0 : yy_current_state; } @@ -3345,7 +3359,7 @@ int main() return 0; } #endif -#line 640 "toke.l" +#line 657 "toke.l" struct path_list { char *path; diff --git a/plugins/sudoers/toke.l b/plugins/sudoers/toke.l index 84e8de62d..36f2f283b 100644 --- a/plugins/sudoers/toke.l +++ b/plugins/sudoers/toke.l @@ -504,6 +504,23 @@ ALL { goto got_alias; #endif } +PRIVS { +#ifdef HAVE_PRIV_SET + LEXTRACE("PRIVS "); + LEXRETURN(PRIVS); +#else + goto got_alias; +#endif + } + +LIMITPRIVS { +#ifdef HAVE_PRIV_SET + LEXTRACE("LIMITPRIVS "); + LEXRETURN(LIMITPRIVS); +#else + goto got_alias; +#endif + } [[:upper:]][[:upper:][:digit:]_]* { #ifndef HAVE_SELINUX diff --git a/src/sudo.c b/src/sudo.c index e4b6ea787..e4771f020 100644 --- a/src/sudo.c +++ b/src/sudo.c @@ -670,6 +670,28 @@ command_info_to_details(char * const info[], struct command_details *details) } break; } +#ifdef HAVE_PRIV_SET + if (strncmp("runas_privs=", info[i], sizeof("runas_privs=") - 1) == 0) { + const char *endp; + cp = info[i] + sizeof("runas_privs=") - 1; + if (*cp == '\0') + break; + errno = 0; + details->privs = priv_str_to_set(cp, ",", &endp); + if (details->privs == NULL) + warning("invalid runas_privs %s", endp); + } + if (strncmp("runas_limitprivs=", info[i], sizeof("runas_limitprivs=") - 1) == 0) { + const char *endp; + cp = info[i] + sizeof("runas_limitprivs=") - 1; + if (*cp == '\0') + break; + errno = 0; + details->limitprivs = priv_str_to_set(cp, ",", &endp); + if (details->limitprivs == NULL) + warning("invalid runas_limitprivs %s", endp); + } +#endif /* HAVE_PRIV_SET */ break; case 's': SET_STRING("selinux_role=", selinux_role) @@ -900,6 +922,26 @@ exec_setup(struct command_details *details, const char *ptyname, int ptyfd) #ifdef HAVE_PROJECT_H set_project(details->pw); #endif +#ifdef HAVE_PRIV_SET + if (details->privs != NULL) { + if (setppriv(PRIV_SET, PRIV_INHERITABLE, details->privs) != 0) { + warning("unable to set privileges"); + goto done; + } + } + if (details->limitprivs != NULL) { + if (setppriv(PRIV_SET, PRIV_LIMIT, details->limitprivs) != 0) { + warning("unable to set limit privileges"); + goto done; + } + } else if (details->privs != NULL) { + if (setppriv(PRIV_SET, PRIV_LIMIT, details->privs) != 0) { + warning("unable to set limit privileges"); + goto done; + } + } +#endif /* HAVE_PRIV_SET */ + #ifdef HAVE_GETUSERATTR aix_prep_user(details->pw->pw_name, ptyname ? ptyname : user_details.tty); #endif diff --git a/src/sudo.h b/src/sudo.h index c50f1e1d6..178062f4d 100644 --- a/src/sudo.h +++ b/src/sudo.h @@ -41,6 +41,10 @@ #include "sudo_debug.h" #include "gettext.h" +#ifdef HAVE_PRIV_SET +# include +#endif + #ifdef __TANDEM # define ROOT_UID 65535 #else @@ -149,6 +153,10 @@ struct command_details { const char *utmp_user; char **argv; char **envp; +#ifdef HAVE_PRIV_SET + priv_set_t *privs; + priv_set_t *limitprivs; +#endif }; /* Status passed between parent and child via socketpair */ -- 2.50.1