]> granicus.if.org Git - sudo/commitdiff
Initial implementation of checksum support in sudoers.
authorTodd C. Miller <Todd.Miller@courtesan.com>
Sun, 14 Apr 2013 11:00:21 +0000 (07:00 -0400)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Sun, 14 Apr 2013 11:00:21 +0000 (07:00 -0400)
Currently supports SHA-224, SHA-256, SHA-384, SHA-512.
TODO: checksum format validation in parser and base64 support.
      checksum support for ldap sudoers

19 files changed:
MANIFEST
config.h.in
configure
configure.in
plugins/sudoers/Makefile.in
plugins/sudoers/gram.c
plugins/sudoers/gram.h
plugins/sudoers/gram.y
plugins/sudoers/hexchar.c [new file with mode: 0644]
plugins/sudoers/ldap.c
plugins/sudoers/match.c
plugins/sudoers/parse.h
plugins/sudoers/regress/parser/check_digest.c [new file with mode: 0644]
plugins/sudoers/regress/parser/check_digest.out.ok [new file with mode: 0644]
plugins/sudoers/sha2.h
plugins/sudoers/sssd.c
plugins/sudoers/toke.c
plugins/sudoers/toke.l
plugins/sudoers/toke_util.c

index b92a2169e5fdebf01ef4f329d7c2fe5973d42c2e..a239ab38434409a4de9cc5338457b10dd47ff00d 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -200,6 +200,7 @@ plugins/sudoers/gram.c
 plugins/sudoers/gram.h
 plugins/sudoers/gram.y
 plugins/sudoers/group_plugin.c
+plugins/sudoers/hexchar.c
 plugins/sudoers/ins_2001.h
 plugins/sudoers/ins_classic.h
 plugins/sudoers/ins_csops.h
@@ -268,6 +269,8 @@ plugins/sudoers/regress/logging/check_wrap.in
 plugins/sudoers/regress/logging/check_wrap.out.ok
 plugins/sudoers/regress/parser/check_addr.c
 plugins/sudoers/regress/parser/check_addr.in
+plugins/sudoers/regress/parser/check_digest.c
+plugins/sudoers/regress/parser/check_digest.out.ok
 plugins/sudoers/regress/parser/check_fill.c
 plugins/sudoers/regress/sudoers/test1.in
 plugins/sudoers/regress/sudoers/test1.out.ok
@@ -331,6 +334,8 @@ plugins/sudoers/regress/visudo/test3.err.ok
 plugins/sudoers/regress/visudo/test3.out.ok
 plugins/sudoers/regress/visudo/test3.sh
 plugins/sudoers/set_perms.c
+plugins/sudoers/sha2.c
+plugins/sudoers/sha2.h
 plugins/sudoers/sssd.c
 plugins/sudoers/sudo_nss.c
 plugins/sudoers/sudo_nss.h
index b601aa24d78c1873110609d6ab23fb323ad552e4..2f785518576360971c0304785650d3d9f49e5303 100644 (file)
 /* Define to `int' if <sys/types.h> doesn't define. */
 #undef uid_t
 
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+#undef uint32_t
+
+/* Define to `unsigned long long' if <sys/types.h> does not define. */
+#undef uint64_t
+
+/* Define to `unsigned char' if <sys/types.h> does not define. */
+#undef uint8_t
+
 /* Define to empty if the keyword `volatile' does not work. Warning: valid
    code using `volatile' can become incorrect without. Disable with care. */
 #undef volatile
index 2b3e49be5e97cf5f3a0ebff212d318900c654d92..e12d8ab2181a466cea8113d21cf784f11d473238 100755 (executable)
--- a/configure
+++ b/configure
@@ -16247,6 +16247,39 @@ _ACEOF
 
 fi
 
+ac_fn_c_check_type "$LINENO" "uint8_t" "ac_cv_type_uint8_t" "$ac_includes_default"
+if test "x$ac_cv_type_uint8_t" = xyes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define uint8_t unsigned char
+_ACEOF
+
+fi
+
+ac_fn_c_check_type "$LINENO" "uint32_t" "ac_cv_type_uint32_t" "$ac_includes_default"
+if test "x$ac_cv_type_uint32_t" = xyes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define uint32_t unsigned int
+_ACEOF
+
+fi
+
+ac_fn_c_check_type "$LINENO" "uint64_t" "ac_cv_type_uint64_t" "$ac_includes_default"
+if test "x$ac_cv_type_uint64_t" = xyes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define uint64_t unsigned long long
+_ACEOF
+
+fi
+
 ac_fn_c_check_type "$LINENO" "socklen_t" "ac_cv_type_socklen_t" "
 $ac_includes_default
 #include <sys/socket.h>
index e145e3666da54ef84d256f9dc0c7b8b62f8146f4..aea690e6afc08af922aaef38d11dd0f5551008c0 100644 (file)
@@ -2169,6 +2169,9 @@ AC_CHECK_TYPE(size_t, unsigned int)
 AC_CHECK_TYPE(ssize_t, int)
 AC_CHECK_TYPE(dev_t, int)
 AC_CHECK_TYPE(ino_t, unsigned int)
+AC_CHECK_TYPE(uint8_t, unsigned char)
+AC_CHECK_TYPE(uint32_t, unsigned int)
+AC_CHECK_TYPE(uint64_t, unsigned long long)
 AC_CHECK_TYPE(socklen_t, [], [AC_DEFINE(socklen_t, unsigned int)], [
 AC_INCLUDES_DEFAULT
 #include <sys/socket.h>])
index eb95e5ed6b6e00253ea93c2da41a8bb01f975187..63bc6be5253ab3bc40d50a54d0f71c8d3b6b72a6 100644 (file)
@@ -123,13 +123,14 @@ SHELL = @SHELL@
 
 PROGS = sudoers.la visudo sudoreplay testsudoers
 
-TEST_PROGS = check_iolog_path check_fill check_wrap check_addr check_symbols
+TEST_PROGS = check_iolog_path check_fill check_wrap check_addr check_symbols \
+            check_digest
 
 AUTH_OBJS = sudo_auth.lo @AUTH_OBJS@
 
-LIBPARSESUDOERS_OBJS = alias.lo audit.lo defaults.lo gram.lo match.lo \
-                      match_addr.lo pwutil.lo pwutil_impl.lo timestr.lo \
-                      toke.lo toke_util.lo redblack.lo
+LIBPARSESUDOERS_OBJS = alias.lo audit.lo defaults.lo hexchar.lo gram.lo \
+                      match.lo match_addr.lo pwutil.lo pwutil_impl.lo \
+                      timestr.lo toke.lo toke_util.lo redblack.lo sha2.lo
 
 SUDOERS_OBJS = $(AUTH_OBJS) boottime.lo check.lo env.lo find_path.lo \
               goodpath.lo group_plugin.lo interfaces.lo iolog.lo \
@@ -146,7 +147,9 @@ TEST_OBJS = group_plugin.o interfaces.o locale.o net_ifs.o \
 
 CHECK_ADDR_OBJS = check_addr.o interfaces.o locale.o match_addr.o
 
-CHECK_FILL_OBJS = check_fill.o locale.o toke_util.o
+CHECK_DIGEST_OBJS = check_digest.o sha2.o
+
+CHECK_FILL_OBJS = check_fill.o hexchar.o locale.o toke_util.o
 
 CHECK_IOLOG_PATH_OBJS = check_iolog_path.o iolog_path.o locale.o \
                        pwutil.o pwutil_impl.o redblack.o
@@ -202,12 +205,15 @@ testsudoers: libparsesudoers.la $(TEST_OBJS) $(LT_LIBS)
 check_addr: $(CHECK_ADDR_OBJS) $(LT_LIBS)
        $(LIBTOOL) --mode=link $(CC) -o $@ $(CHECK_ADDR_OBJS) $(LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) $(NET_LIBS)
 
-check_iolog_path: $(CHECK_IOLOG_PATH_OBJS) $(LT_LIBS)
-       $(LIBTOOL) --mode=link $(CC) -o $@ $(CHECK_IOLOG_PATH_OBJS) $(LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS)
+check_digest: $(CHECK_DIGEST_OBJS) $(LT_LIBS)
+       $(LIBTOOL) --mode=link $(CC) -o $@ $(CHECK_DIGEST_OBJS) $(LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS)
 
 check_fill: $(CHECK_FILL_OBJS) $(LT_LIBS)
        $(LIBTOOL) --mode=link $(CC) -o $@ $(CHECK_FILL_OBJS) $(LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS)
 
+check_iolog_path: $(CHECK_IOLOG_PATH_OBJS) $(LT_LIBS)
+       $(LIBTOOL) --mode=link $(CC) -o $@ $(CHECK_IOLOG_PATH_OBJS) $(LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS)
+
 check_symbols: $(CHECK_SYMBOLS_OBJS) $(LT_LIBS)
        if [ X"$(soext)" != X"" ]; then \
            $(LIBTOOL) --mode=link $(CC) -o $@ $(CHECK_SYMBOLS_OBJS) $(LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) @SUDO_LIBS@; \
@@ -310,7 +316,10 @@ check: $(TEST_PROGS) visudo testsudoers
        @if test X"$(cross_compiling)" != X"yes"; then \
            rval=0; \
            CWD=`pwd`; \
+           mkdir -p regress/parser; \
            ./check_addr $(srcdir)/regress/parser/check_addr.in || rval=`expr $$rval + $$?`; \
+           ./check_digest > regress/parser/check_digest.out; \
+           diff regress/parser/check_digest.out $(srcdir)/regress/parser/check_digest.out.ok || rval=`expr $$rval + $$?`; \
            ./check_fill || rval=`expr $$rval + $$?`; \
            ./check_iolog_path $(srcdir)/regress/iolog_path/data || rval=`expr $$rval + $$?`; \
            if [ X"$(soext)" != X"" ]; then \
@@ -473,6 +482,9 @@ check_addr.o: $(srcdir)/regress/parser/check_addr.c $(top_builddir)/config.h \
               $(incdir)/sudo_debug.h $(incdir)/gettext.h $(srcdir)/parse.h \
               $(srcdir)/interfaces.h
        $(CC) -c $(CPPFLAGS) $(CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(DEFS) $(srcdir)/regress/parser/check_addr.c
+check_digest.o: $(srcdir)/regress/parser/check_digest.c \
+                $(top_builddir)/config.h $(srcdir)/sha2.h
+       $(CC) -c $(CPPFLAGS) $(CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(DEFS) $(srcdir)/regress/parser/check_digest.c
 check_fill.o: $(srcdir)/regress/parser/check_fill.c $(top_builddir)/config.h \
               $(top_srcdir)/compat/stdbool.h $(incdir)/missing.h \
               $(incdir)/list.h $(srcdir)/parse.h $(srcdir)/toke.h \
@@ -571,6 +583,10 @@ group_plugin.lo: $(srcdir)/group_plugin.c $(top_builddir)/config.h \
                  $(incdir)/gettext.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(DEFS) $(srcdir)/group_plugin.c
 group_plugin.o: group_plugin.lo
+hexchar.lo: $(srcdir)/hexchar.c $(top_builddir)/config.h $(incdir)/missing.h \
+            $(incdir)/sudo_debug.h $(incdir)/error.h
+       $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(DEFS) $(srcdir)/hexchar.c
+hexchar.o: hexchar.lo
 interfaces.lo: $(srcdir)/interfaces.c $(top_builddir)/config.h \
                $(srcdir)/sudoers.h $(top_srcdir)/compat/stdbool.h \
                $(top_builddir)/pathnames.h $(incdir)/missing.h \
@@ -646,7 +662,8 @@ match.lo: $(srcdir)/match.c $(top_builddir)/config.h \
           $(incdir)/alloc.h $(incdir)/list.h $(incdir)/fileops.h \
           $(srcdir)/defaults.h $(devdir)/def_data.h $(srcdir)/logging.h \
           $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h \
-          $(incdir)/gettext.h $(srcdir)/parse.h $(devdir)/gram.h
+          $(incdir)/gettext.h $(srcdir)/parse.h $(srcdir)/sha2.h \
+          $(devdir)/gram.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(DEFS) $(srcdir)/match.c
 match_addr.lo: $(srcdir)/match_addr.c $(top_builddir)/config.h \
                $(srcdir)/sudoers.h $(top_srcdir)/compat/stdbool.h \
@@ -754,6 +771,9 @@ set_perms.lo: $(srcdir)/set_perms.c $(top_builddir)/config.h \
               $(srcdir)/logging.h $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h \
               $(incdir)/sudo_debug.h $(incdir)/gettext.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(DEFS) $(srcdir)/set_perms.c
+sha2.lo: $(srcdir)/sha2.c $(top_builddir)/config.h $(srcdir)/sha2.h
+       $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(DEFS) $(srcdir)/sha2.c
+sha2.o: sha2.lo
 sia.lo: $(authdir)/sia.c $(top_builddir)/config.h $(srcdir)/sudoers.h \
         $(top_srcdir)/compat/stdbool.h $(top_builddir)/pathnames.h \
         $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
index 90d4c8a5f359f9192c4020e78c19817b2391cc77..c4769a444ffc847ec57e10e4b9de9fb66e6c9e45 100644 (file)
@@ -127,7 +127,8 @@ static void  add_defaults(int, struct member *, struct defaults *);
 static void  add_userspec(struct member *, struct privilege *);
 static struct defaults *new_default(char *, char *, int);
 static struct member *new_member(char *, int);
-#line 94 "gram.y"
+static struct sudo_digest *new_digest(int, const char *);
+#line 95 "gram.y"
 #ifndef YYSTYPE_DEFINED
 #define YYSTYPE_DEFINED
 typedef union {
@@ -136,6 +137,7 @@ typedef union {
     struct member *member;
     struct runascontainer *runas;
     struct privilege *privilege;
+    struct sudo_digest *digest;
     struct sudo_command command;
     struct cmndtag tag;
     struct selinux_info seinfo;
@@ -144,7 +146,7 @@ typedef union {
     int tok;
 } YYSTYPE;
 #endif /* YYSTYPE_DEFINED */
-#line 147 "gram.c"
+#line 149 "gram.c"
 #define COMMAND 257
 #define ALIAS 258
 #define DEFVAR 259
@@ -179,6 +181,10 @@ typedef union {
 #define PRIVS 288
 #define LIMITPRIVS 289
 #define MYSELF 290
+#define SHA224 291
+#define SHA256 292
+#define SHA384 293
+#define SHA512 294
 #define YYERRCODE 256
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoerslhs[] =
@@ -186,17 +192,18 @@ const short sudoerslhs[] =
 short sudoerslhs[] =
 #endif
        {                                        -1,
-    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,   26,   27,   25,   25,   25,
-   25,   25,   17,   17,   18,   18,   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,
+    0,    0,   30,   30,   31,   31,   31,   31,   31,   31,
+   31,   31,   31,   31,   31,   31,    4,    4,    3,    3,
+    3,    3,    3,   21,   21,   20,   11,   11,    9,    9,
+    9,    9,    9,    2,    2,    1,   29,   29,   29,   29,
+    7,    7,    6,    6,   24,   25,   23,   23,   23,   23,
+   23,   27,   28,   26,   26,   26,   26,   26,   18,   18,
+   19,   19,   19,   19,   19,   22,   22,   22,   22,   22,
+   22,   22,   22,   22,   22,   22,    5,    5,    5,   33,
+   33,   36,   10,   10,   34,   34,   37,    8,    8,   35,
+   35,   38,   32,   32,   39,   14,   14,   12,   12,   13,
+   13,   13,   13,   13,   17,   17,   15,   15,   16,   16,
+   16,
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoerslen[] =
@@ -207,14 +214,15 @@ short sudoerslen[] =
     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,    5,    1,    2,    3,    3,
-    0,    1,    1,    2,    2,    3,    3,    0,    1,    1,
-    2,    2,    0,    3,    0,    1,    3,    2,    1,    0,
-    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
-    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,    3,    3,    3,    3,
+    1,    2,    1,    2,    3,    3,    0,    1,    1,    2,
+    2,    3,    3,    0,    1,    1,    2,    2,    0,    3,
+    0,    1,    3,    2,    1,    0,    2,    2,    2,    2,
+    2,    2,    2,    2,    2,    2,    1,    1,    1,    1,
+    3,    3,    1,    3,    1,    3,    3,    1,    3,    1,
+    3,    3,    1,    3,    3,    1,    3,    1,    2,    1,
+    1,    1,    1,    1,    1,    3,    1,    2,    1,    1,
+    1,
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoersdefred[] =
@@ -222,22 +230,24 @@ const short sudoersdefred[] =
 short sudoersdefred[] =
 #endif
        {                                      0,
-    0,   94,   96,   97,   98,    0,    0,    0,    0,    0,
-   95,    5,    0,    0,    0,    0,    0,    0,   90,   92,
+    0,  100,  102,  103,  104,    0,    0,    0,    0,    0,
+  101,    5,    0,    0,    0,    0,    0,    0,   96,   98,
     0,    0,    3,    6,    0,    0,   17,    0,   29,   32,
-   31,   33,   30,    0,   27,    0,   77,    0,    0,   73,
-   72,   71,    0,   37,   82,    0,    0,    0,   74,    0,
-    0,   79,    0,    0,   87,    0,    0,   84,   93,    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,   91,    0,    0,   21,   22,
-   23,   18,   78,   83,    0,   75,    0,   80,    0,   88,
-    0,   85,    0,   34,    0,    0,   25,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,  103,  105,  104,    0,
-   99,  101,    0,    0,   54,   35,    0,    0,    0,    0,
-   60,    0,    0,   44,   45,  102,    0,    0,   40,   39,
-    0,    0,    0,   51,   52,  100,   46,   47,   61,   62,
-   63,   64,   65,   66,   67,   68,   69,   70,   36,
+   31,   33,   30,    0,   27,    0,   83,    0,    0,   79,
+   78,   77,    0,    0,    0,    0,    0,   43,   41,   88,
+    0,    0,    0,    0,   80,    0,    0,   85,    0,    0,
+   93,    0,    0,   90,   99,    0,    0,   24,    0,    4,
+    0,    0,    0,   20,    0,   28,    0,    0,    0,    0,
+   44,    0,    0,    0,    0,    0,    0,   42,    0,    0,
+    0,    0,    0,    0,    0,    0,   97,    0,    0,   21,
+   22,   23,   18,   84,   37,   38,   39,   40,   89,    0,
+   81,    0,   86,    0,   94,    0,   91,    0,   34,    0,
+    0,   25,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,  109,  111,  110,    0,  105,  107,    0,    0,   60,
+   35,    0,    0,    0,    0,   66,    0,    0,   50,   51,
+  108,    0,    0,   46,   45,    0,    0,    0,   57,   58,
+  106,   52,   53,   67,   68,   69,   70,   71,   72,   73,
+   74,   75,   76,   36,
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoersdgoto[] =
@@ -245,114 +255,118 @@ const short sudoersdgoto[] =
 short sudoersdgoto[] =
 #endif
        {                                      18,
-  104,  105,   27,   28,   44,   45,   46,   35,   61,   37,
-   19,   20,   21,  121,  122,  123,  106,  110,   62,   63,
-  143,  114,  115,  116,  131,  132,  133,   22,   23,   54,
-   48,   51,   57,   49,   52,   58,   55,
+  119,  120,   27,   28,   48,   49,   50,   51,   35,   67,
+   37,   19,   20,   21,  136,  137,  138,  121,  125,   68,
+   69,  158,  129,  130,  131,  146,  147,  148,   52,   22,
+   23,   60,   54,   57,   63,   55,   58,   64,   61,
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoerssindex[] =
 #else
 short sudoerssindex[] =
 #endif
-       {                                    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,};
+       {                                    -33,
+ -275,    0,    0,    0,    0,  -16,  698,  710,  710,  -19,
+    0,    0, -250, -245, -216, -211, -239,    0,    0,    0,
+  845,  -33,    0,    0,   -6, -209,    0,  -24,    0,    0,
+    0,    0,    0, -225,    0,  -23,    0,  -18,  -18,    0,
+    0,    0, -251,   -1,    2,    4,    6,    0,    0,    0,
+  -17,   -2,   -8,    7,    0,   -3,    8,    0,    9,   10,
+    0,   11,   13,    0,    0,  710,  -15,    0,   15,    0,
+ -202, -196, -194,    0,  -16,    0,  698,  -24,  -24,  -24,
+    0, -189, -187, -186, -185,  -19,  -24,    0,  698, -250,
+  -19, -245,  710, -216,  710, -211,    0,   39,  698,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,   36,
+    0,   37,    0,   38,    0,   38,    0,  690,    0,   41,
+ -238,    0,   86,  -26,   42,   39,   25,   26, -237, -195,
+ -197,    0,    0,    0, -254,    0,    0,   49,   86,    0,
+    0, -169, -168,   40,   43,    0, -192, -188,    0,    0,
+    0,   86,   49,    0,    0, -164, -161,  567,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,};
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoersrindex[] =
 #else
 short sudoersrindex[] =
 #endif
-       {                                     96,
+       {                                    103,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,  105,    0,    0,    1,    0,    0,  177,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    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,  463,    0,    0,    0,
-    0,    0,    0,    0,   30,    0,   59,    0,   89,    0,
-  118,    0,   60,    0,  148,  -28,    0,   62,   63,    0,
-  463,    0,    0,  594,  489,  512,    0,    0,    0,    0,
-    0,    0,   64,    0,    0,    0,    0,    0,    0,    0,
-    0,  623,  653,    0,    0,    0,    0,   65,    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,    0,    0,    0,    0,  446,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,  463,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,   30,
+    0,   59,    0,   89,    0,  118,    0,   65,    0,  148,
+  489,    0,   66,   67,    0,  463,    0,    0,  594,  515,
+  541,    0,    0,    0,    0,    0,    0,   68,    0,    0,
+    0,    0,    0,    0,    0,    0,  623,  653,    0,    0,
+    0,    0,   69,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,};
+    0,    0,    0,    0,};
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoersgindex[] =
 #else
 short sudoersgindex[] =
 #endif
        {                                      0,
-  -11,    0,   39,   12,   66,  -72,   27,   76,   -4,   40,
-   52,   98,   -1,  -23,   -7,   -8,    0,    0,   42,    0,
-    0,    0,    8,   13,    0,  -13,   -9,    0,   99,    0,
-    0,    0,    0,   46,   45,   44,   48,
+  -14,    0,   45,    5,   70,   62,  -83,   20,   81,   -5,
+   46,   50,  107,    3,  -27,   -9,  -12,    0,    0,   29,
+    0,    0,    0,   12,   14,    0,  -13,  -11,    0,    0,
+  108,    0,    0,    0,    0,   44,   47,   33,   48,
 };
-#define YYTABLESIZE 932
+#define YYTABLESIZE 1124
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoerstable[] =
 #else
 short sudoerstable[] =
 #endif
-       {                                      26,
-   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,   76,
-  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,   81,  112,
-  113,   81,   76,   80,   83,   82,   84,   85,   88,   90,
-  159,   91,  103,   95,   71,   76,  125,   60,  111,  127,
-   99,  128,  101,  112,  137,  113,  139,   76,   89,  140,
-  130,   81,  129,  147,  148,    1,    2,  141,  142,  126,
-   55,  109,   59,   56,   58,   57,   97,   92,   75,   70,
-   93,   86,  136,  146,   59,  138,   81,   86,  120,  145,
-   64,   89,  144,  135,   96,   98,    0,  134,  102,  107,
-  100,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,   89,   26,    0,    0,
-   86,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+       {                                      17,
+   19,   36,  109,  132,   24,   40,   41,   53,  133,   26,
+   38,   39,   56,   43,   26,   26,   26,   66,    2,   75,
+   77,    3,    4,    5,  134,   66,   86,   42,   77,   82,
+   43,  139,   29,   19,   30,   31,   72,   32,   73,   11,
+   78,   59,   79,   80,   19,   98,   62,  127,  128,   74,
+  144,  145,   89,   33,   71,   87,   82,   91,   87,   83,
+  100,   84,   82,   85,   90,   92,  101,   94,  102,   93,
+   96,   95,   99,  105,  174,  106,  107,  108,  118,   77,
+   86,   66,  140,  110,  126,  142,  143,   82,   95,  128,
+  127,   87,  152,  154,  155,  114,  145,  116,  162,  144,
+  156,  163,    1,  157,    2,   61,   65,   62,   64,   63,
+  112,  141,   81,   88,   76,   97,   87,   92,  135,  103,
+  124,   95,  104,   65,  161,  151,  153,  122,  117,   70,
+    0,    0,    0,  111,  160,  159,    0,    0,  113,    0,
+    0,  115,  150,  149,    0,    0,   95,   26,    0,    0,
+   92,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,   86,   12,    0,    0,    0,
+    0,    0,    0,    0,    0,   92,   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,   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,   76,    0,   76,    0,    0,
-   76,   76,   76,   76,   76,   76,   76,   76,   42,   11,
-    0,    0,    0,    8,    0,    0,    0,    0,   76,   76,
-   76,   76,   76,   76,   81,    0,   81,    0,    0,   81,
-   81,   81,   81,   81,   81,   81,   81,    0,    7,    0,
-    0,    0,   11,    0,    0,    0,    0,   81,   81,   81,
-   81,   81,   81,  117,   89,    0,   89,    0,  118,   89,
-   89,   89,   89,   89,   89,   89,   89,   15,    0,    0,
-    0,    7,    0,    0,  119,    0,    0,   89,   89,   89,
-   89,   89,   89,   86,    0,   86,    0,    0,   86,   86,
-   86,   86,   86,   86,   86,   86,   13,    0,    0,    0,
-   15,    0,    0,    0,    0,    0,   86,   86,   86,   86,
-   86,   86,    0,   26,    0,   26,    0,    0,   26,   26,
+    0,    0,    1,    0,    2,    0,    0,    3,    4,    5,
+    6,    7,    8,    9,   10,   25,   10,   40,   41,    9,
+   25,   25,   25,    0,    0,   11,   12,   13,   14,   15,
+   16,    0,    0,    0,   40,   41,   19,    0,   19,   42,
+    0,   19,   19,   19,   19,   19,   19,   19,   19,   10,
+    8,   44,   45,   46,   47,    0,   42,    0,    0,   19,
+   19,   19,   19,   19,   19,   82,    0,   82,    0,    0,
+   82,   82,   82,   82,   82,   82,   82,   82,    0,   11,
+    0,    0,    0,    8,    0,    0,    0,    0,   82,   82,
+   82,   82,   82,   82,   87,    0,   87,    0,    0,   87,
+   87,   87,   87,   87,   87,   87,   87,    0,    7,    0,
+    0,    0,   11,    0,    0,    0,    0,   87,   87,   87,
+   87,   87,   87,  132,   95,    0,   95,    0,  133,   95,
+   95,   95,   95,   95,   95,   95,   95,   15,    0,    0,
+    0,    7,    0,    0,  134,    0,    0,   95,   95,   95,
+   95,   95,   95,   92,    0,   92,    0,    0,   92,   92,
+   92,   92,   92,   92,   92,   92,   13,    0,    0,    0,
+   15,    0,    0,    0,    0,    0,   92,   92,   92,   92,
+   92,   92,    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,
@@ -361,51 +375,70 @@ short sudoerstable[] =
    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,   53,    0,   10,   10,   10,
+    9,    0,   10,    0,   10,   59,    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,   42,    0,    0,    0,    0,    8,    0,    8,    0,
+   10,   47,    0,    0,    0,    0,    8,    0,    8,    0,
     0,    8,    8,    8,    8,    8,    8,    8,    8,    0,
-    0,    0,    0,    0,   43,   17,    0,    0,    0,    8,
+    0,    0,    0,    0,    0,    0,    0,   48,    0,    8,
     8,    8,    8,    8,    8,   11,    0,   11,    0,    0,
    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,
+    0,    0,    0,   49,    0,    0,    0,    0,   11,   11,
+   11,   11,   11,   11,    7,    0,    7,    0,    0,    7,
+    7,    7,    7,    7,    7,    7,    7,    0,    0,   43,
+    0,    0,    0,    0,    0,    0,    0,    7,    7,    7,
     7,    7,    7,   15,    0,   15,    0,    0,   15,   15,
-   15,   15,   15,   15,   15,   15,   48,    0,    0,    0,
+   15,   15,   15,   15,   15,   15,   54,    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,   49,    0,    0,    0,    0,
+   13,   13,   13,   13,   13,   55,    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,   50,    0,    0,    0,    0,
+   14,   14,   14,   14,   14,   56,    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,   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,
+   16,   16,   16,   16,    0,    0,    0,    0,    0,   59,
+   59,    0,   17,    0,   16,   16,   16,   16,   16,   16,
+   34,   59,   59,   59,   59,   59,   59,   59,   59,   59,
+   59,   59,   17,    0,    0,   47,   47,  123,   59,   59,
+   59,   59,    0,   59,   59,   59,   59,   47,   47,   47,
+   47,   47,   47,   47,   47,   47,   47,   47,    0,    0,
+    0,   48,   48,    0,    0,    0,   47,   47,    0,   47,
+   47,   47,   47,   48,   48,   48,   48,   48,   48,   48,
+   48,   48,   48,   48,    0,    0,    0,   49,   49,    0,
+    0,    0,   48,   48,    0,   48,   48,   48,   48,   49,
+   49,   49,   49,   49,   49,   49,   49,   49,   49,   49,
+    0,    0,    0,   40,   41,    0,    0,    0,   49,   49,
+    0,   49,   49,   49,   49,  164,  165,  166,  167,  168,
+  169,  170,  171,  172,  173,   42,    0,    0,    0,    0,
+   54,   54,    0,    0,    0,    0,    0,   44,   45,   46,
+   47,    0,   54,   54,   54,   54,   54,   54,   54,   54,
+   54,   54,   54,    0,    0,    0,    0,   34,    0,   55,
+   55,    0,    0,    0,   54,   54,   54,   54,   66,    0,
+    0,   55,   55,   55,   55,   55,   55,   55,   55,   55,
+   55,   55,    0,    0,    0,    0,    0,    0,    0,   56,
+   56,    0,    0,   55,   55,   55,   55,    0,    0,    0,
+    0,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+   56,   56,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,   56,   56,   56,   56,    2,    0,    0,
+    3,    4,    5,    0,    0,   29,    0,   30,   31,    0,
+   32,    0,    0,    0,    0,    0,    0,    2,   11,    0,
+    3,    4,    5,    0,    0,    0,   33,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,   11,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,   29,    0,   30,   31,    0,   32,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,   33,
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoerscheck[] =
@@ -413,21 +446,21 @@ const short sudoerscheck[] =
 short sudoerscheck[] =
 #endif
        {                                      33,
-    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,   41,   41,   80,   69,   43,   34,
-   71,   60,  120,  137,   17,  124,   58,    0,   33,  133,
-   22,   33,  132,  116,   79,   81,   -1,  115,   85,   88,
-   83,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   58,    0,   -1,   -1,
+    0,    7,   86,  258,  280,  257,  258,  258,  263,   33,
+    8,    9,  258,   33,   33,   33,   33,   44,  258,   44,
+   44,  261,  262,  263,  279,   44,   44,  279,   44,    0,
+   33,   58,  258,   33,  260,  261,   43,  263,   45,  279,
+   36,  258,   38,   39,   44,   61,  258,  286,  287,  259,
+  288,  289,   61,  279,   61,   51,   58,   61,    0,   58,
+  263,   58,   33,   58,   58,   58,  263,   58,  263,   61,
+   58,   61,   58,  263,  158,  263,  263,  263,   40,   44,
+   44,   44,   41,   89,   44,   61,   61,   58,    0,  287,
+  286,   33,   44,  263,  263,   93,  289,   95,  263,  288,
+   61,  263,    0,   61,    0,   41,   41,   41,   41,   41,
+   91,  126,   43,   52,   34,   66,   58,    0,   33,   75,
+  118,   33,   77,   17,  152,  135,  139,   99,   96,   22,
+   -1,   -1,   -1,   90,  148,  147,   -1,   -1,   92,   -1,
+   -1,   94,  131,  130,   -1,   -1,   58,    0,   -1,   -1,
    33,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
    -1,   -1,   -1,   -1,   -1,   58,    0,   -1,   -1,   -1,
@@ -435,14 +468,14 @@ short sudoerscheck[] =
    -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,  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,
+   -1,   -1,  256,   -1,  258,   -1,   -1,  261,  262,  263,
+  264,  265,  266,  267,  268,  259,    0,  257,  258,   33,
+  259,  259,  259,   -1,   -1,  279,  280,  281,  282,  283,
+  284,   -1,   -1,   -1,  257,  258,  256,   -1,  258,  279,
+   -1,  261,  262,  263,  264,  265,  266,  267,  268,   33,
+    0,  291,  292,  293,  294,   -1,  279,   -1,   -1,  279,
   280,  281,  282,  283,  284,  256,   -1,  258,   -1,   -1,
-  261,  262,  263,  264,  265,  266,  267,  268,  279,    0,
+  261,  262,  263,  264,  265,  266,  267,  268,   -1,    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,
@@ -467,13 +500,13 @@ short sudoerscheck[] =
    -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,  283,
   284,   33,   -1,   -1,   -1,   -1,  256,   -1,  258,   -1,
    -1,  261,  262,  263,  264,  265,  266,  267,  268,   -1,
-   -1,   -1,   -1,   -1,   33,   33,   -1,   -1,   -1,  279,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   33,   -1,  279,
   280,  281,  282,  283,  284,  256,   -1,  258,   -1,   -1,
   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,
+   -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,   -1,   33,
+   -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,   33,   -1,   -1,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,
@@ -485,34 +518,53 @@ short sudoerscheck[] =
    -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,  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,
+  258,   -1,   33,   -1,  279,  280,  281,  282,  283,  284,
+   33,  269,  270,  271,  272,  273,  274,  275,  276,  277,
+  278,  279,   33,   -1,   -1,  257,  258,   58,  286,  287,
+  288,  289,   -1,  291,  292,  293,  294,  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,   -1,   -1,   -1,   -1,   -1,   -1,  257,
-  258,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,  257,  258,   -1,   -1,   -1,  288,  289,   -1,  291,
+  292,  293,  294,  269,  270,  271,  272,  273,  274,  275,
+  276,  277,  278,  279,   -1,   -1,   -1,  257,  258,   -1,
+   -1,   -1,  288,  289,   -1,  291,  292,  293,  294,  269,
+  270,  271,  272,  273,  274,  275,  276,  277,  278,  279,
+   -1,   -1,   -1,  257,  258,   -1,   -1,   -1,  288,  289,
+   -1,  291,  292,  293,  294,  269,  270,  271,  272,  273,
+  274,  275,  276,  277,  278,  279,   -1,   -1,   -1,   -1,
+  257,  258,   -1,   -1,   -1,   -1,   -1,  291,  292,  293,
+  294,   -1,  269,  270,  271,  272,  273,  274,  275,  276,
+  277,  278,  279,   -1,   -1,   -1,   -1,   33,   -1,  257,
+  258,   -1,   -1,   -1,  291,  292,  293,  294,   44,   -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,
+  258,   -1,   -1,  291,  292,  293,  294,   -1,   -1,   -1,
    -1,  269,  270,  271,  272,  273,  274,  275,  276,  277,
-  278,  279,
+  278,  279,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,  291,  292,  293,  294,  258,   -1,   -1,
+  261,  262,  263,   -1,   -1,  258,   -1,  260,  261,   -1,
+  263,   -1,   -1,   -1,   -1,   -1,   -1,  258,  279,   -1,
+  261,  262,  263,   -1,   -1,   -1,  279,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  279,   -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,   -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,   -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,  258,   -1,  260,  261,   -1,  263,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,  279,
 };
 #define YYFINAL 18
 #ifndef YYDEBUG
 #define YYDEBUG 0
 #endif
-#define YYMAXTOKEN 290
+#define YYMAXTOKEN 294
 #if YYDEBUG
 #if defined(__cplusplus) || defined(__STDC__)
 const char * const sudoersname[] =
@@ -531,7 +583,8 @@ char *sudoersname[] =
 "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","PRIVS","LIMITPRIVS","MYSELF",
+"RUNASALIAS","ERROR","TYPE","ROLE","PRIVS","LIMITPRIVS","MYSELF","SHA224",
+"SHA256","SHA384","SHA512",
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const char * const sudoersrule[] =
@@ -574,7 +627,13 @@ char *sudoersrule[] =
 "host : WORD",
 "cmndspeclist : cmndspec",
 "cmndspeclist : cmndspeclist ',' cmndspec",
-"cmndspec : runasspec selinux solarisprivs cmndtag opcmnd",
+"cmndspec : runasspec selinux solarisprivs cmndtag digcmnd",
+"digest : SHA224 ':' WORD",
+"digest : SHA256 ':' WORD",
+"digest : SHA384 ':' WORD",
+"digest : SHA512 ':' WORD",
+"digcmnd : opcmnd",
+"digcmnd : digest opcmnd",
 "opcmnd : cmnd",
 "opcmnd : '!' cmnd",
 "rolespec : ROLE '=' WORD",
@@ -620,8 +679,8 @@ char *sudoersrule[] =
 "cmndaliases : cmndalias",
 "cmndaliases : cmndaliases ':' cmndalias",
 "cmndalias : ALIAS '=' cmndlist",
-"cmndlist : opcmnd",
-"cmndlist : cmndlist ',' opcmnd",
+"cmndlist : digcmnd",
+"cmndlist : cmndlist ',' digcmnd",
 "runasaliases : runasalias",
 "runasaliases : runasaliases ':' runasalias",
 "runasalias : ALIAS '=' userlist",
@@ -671,14 +730,13 @@ short *yyss;
 short *yysslim;
 YYSTYPE *yyvs;
 int yystacksize;
-#line 647 "gram.y"
+#line 680 "gram.y"
 void
 sudoerserror(const char *s)
 {
     debug_decl(sudoerserror, SUDO_DEBUG_PARSER)
 
     /* If we last saw a newline the error is on the preceding line. */
-    /* XXX - COMMENT not yet defined - XXX */
     if (last_token == COMMENT)
        sudolineno--;
 
@@ -738,6 +796,19 @@ new_member(char *name, int type)
     debug_return_ptr(m);
 }
 
+struct sudo_digest *
+new_digest(int digest_type, const char *digest_str)
+{
+    struct sudo_digest *dig;
+    debug_decl(new_digest, SUDO_DEBUG_PARSER)
+
+    dig = emalloc(sizeof(*dig));
+    dig->digest_type = digest_type;
+    dig->digest_str = estrdup(digest_str);
+
+    debug_return_ptr(dig);
+}
+
 /*
  * Add a list of defaults structures to the defaults list.
  * The binding, if non-NULL, specifies a list of hosts, users, or
@@ -907,7 +978,7 @@ init_parser(const char *path, bool quiet)
 
     debug_return;
 }
-#line 858 "gram.c"
+#line 929 "gram.c"
 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
 #if defined(__cplusplus) || defined(__STDC__)
 static int yygrowstack(void)
@@ -1110,127 +1181,127 @@ yyreduce:
     switch (yyn)
     {
 case 1:
-#line 176 "gram.y"
+#line 184 "gram.y"
 { ; }
 break;
 case 5:
-#line 184 "gram.y"
+#line 192 "gram.y"
 {
                            ;
                        }
 break;
 case 6:
-#line 187 "gram.y"
+#line 195 "gram.y"
 {
                            yyerrok;
                        }
 break;
 case 7:
-#line 190 "gram.y"
+#line 198 "gram.y"
 {
                            add_userspec(yyvsp[-1].member, yyvsp[0].privilege);
                        }
 break;
 case 8:
-#line 193 "gram.y"
+#line 201 "gram.y"
 {
                            ;
                        }
 break;
 case 9:
-#line 196 "gram.y"
+#line 204 "gram.y"
 {
                            ;
                        }
 break;
 case 10:
-#line 199 "gram.y"
+#line 207 "gram.y"
 {
                            ;
                        }
 break;
 case 11:
-#line 202 "gram.y"
+#line 210 "gram.y"
 {
                            ;
                        }
 break;
 case 12:
-#line 205 "gram.y"
+#line 213 "gram.y"
 {
                            add_defaults(DEFAULTS, NULL, yyvsp[0].defaults);
                        }
 break;
 case 13:
-#line 208 "gram.y"
+#line 216 "gram.y"
 {
                            add_defaults(DEFAULTS_USER, yyvsp[-1].member, yyvsp[0].defaults);
                        }
 break;
 case 14:
-#line 211 "gram.y"
+#line 219 "gram.y"
 {
                            add_defaults(DEFAULTS_RUNAS, yyvsp[-1].member, yyvsp[0].defaults);
                        }
 break;
 case 15:
-#line 214 "gram.y"
+#line 222 "gram.y"
 {
                            add_defaults(DEFAULTS_HOST, yyvsp[-1].member, yyvsp[0].defaults);
                        }
 break;
 case 16:
-#line 217 "gram.y"
+#line 225 "gram.y"
 {
                            add_defaults(DEFAULTS_CMND, yyvsp[-1].member, yyvsp[0].defaults);
                        }
 break;
 case 18:
-#line 223 "gram.y"
+#line 231 "gram.y"
 {
                            list_append(yyvsp[-2].defaults, yyvsp[0].defaults);
                            yyval.defaults = yyvsp[-2].defaults;
                        }
 break;
 case 19:
-#line 229 "gram.y"
+#line 237 "gram.y"
 {
                            yyval.defaults = new_default(yyvsp[0].string, NULL, true);
                        }
 break;
 case 20:
-#line 232 "gram.y"
+#line 240 "gram.y"
 {
                            yyval.defaults = new_default(yyvsp[0].string, NULL, false);
                        }
 break;
 case 21:
-#line 235 "gram.y"
+#line 243 "gram.y"
 {
                            yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, true);
                        }
 break;
 case 22:
-#line 238 "gram.y"
+#line 246 "gram.y"
 {
                            yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, '+');
                        }
 break;
 case 23:
-#line 241 "gram.y"
+#line 249 "gram.y"
 {
                            yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, '-');
                        }
 break;
 case 25:
-#line 247 "gram.y"
+#line 255 "gram.y"
 {
                            list_append(yyvsp[-2].privilege, yyvsp[0].privilege);
                            yyval.privilege = yyvsp[-2].privilege;
                        }
 break;
 case 26:
-#line 253 "gram.y"
+#line 261 "gram.y"
 {
                            struct privilege *p = ecalloc(1, sizeof(*p));
                            list2tq(&p->hostlist, yyvsp[-2].member);
@@ -1241,51 +1312,51 @@ case 26:
                        }
 break;
 case 27:
-#line 263 "gram.y"
+#line 271 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = false;
                        }
 break;
 case 28:
-#line 267 "gram.y"
+#line 275 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = true;
                        }
 break;
 case 29:
-#line 273 "gram.y"
+#line 281 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, ALIAS);
                        }
 break;
 case 30:
-#line 276 "gram.y"
+#line 284 "gram.y"
 {
                            yyval.member = new_member(NULL, ALL);
                        }
 break;
 case 31:
-#line 279 "gram.y"
+#line 287 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, NETGROUP);
                        }
 break;
 case 32:
-#line 282 "gram.y"
+#line 290 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, NTWKADDR);
                        }
 break;
 case 33:
-#line 285 "gram.y"
+#line 293 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, WORD);
                        }
 break;
 case 35:
-#line 291 "gram.y"
+#line 299 "gram.y"
 {
                            list_append(yyvsp[-2].cmndspec, yyvsp[0].cmndspec);
 #ifdef HAVE_SELINUX
@@ -1325,7 +1396,7 @@ case 35:
                        }
 break;
 case 36:
-#line 330 "gram.y"
+#line 338 "gram.y"
 {
                            struct cmndspec *cs = ecalloc(1, sizeof(*cs));
                            if (yyvsp[-4].runas != NULL) {
@@ -1356,246 +1427,285 @@ case 36:
                        }
 break;
 case 37:
-#line 360 "gram.y"
+#line 368 "gram.y"
+{
+                           yyval.digest = new_digest(SUDO_DIGEST_SHA224, yyvsp[0].string);
+                       }
+break;
+case 38:
+#line 371 "gram.y"
+{
+                           yyval.digest = new_digest(SUDO_DIGEST_SHA256, yyvsp[0].string);
+                       }
+break;
+case 39:
+#line 374 "gram.y"
+{
+                           yyval.digest = new_digest(SUDO_DIGEST_SHA384, yyvsp[0].string);
+                       }
+break;
+case 40:
+#line 377 "gram.y"
+{
+                           yyval.digest = new_digest(SUDO_DIGEST_SHA512, yyvsp[0].string);
+                       }
+break;
+case 41:
+#line 382 "gram.y"
+{
+                           yyval.member = yyvsp[0].member;
+                       }
+break;
+case 42:
+#line 385 "gram.y"
+{
+                           /* XXX - yuck */
+                           struct sudo_command *c = (struct sudo_command *)(yyvsp[0].member->name);
+                           c->digest = yyvsp[-1].digest;
+                           yyval.member = yyvsp[0].member;
+                       }
+break;
+case 43:
+#line 393 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = false;
                        }
 break;
-case 38:
-#line 364 "gram.y"
+case 44:
+#line 397 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = true;
                        }
 break;
-case 39:
-#line 370 "gram.y"
+case 45:
+#line 403 "gram.y"
 {
                            yyval.string = yyvsp[0].string;
                        }
 break;
-case 40:
-#line 375 "gram.y"
+case 46:
+#line 408 "gram.y"
 {
                            yyval.string = yyvsp[0].string;
                        }
 break;
-case 41:
-#line 380 "gram.y"
+case 47:
+#line 413 "gram.y"
 {
                            yyval.seinfo.role = NULL;
                            yyval.seinfo.type = NULL;
                        }
 break;
-case 42:
-#line 384 "gram.y"
+case 48:
+#line 417 "gram.y"
 {
                            yyval.seinfo.role = yyvsp[0].string;
                            yyval.seinfo.type = NULL;
                        }
 break;
-case 43:
-#line 388 "gram.y"
+case 49:
+#line 421 "gram.y"
 {
                            yyval.seinfo.type = yyvsp[0].string;
                            yyval.seinfo.role = NULL;
                        }
 break;
-case 44:
-#line 392 "gram.y"
+case 50:
+#line 425 "gram.y"
 {
                            yyval.seinfo.role = yyvsp[-1].string;
                            yyval.seinfo.type = yyvsp[0].string;
                        }
 break;
-case 45:
-#line 396 "gram.y"
+case 51:
+#line 429 "gram.y"
 {
                            yyval.seinfo.type = yyvsp[-1].string;
                            yyval.seinfo.role = yyvsp[0].string;
                        }
 break;
-case 46:
-#line 402 "gram.y"
+case 52:
+#line 435 "gram.y"
 {
                            yyval.string = yyvsp[0].string;
                        }
 break;
-case 47:
-#line 406 "gram.y"
+case 53:
+#line 439 "gram.y"
 {
                            yyval.string = yyvsp[0].string;
                        }
 break;
-case 48:
-#line 411 "gram.y"
+case 54:
+#line 444 "gram.y"
 {
                            yyval.privinfo.privs = NULL;
                            yyval.privinfo.limitprivs = NULL;
                        }
 break;
-case 49:
-#line 415 "gram.y"
+case 55:
+#line 448 "gram.y"
 {
                            yyval.privinfo.privs = yyvsp[0].string;
                            yyval.privinfo.limitprivs = NULL;
                        }
 break;
-case 50:
-#line 419 "gram.y"
+case 56:
+#line 452 "gram.y"
 {
                            yyval.privinfo.privs = NULL;
                            yyval.privinfo.limitprivs = yyvsp[0].string;
                        }
 break;
-case 51:
-#line 423 "gram.y"
+case 57:
+#line 456 "gram.y"
 {
                            yyval.privinfo.privs = yyvsp[-1].string;
                            yyval.privinfo.limitprivs = yyvsp[0].string;
                        }
 break;
-case 52:
-#line 427 "gram.y"
+case 58:
+#line 460 "gram.y"
 {
                            yyval.privinfo.limitprivs = yyvsp[-1].string;
                            yyval.privinfo.privs = yyvsp[0].string;
                        }
 break;
-case 53:
-#line 433 "gram.y"
+case 59:
+#line 466 "gram.y"
 {
                            yyval.runas = NULL;
                        }
 break;
-case 54:
-#line 436 "gram.y"
+case 60:
+#line 469 "gram.y"
 {
                            yyval.runas = yyvsp[-1].runas;
                        }
 break;
-case 55:
-#line 441 "gram.y"
+case 61:
+#line 474 "gram.y"
 {
                            yyval.runas = ecalloc(1, sizeof(struct runascontainer));
                            yyval.runas->runasusers = new_member(NULL, MYSELF);
                            /* $$->runasgroups = NULL; */
                        }
 break;
-case 56:
-#line 446 "gram.y"
+case 62:
+#line 479 "gram.y"
 {
                            yyval.runas = ecalloc(1, sizeof(struct runascontainer));
                            yyval.runas->runasusers = yyvsp[0].member;
                            /* $$->runasgroups = NULL; */
                        }
 break;
-case 57:
-#line 451 "gram.y"
+case 63:
+#line 484 "gram.y"
 {
                            yyval.runas = ecalloc(1, sizeof(struct runascontainer));
                            yyval.runas->runasusers = yyvsp[-2].member;
                            yyval.runas->runasgroups = yyvsp[0].member;
                        }
 break;
-case 58:
-#line 456 "gram.y"
+case 64:
+#line 489 "gram.y"
 {
                            yyval.runas = ecalloc(1, sizeof(struct runascontainer));
                            /* $$->runasusers = NULL; */
                            yyval.runas->runasgroups = yyvsp[0].member;
                        }
 break;
-case 59:
-#line 461 "gram.y"
+case 65:
+#line 494 "gram.y"
 {
                            yyval.runas = ecalloc(1, sizeof(struct runascontainer));
                            yyval.runas->runasusers = new_member(NULL, MYSELF);
                            /* $$->runasgroups = NULL; */
                        }
 break;
-case 60:
-#line 468 "gram.y"
+case 66:
+#line 501 "gram.y"
 {
                            yyval.tag.nopasswd = yyval.tag.noexec = yyval.tag.setenv =
                                yyval.tag.log_input = yyval.tag.log_output = UNSPEC;
                        }
 break;
-case 61:
-#line 472 "gram.y"
+case 67:
+#line 505 "gram.y"
 {
                            yyval.tag.nopasswd = true;
                        }
 break;
-case 62:
-#line 475 "gram.y"
+case 68:
+#line 508 "gram.y"
 {
                            yyval.tag.nopasswd = false;
                        }
 break;
-case 63:
-#line 478 "gram.y"
+case 69:
+#line 511 "gram.y"
 {
                            yyval.tag.noexec = true;
                        }
 break;
-case 64:
-#line 481 "gram.y"
+case 70:
+#line 514 "gram.y"
 {
                            yyval.tag.noexec = false;
                        }
 break;
-case 65:
-#line 484 "gram.y"
+case 71:
+#line 517 "gram.y"
 {
                            yyval.tag.setenv = true;
                        }
 break;
-case 66:
-#line 487 "gram.y"
+case 72:
+#line 520 "gram.y"
 {
                            yyval.tag.setenv = false;
                        }
 break;
-case 67:
-#line 490 "gram.y"
+case 73:
+#line 523 "gram.y"
 {
                            yyval.tag.log_input = true;
                        }
 break;
-case 68:
-#line 493 "gram.y"
+case 74:
+#line 526 "gram.y"
 {
                            yyval.tag.log_input = false;
                        }
 break;
-case 69:
-#line 496 "gram.y"
+case 75:
+#line 529 "gram.y"
 {
                            yyval.tag.log_output = true;
                        }
 break;
-case 70:
-#line 499 "gram.y"
+case 76:
+#line 532 "gram.y"
 {
                            yyval.tag.log_output = false;
                        }
 break;
-case 71:
-#line 504 "gram.y"
+case 77:
+#line 537 "gram.y"
 {
                            yyval.member = new_member(NULL, ALL);
                        }
 break;
-case 72:
-#line 507 "gram.y"
+case 78:
+#line 540 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, ALIAS);
                        }
 break;
-case 73:
-#line 510 "gram.y"
+case 79:
+#line 543 "gram.y"
 {
                            struct sudo_command *c = ecalloc(1, sizeof(*c));
                            c->cmnd = yyvsp[0].command.cmnd;
@@ -1603,8 +1713,8 @@ case 73:
                            yyval.member = new_member((char *)c, COMMAND);
                        }
 break;
-case 76:
-#line 522 "gram.y"
+case 82:
+#line 555 "gram.y"
 {
                            char *s;
                            if ((s = alias_add(yyvsp[-2].string, HOSTALIAS, yyvsp[0].member)) != NULL) {
@@ -1613,15 +1723,15 @@ case 76:
                            }
                        }
 break;
-case 78:
-#line 532 "gram.y"
+case 84:
+#line 565 "gram.y"
 {
                            list_append(yyvsp[-2].member, yyvsp[0].member);
                            yyval.member = yyvsp[-2].member;
                        }
 break;
-case 81:
-#line 542 "gram.y"
+case 87:
+#line 575 "gram.y"
 {
                            char *s;
                            if ((s = alias_add(yyvsp[-2].string, CMNDALIAS, yyvsp[0].member)) != NULL) {
@@ -1630,15 +1740,15 @@ case 81:
                            }
                        }
 break;
-case 83:
-#line 552 "gram.y"
+case 89:
+#line 585 "gram.y"
 {
                            list_append(yyvsp[-2].member, yyvsp[0].member);
                            yyval.member = yyvsp[-2].member;
                        }
 break;
-case 86:
-#line 562 "gram.y"
+case 92:
+#line 595 "gram.y"
 {
                            char *s;
                            if ((s = alias_add(yyvsp[-2].string, RUNASALIAS, yyvsp[0].member)) != NULL) {
@@ -1647,8 +1757,8 @@ case 86:
                            }
                        }
 break;
-case 89:
-#line 575 "gram.y"
+case 95:
+#line 608 "gram.y"
 {
                            char *s;
                            if ((s = alias_add(yyvsp[-2].string, USERALIAS, yyvsp[0].member)) != NULL) {
@@ -1657,97 +1767,97 @@ case 89:
                            }
                        }
 break;
-case 91:
-#line 585 "gram.y"
+case 97:
+#line 618 "gram.y"
 {
                            list_append(yyvsp[-2].member, yyvsp[0].member);
                            yyval.member = yyvsp[-2].member;
                        }
 break;
-case 92:
-#line 591 "gram.y"
+case 98:
+#line 624 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = false;
                        }
 break;
-case 93:
-#line 595 "gram.y"
+case 99:
+#line 628 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = true;
                        }
 break;
-case 94:
-#line 601 "gram.y"
+case 100:
+#line 634 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, ALIAS);
                        }
 break;
-case 95:
-#line 604 "gram.y"
+case 101:
+#line 637 "gram.y"
 {
                            yyval.member = new_member(NULL, ALL);
                        }
 break;
-case 96:
-#line 607 "gram.y"
+case 102:
+#line 640 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, NETGROUP);
                        }
 break;
-case 97:
-#line 610 "gram.y"
+case 103:
+#line 643 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, USERGROUP);
                        }
 break;
-case 98:
-#line 613 "gram.y"
+case 104:
+#line 646 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, WORD);
                        }
 break;
-case 100:
-#line 619 "gram.y"
+case 106:
+#line 652 "gram.y"
 {
                            list_append(yyvsp[-2].member, yyvsp[0].member);
                            yyval.member = yyvsp[-2].member;
                        }
 break;
-case 101:
-#line 625 "gram.y"
+case 107:
+#line 658 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = false;
                        }
 break;
-case 102:
-#line 629 "gram.y"
+case 108:
+#line 662 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = true;
                        }
 break;
-case 103:
-#line 635 "gram.y"
+case 109:
+#line 668 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, ALIAS);
                        }
 break;
-case 104:
-#line 638 "gram.y"
+case 110:
+#line 671 "gram.y"
 {
                            yyval.member = new_member(NULL, ALL);
                        }
 break;
-case 105:
-#line 641 "gram.y"
+case 111:
+#line 674 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, WORD);
                        }
 break;
-#line 1698 "gram.c"
+#line 1808 "gram.c"
     }
     yyssp -= yym;
     yystate = *yyssp;
index 47272b4ea913c0ef3dd78498d41764528e7e86aa..6bd3267ec94964a48554ecbef68a0f127914e3b2 100644 (file)
 #define PRIVS 288
 #define LIMITPRIVS 289
 #define MYSELF 290
+#define SHA224 291
+#define SHA256 292
+#define SHA384 293
+#define SHA512 294
 #ifndef YYSTYPE_DEFINED
 #define YYSTYPE_DEFINED
 typedef union {
@@ -40,6 +44,7 @@ typedef union {
     struct member *member;
     struct runascontainer *runas;
     struct privilege *privilege;
+    struct sudo_digest *digest;
     struct sudo_command command;
     struct cmndtag tag;
     struct selinux_info seinfo;
index 4ba2b42e8ce63710cdadc6515ceddf633ea1aaa8..257a87e0a9e43351eb76d942197850781600a9f7 100644 (file)
@@ -89,6 +89,7 @@ static void  add_defaults(int, struct member *, struct defaults *);
 static void  add_userspec(struct member *, struct privilege *);
 static struct defaults *new_default(char *, char *, int);
 static struct member *new_member(char *, int);
+static struct sudo_digest *new_digest(int, const char *);
 %}
 
 %union {
@@ -97,6 +98,7 @@ static struct member *new_member(char *, int);
     struct member *member;
     struct runascontainer *runas;
     struct privilege *privilege;
+    struct sudo_digest *digest;
     struct sudo_command command;
     struct cmndtag tag;
     struct selinux_info seinfo;
@@ -142,6 +144,10 @@ static struct member *new_member(char *, int);
 %token <tok>    PRIVS                  /* Solaris privileges */
 %token <tok>    LIMITPRIVS             /* Solaris limit privileges */
 %token <tok>    MYSELF                 /* run as myself, not another user */
+%token <tok>    SHA224                 /* sha224 digest */
+%token <tok>    SHA256                 /* sha256 digest */
+%token <tok>    SHA384                 /* sha384 digest */
+%token <tok>    SHA512                 /* sha512 digest */
 
 %type <cmndspec>  cmndspec
 %type <cmndspec>  cmndspeclist
@@ -149,6 +155,7 @@ static struct member *new_member(char *, int);
 %type <defaults>  defaults_list
 %type <member>   cmnd
 %type <member>   opcmnd
+%type <member>   digcmnd
 %type <member>   cmndlist
 %type <member>   host
 %type <member>   hostlist
@@ -170,6 +177,7 @@ static struct member *new_member(char *, int);
 %type <privinfo>  solarisprivs
 %type <string>   privsspec
 %type <string>   limitprivsspec
+%type <digest>   digest
 
 %%
 
@@ -327,7 +335,7 @@ cmndspeclist        :       cmndspec
                        }
                ;
 
-cmndspec       :       runasspec selinux solarisprivs cmndtag opcmnd {
+cmndspec       :       runasspec selinux solarisprivs cmndtag digcmnd {
                            struct cmndspec *cs = ecalloc(1, sizeof(*cs));
                            if ($1 != NULL) {
                                list2tq(&cs->runasuserlist, $1->runasusers);
@@ -357,6 +365,31 @@ cmndspec   :       runasspec selinux solarisprivs cmndtag opcmnd {
                        }
                ;
 
+digest         :       SHA224 ':' WORD {
+                           $$ = new_digest(SUDO_DIGEST_SHA224, $3);
+                       }
+               |       SHA256 ':' WORD {
+                           $$ = new_digest(SUDO_DIGEST_SHA256, $3);
+                       }
+               |       SHA384 ':' WORD {
+                           $$ = new_digest(SUDO_DIGEST_SHA384, $3);
+                       }
+               |       SHA512 ':' WORD {
+                           $$ = new_digest(SUDO_DIGEST_SHA512, $3);
+                       }
+               ;
+
+digcmnd                :       opcmnd {
+                           $$ = $1;
+                       }
+               |       digest opcmnd {
+                           /* XXX - yuck */
+                           struct sudo_command *c = (struct sudo_command *)($2->name);
+                           c->digest = $1;
+                           $$ = $2;
+                       }
+               ;
+
 opcmnd         :       cmnd {
                            $$ = $1;
                            $$->negated = false;
@@ -548,8 +581,8 @@ cmndalias   :       ALIAS '=' cmndlist {
                        }
                ;
 
-cmndlist       :       opcmnd
-               |       cmndlist ',' opcmnd {
+cmndlist       :       digcmnd
+               |       cmndlist ',' digcmnd {
                            list_append($1, $3);
                            $$ = $1;
                        }
@@ -650,7 +683,6 @@ sudoerserror(const char *s)
     debug_decl(sudoerserror, SUDO_DEBUG_PARSER)
 
     /* If we last saw a newline the error is on the preceding line. */
-    /* XXX - COMMENT not yet defined - XXX */
     if (last_token == COMMENT)
        sudolineno--;
 
@@ -710,6 +742,19 @@ new_member(char *name, int type)
     debug_return_ptr(m);
 }
 
+struct sudo_digest *
+new_digest(int digest_type, const char *digest_str)
+{
+    struct sudo_digest *dig;
+    debug_decl(new_digest, SUDO_DEBUG_PARSER)
+
+    dig = emalloc(sizeof(*dig));
+    dig->digest_type = digest_type;
+    dig->digest_str = estrdup(digest_str);
+
+    debug_return_ptr(dig);
+}
+
 /*
  * Add a list of defaults structures to the defaults list.
  * The binding, if non-NULL, specifies a list of hosts, users, or
diff --git a/plugins/sudoers/hexchar.c b/plugins/sudoers/hexchar.c
new file mode 100644 (file)
index 0000000..bcfe526
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 2013 Todd C. Miller <Todd.Miller@courtesan.com>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <stdio.h>
+
+#include "missing.h"
+#include "sudo_debug.h"
+#include "error.h"
+
+int
+hexchar(const char *s)
+{
+    unsigned char result[2];
+    int i;
+    debug_decl(hexchar, SUDO_DEBUG_UTIL)
+
+    for (i = 0; i < 2; i++) {
+       switch (s[i]) {
+       case '0':
+           result[i] = 0;
+           break;
+       case '1':
+           result[i] = 1;
+           break;
+       case '2':
+           result[i] = 2;
+           break;
+       case '3':
+           result[i] = 3;
+           break;
+       case '4':
+           result[i] = 4;
+           break;
+       case '5':
+           result[i] = 5;
+           break;
+       case '6':
+           result[i] = 6;
+           break;
+       case '7':
+           result[i] = 7;
+           break;
+       case '8':
+           result[i] = 8;
+           break;
+       case '9':
+           result[i] = 9;
+           break;
+       case 'A':
+       case 'a':
+           result[i] = 10;
+           break;
+       case 'B':
+       case 'b':
+           result[i] = 11;
+           break;
+       case 'C':
+       case 'c':
+           result[i] = 12;
+           break;
+       case 'D':
+       case 'd':
+           result[i] = 13;
+           break;
+       case 'E':
+       case 'e':
+           result[i] = 14;
+           break;
+       case 'F':
+       case 'f':
+           result[i] = 15;
+           break;
+       default:
+           /* Should not happen. */
+           errorx(1, "internal error, \\x%s not in proper hex format", s);
+       }
+    }
+    debug_return_int((result[0] << 4) | result[1]);
+}
index 167aa5858c185671c769151866507dee07933733..d1d16083188c29ddedd2d88a73f127aae5e6c3da 100644 (file)
@@ -855,7 +855,7 @@ sudo_ldap_check_command(LDAP *ld, LDAPMessage *entry, int *setenv_implied)
            *allowed_args++ = '\0';
 
        /* check the command like normal */
-       if (command_matches(allowed_cmnd, allowed_args)) {
+       if (command_matches(allowed_cmnd, allowed_args, NULL)) {
            /*
             * If allowed (no bang) set ret but keep on checking.
             * If disallowed (bang), exit loop.
index 4137318224d41e1dd337ea5437cbac8998aec776..8d4c3d6250ed4c4515256935d4c899e11adb0d07 100644 (file)
@@ -60,9 +60,6 @@
 #else
 # include <netdb.h>
 #endif /* HAVE_NETGROUP_H */
-#include <ctype.h>
-#include <pwd.h>
-#include <grp.h>
 #ifdef HAVE_DIRENT_H
 # include <dirent.h>
 # define NAMLEN(dirent) strlen((dirent)->d_name)
 #  include <ndir.h>
 # endif
 #endif
+#include <ctype.h>
+#include <pwd.h>
+#include <grp.h>
+#include <errno.h>
 
 #include "sudoers.h"
 #include "parse.h"
+#include "sha2.h"
 #include <gram.h>
 
 static struct member_list empty;
@@ -91,7 +93,7 @@ static bool command_matches_dir(char *, size_t);
 static bool command_matches_glob(char *, char *);
 #endif
 static bool command_matches_fnmatch(char *, char *);
-static bool command_matches_normal(char *, char *);
+static bool command_matches_normal(char *, char *, struct sudo_digest *);
 
 /*
  * Returns true if string 's' contains meta characters.
@@ -367,7 +369,7 @@ cmnd_matches(struct member *m)
            break;
        case COMMAND:
            c = (struct sudo_command *)m->name;
-           if (command_matches(c->cmnd, c->args))
+           if (command_matches(c->cmnd, c->args, c->digest))
                matched = !m->negated;
            break;
     }
@@ -375,9 +377,7 @@ cmnd_matches(struct member *m)
 }
 
 static bool
-command_args_match(sudoers_cmnd, sudoers_args)
-    char *sudoers_cmnd;
-    char *sudoers_args;
+command_args_match(char *sudoers_cmnd, char *sudoers_args)
 {
     int flags = 0;
     debug_decl(command_args_match, SUDO_DEBUG_MATCH)
@@ -408,7 +408,7 @@ command_args_match(sudoers_cmnd, sudoers_args)
  * otherwise, return true if user_cmnd names one of the inodes in path.
  */
 bool
-command_matches(char *sudoers_cmnd, char *sudoers_args)
+command_matches(char *sudoers_cmnd, char *sudoers_args, struct sudo_digest *digest)
 {
     debug_decl(command_matches, SUDO_DEBUG_MATCH)
 
@@ -444,7 +444,7 @@ command_matches(char *sudoers_cmnd, char *sudoers_args)
        debug_return_bool(command_matches_glob(sudoers_cmnd, sudoers_args));
 #endif
     }
-    debug_return_bool(command_matches_normal(sudoers_cmnd, sudoers_args));
+    debug_return_bool(command_matches_normal(sudoers_cmnd, sudoers_args, digest));
 }
 
 static bool
@@ -545,28 +545,129 @@ command_matches_glob(char *sudoers_cmnd, char *sudoers_args)
 
 #ifdef SUDOERS_NAME_MATCH
 static bool
-command_matches_normal(char *sudoers_cmnd, char *sudoers_args)
+command_matches_normal(char *sudoers_cmnd, char *sudoers_args, struct sudo_digest *digest)
 {
     size_t dlen;
+    debug_decl(command_matches_normal, SUDO_DEBUG_MATCH)
 
     dlen = strlen(sudoers_cmnd);
 
     /* If it ends in '/' it is a directory spec. */
     if (sudoers_cmnd[dlen - 1] == '/')
-       return command_matches_dir(sudoers_cmnd, dlen);
+       debug_return_bool(command_matches_dir(sudoers_cmnd, dlen));
 
     if (strcmp(user_cmnd, sudoers_cmnd) == 0) {
        if (command_args_match(sudoers_cmnd, sudoers_args)) {
            efree(safe_cmnd);
            safe_cmnd = estrdup(sudoers_cmnd);
-           return true;
+           debug_return_bool(true);
        }
     }
-    return false;
+    debug_return_bool(false);
 }
 #else /* !SUDOERS_NAME_MATCH */
+
+static struct digest_function {
+    const char *digest_name;
+    const int digest_len;
+    void (*init)(SHA2_CTX *);
+    void (*update)(SHA2_CTX *, const unsigned char *, size_t);
+    void (*final)(unsigned char *, SHA2_CTX *);
+} digest_functions[] = {
+    {
+       "SHA224",
+       SHA224_DIGEST_LENGTH,
+       SHA224Init,
+       SHA224Update,
+       SHA224Final
+    }, {
+       "SHA256",
+       SHA256_DIGEST_LENGTH,
+       SHA256Init,
+       SHA256Update,
+       SHA256Final
+    }, {
+       "SHA384",
+       SHA384_DIGEST_LENGTH,
+       SHA384Init,
+       SHA384Update,
+       SHA384Final
+    }, {
+       "SHA512",
+       SHA512_DIGEST_LENGTH,
+       SHA512Init,
+       SHA512Update,
+       SHA512Final
+    }, {
+       NULL
+    }
+};
+
 static bool
-command_matches_normal(char *sudoers_cmnd, char *sudoers_args)
+digest_matches(char *file, struct sudo_digest *sd)
+{
+    char file_digest[SHA512_DIGEST_LENGTH];
+    char sudoers_digest[SHA512_DIGEST_LENGTH];
+    unsigned char buf[32 * 1024];
+    struct digest_function *func = NULL;
+    size_t nread;
+    SHA2_CTX ctx;
+    FILE *fp;
+    int i;
+    debug_decl(digest_matches, SUDO_DEBUG_MATCH)
+
+    for (i = 0; digest_functions[i].digest_name != NULL; i++) {
+       if (sd->digest_type == i) {
+           func = &digest_functions[i];
+           break;
+       }
+    }
+    if (func == NULL) {
+       warningx(_("unsupported digest type %d for %s"), sd->digest_type, file);
+       debug_return_bool(false);
+    }
+    /* XXX - support base64 type too */
+    if (strlen(sd->digest_str) != func->digest_len * 2) {
+       warningx(_("digest for %s (%s) is not in %s form"), file,
+           sd->digest_str, func->digest_name);
+       debug_return_bool(false);
+    }
+
+    /* First convert the digest from sudoers from ascii to binary. */
+    /* XXX - parse base64 type too */
+    for (i = 0; i < func->digest_len; i++) {
+       if (!isxdigit((unsigned char)sd->digest_str[i + i]) ||
+           !isxdigit((unsigned char)sd->digest_str[i + i + 1])) {
+           warningx(_("digest for %s (%s) is not in %s form"), file,
+               sd->digest_str, func->digest_name);
+           debug_return_bool(false);
+       }
+       sudoers_digest[i] = hexchar(&sd->digest_str[i + i]);
+    }
+
+    if ((fp = fopen(file, "r")) == NULL) {
+       sudo_debug_printf(SUDO_DEBUG_INFO, "unable to open %s: %s",
+           file, strerror(errno));
+       debug_return_bool(false);
+    }
+
+    func->init(&ctx);
+    while ((nread = fread(buf, 1, sizeof(buf), fp)) != 0) {
+       func->update(&ctx, buf, nread);
+    }
+    if (ferror(fp)) {
+       warningx(_("%s: read error"), file);
+       fclose(fp);
+       debug_return_bool(false);
+    }
+    fclose(fp);
+    func->final(file_digest, &ctx);
+
+    debug_return_bool(memcmp(file_digest, sudoers_digest, func->digest_len) == 0);
+}
+
+static bool
+command_matches_normal(char *sudoers_cmnd, char *sudoers_args, struct sudo_digest *digest)
 {
     struct stat sudoers_stat;
     char *base;
@@ -592,17 +693,21 @@ command_matches_normal(char *sudoers_cmnd, char *sudoers_args)
      *  a) there are no args in sudoers OR
      *  b) there are no args on command line and none req by sudoers OR
      *  c) there are args in sudoers and on command line and they match
+     *  d) there is a digest and it matches
      */
     if (user_stat != NULL &&
        (user_stat->st_dev != sudoers_stat.st_dev ||
        user_stat->st_ino != sudoers_stat.st_ino))
        debug_return_bool(false);
-    if (command_args_match(sudoers_cmnd, sudoers_args)) {
-       efree(safe_cmnd);
-       safe_cmnd = estrdup(sudoers_cmnd);
-       debug_return_bool(true);
+    if (!command_args_match(sudoers_cmnd, sudoers_args))
+       debug_return_bool(false);
+    if (digest != NULL && !digest_matches(sudoers_cmnd, digest)) {
+       /* XXX - log functions not available but we should log very loudly */
+       debug_return_bool(false);
     }
-    debug_return_bool(false);
+    efree(safe_cmnd);
+    safe_cmnd = estrdup(sudoers_cmnd);
+    debug_return_bool(true);
 }
 #endif /* SUDOERS_NAME_MATCH */
 
@@ -614,7 +719,8 @@ command_matches_normal(char *sudoers_cmnd, char *sudoers_args)
 static bool
 command_matches_dir(char *sudoers_dir, size_t dlen)
 {
-    return strncmp(user_cmnd, sudoers_dir, dlen) == 0;
+    debug_decl(command_matches_normal, SUDO_DEBUG_MATCH)
+    debug_return_bool(strncmp(user_cmnd, sudoers_dir, dlen) == 0);
 }
 #else /* !SUDOERS_NAME_MATCH */
 /*
index 602231698c21a589bea77b40e0aa965a794fbca2..7ab5063a63ab3e2b2084a09a139fffe7ebb3a704 100644 (file)
 #undef IMPLIED
 #define IMPLIED         2
 
+#define SUDO_DIGEST_SHA224     0
+#define SUDO_DIGEST_SHA256     1
+#define SUDO_DIGEST_SHA384     2
+#define SUDO_DIGEST_SHA512     3
+
+struct sudo_digest {
+    int digest_type;
+    char *digest_str;
+};
+
 /*
- * A command with args. XXX - merge into struct member.
+ * A command with option args and digest.
+ * XXX - merge into struct member
  */
 struct sudo_command {
     char *cmnd;
     char *args;
+    struct sudo_digest *digest;
 };
 
 /*
@@ -117,6 +129,7 @@ struct cmndspec {
     struct member_list runasuserlist;  /* list of runas users */
     struct member_list runasgrouplist; /* list of runas groups */
     struct member *cmnd;               /* command to allow/deny */
+    char *digest;                      /* optional command digest */
     struct cmndtag tags;               /* tag specificaion */
 #ifdef HAVE_SELINUX
     char *role, *type;                 /* SELinux role and type */
@@ -182,7 +195,7 @@ char *alias_add(char *, int, struct member *);
 bool addr_matches(char *);
 int cmnd_matches(struct member *);
 int cmndlist_matches(struct member_list *);
-bool command_matches(char *, char *);
+bool command_matches(char *, char *, struct sudo_digest *);
 int hostlist_matches(struct member_list *);
 bool hostname_matches(char *, char *, char *);
 bool netgr_matches(char *, char *, char *, char *);
@@ -200,5 +213,6 @@ void init_aliases(void);
 void init_lexer(void);
 void init_parser(const char *, bool);
 int alias_compare(const void *, const void *);
+int hexchar(const char *s);
 
 #endif /* _SUDOERS_PARSE_H */
diff --git a/plugins/sudoers/regress/parser/check_digest.c b/plugins/sudoers/regress/parser/check_digest.c
new file mode 100644 (file)
index 0000000..42020e8
--- /dev/null
@@ -0,0 +1,134 @@
+/*
+ * Copyright (c) 2013 Todd C. Miller <Todd.Miller@courtesan.com>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif /* STDC_HEADERS */
+#ifdef HAVE_STRING_H
+# if defined(HAVE_MEMORY_H) && !defined(STDC_HEADERS)
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif /* HAVE_STRING_H */
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif /* HAVE_STRINGS_H */
+#if defined(HAVE_STDINT_H)
+# include <stdint.h>
+#elif defined(HAVE_INTTYPES_H)
+# include <inttypes.h>
+#endif
+
+#include "missing.h"
+#include "sha2.h"
+
+__dso_public int main(int argc, char *argv[]);
+
+static struct digest_function {
+    const char *digest_name;
+    const int digest_len;
+    void (*init)(SHA2_CTX *);
+    void (*update)(SHA2_CTX *, const unsigned char *, size_t);
+    void (*final)(unsigned char *, SHA2_CTX *);
+} digest_functions[] = {
+    {
+       "SHA224",
+       SHA224_DIGEST_LENGTH,
+       SHA224Init,
+       SHA224Update,
+       SHA224Final
+    }, {
+       "SHA256",
+       SHA256_DIGEST_LENGTH,
+       SHA256Init,
+       SHA256Update,
+       SHA256Final
+    }, {
+       "SHA384",
+       SHA384_DIGEST_LENGTH,
+       SHA384Init,
+       SHA384Update,
+       SHA384Final
+    }, {
+       "SHA512",
+       SHA512_DIGEST_LENGTH,
+       SHA512Init,
+       SHA512Update,
+       SHA512Final
+    }, {
+       NULL
+    }
+};
+
+int
+main(int argc, char *argv[])
+{
+    SHA2_CTX ctx;
+    int i, j;
+    struct digest_function *func;
+    unsigned char digest[SHA512_DIGEST_LENGTH];
+    static const char hex[] = "0123456789abcdef";
+    unsigned char buf[1000];
+    unsigned const char *test_strings[] = {
+       "",
+       "a",
+       "abc",
+       "message digest",
+       "abcdefghijklmnopqrstuvwxyz",
+       "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
+       "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
+           "0123456789",
+       "12345678901234567890123456789012345678901234567890123456789"
+           "012345678901234567890",
+    };
+
+    for (func = digest_functions; func->digest_name != NULL; func++) {
+       for (i = 0; i < 8; i++) {
+           func->init(&ctx);
+           func->update(&ctx, test_strings[i], strlen(test_strings[i]));
+           func->final(digest, &ctx);
+           printf("%s (\"%s\") = ", func->digest_name, test_strings[i]);
+           for (j = 0; j < func->digest_len; j++) {
+               putchar(hex[digest[j] >> 4]);
+               putchar(hex[digest[j] & 0x0f]);
+           }
+           putchar('\n');
+       }
+
+       /* Simulate a string of a million 'a' characters. */
+       memset(buf, 'a', sizeof(buf));
+       func->init(&ctx);
+       for (i = 0; i < 1000; i++) {
+           func->update(&ctx, buf, sizeof(buf));
+       }
+       func->final(digest, &ctx);
+       printf("%s (one million 'a' characters) = ", func->digest_name);
+       for (j = 0; j < func->digest_len; j++) {
+           putchar(hex[digest[j] >> 4]);
+           putchar(hex[digest[j] & 0x0f]);
+       }
+       putchar('\n');
+    }
+    exit(0);
+}
diff --git a/plugins/sudoers/regress/parser/check_digest.out.ok b/plugins/sudoers/regress/parser/check_digest.out.ok
new file mode 100644 (file)
index 0000000..bfb5735
--- /dev/null
@@ -0,0 +1,36 @@
+SHA224 ("") = d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f
+SHA224 ("a") = abd37534c7d9a2efb9465de931cd7055ffdb8879563ae98078d6d6d5
+SHA224 ("abc") = 23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7
+SHA224 ("message digest") = 2cb21c83ae2f004de7e81c3c7019cbcb65b71ab656b22d6d0c39b8eb
+SHA224 ("abcdefghijklmnopqrstuvwxyz") = 45a5f72c39c5cff2522eb3429799e49e5f44b356ef926bcf390dccc2
+SHA224 ("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq") = 75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525
+SHA224 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = bff72b4fcb7d75e5632900ac5f90d219e05e97a7bde72e740db393d9
+SHA224 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = b50aecbe4e9bb0b57bc5f3ae760a8e01db24f203fb3cdcd13148046e
+SHA224 (one million 'a' characters) = 20794655980c91d8bbb4c1ea97618a4bf03f42581948b2ee4ee7ad67
+SHA256 ("") = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
+SHA256 ("a") = ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb
+SHA256 ("abc") = ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
+SHA256 ("message digest") = f7846f55cf23e14eebeab5b4e1550cad5b509e3348fbc4efa3a1413d393cb650
+SHA256 ("abcdefghijklmnopqrstuvwxyz") = 71c480df93d6ae2f1efad1447c66c9525e316218cf51fc8d9ed832f2daf18b73
+SHA256 ("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq") = 248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1
+SHA256 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = db4bfcbd4da0cd85a60c3c37d3fbd8805c77f15fc6b1fdfe614ee0a7c8fdb4c0
+SHA256 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = f371bc4a311f2b009eef952dd83ca80e2b60026c8e935592d0f9c308453c813e
+SHA256 (one million 'a' characters) = cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0
+SHA384 ("") = 38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b
+SHA384 ("a") = 54a59b9f22b0b80880d8427e548b7c23abd873486e1f035dce9cd697e85175033caa88e6d57bc35efae0b5afd3145f31
+SHA384 ("abc") = cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7
+SHA384 ("message digest") = 473ed35167ec1f5d8e550368a3db39be54639f828868e9454c239fc8b52e3c61dbd0d8b4de1390c256dcbb5d5fd99cd5
+SHA384 ("abcdefghijklmnopqrstuvwxyz") = feb67349df3db6f5924815d6c3dc133f091809213731fe5c7b5f4999e463479ff2877f5f2936fa63bb43784b12f3ebb4
+SHA384 ("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq") = 3391fdddfc8dc7393707a65b1b4709397cf8b1d162af05abfe8f450de5f36bc6b0455a8520bc4e6f5fe95b1fe3c8452b
+SHA384 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = 1761336e3f7cbfe51deb137f026f89e01a448e3b1fafa64039c1464ee8732f11a5341a6f41e0c202294736ed64db1a84
+SHA384 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = b12932b0627d1c060942f5447764155655bd4da0c9afa6dd9b9ef53129af1b8fb0195996d2de9ca0df9d821ffee67026
+SHA384 (one million 'a' characters) = 9d0e1809716474cb086e834e310a4a1ced149e9c00f248527972cec5704c2a5b07b8b3dc38ecc4ebae97ddd87f3d8985
+SHA512 ("") = cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e
+SHA512 ("a") = 1f40fc92da241694750979ee6cf582f2d5d7d28e18335de05abc54d0560e0f5302860c652bf08d560252aa5e74210546f369fbbbce8c12cfc7957b2652fe9a75
+SHA512 ("abc") = ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f
+SHA512 ("message digest") = 107dbf389d9e9f71a3a95f6c055b9251bc5268c2be16d6c13492ea45b0199f3309e16455ab1e96118e8a905d5597b72038ddb372a89826046de66687bb420e7c
+SHA512 ("abcdefghijklmnopqrstuvwxyz") = 4dbff86cc2ca1bae1e16468a05cb9881c97f1753bce3619034898faa1aabe429955a1bf8ec483d7421fe3c1646613a59ed5441fb0f321389f77f48a879c7b1f1
+SHA512 ("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq") = 204a8fc6dda82f0a0ced7beb8e08a41657c16ef468b228a8279be331a703c33596fd15c13b1b07f9aa1d3bea57789ca031ad85c7a71dd70354ec631238ca3445
+SHA512 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = 1e07be23c26a86ea37ea810c8ec7809352515a970e9253c26f536cfc7a9996c45c8370583e0a78fa4a90041d71a4ceab7423f19c71b9d5a3e01249f0bebd5894
+SHA512 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = 72ec1ef1124a45b047e8b7c75a932195135bb61de24ec0d1914042246e0aec3a2354e093d76f3048b456764346900cb130d2a4fd5dd16abb5e30bcb850dee843
+SHA512 (one million 'a' characters) = e718483d0ce769644e2e42c7bc15b4638e1f98b13b2044285632a803afa973ebde0ff244877ea60a4cb0432ce577c31beb009c5c2c49aa2e4eadb217ad8cc09b
index 13d071a855461e0f15a563567d448b311f6cd74a..79dfc068db4e0cef91a4bf095349be9d35da048f 100644 (file)
@@ -49,13 +49,9 @@ typedef struct {
 
 void SHA224Init(SHA2_CTX *ctx);
 void SHA224Pad(SHA2_CTX *ctx);
-void SHA224Transform(uint32_t state[8], const uint8_t buffer[SHA224_BLOCK_LENGTH])
-       __attribute__((__bounded__(__minbytes__,1,32)))
-       __attribute__((__bounded__(__minbytes__,2,SHA224_BLOCK_LENGTH)));
-void SHA224Update(SHA2_CTX *ctx, const uint8_t *data, size_t len)
-       __attribute__((__bounded__(__string__,2,3)));
-void SHA224Final(uint8_t digest[SHA224_DIGEST_LENGTH], SHA2_CTX *ctx)
-       __attribute__((__bounded__(__minbytes__,1,SHA224_DIGEST_LENGTH)));
+void SHA224Transform(uint32_t state[8], const uint8_t buffer[SHA224_BLOCK_LENGTH]);
+void SHA224Update(SHA2_CTX *ctx, const uint8_t *data, size_t len);
+void SHA224Final(uint8_t digest[SHA224_DIGEST_LENGTH], SHA2_CTX *ctx);
 
 void SHA256Init(SHA2_CTX *ctx);
 void SHA256Pad(SHA2_CTX *ctx);
index e25c7d66742d1d83da8763d8b3dccbd2ac1e0a1a..03f28628d4bd561226b2030b01a12fb29cc3c01f 100644 (file)
@@ -774,7 +774,7 @@ sudo_sss_check_command(struct sudo_sss_handle *handle,
            *allowed_args++ = '\0';
 
        /* check the command like normal */
-       if (command_matches(allowed_cmnd, allowed_args)) {
+       if (command_matches(allowed_cmnd, allowed_args, NULL)) {
            /*
             * If allowed (no bang) set ret but keep on checking.
             * If disallowed (bang), exit loop.
index 743d5ef942061a16ee7079f60a8fe53169e1f345..20b1d2c30363962c4d3397611a40b8927ce4a97c 100644 (file)
@@ -306,79 +306,80 @@ static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
        *yy_cp = '\0'; \
        yy_c_buf_p = yy_cp;
 
-#define YY_NUM_RULES 61
-#define YY_END_OF_BUFFER 62
-static yyconst short int yy_accept[622] =
+#define YY_NUM_RULES 65
+#define YY_END_OF_BUFFER 66
+static yyconst short int yy_accept[635] =
     {   0,
         0,    0,    0,    0,    0,    0,    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,
+        0,    0,   66,   53,   61,   60,   59,   52,   64,   32,
+       54,   55,   32,   56,   53,   53,   53,   53,   58,   57,
+       64,   44,   44,   44,   44,   44,   44,   44,   44,   44,
+       44,   64,   53,   53,   61,   64,   44,   44,   44,   44,
+       44,    2,   64,    1,   53,   44,   44,   53,   17,   16,
+       17,   16,   16,   64,   64,   64,    3,    9,    8,    9,
+        4,    9,    5,   64,   13,   13,   13,   11,   12,   53,
+        0,   61,   59,    0,   63,    0,   53,   34,    0,   32,
+        0,   33,    0,   51,   51,    0,   53,   53,    0,   53,
+
+       53,   53,   53,    0,   37,   44,   44,   44,   44,   44,
+       44,   44,   44,   44,   44,   44,   44,   53,   62,   53,
+       53,   61,    0,    0,    0,    0,    0,    0,   53,   53,
+       53,   53,   53,    2,    1,    0,    1,   45,   45,    0,
+       53,   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,   53,   53,
+       53,   53,   53,    0,    0,   37,   37,   44,   39,   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,    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,    0,    0,    0,   37,   37,   37,   37,
+       44,   53,   53,    0,    0,    0,    0,    0,    0,   53,
+
+       53,   53,   53,   53,    0,   53,   10,    0,   53,   53,
+       53,   53,   53,   53,    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,
+       53,   53,   53,   53,    0,    0,    0,    0,    0,    0,
+       53,   53,   53,   53,   53,   53,   53,    0,    0,   38,
+       38,   38,    0,   37,   37,    0,   37,   37,   37,   37,
+       37,   37,   37,   37,   37,   37,   37,    0,   25,   44,
+       44,   44,   44,   44,   44,   44,   44,   42,   44,   53,
+       53,   53,   53,   53,    0,    0,    0,    0,   53,   53,
+
+       53,   53,   53,   53,   53,   53,    0,   38,    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,   46,   47,   48,
+       49,   53,    0,    0,    0,   53,   53,   53,   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,   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,   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,   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,   46,    0,
-        0,    0,   49,   20,   45,   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,   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,
+       44,   44,    0,   24,   44,   44,   44,   44,    0,   23,
+        0,   26,   53,    0,    0,    0,   53,   53,   53,   53,
 
+       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,   37,   37,   37,
+       37,   37,   37,   37,   44,   44,   44,   44,   44,   44,
+       44,   50,    0,    0,    0,   53,   20,   45,   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,   44,   44,   44,   44,   44,    0,   22,    0,
+       27,    0,   20,    0,    0,   53,    0,   53,   53,   53,
+
+       36,   36,   36,   36,    0,    0,    0,    0,    0,   37,
        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,   43,
+        0,   30,   44,   44,   44,    0,    0,    0,   18,    0,
+       21,   20,    0,    0,    0,    0,    0,   20,    0,   53,
+       53,   53,    0,    0,    0,   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
+       37,   37,   37,    0,   28,   44,   44,   21,    0,    0,
+       20,   53,   53,   53,   53,   53,    0,    0,    0,    0,
+        0,   37,   37,   37,   37,   37,   37,   37,   37,    0,
+
+       31,   44,    0,   53,   53,   53,   37,   37,   37,   37,
+       37,   37,    0,   29,    0,    0,   19,   53,   53,   53,
+       53,   53,   37,   37,   37,   37,   37,   35,   35,   35,
+       35,   35,   35,    0
     } ;
 
 static yyconst int yy_ec[256] =
@@ -388,15 +389,15 @@ static yyconst int yy_ec[256] =
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    2,    4,    5,    6,    1,    7,    1,    1,    8,
         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,   38,   39,   40,   41,
-       36,   42,   43,   44,   45,   46,   47,   48,   49,   36,
-       10,   50,   10,    1,   51,    1,   52,   53,   54,   55,
-
-       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,
+       19,   20,   21,   22,   23,   24,   25,   26,    1,    1,
+       27,   28,   10,   29,   30,   31,   32,   33,   34,   31,
+       35,   36,   37,   38,   38,   39,   40,   41,   42,   43,
+       38,   44,   45,   46,   47,   48,   49,   50,   51,   38,
+       10,   52,   10,    1,   53,    1,   54,   55,   56,   57,
+
+       58,   59,   60,   61,   62,   60,   60,   63,   64,   65,
+       66,   60,   60,   67,   68,   69,   70,   60,   60,   60,
+       60,   60,    1,    1,    1,    1,    1,    1,    1,    1,
         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,
@@ -413,583 +414,628 @@ static yyconst int yy_ec[256] =
         1,    1,    1,    1,    1
     } ;
 
-static yyconst int yy_meta[68] =
+static yyconst int yy_meta[71] =
     {   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,    1,   14,
-       15,   16,   16,   16,   16,   16,   16,   15,   15,   15,
-       15,   15,   15,   15,   15,   15,   15
+        1,    8,    9,   10,   11,   12,   12,   12,   12,   12,
+       12,   12,   12,   12,   12,   13,   14,    7,    1,   15,
+       15,   15,   15,   15,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,   16,   17,   18,   18,   18,   18,   18,   18,   17,
+       17,   17,   17,   17,   17,   17,   17,   17,   17,   17
     } ;
 
-static yyconst short int yy_base[686] =
+static yyconst short int yy_base[714] =
     {   0,
-        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
+        0,   69,   71,   79,   94,  124,  175,  244,  153,  197,
+       85,  130, 3060, 3007, 3056, 3925, 3053, 3925,  312,   86,
+     3925, 3925, 3004, 3925,  140,  324,  195,  153, 3029, 3925,
+     3925,  383, 3015,   43,  438,   37, 3011,   65, 3010, 3017,
+     2999,  496,  511,   91,  151,  534,   39,   41, 2983,   34,
+     2980,  117, 3034, 3044,  264, 2992, 3003,  136,    0, 3925,
+     3028, 3925,    0,  359,  594,  105,    0, 2979, 3925,  115,
+     3925,  133, 3925,  138, 2946,  152,  171, 3925,  188, 2934,
+      249, 2972, 2958, 2917, 3925,  262,  462,  265, 2895,  215,
+      536, 2844,  563,  572, 2832,  621,  634,  671, 2836, 2836,
+
+      493,  618,  302, 2812,  181,  715,    0, 2791, 2795, 2788,
+     2792,  325, 2781, 2788, 2785, 2777, 2779,  287, 3925,  208,
+      137,  629, 2742, 2747, 2738, 2733, 2724,  121,  200,  211,
+      299,  301,  236,  254, 2782,  690, 2781,  594, 2730,  749,
+      207,    0, 2756,  160, 3925, 3925,  762,  324,    0, 2707,
+      581, 3925, 3925, 2706,  487, 2694, 2729,  272,  469,  370,
+     2720, 2707, 2672,  772,  782,  468,  806,  658,  821,  803,
+      661,  860, 2647, 2633,  904,  362,  949,  993,    0, 2611,
+     2605, 2588, 2590, 2573, 2584, 2579, 2561, 2551, 2564, 2563,
+     2551,  648,  308, 2512, 2517, 2485, 2487, 2493,  463,  335,
+
+     2485,  474,  241,  343,  845,  323, 2531, 2525, 1037,  451,
+        0,    0,  694,  536, 2492, 2488, 1074,  588, 2487, 2468,
+      534,  842, 1087,  879,  746, 1132, 1178, 2467,  465, 2437,
+      524, 2442, 2435, 2424, 2422, 2418, 2399,    0, 2395,    0,
+      834,  518,  557,  521, 2378, 2380, 2364, 2375, 2345,  581,
+      423,  672,  526,  543, 1190, 1202, 1214, 2385, 2384, 1224,
+     2367, 2365, 2364, 2362,  606,  923,  657,  968, 1005, 1237,
+        0, 1018, 1283, 1047,  889, 1328, 1374,  673, 3925, 2344,
+     2344, 2337, 2351, 2329, 2330, 2334, 2334,    0, 2318,  700,
+      976,  796,  645,  760, 2301, 2276, 2277,  884,  691,  977,
+
+      779, 1384,  568, 1423, 1435, 1062, 2318, 2314, 2296, 2295,
+     1445, 1015, 2306, 2294, 1491, 1058, 1060, 1101, 1112, 1145,
+     1503,    0, 1158, 1549, 1256, 1266, 1594, 1640, 2252, 2250,
+     2243,  742,  812, 2238, 2245,  827,  886, 2233, 2221, 2220,
+     2219,  698, 2240, 2182,  665, 1025,  576, 1118, 1651, 1302,
+     1312, 2211, 2204, 2194, 1347, 1690, 1394, 1357, 1734, 1780,
+     1404, 2198, 2197, 2196, 1466, 1167, 1466, 1480, 1516, 1527,
+     1562, 1792,    0, 1575, 1838, 1613, 1414, 1883, 1929, 2154,
+     2120, 2123,  887, 3925, 2124, 2094, 2088, 2072,  929, 3925,
+      930, 3925,  761, 2056, 2047,  853, 1327,  881,  925, 1939,
+
+      211,    0,    0,  928, 2089, 2088, 1661,   58, 1671, 1112,
+     1978,    0, 1711, 2024, 1753, 1623, 2068, 2114, 2099, 2083,
+     2126, 1571, 1572, 1769, 1805, 1816, 1851, 2138,    0, 1864,
+     2184, 1902, 1681, 2230, 2048, 2049, 2030, 2031, 2024,  974,
+      976, 2017, 2006, 1999, 1871,  816, 1883, 2001, 2242, 1949,
+     1959,  979, 2026, 2025, 2017, 2281, 1998, 1155, 1191, 1997,
+     1424, 2293,    0, 2045, 2339, 2087, 1722, 2383, 2429, 2157,
+     1993, 1992, 1922, 2009, 1860, 1918, 2103,  492, 1007, 2441,
+        0, 2169, 1889, 1159, 1885, 1883, 1867, 1262, 3925, 1263,
+     3925, 1813, 2047, 1040, 1121, 1071, 2217, 2222, 2485, 1073,
+
+        0,    0, 1466, 1526, 2259, 1830, 1814, 1807, 2215, 1760,
+     1736, 1527, 1691, 2312, 1816, 2524,    0, 2360, 2570, 2402,
+     1969, 2614, 2660, 1711, 1640, 2671, 2242, 1631, 1031,    0,
+     1264, 3925, 1308, 1575, 1555, 1471, 1490, 1165, 3925, 1471,
+     1421, 2286, 2337, 2426, 2475, 1367, 2503, 2480, 2508, 2683,
+     2695, 2707, 1215, 1126, 2719, 1096, 1059, 1862, 1979, 2543,
+     2046, 2731,    0, 2591, 2777, 2633, 2471,    0,  942,  860,
+      854, 2554,  835, 1309, 3925, 1310,  763, 3925, 1353, 2750,
+     2796, 2823, 1570, 2835, 2847, 2646, 2857,  709,  660,  578,
+     2505,  559,  520, 2199,  474,  377, 2869,    0, 2602, 1355,
+
+     3925, 1470, 1495, 2881, 2893, 2905, 2915, 2925, 2935,  326,
+        0,  208, 1530, 3925,  128, 1552, 3925, 2947, 1571, 2959,
+     2971, 2983, 3925, 2989, 2999, 2760, 3925, 3020, 3057, 3094,
+       59, 3131, 3009, 3925, 3183, 3201, 3219, 3237, 3255, 3273,
+     3291, 3309, 3327, 3334,  747, 3352, 3370, 1582, 3388, 3406,
+     3424, 3442, 3460, 1724, 3478, 3496, 3503, 3511, 3529, 3547,
+     3554, 3562, 3569, 3576, 3583, 3591, 3598, 3605, 3612, 3620,
+     3629, 3636, 3643, 3650,  989, 1635, 3658, 3667, 3674, 3681,
+     3689, 3698, 3705, 3714, 1751, 1769, 3722, 3731, 1770, 1775,
+     3738, 3747, 1817, 3755, 3764, 3782, 3800, 3818, 3825, 3834,
+
+     1707, 1723, 3842, 1920, 1833, 1879, 3849, 3858, 3865, 3872,
+     3881, 3899, 3906
     } ;
 
-static yyconst short int yy_def[686] =
+static yyconst short int yy_def[714] =
     {   0,
-      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,
+      634,    1,    1,    1,  635,  635,  636,  636,  637,  637,
+      638,  638,  634,  639,  634,  634,  634,  634,  640,  641,
+      634,  634,  642,  634,  643,  639,   26,   26,  644,  634,
+      634,  634,   32,   32,   32,   35,   35,   35,   35,   35,
+       35,  639,   26,  639,  634,  640,   32,   32,   35,   35,
+       35,  634,  645,  634,  646,   35,   35,  639,  647,  634,
+      647,  634,  647,  634,  640,  634,  648,  649,  634,  649,
+      634,  649,  634,  650,  651,  651,  651,  634,  634,  639,
+      639,  634,  634,  652,  634,  653,  634,  641,  654,  655,
+      641,  642,  642,  643,  656,  639,  639,   26,  644,   98,
+
+       98,   98,   98,  657,  658,   35,   35,   35,   35,   35,
+       35,   35,   35,   35,   35,   35,   35,  639,  634,  639,
+      639,  634,  634,  634,  634,  634,  634,  652,  639,   98,
+      639,  639,  639,  634,  634,  634,  634,  646,  659,  639,
+      639,  647,  647,  634,  634,  634,  653,  634,  648,  649,
+      649,  634,  634,  649,  649,  651,  634,  651,  651,  634,
+      634,  652,  660,  634,  634,  655,  655,  634,  639,  169,
+      169,   98,  172,  661,  634,  662,  634,  106,   35,   35,
        35,   35,   35,   35,   35,   35,   35,   35,   35,   35,
-      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
+       35,  639,  639,  634,  634,  634,  634,  634,  652,  639,
+
+      172,  639,  639,  639,  634,  639,  634,  660,  639,  639,
+      169,  169,  169,  639,  663,  664,  664,  217,  665,  664,
+      666,  177,  634,  223,  223,  634,  223,   35,   35,   35,
+       35,   35,   35,   35,   35,   35,   35,   35,   35,   35,
+      639,  639,  639,  639,  634,  634,  634,  634,  634,  652,
+      639,  639,  639,  639,  169,  169,  169,  634,  667,  667,
+      260,  667,  668,  669,  670,  634,  671,  226,  671,  634,
+      270,  671,  634,  273,  273,  634,  273,  634,  634,   35,
+       35,   35,   35,   35,   35,   35,   35,   35,   35,  639,
+      639,  639,  639,  639,  634,  634,  634,  652,  639,  639,
+
+      639,  639,  639,  169,  169,  639,  672,  672,  673,  674,
+      634,  634,  675,  676,  634,  677,  677,  678,  276,  678,
+      634,  321,  678,  634,  324,  324,  634,  324,   35,   35,
+       35,   35,   35,   35,   35,   35,   35,  639,  639,  639,
+      639,  639,  634,  634,  652,  639,  639,  639,  639,  349,
+      349,  634,  679,  680,  311,  634,  356,  356,  634,  356,
+      634,  634,  675,  675,  634,  634,  681,  681,  682,  327,
+      682,  634,  372,  682,  634,  375,  375,  634,  375,   35,
+       35,   35,  634,  634,   35,   35,   35,   35,  634,  634,
+      634,  634,  639,  634,  634,  652,  639,  639,  639,  639,
+
+      639,  349,  349,  349,  634,  683,  634,  684,  359,  684,
+      634,  411,  684,  634,  414,  414,  634,  414,  685,  686,
+      634,  634,  687,  687,  688,  378,  688,  634,  428,  688,
+      634,  431,  431,  431,   35,   35,   35,   35,   35,   35,
+       35,  639,  634,  634,  652,  639,  639,  639,  639,  449,
+      449,  449,  634,  689,  690,  634,  691,  691,  692,  417,
+      692,  634,  462,  692,  634,  465,  465,  634,  465,  634,
+      634,  693,  693,  634,  634,  694,  694,  695,  695,  634,
+      480,  695,   35,   35,   35,   35,   35,  634,  634,  634,
+      634,  634,  634,  696,  652,  639,  697,  698,  639,  639,
+
+      449,  449,  449,  639,  634,  634,  689,  689,  634,  634,
+      699,  699,  700,  468,  700,  634,  516,  700,  634,  519,
+      519,  634,  519,  701,  702,  634,  634,  703,  703,   35,
+      634,  634,   35,   35,   35,  634,  696,  696,  634,  652,
+      639,  697,  697,  697,  697,  704,  697,  698,  698,  449,
+      449,  449,  705,  706,  634,  634,  707,  707,  708,  522,
+      708,  634,  562,  708,  634,  565,  565,  709,  634,  701,
+      701,  634,  634,  634,  634,   35,   35,  634,  652,  634,
+      634,  449,  639,  449,  449,  639,  634,  634,  705,  705,
+      634,  634,  710,  710,  711,  711,  711,  597,  711,  634,
+
+      634,   35,  712,  449,  449,  449,  634,  634,  634,  634,
+      713,  713,  634,  634,  712,  712,  634,  449,  639,  449,
+      449,  639,  634,  634,  634,  634,  634,  639,  639,  639,
+      639,  639,  639,    0,  634,  634,  634,  634,  634,  634,
+      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
+      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
+      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
+      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
+      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
+      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
+
+      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
+      634,  634,  634
     } ;
 
-static yyconst short int yy_nxt[3663] =
+static yyconst short int yy_nxt[3996] =
     {   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,   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,
+       26,   26,   26,   26,   26,   29,   30,   31,   14,   32,
+       33,   33,   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,   14,   44,   14,   14,
+       45,  407,   52,  110,   46,  115,   53,  107,  111,  107,
+       52,  107,   54,  409,   53,   55,   76,   16,   77,   78,
+       54,   89,  109,   55,  113,   15,   60,   61,  130,   62,
+
+       47,   48,  129,  132,   49,   62,  148,  119,  114,   56,
+       81,   90,   50,   57,   35,   51,   35,   56,  134,   62,
+       63,   57,   35,   85,   35,   15,   60,   61,  135,   62,
+      617,   76,   16,   77,   78,   62,   79,   91,   58,  155,
+      119,  152,   81,   95,   95,   64,   58,   95,   95,   62,
+       63,  120,  122,  158,   15,   16,   17,   69,   65,  153,
+      121,  148,  119,   70,   71,   72,  151,   95,  102,  102,
+      102,  102,  102,  103,  159,   64,   15,   16,   17,   73,
+       65,   79,  123,  124,  151,  199,  125,   81,   81,  160,
+      161,   96,  156,  193,  126,  175,  120,  127,   15,   16,
+
+       17,   69,   65,  157,   74,  141,  177,   70,   71,   72,
+      101,  101,  101,  101,  101,  101,  101,  101,  101,  101,
+       89,  407,  157,   73,   80,  400,   66,   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,   15,   16,   17,   74,   65,
+       80,   81,   80,   80,   80,  134,   80,   80,   81,   81,
+       80,  192,   81,  206,  200,  135,  167,  139,  139,  201,
+      634,  139,  139,  158,   80,   80,   80,   87,   87,   87,
+       87,   87,   87,   87,   87,   87,   87,   81,  148,  119,
+      634,  139,   81,  204,  253,   66,   67,   67,   67,   67,
+
        67,   67,   67,   67,   67,   67,   67,   67,   67,   67,
+       67,   67,   67,   67,   85,  140,   91,  173,  173,  173,
+      173,  173,  173,  157,   86,  148,  119,   87,   87,   87,
+       87,   87,   87,   87,   87,   87,   87,   97,   81,   98,
+       98,   98,   98,   98,   98,   98,   98,   98,   98,   99,
+       81,  560,   81,  100,  100,  100,  100,  100,  183,   81,
+      144,  119,  145,  184,  146,  203,  202,  185,  145,  186,
+      146,  160,  161,  244,   81,   81,  175,  100,  100,  100,
+      100,  100,  100,   80,  146,  146,   81,  222,  254,   80,
+      634,  251,   80,   80,   81,   80,   80,   80,  106,  106,
+
+      106,  106,  106,  106,  106,  106,  106,  106,   99,  251,
+      146,   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,   80,  107,  107,  107,  107,  107,  107,  107,
+      107,  107,  107,  634,  209,   85,  278,  107,  107,  107,
+      107,  107,  159,  634,   81,  299,  107,   87,   87,   87,
+       87,   87,   87,   87,   87,   87,   87,  407,  148,  119,
+      279,   80,   80,   80,   80,   80,   80,  118,  119,   80,
+
+       80,   80,   81,   80,   80,  266,  175,   80,  173,  173,
+      173,  173,  173,  173,  173,  173,  173,  173,  250,  167,
+      157,   80,   80,   80,   80,   81,  100,  100,  100,  100,
+      100,  100,  100,  100,  100,  100,   85,   88,  151,   88,
+       88,  292,  251,   88,   88,  560,   86,   88,  175,   87,
+       87,   87,   87,   87,   87,   87,   87,   87,   87,  222,
+      281,   99,   88,   88,   92,  282,   92,   92,   92,   81,
+       92,   92,   81,  293,   92,   95,   95,   81,  294,   95,
+       95,  302,  150,   85,  514,  150,  150,   81,   92,   92,
+       92,  587,  150,  251,   81,  128,   85,  139,  139,   95,
+
+      301,  139,  139,  262,  262,  262,  147,  150,   81,  634,
+      634,  634,  634,  634,  634,  634,  634,  634,  634,   81,
+      175,  139,   94,   96,   80,   80,   94,   81,   80,   80,
+      122,  222,   94,  173,  173,  173,  173,  173,  173,  173,
+      173,  173,  173,  298,  398,  140,   94,   94,   80,  169,
+      170,  171,  169,  169,  169,  169,  169,  169,  169,   95,
+      123,  124,  341,   95,  125,  241,  242,   85,  243,   95,
+      266,  175,  126,  587,  278,  127,  212,  212,  212,  212,
+      212,  213,  268,   95,   95,   81,  172,  172,  172,  172,
+      172,  172,  172,  172,  172,  172,   81,   99,  279,   81,
+
+      172,  172,  172,  172,  172,   87,   87,   87,   87,   87,
+       87,   87,   87,   87,   87,   80,   80,   80,   80,  338,
+      346,  396,  587,   81,  172,  172,  172,  172,  172,  172,
+      178,  178,  178,  178,  178,  178,  178,  178,  178,  178,
+       99,  300,   81,  383,  178,  178,  178,  178,  178,   81,
+      138,   81,   80,   80,  138,   87,   80,   80,   87,  393,
+      138,  271,  271,  271,  271,  271,  272,  384,  172,  172,
+      172,  172,  172,  172,  138,  138,   80,  634,  634,  634,
+      634,  634,  634,  634,  634,  634,  634,  165,  165,  165,
+      165,  165,  165,  165,  165,  165,  165,  165,  165,  165,
+
+      165,  165,  165,  165,  165,  165,  165,  166,  602,  166,
+      166,   81,   81,  166,  166,  340,  342,  166,  211,  211,
+      211,  211,  211,  211,  211,  211,  211,  211,  389,  442,
+       81,  166,  166,  166,  209,  348,  210,  210,  210,  210,
+      210,  210,  210,  210,  210,  210,  139,   81,  385,  175,
+      139,  290,  390,  386,  291,   85,  139,  227,  227,  227,
+      227,  227,  227,  227,  227,  227,  227,   81,  175,  496,
+      139,  139,   81,   80,  175,  214,  214,  214,  214,  214,
+      214,  214,  214,  214,  214,   81,   85,  391,  383,  214,
+      214,  214,  214,  214,  270,  270,  270,  270,  270,  270,
+
+      270,  270,  270,  270,  322,  322,  322,  322,  322,  323,
+      445,  392,  384,  214,  214,  214,  214,  214,  214,  216,
+      217,  218,  218,  218,  218,  218,  218,  218,  218,  219,
+      389,  391,   81,  220,  220,  220,  220,  220,  313,  314,
+      315,  313,  313,  313,  313,  313,  313,  313,  447,   80,
+       80,   80,   80,  345,  390,  392,  175,  220,  220,  220,
+      220,  220,  220,  175,  223,  224,  225,  223,  223,  223,
+      223,  223,  223,  223,  226,  488,   81,  490,  227,  227,
+      227,  227,  227,  277,  277,  277,  277,  277,  277,  277,
+      277,  277,  277,  448,  504,  504,  504,  339,  362,  489,
+
+      362,  491,  227,  227,  227,  227,  227,  227,  228,  228,
+      228,  228,  228,  228,  228,  228,  228,  228,  634,  175,
+      634,  175,  228,  228,  228,  228,  228,   81,   81,  175,
+      268,  266,  175,  317,  317,  317,  317,  317,  317,  347,
+      222,  538,  539,  268,  266,  175,  214,  214,  214,  214,
+      214,  214,  255,  256,  257,  255,  255,  255,  255,  255,
+      255,  255,  321,  321,  321,  321,  321,  321,  321,  321,
+      321,  321,  175,  266,  175,  302,   81,  303,  303,  303,
+      303,  303,  303,  268,  514,  268,  499,  397,   81,  260,
+      260,  261,  262,  262,  262,  262,  262,  262,  262,  219,
+
+      266,  175,  267,  267,  267,  267,  267,  267,  267,  267,
+      267,  267,  268,   81,  266,  175,  269,  269,  269,  269,
+      269,  460,   81,   85,   81,  634,  319,  328,  328,  328,
+      328,  328,  328,  328,  328,  328,  328,  409,  541,  587,
+      269,  269,  269,  269,  269,  269,  175,  273,  274,  275,
+      273,  273,  273,  273,  273,  273,  273,  276,  634,  175,
+      531,  277,  277,  277,  277,  277,  538,  539,  407,   81,
+      319,  266,  175,  368,  368,  368,  368,  368,  368,  399,
+      409,  175,  540,  319,  532,  277,  277,  277,  277,  277,
+      277,  634,  268,  269,  269,  269,  269,  269,  269,  269,
+
+      269,  269,  269,  302,  407,  303,  303,  303,  303,  303,
+      303,  303,  303,  303,  303,  302,  460,  304,  304,  304,
+      304,  304,  304,  304,  304,  304,  304,  302,  587,  305,
+      305,  305,  305,  305,  306,  303,  303,  303,  303,  308,
+      308,  308,  308,  308,  308,  308,  308,  308,  308,  219,
+      266,  175,  317,  317,  317,  317,  317,  317,  317,  317,
+      317,  317,  268,  488,  490,  531,  316,  316,  316,  316,
+      316,  372,  372,  372,  372,  372,  372,  372,  372,  372,
+      372,  373,  373,  373,  373,  373,  374,  489,  491,  532,
+      316,  316,  316,  316,  316,  316,  266,  175,  318,  318,
+
+      318,  318,  318,  318,  318,  318,  318,  318,  319,  574,
+      574,  600,  320,  320,  320,  320,  320,  402,  402,  402,
+      402,  402,  402,  402,  402,  402,  402,  403,  403,  403,
+      403,  403,  404,  575,  575,  601,  320,  320,  320,  320,
+      320,  320,  175,  324,  325,  326,  324,  324,  324,  324,
+      324,  324,  324,  327,  603,   85,  600,  328,  328,  328,
+      328,  328,  360,  360,  360,  360,  360,  360,  360,  360,
+      360,  360,  412,  412,  412,  412,  412,  413,   81,  580,
+      601,  328,  328,  328,  328,  328,  328,  634,  446,  320,
+      320,  320,  320,  320,  320,  320,  320,  320,  320,  349,
+
+      350,  351,  349,  349,  349,  349,  349,  349,  349,  411,
+      411,  411,  411,  411,  411,  411,  411,  411,  411,  419,
+      420,  421,  419,  419,  419,  419,  419,  419,  419,  429,
+      429,  429,  429,  429,  430,   81,  302,  634,  303,  303,
+      303,  303,  303,  303,  303,  303,  303,  303,  302,  460,
+      303,  303,  303,  303,  303,  303,  303,  303,  303,  303,
+      356,  357,  358,  356,  356,  356,  356,  356,  356,  356,
+      359,  613,   81,   85,  360,  360,  360,  360,  360,  361,
+      175,  362,  362,  362,  362,  362,  362,   80,   80,   80,
+       80,  319,  539,  266,  175,  614,  616,  617,  360,  360,
+
+      360,  360,  360,  360,  361,  319,  364,  364,  364,  364,
+      364,  365,  362,  362,  362,  362,  266,  175,  368,  368,
+      368,  368,  368,  368,  368,  368,  368,  368,  319,  266,
+      175,  613,  367,  367,  367,  367,  367,  579,  578,  499,
+      407,  370,  379,  379,  379,  379,  379,  379,  379,  379,
+      379,  379,  460,  616,  617,  614,  367,  367,  367,  367,
+      367,  367,  266,  175,  369,  369,  369,  369,  369,  369,
+      369,  369,  369,  369,  370,  634,  175,   81,  371,  371,
+      371,  371,  371,  582,  618,  175,  175,  370,  266,  175,
+      424,  424,  424,  424,  424,  424,  319,  370,  149,  149,
+
+      370,  577,  371,  371,  371,  371,  371,  371,  175,  375,
+      376,  377,  375,  375,  375,  375,  375,  375,  375,  378,
+      576,   81,   81,  379,  379,  379,  379,  379,  428,  428,
+      428,  428,  428,  428,  428,  428,  428,  428,  463,  463,
+      463,  463,  463,  464,  363,  175,  363,  379,  379,  379,
+      379,  379,  379,  634,  175,  371,  371,  371,  371,  371,
+      371,  371,  371,  371,  371,  400,  401,  401,  401,  401,
+      401,  401,  401,  401,  401,  401,  454,  455,  456,  454,
+      454,  454,  454,  454,  454,  454,  418,  418,  418,  418,
+      418,  418,  418,  418,  418,  418,  481,  481,  481,  481,
+
+      481,  482,   81,  407,  407,  408,  408,  408,  408,  408,
+      408,  408,  408,  408,  408,  409,  514,  569,  569,  410,
+      410,  410,  410,  410,  407,  175,  458,  458,  458,  458,
+      458,  458,  165,  570,  570,  165,  409,  517,  517,  517,
+      517,  517,  518,  410,  410,  410,  410,  410,  410,  414,
+      415,  416,  414,  414,  414,  414,  414,  414,  414,  417,
+      471,  460,  471,  418,  418,  418,  418,  418,  462,  462,
+      462,  462,  462,  462,  462,  462,  462,  462,  472,  506,
+      472,  506,  266,  175,  507,  409,  507,  418,  418,  418,
+      418,  418,  418,  634,  370,  410,  410,  410,  410,  410,
+
+      410,  410,  410,  410,  410,  266,  175,  424,  424,  424,
+      424,  424,  424,  424,  424,  424,  424,  370,  266,  175,
+      505,  423,  423,  423,  423,  423,  471,  505,  471,  634,
+      426,  434,  434,  434,  434,  434,  434,  434,  434,  434,
+      434,  514,  588,  505,  588,  423,  423,  423,  423,  423,
+      423,  266,  175,  425,  425,  425,  425,  425,  425,  425,
+      425,  425,  425,  426,  634,  175,  536,  427,  427,  427,
+      427,  427,  494,   85,  175,  407,  426,  266,  175,  477,
+      477,  477,  477,  477,  477,  370,  497,  514,  589,  426,
+      589,  427,  427,  427,  427,  427,  427,  175,  431,  432,
+
+      433,  431,  431,  431,  431,  431,  431,  431,  497,  535,
+      497,  498,  434,  434,  434,  434,  434,  480,  480,  480,
+      480,  480,  480,  480,  480,  480,  480,  495,  581,  534,
+      533,  581,  175,  530,   81,  470,  434,  434,  434,  434,
+      434,  434,  634,  426,  427,  427,  427,  427,  427,  427,
+      427,  427,  427,  427,  449,  450,  451,  452,  449,  449,
+      449,  449,  449,  449,  501,  501,  501,  501,  501,  501,
+      501,  501,  501,  501,  502,  502,  502,  502,  502,  503,
+      504,  504,  504,  504,  563,  563,  563,  563,  563,  564,
+       81,  407,  407,  458,  458,  458,  458,  458,  458,  458,
+
+      458,  458,  458,  409,  560,  470,  470,  457,  457,  457,
+      457,  457,  469,  469,  469,  469,  469,  469,  469,  469,
+      469,  469,  470,  409,  471,  471,  471,  471,  471,  471,
+      505,  457,  457,  457,  457,  457,  457,  407,  505,  459,
+      459,  459,  459,  459,  459,  459,  459,  459,  459,  460,
+      497,  355,   81,  461,  461,  461,  461,  461,  407,  634,
+      512,  512,  512,  512,  512,  512,  493,  492,   81,  487,
+      460,  560,  497,  486,  497,  497,  485,  461,  461,  461,
+      461,  461,  461,  465,  466,  467,  465,  465,  465,  465,
+      465,  465,  465,  468,  484,  483,  470,  469,  469,  469,
+
+      469,  469,  516,  516,  516,  516,  516,  516,  516,  516,
+      516,  516,  470,  355,  264,  444,  266,  175,  443,  441,
+      440,  469,  469,  469,  469,  469,  469,  634,  426,  461,
+      461,  461,  461,  461,  461,  461,  461,  461,  461,  470,
+      439,  473,  473,  473,  473,  473,  474,  471,  471,  471,
+      471,  266,  175,  477,  477,  477,  477,  477,  477,  477,
+      477,  477,  477,  426,  438,  437,  436,  476,  476,  476,
+      476,  476,  524,  525,  526,  524,  524,  524,  524,  524,
+      524,  524,  266,  175,  529,  529,  529,  529,  529,  529,
+      435,  476,  476,  476,  476,  476,  476,  266,  175,  478,
+
+      478,  478,  478,  478,  478,  478,  478,  478,  478,  361,
+      361,  361,  407,  479,  479,  479,  479,  479,  543,  355,
+      544,  545,  546,  543,  560,  544,  545,  546,  505,  264,
+      506,  506,  506,  506,  506,  506,  219,  479,  479,  479,
+      479,  479,  479,  634,  395,  479,  479,  479,  479,  479,
+      479,  479,  479,  479,  479,  499,  175,  500,  500,  500,
+      500,  500,  500,  500,  500,  500,  500,  426,  547,  394,
+       81,   81,   81,  549,  553,  554,  555,  553,  553,  553,
+      553,  553,  553,  553,   81,  388,  387,  634,  382,  634,
+      634,  634,  381,   81,  505,  380,  508,  508,  508,  508,
+
+      508,  509,  506,  506,  506,  506,  407,  361,  512,  512,
+      512,  512,  512,  512,  512,  512,  512,  512,  460,  361,
+      355,  264,  511,  511,  511,  511,  511,  523,  523,  523,
+      523,  523,  523,  523,  523,  523,  523,  547,  543,  219,
+      544,  545,  546,  219,  295,  344,  511,  511,  511,  511,
+      511,  511,  407,  343,  513,  513,  513,  513,  513,  513,
+      513,  513,  513,  513,  514,  337,  336,  335,  515,  515,
+      515,  515,  515,  407,  334,  558,  558,  558,  558,  558,
+      558,  333,  332,  331,  330,  514,  329,  311,  547,  264,
+      219,  307,  515,  515,  515,  515,  515,  515,  519,  520,
+
+      521,  519,  519,  519,  519,  519,  519,  519,  522,  219,
+      105,  295,  523,  523,  523,  523,  523,  562,  562,  562,
+      562,  562,  562,  562,  562,  562,  562,  634,  297,  544,
+      545,  546,  295,  296,  295,  289,  523,  523,  523,  523,
+      523,  523,  634,  288,  515,  515,  515,  515,  515,  515,
+      515,  515,  515,  515,  266,  175,  529,  529,  529,  529,
+      529,  529,  529,  529,  529,  529,  287,  286,  285,  284,
+      528,  528,  528,  528,  528,  283,  634,  547,  634,  634,
+      546,  634,  280,  634,  634,  634,  598,  598,  598,  598,
+      598,  599,   99,  219,  528,  528,  528,  528,  528,  528,
+
+      550,  551,  552,  550,  550,  550,  550,  550,  550,  550,
+      542,  542,  264,  219,  542,  548,  548,  105,  587,  548,
+      588,  588,  588,  588,  588,  588,  547,   85,  542,  542,
+      542,  549,  207,  548,  548,  548,   81,  407,  252,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  514,
+      249,  248,  247,  557,  557,  557,  557,  557,  568,  568,
+      568,  568,  568,  568,  568,  568,  568,  568,  175,  569,
+      569,  569,  569,  569,  569,  246,  245,  557,  557,  557,
+      557,  557,  557,  407,  240,  559,  559,  559,  559,  559,
+      559,  559,  559,  559,  559,  560,  239,  238,  237,  561,
+
+      561,  561,  561,  561,  407,  236,  594,  594,  594,  594,
+      594,  594,  235,  234,  233,  407,  560,  612,  612,  612,
+      612,  612,  612,  561,  561,  561,  561,  561,  561,  565,
+      566,  567,  565,  565,  565,  565,  565,  565,  565,  232,
+      231,  230,  229,  568,  568,  568,  568,  568,  597,  597,
+      597,  597,  597,  597,  597,  597,  597,  597,  105,  582,
+       97,  583,  583,  583,  583,  583,  583,  568,  568,  568,
+      568,  568,  568,  634,   85,  561,  561,  561,  561,  561,
+      561,  561,  561,  561,  561,  175,  571,  571,  571,  571,
+      571,  572,  569,  569,  569,  569,  582,   81,  583,  583,
+
+      583,  583,  583,  583,  583,  583,  583,  583,  582,   85,
+      584,  584,  584,  584,  584,  584,  584,  584,  584,  584,
+      582,  207,  585,  585,  585,  585,  585,  586,  583,  583,
+      583,  583,  587,  156,  590,  590,  590,  590,  590,  591,
+      588,  588,  588,  588,  407,  157,  594,  594,  594,  594,
+      594,  594,  594,  594,  594,  594,  560,  151,  151,  143,
+      593,  593,  593,  593,  593,  581,  581,  581,  581,  581,
+      581,  581,  581,  581,  581,  623,  623,  623,  623,  623,
+      623,  205,  137,  137,  593,  593,  593,  593,  593,  593,
+      407,  198,  595,  595,  595,  595,  595,  595,  595,  595,
+
+      595,  595,  197,  196,  195,  194,  596,  596,  596,  596,
+      596,  581,  581,  581,  581,  581,  581,  581,  581,  581,
+      581,  191,  190,  189,  188,  187,  182,  181,  180,  179,
+      596,  596,  596,  596,  596,  596,   80,  105,  604,  605,
+      606,  604,  604,  604,  604,  604,  604,  604,  582,   80,
+      583,  583,  583,  583,  583,  583,  583,  583,  583,  583,
+      582,  105,  583,  583,  583,  583,  583,  583,  583,  583,
+      583,  583,  607,  608,  609,  607,  607,  607,  607,  607,
+      607,  607,  407,  168,  612,  612,  612,  612,  612,  612,
+      612,  612,  612,  612,  618,   93,  619,  619,  619,  619,
+
+      619,  619,  619,  619,  619,  619,  618,  164,  620,  620,
+      620,  620,  620,  620,  620,  620,  620,  620,  618,   85,
+      621,  621,  621,  621,  621,  622,  619,  619,  619,  619,
+      623,  623,  623,  623,  623,  623,  623,  623,  623,  623,
+      624,  624,  624,  624,  624,  624,  624,  624,  624,  624,
+      625,  625,  625,  625,  625,  626,  623,  623,  623,  623,
+       80,   83,  628,  629,  630,  628,  628,  628,  628,  628,
+      628,  628,  618,   82,  619,  619,  619,  619,  619,  619,
+      619,  619,  619,  619,  618,   81,  619,  619,  619,  619,
+      619,  619,  619,  619,  619,  619,  618,  157,  619,  619,
 
-       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,   68,   68,   68,   68,   68,
+      619,  619,  619,  619,  623,  623,  623,  623,  623,  623,
+      623,  623,  623,  623,  623,  623,  623,  623,  623,  623,
+      623,  623,  623,  623,  631,  631,  631,  631,  631,  631,
+      151,  143,  113,  111,   81,  631,  631,  631,  631,  631,
+      631,  631,  631,  631,  631,  137,  136,  133,  131,  117,
+      116,  115,  112,  107,  105,   93,   83,   82,   81,  634,
+       81,  634,  634,  634,  634,  634,  634,  634,  634,  634,
+      634,   81,  628,  628,  628,  628,  628,  628,  628,  628,
+      628,  628,  634,  634,  634,  634,  634,  634,  634,  634,
+      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
+
+      634,  634,  634,  634,  634,  634,  634,  634,   81,  632,
+      632,  632,  632,  632,  633,  631,  631,  631,  631,  634,
+      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
+      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
+      634,  634,  634,  634,  634,   81,  631,  631,  631,  631,
+      631,  631,  631,  631,  631,  631,  634,  634,  634,  634,
+      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
+      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
+      634,  634,   81,   59,   59,   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,   31,   31,   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,
+       68,   68,   68,   68,   68,   68,   68,   75,   75,   75,
+       75,   75,   75,   75,   75,   75,   75,   75,   75,   75,
+       75,   75,   75,   75,   75,   80,  634,  634,  634,  634,
+      634,  634,  634,   80,   80,   80,   80,  634,  634,   80,
        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
+       84,   84,   84,   84,   84,   84,   84,   84,   84,   84,
+       84,   88,  634,  634,  634,  634,   88,  634,  634,   88,
+
+       88,   88,   88,   88,  634,   88,   88,   88,   88,   92,
+      634,  634,  634,  634,  634,  634,  634,   92,   92,   92,
+       92,  634,  634,   92,   92,   92,   92,   94,  634,  634,
+       94,   94,  634,   94,  634,   94,   94,   94,   94,  634,
+      634,   94,   94,   94,   94,  104,  104,  634,  104,  634,
+      634,  104,  138,  634,  634,  138,  138,  634,  138,  634,
+      138,  138,  138,  138,  634,  634,  138,  138,  138,  138,
+      142,  634,  634,  142,  142,  634,  142,  634,  142,  142,
+      142,  142,  634,  142,  142,  634,  142,  142,  150,  634,
+      634,  150,  634,  634,  150,  634,  150,  150,  150,  150,
+
+      150,  634,  150,  150,  150,  150,  154,  154,  154,  154,
+      154,  154,  154,  154,  154,  154,  154,  154,  154,  154,
+      154,  154,  154,  154,  156,  156,  634,  156,  634,  156,
+      156,  156,  156,  156,  156,  156,  156,  156,  156,  156,
+      156,  156,  162,  162,  162,  162,  162,  162,  162,  162,
+      162,  162,  162,  162,  162,  162,  162,  162,  162,  162,
+      163,  163,  634,  163,  163,  163,  163,  163,  163,  163,
+      163,  163,  163,  163,  163,  163,  163,  163,  166,  634,
+      634,  634,  634,  166,  634,  634,  166,  166,  166,  166,
+      634,  634,  166,  166,  166,  166,   95,  634,  634,   95,
+
+       95,  634,   95,  634,   95,   95,   95,   95,  634,  634,
+       95,   95,   95,   95,  174,  174,  634,  174,  634,  634,
+      174,  176,  176,  176,  634,  176,  634,  634,  176,  139,
+      634,  634,  139,  139,  634,  139,  634,  139,  139,  139,
+      139,  634,  634,  139,  139,  139,  139,  208,  208,  208,
+      208,  208,  208,  208,  208,  208,  208,  208,  208,  208,
+      208,  208,  208,  208,  208,  215,  215,  634,  215,  634,
+      634,  215,  221,  221,  221,  634,  221,  634,  634,  221,
+      258,  258,  634,  258,  634,  634,  258,  259,  259,  634,
+      259,  634,  634,  259,  263,  263,  634,  263,  634,  634,
+
+      263,  265,  265,  265,  634,  265,  634,  634,  265,  307,
+      307,  634,  307,  634,  634,  307,  309,  309,  634,  309,
+      634,  634,  309,  310,  310,  634,  310,  634,  634,  310,
+      312,  312,  312,  634,  312,  634,  634,  312,  316,  316,
+      316,  316,  634,  316,  634,  634,  316,  352,  352,  634,
+      352,  634,  634,  352,  353,  353,  634,  353,  634,  634,
+      353,  354,  354,  634,  354,  634,  634,  354,  366,  366,
+      366,  634,  366,  634,  634,  366,  367,  367,  367,  367,
+      634,  367,  634,  634,  367,  405,  405,  634,  405,  634,
+      634,  405,  406,  406,  634,  406,  634,  634,  406,  422,
+
+      422,  422,  634,  422,  634,  634,  422,  423,  423,  423,
+      423,  634,  423,  634,  634,  423,  453,  453,  634,  453,
+      634,  634,  453,  457,  634,  457,  457,  634,  457,  634,
+      634,  457,  475,  475,  475,  634,  475,  634,  634,  475,
+      476,  476,  476,  476,  634,  476,  634,  634,  476,  510,
+      510,  634,  510,  634,  634,  510,  511,  634,  511,  511,
+      634,  511,  634,  634,  511,  527,  527,  527,  634,  527,
+      634,  634,  527,  528,  528,  528,  634,  634,  528,  634,
+      634,  528,  537,  537,  537,  537,  537,  537,  537,  537,
+      537,  537,  537,  537,  537,  537,  537,  537,  537,  537,
+
+      542,  542,  634,  542,  542,  542,  634,  634,  542,  542,
+      542,  542,  634,  634,  542,  542,  542,  542,  548,  548,
+      634,  548,  548,  548,  634,  634,  548,  548,  548,  548,
+      634,  634,  548,  548,  548,  548,  556,  556,  634,  556,
+      634,  634,  556,  557,  634,  557,  557,  634,  557,  634,
+      634,  557,  573,  573,  634,  634,  573,  634,  634,  573,
+      592,  592,  634,  592,  634,  634,  592,  593,  634,  593,
+      593,  634,  593,  634,  634,  593,  596,  634,  634,  596,
+      634,  634,  596,  610,  610,  634,  610,  634,  634,  610,
+      611,  634,  611,  634,  634,  611,  634,  634,  611,  615,
+
+      615,  615,  615,  615,  615,  615,  615,  615,  615,  615,
+      615,  615,  615,  615,  615,  615,  615,  627,  634,  634,
+      627,  634,  634,  627,   13,  634,  634,  634,  634,  634,
+      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
+      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
+      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
+      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
+      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
+      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
+      634,  634,  634,  634,  634
+
     } ;
 
-static yyconst short int yy_chk[3663] =
+static yyconst short int yy_chk[3996] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -997,403 +1043,440 @@ static yyconst short int yy_chk[3663] =
         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,    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,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        2,  408,    3,   36,    2,   50,    3,   47,   36,   48,
+        4,   34,    3,  408,    4,    3,   11,   11,   11,   11,
+        4,   20,   34,    4,   38,    5,    5,    5,   48,    5,
+
+        2,    2,   47,   50,    2,    5,   66,   66,   38,    3,
+      631,   20,    2,    3,    3,    2,    3,    4,   52,    5,
+        5,    4,    4,  128,    4,    6,    6,    6,   52,    6,
+      615,   12,   12,   12,   12,    6,   11,   20,    3,   74,
+       74,   70,   44,   25,   25,    5,    4,   25,   25,    6,
+        6,   44,   45,   76,    9,    9,    9,    9,    9,   72,
+       44,  144,  144,    9,    9,    9,   70,   25,   28,   28,
+       28,   28,   28,   28,   77,    6,    7,    7,    7,    9,
+        7,   12,   45,   45,   72,  128,   45,   58,  121,   79,
+       79,   25,   79,  121,   45,  105,   58,   45,   10,   10,
+
+       10,   10,   10,   76,    9,   58,  105,   10,   10,   10,
+       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,
+       90,  612,   77,   10,  130,  401,    7,    7,    7,    7,
         7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
-        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,
+        7,    7,    7,    7,    7,    8,    8,    8,   10,    8,
+       81,  129,   81,   81,   81,  134,   81,   81,  141,  120,
+       81,  120,  401,  141,  129,  134,   90,   55,   55,  130,
+       88,   55,   55,  158,   81,   81,   81,   86,   86,   86,
+       86,   86,   86,   86,   86,   86,   86,  133,  118,  118,
+       88,   55,  203,  133,  203,    8,    8,    8,    8,    8,
 
-        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,
+        8,    8,    8,    8,    8,    8,    8,    8,    8,    8,
+        8,    8,    8,    8,   19,   55,   88,  103,  103,  103,
+      103,  103,  103,  158,   19,  148,  148,   19,   19,   19,
+       19,   19,   19,   19,   19,   19,   19,   26,  118,   26,
+       26,   26,   26,   26,   26,   26,   26,   26,   26,   26,
+      131,  610,  132,   26,   26,   26,   26,   26,  112,  193,
+       64,   64,   64,  112,   64,  132,  131,  112,   64,  112,
+       64,  160,  160,  193,  206,   26,  176,   26,   26,   26,
+       26,   26,   26,   32,   64,   64,  200,  176,  206,   32,
+      596,  200,   32,   32,  204,   32,   32,   32,   32,   32,
+
+       32,   32,   32,   32,   32,   32,   32,   32,   32,  204,
+       64,   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,   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,
+       32,   32,   32,   35,   35,   35,   35,   35,   35,   35,
+       35,   35,   35,   35,  210,  199,  229,   35,   35,   35,
+       35,   35,  159,  166,  251,  251,   35,   87,   87,   87,
+       87,   87,   87,   87,   87,   87,   87,  595,  155,  155,
+      229,   35,   35,   35,   35,   35,   35,   42,   42,   42,
+
+       42,   42,  210,   42,   42,  478,  478,   42,  101,  101,
+      101,  101,  101,  101,  101,  101,  101,  101,  199,  166,
+      159,   42,   42,   42,   43,  202,   43,   43,   43,   43,
+       43,   43,   43,   43,   43,   43,   46,   91,  155,   91,
+       91,  242,  202,   91,   91,  593,   46,   91,  221,   46,
+       46,   46,   46,   46,   46,   46,   46,   46,   46,  221,
+      231,  214,   91,   91,   93,  231,   93,   93,   93,  242,
+       93,   93,  244,  243,   93,   94,   94,  253,  244,   94,
+       94,  303,  151,  250,  592,  151,  151,  214,   93,   93,
+       93,  590,  151,  253,  254,   46,   65,  138,  138,   94,
+
+      254,  138,  138,  218,  218,  218,   65,  151,  243,   65,
+       65,   65,   65,   65,   65,   65,   65,   65,   65,  303,
+      265,  138,   96,   94,   96,   96,   96,  347,   96,   96,
+      122,  265,   96,  102,  102,  102,  102,  102,  102,  102,
+      102,  102,  102,  250,  347,  138,   96,   96,   96,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,  168,
+      122,  122,  293,  168,  122,  192,  192,  345,  192,  168,
+      267,  267,  122,  589,  278,  122,  171,  171,  171,  171,
+      171,  171,  267,  168,  168,   97,   98,   98,   98,   98,
+       98,   98,   98,   98,   98,   98,  293,  252,  278,  192,
+
+       98,   98,   98,   98,   98,  136,  136,  136,  136,  136,
+      136,  136,  136,  136,  136,  213,  213,  213,  213,  290,
+      299,  345,  588,  252,   98,   98,   98,   98,   98,   98,
+      106,  106,  106,  106,  106,  106,  106,  106,  106,  106,
+      106,  252,  299,  332,  106,  106,  106,  106,  106,  342,
+      140,  290,  140,  140,  140,  645,  140,  140,  645,  342,
+      140,  225,  225,  225,  225,  225,  225,  332,  106,  106,
+      106,  106,  106,  106,  140,  140,  140,  147,  147,  147,
+      147,  147,  147,  147,  147,  147,  147,  164,  164,  164,
+      164,  164,  164,  164,  164,  164,  164,  165,  165,  165,
+
+      165,  165,  165,  165,  165,  165,  165,  167,  577,  167,
+      167,  294,  393,  167,  167,  292,  294,  167,  170,  170,
+      170,  170,  170,  170,  170,  170,  170,  170,  336,  393,
+      301,  167,  167,  167,  169,  301,  169,  169,  169,  169,
+      169,  169,  169,  169,  169,  169,  205,  292,  333,  573,
+      205,  241,  336,  333,  241,  396,  205,  222,  222,  222,
+      222,  222,  222,  222,  222,  222,  222,  446,  571,  446,
+      205,  205,  169,  172,  570,  172,  172,  172,  172,  172,
+      172,  172,  172,  172,  172,  241,  298,  337,  383,  172,
+      172,  172,  172,  172,  224,  224,  224,  224,  224,  224,
+
+      224,  224,  224,  224,  275,  275,  275,  275,  275,  275,
+      396,  337,  383,  172,  172,  172,  172,  172,  172,  175,
+      175,  175,  175,  175,  175,  175,  175,  175,  175,  175,
+      389,  391,  398,  175,  175,  175,  175,  175,  266,  266,
+      266,  266,  266,  266,  266,  266,  266,  266,  398,  404,
+      404,  404,  404,  298,  389,  391,  569,  175,  175,  175,
+      175,  175,  175,  177,  177,  177,  177,  177,  177,  177,
+      177,  177,  177,  177,  177,  440,  399,  441,  177,  177,
+      177,  177,  177,  268,  268,  268,  268,  268,  268,  268,
+      268,  268,  268,  399,  452,  452,  452,  291,  675,  440,
+
+      675,  441,  177,  177,  177,  177,  177,  177,  178,  178,
+      178,  178,  178,  178,  178,  178,  178,  178,  269,  269,
+      479,  479,  178,  178,  178,  178,  178,  291,  300,  312,
+      269,  272,  272,  272,  272,  272,  272,  272,  272,  300,
+      312,  494,  494,  272,  529,  529,  178,  178,  178,  178,
+      178,  178,  209,  209,  209,  209,  209,  209,  209,  209,
+      209,  209,  274,  274,  274,  274,  274,  274,  274,  274,
+      274,  274,  316,  317,  317,  306,  346,  306,  306,  306,
+      306,  306,  306,  316,  557,  317,  500,  346,  209,  217,
+      217,  217,  217,  217,  217,  217,  217,  217,  217,  217,
+
+      223,  223,  223,  223,  223,  223,  223,  223,  223,  223,
+      223,  223,  223,  306,  318,  318,  223,  223,  223,  223,
+      223,  556,  496,  495,  500,  410,  318,  319,  319,  319,
+      319,  319,  319,  319,  319,  319,  319,  410,  496,  554,
+      223,  223,  223,  223,  223,  223,  226,  226,  226,  226,
+      226,  226,  226,  226,  226,  226,  226,  226,  320,  320,
+      484,  226,  226,  226,  226,  226,  538,  538,  458,  348,
+      320,  323,  323,  323,  323,  323,  323,  323,  323,  348,
+      458,  366,  495,  323,  484,  226,  226,  226,  226,  226,
+      226,  227,  366,  227,  227,  227,  227,  227,  227,  227,
+
+      227,  227,  227,  255,  459,  255,  255,  255,  255,  255,
+      255,  255,  255,  255,  255,  256,  459,  256,  256,  256,
+      256,  256,  256,  256,  256,  256,  256,  257,  553,  257,
+      257,  257,  257,  257,  257,  257,  257,  257,  257,  260,
+      260,  260,  260,  260,  260,  260,  260,  260,  260,  260,
+      270,  270,  270,  270,  270,  270,  270,  270,  270,  270,
+      270,  270,  270,  488,  490,  531,  270,  270,  270,  270,
+      270,  325,  325,  325,  325,  325,  325,  325,  325,  325,
+      325,  326,  326,  326,  326,  326,  326,  488,  490,  531,
+      270,  270,  270,  270,  270,  270,  273,  273,  273,  273,
+
+      273,  273,  273,  273,  273,  273,  273,  273,  273,  533,
+      574,  576,  273,  273,  273,  273,  273,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  351,  351,  351,
+      351,  351,  351,  533,  574,  576,  273,  273,  273,  273,
+      273,  273,  276,  276,  276,  276,  276,  276,  276,  276,
+      276,  276,  276,  276,  579,  579,  600,  276,  276,  276,
+      276,  276,  355,  355,  355,  355,  355,  355,  355,  355,
+      355,  355,  358,  358,  358,  358,  358,  358,  397,  546,
+      600,  276,  276,  276,  276,  276,  276,  277,  397,  277,
+      277,  277,  277,  277,  277,  277,  277,  277,  277,  302,
+
+      302,  302,  302,  302,  302,  302,  302,  302,  302,  357,
+      357,  357,  357,  357,  357,  357,  357,  357,  357,  361,
+      361,  361,  361,  361,  361,  361,  361,  361,  361,  377,
+      377,  377,  377,  377,  377,  302,  304,  461,  304,  304,
+      304,  304,  304,  304,  304,  304,  304,  304,  305,  461,
+      305,  305,  305,  305,  305,  305,  305,  305,  305,  305,
+      311,  311,  311,  311,  311,  311,  311,  311,  311,  311,
+      311,  602,  541,  540,  311,  311,  311,  311,  311,  365,
+      367,  365,  365,  365,  365,  365,  365,  503,  503,  503,
+      503,  367,  537,  368,  368,  602,  603,  603,  311,  311,
+
+      311,  311,  311,  311,  315,  368,  315,  315,  315,  315,
+      315,  315,  315,  315,  315,  315,  321,  321,  321,  321,
+      321,  321,  321,  321,  321,  321,  321,  321,  321,  369,
+      369,  613,  321,  321,  321,  321,  321,  540,  536,  504,
+      512,  369,  370,  370,  370,  370,  370,  370,  370,  370,
+      370,  370,  512,  616,  616,  613,  321,  321,  321,  321,
+      321,  321,  324,  324,  324,  324,  324,  324,  324,  324,
+      324,  324,  324,  324,  324,  371,  371,  504,  324,  324,
+      324,  324,  324,  583,  619,  422,  423,  371,  374,  374,
+      374,  374,  374,  374,  374,  374,  422,  423,  648,  648,
+
+      374,  535,  324,  324,  324,  324,  324,  324,  327,  327,
+      327,  327,  327,  327,  327,  327,  327,  327,  327,  327,
+      534,  583,  619,  327,  327,  327,  327,  327,  376,  376,
+      376,  376,  376,  376,  376,  376,  376,  376,  416,  416,
+      416,  416,  416,  416,  676,  528,  676,  327,  327,  327,
+      327,  327,  327,  328,  525,  328,  328,  328,  328,  328,
+      328,  328,  328,  328,  328,  349,  349,  349,  349,  349,
+      349,  349,  349,  349,  349,  349,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  409,  409,  409,  409,
+      409,  409,  409,  409,  409,  409,  433,  433,  433,  433,
+
+      433,  433,  349,  356,  513,  356,  356,  356,  356,  356,
+      356,  356,  356,  356,  356,  356,  513,  701,  701,  356,
+      356,  356,  356,  356,  413,  524,  413,  413,  413,  413,
+      413,  413,  654,  702,  702,  654,  413,  467,  467,  467,
+      467,  467,  467,  356,  356,  356,  356,  356,  356,  359,
+      359,  359,  359,  359,  359,  359,  359,  359,  359,  359,
+      685,  511,  685,  359,  359,  359,  359,  359,  415,  415,
+      415,  415,  415,  415,  415,  415,  415,  415,  686,  689,
+      686,  689,  424,  424,  690,  510,  690,  359,  359,  359,
+      359,  359,  359,  360,  424,  360,  360,  360,  360,  360,
+
+      360,  360,  360,  360,  360,  372,  372,  372,  372,  372,
+      372,  372,  372,  372,  372,  372,  372,  372,  425,  425,
+      508,  372,  372,  372,  372,  372,  693,  507,  693,  515,
+      425,  426,  426,  426,  426,  426,  426,  426,  426,  426,
+      426,  515,  705,  506,  705,  372,  372,  372,  372,  372,
+      372,  375,  375,  375,  375,  375,  375,  375,  375,  375,
+      375,  375,  375,  375,  427,  427,  492,  375,  375,  375,
+      375,  375,  445,  445,  475,  558,  427,  430,  430,  430,
+      430,  430,  430,  430,  430,  475,  447,  558,  706,  430,
+      706,  375,  375,  375,  375,  375,  375,  378,  378,  378,
+
+      378,  378,  378,  378,  378,  378,  378,  378,  447,  487,
+      447,  447,  378,  378,  378,  378,  378,  432,  432,  432,
+      432,  432,  432,  432,  432,  432,  432,  445,  704,  486,
+      485,  704,  476,  483,  447,  473,  378,  378,  378,  378,
+      378,  378,  379,  476,  379,  379,  379,  379,  379,  379,
+      379,  379,  379,  379,  400,  400,  400,  400,  400,  400,
+      400,  400,  400,  400,  450,  450,  450,  450,  450,  450,
+      450,  450,  450,  450,  451,  451,  451,  451,  451,  451,
+      451,  451,  451,  451,  521,  521,  521,  521,  521,  521,
+      400,  411,  559,  411,  411,  411,  411,  411,  411,  411,
+
+      411,  411,  411,  411,  559,  472,  471,  411,  411,  411,
+      411,  411,  460,  460,  460,  460,  460,  460,  460,  460,
+      460,  460,  474,  457,  474,  474,  474,  474,  474,  474,
+      455,  411,  411,  411,  411,  411,  411,  414,  454,  414,
+      414,  414,  414,  414,  414,  414,  414,  414,  414,  414,
+      493,  453,  448,  414,  414,  414,  414,  414,  464,  561,
+      464,  464,  464,  464,  464,  464,  444,  443,  442,  439,
+      464,  561,  493,  438,  493,  493,  437,  414,  414,  414,
+      414,  414,  414,  417,  417,  417,  417,  417,  417,  417,
+      417,  417,  417,  417,  436,  435,  420,  417,  417,  417,
+
+      417,  417,  466,  466,  466,  466,  466,  466,  466,  466,
+      466,  466,  419,  406,  405,  395,  477,  477,  394,  388,
+      387,  417,  417,  417,  417,  417,  417,  418,  477,  418,
+      418,  418,  418,  418,  418,  418,  418,  418,  418,  421,
+      386,  421,  421,  421,  421,  421,  421,  421,  421,  421,
+      421,  428,  428,  428,  428,  428,  428,  428,  428,  428,
+      428,  428,  428,  428,  385,  382,  381,  428,  428,  428,
+      428,  428,  470,  470,  470,  470,  470,  470,  470,  470,
+      470,  470,  482,  482,  482,  482,  482,  482,  482,  482,
+      380,  428,  428,  428,  428,  428,  428,  431,  431,  431,
+
+      431,  431,  431,  431,  431,  431,  431,  431,  431,  364,
+      363,  362,  594,  431,  431,  431,  431,  431,  497,  354,
+      497,  497,  497,  498,  594,  498,  498,  498,  509,  353,
+      509,  509,  509,  509,  509,  509,  352,  431,  431,  431,
+      431,  431,  431,  434,  344,  434,  434,  434,  434,  434,
+      434,  434,  434,  434,  434,  449,  527,  449,  449,  449,
+      449,  449,  449,  449,  449,  449,  449,  527,  497,  343,
+      341,  340,  339,  498,  505,  505,  505,  505,  505,  505,
+      505,  505,  505,  505,  338,  335,  334,  542,  331,  542,
+      542,  542,  330,  449,  456,  329,  456,  456,  456,  456,
+
+      456,  456,  456,  456,  456,  456,  462,  314,  462,  462,
+      462,  462,  462,  462,  462,  462,  462,  462,  462,  313,
+      310,  309,  462,  462,  462,  462,  462,  514,  514,  514,
+      514,  514,  514,  514,  514,  514,  514,  542,  543,  308,
+      543,  543,  543,  307,  297,  296,  462,  462,  462,  462,
+      462,  462,  465,  295,  465,  465,  465,  465,  465,  465,
+      465,  465,  465,  465,  465,  289,  287,  286,  465,  465,
+      465,  465,  465,  518,  285,  518,  518,  518,  518,  518,
+      518,  284,  283,  282,  281,  518,  280,  264,  543,  263,
+      262,  261,  465,  465,  465,  465,  465,  465,  468,  468,
+
+      468,  468,  468,  468,  468,  468,  468,  468,  468,  259,
+      258,  249,  468,  468,  468,  468,  468,  520,  520,  520,
+      520,  520,  520,  520,  520,  520,  520,  544,  248,  544,
+      544,  544,  247,  246,  245,  239,  468,  468,  468,  468,
+      468,  468,  469,  237,  469,  469,  469,  469,  469,  469,
+      469,  469,  469,  469,  480,  480,  480,  480,  480,  480,
+      480,  480,  480,  480,  480,  480,  236,  235,  234,  233,
+      480,  480,  480,  480,  480,  232,  545,  544,  545,  545,
+      545,  548,  230,  548,  548,  548,  567,  567,  567,  567,
+      567,  567,  228,  220,  480,  480,  480,  480,  480,  480,
+
+      499,  499,  499,  499,  499,  499,  499,  499,  499,  499,
+      547,  547,  219,  216,  547,  549,  549,  215,  591,  549,
+      591,  591,  591,  591,  591,  591,  545,  208,  547,  547,
+      547,  548,  207,  549,  549,  549,  499,  516,  201,  516,
+      516,  516,  516,  516,  516,  516,  516,  516,  516,  516,
+      198,  197,  196,  516,  516,  516,  516,  516,  560,  560,
+      560,  560,  560,  560,  560,  560,  560,  560,  572,  572,
+      572,  572,  572,  572,  572,  195,  194,  516,  516,  516,
+      516,  516,  516,  519,  191,  519,  519,  519,  519,  519,
+      519,  519,  519,  519,  519,  519,  190,  189,  188,  519,
+
+      519,  519,  519,  519,  564,  187,  564,  564,  564,  564,
+      564,  564,  186,  185,  184,  599,  564,  599,  599,  599,
+      599,  599,  599,  519,  519,  519,  519,  519,  519,  522,
+      522,  522,  522,  522,  522,  522,  522,  522,  522,  183,
+      182,  181,  180,  522,  522,  522,  522,  522,  566,  566,
+      566,  566,  566,  566,  566,  566,  566,  566,  174,  586,
+      173,  586,  586,  586,  586,  586,  586,  522,  522,  522,
+      522,  522,  522,  523,  163,  523,  523,  523,  523,  523,
+      523,  523,  523,  523,  523,  526,  526,  526,  526,  526,
+      526,  526,  526,  526,  526,  526,  550,  586,  550,  550,
+
+      550,  550,  550,  550,  550,  550,  550,  550,  551,  162,
+      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
+      552,  161,  552,  552,  552,  552,  552,  552,  552,  552,
+      552,  552,  555,  157,  555,  555,  555,  555,  555,  555,
+      555,  555,  555,  555,  562,  156,  562,  562,  562,  562,
+      562,  562,  562,  562,  562,  562,  562,  154,  150,  143,
+      562,  562,  562,  562,  562,  580,  580,  580,  580,  580,
+      580,  580,  580,  580,  580,  626,  626,  626,  626,  626,
+      626,  139,  137,  135,  562,  562,  562,  562,  562,  562,
+      565,  127,  565,  565,  565,  565,  565,  565,  565,  565,
+
+      565,  565,  126,  125,  124,  123,  565,  565,  565,  565,
+      565,  581,  581,  581,  581,  581,  581,  581,  581,  581,
+      581,  117,  116,  115,  114,  113,  111,  110,  109,  108,
+      565,  565,  565,  565,  565,  565,  582,  104,  582,  582,
+      582,  582,  582,  582,  582,  582,  582,  582,  584,  100,
+      584,  584,  584,  584,  584,  584,  584,  584,  584,  584,
+      585,   99,  585,  585,  585,  585,  585,  585,  585,  585,
+      585,  585,  587,  587,  587,  587,  587,  587,  587,  587,
+      587,  587,  597,   95,  597,  597,  597,  597,  597,  597,
+      597,  597,  597,  597,  604,   92,  604,  604,  604,  604,
+
+      604,  604,  604,  604,  604,  604,  605,   89,  605,  605,
+      605,  605,  605,  605,  605,  605,  605,  605,  606,   84,
+      606,  606,  606,  606,  606,  606,  606,  606,  606,  606,
+      607,  607,  607,  607,  607,  607,  607,  607,  607,  607,
+      608,  608,  608,  608,  608,  608,  608,  608,  608,  608,
+      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
+      618,   83,  618,  618,  618,  618,  618,  618,  618,  618,
+      618,  618,  620,   82,  620,  620,  620,  620,  620,  620,
+      620,  620,  620,  620,  621,   80,  621,  621,  621,  621,
+      621,  621,  621,  621,  621,  621,  622,   75,  622,  622,
+
+      622,  622,  622,  622,  624,  624,  624,  624,  624,  624,
+      624,  624,  624,  624,  625,  625,  625,  625,  625,  625,
+      625,  625,  625,  625,  633,  633,  633,  633,  633,  633,
+       68,   61,   57,   56,  622,  628,  628,  628,  628,  628,
+      628,  628,  628,  628,  628,   54,   53,   51,   49,   41,
+       40,   39,   37,   33,   29,   23,   17,   15,   14,   13,
+      633,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,  628,  629,  629,  629,  629,  629,  629,  629,  629,
+      629,  629,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,  629,  630,
+      630,  630,  630,  630,  630,  630,  630,  630,  630,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,  630,  632,  632,  632,  632,
+      632,  632,  632,  632,  632,  632,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,  632,  635,  635,  635,  635,  635,  635,  635,
+      635,  635,  635,  635,  635,  635,  635,  635,  635,  635,
 
-      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
+      636,  636,  636,  636,  636,  636,  636,  636,  636,  637,
+      637,  637,  637,  637,  637,  637,  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,  638,  638,  639,    0,    0,    0,    0,
+        0,    0,    0,  639,  639,  639,  639,    0,    0,  639,
+      639,  639,  639,  640,  640,  640,  640,  640,  640,  640,
+      640,  640,  640,  640,  640,  640,  640,  640,  640,  640,
+      640,  641,    0,    0,    0,    0,  641,    0,    0,  641,
+
+      641,  641,  641,  641,    0,  641,  641,  641,  641,  642,
+        0,    0,    0,    0,    0,    0,    0,  642,  642,  642,
+      642,    0,    0,  642,  642,  642,  642,  643,    0,    0,
+      643,  643,    0,  643,    0,  643,  643,  643,  643,    0,
+        0,  643,  643,  643,  643,  644,  644,    0,  644,    0,
+        0,  644,  646,    0,    0,  646,  646,    0,  646,    0,
+      646,  646,  646,  646,    0,    0,  646,  646,  646,  646,
+      647,    0,    0,  647,  647,    0,  647,    0,  647,  647,
+      647,  647,    0,  647,  647,    0,  647,  647,  649,    0,
+        0,  649,    0,    0,  649,    0,  649,  649,  649,  649,
+
+      649,    0,  649,  649,  649,  649,  650,  650,  650,  650,
+      650,  650,  650,  650,  650,  650,  650,  650,  650,  650,
+      650,  650,  650,  650,  651,  651,    0,  651,    0,  651,
+      651,  651,  651,  651,  651,  651,  651,  651,  651,  651,
+      651,  651,  652,  652,  652,  652,  652,  652,  652,  652,
+      652,  652,  652,  652,  652,  652,  652,  652,  652,  652,
+      653,  653,    0,  653,  653,  653,  653,  653,  653,  653,
+      653,  653,  653,  653,  653,  653,  653,  653,  655,    0,
+        0,    0,    0,  655,    0,    0,  655,  655,  655,  655,
+        0,    0,  655,  655,  655,  655,  656,    0,    0,  656,
+
+      656,    0,  656,    0,  656,  656,  656,  656,    0,    0,
+      656,  656,  656,  656,  657,  657,    0,  657,    0,    0,
+      657,  658,  658,  658,    0,  658,    0,    0,  658,  659,
+        0,    0,  659,  659,    0,  659,    0,  659,  659,  659,
+      659,    0,    0,  659,  659,  659,  659,  660,  660,  660,
+      660,  660,  660,  660,  660,  660,  660,  660,  660,  660,
+      660,  660,  660,  660,  660,  661,  661,    0,  661,    0,
+        0,  661,  662,  662,  662,    0,  662,    0,    0,  662,
+      663,  663,    0,  663,    0,    0,  663,  664,  664,    0,
+      664,    0,    0,  664,  665,  665,    0,  665,    0,    0,
+
+      665,  666,  666,  666,    0,  666,    0,    0,  666,  667,
+      667,    0,  667,    0,    0,  667,  668,  668,    0,  668,
+        0,    0,  668,  669,  669,    0,  669,    0,    0,  669,
+      670,  670,  670,    0,  670,    0,    0,  670,  671,  671,
+      671,  671,    0,  671,    0,    0,  671,  672,  672,    0,
+      672,    0,    0,  672,  673,  673,    0,  673,    0,    0,
+      673,  674,  674,    0,  674,    0,    0,  674,  677,  677,
+      677,    0,  677,    0,    0,  677,  678,  678,  678,  678,
+        0,  678,    0,    0,  678,  679,  679,    0,  679,    0,
+        0,  679,  680,  680,    0,  680,    0,    0,  680,  681,
+
+      681,  681,    0,  681,    0,    0,  681,  682,  682,  682,
+      682,    0,  682,    0,    0,  682,  683,  683,    0,  683,
+        0,    0,  683,  684,    0,  684,  684,    0,  684,    0,
+        0,  684,  687,  687,  687,    0,  687,    0,    0,  687,
+      688,  688,  688,  688,    0,  688,    0,    0,  688,  691,
+      691,    0,  691,    0,    0,  691,  692,    0,  692,  692,
+        0,  692,    0,    0,  692,  694,  694,  694,    0,  694,
+        0,    0,  694,  695,  695,  695,    0,    0,  695,    0,
+        0,  695,  696,  696,  696,  696,  696,  696,  696,  696,
+      696,  696,  696,  696,  696,  696,  696,  696,  696,  696,
+
+      697,  697,    0,  697,  697,  697,    0,    0,  697,  697,
+      697,  697,    0,    0,  697,  697,  697,  697,  698,  698,
+        0,  698,  698,  698,    0,    0,  698,  698,  698,  698,
+        0,    0,  698,  698,  698,  698,  699,  699,    0,  699,
+        0,    0,  699,  700,    0,  700,  700,    0,  700,    0,
+        0,  700,  703,  703,    0,    0,  703,    0,    0,  703,
+      707,  707,    0,  707,    0,    0,  707,  708,    0,  708,
+      708,    0,  708,    0,    0,  708,  709,    0,    0,  709,
+        0,    0,  709,  710,  710,    0,  710,    0,    0,  710,
+      711,    0,  711,    0,    0,  711,    0,    0,  711,  712,
+
+      712,  712,  712,  712,  712,  712,  712,  712,  712,  712,
+      712,  712,  712,  712,  712,  712,  712,  713,    0,    0,
+      713,    0,    0,  713,  634,  634,  634,  634,  634,  634,
+      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
+      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
+      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
+      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
+      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
+      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
+      634,  634,  634,  634,  634
+
     } ;
 
 static yy_state_type yy_last_accepting_state;
@@ -1527,7 +1610,7 @@ int (*trace_print)(const char *msg) = sudoers_trace_print;
 
 #define INSTR 5
 
-#line 1530 "lex.sudoers.c"
+#line 1613 "lex.sudoers.c"
 
 /* Macros after this point can all be overridden by user definitions in
  * section 1.
@@ -1683,7 +1766,7 @@ YY_DECL
 
 #line 132 "toke.l"
 
-#line 1686 "lex.sudoers.c"
+#line 1769 "lex.sudoers.c"
 
        if ( yy_init )
                {
@@ -1735,13 +1818,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 >= 622 )
+                               if ( yy_current_state >= 635 )
                                        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] != 3595 );
+               while ( yy_base[yy_current_state] != 3925 );
 
 yy_find_action:
                yy_act = yy_accept[yy_current_state];
@@ -2303,6 +2386,7 @@ case 45:
 YY_RULE_SETUP
 #line 532 "toke.l"
 {
+                           /* XXX - no way to specify digest for command */
                            /* no command args allowed for Defaults!/path */
                            if (!fill_cmnd(sudoerstext, sudoersleng))
                                yyterminate();
@@ -2312,7 +2396,39 @@ YY_RULE_SETUP
        YY_BREAK
 case 46:
 YY_RULE_SETUP
-#line 540 "toke.l"
+#line 541 "toke.l"
+{
+                           LEXTRACE("SHA224 ");
+                           LEXRETURN(SHA224);
+                       }
+       YY_BREAK
+case 47:
+YY_RULE_SETUP
+#line 546 "toke.l"
+{
+                           LEXTRACE("SHA256 ");
+                           LEXRETURN(SHA256);
+                       }
+       YY_BREAK
+case 48:
+YY_RULE_SETUP
+#line 551 "toke.l"
+{
+                           LEXTRACE("SHA384 ");
+                           LEXRETURN(SHA384);
+                       }
+       YY_BREAK
+case 49:
+YY_RULE_SETUP
+#line 556 "toke.l"
+{
+                           LEXTRACE("SHA512 ");
+                           LEXRETURN(SHA512);
+                       }
+       YY_BREAK
+case 50:
+YY_RULE_SETUP
+#line 561 "toke.l"
 {
                            BEGIN GOTCMND;
                            LEXTRACE("COMMAND ");
@@ -2320,9 +2436,9 @@ YY_RULE_SETUP
                                yyterminate();
                        }                       /* sudo -e */
        YY_BREAK
-case 47:
+case 51:
 YY_RULE_SETUP
-#line 547 "toke.l"
+#line 568 "toke.l"
 {
                            /* directories can't have args... */
                            if (sudoerstext[sudoersleng - 1] == '/') {
@@ -2338,9 +2454,9 @@ YY_RULE_SETUP
                            }
                        }                       /* a pathname */
        YY_BREAK
-case 48:
+case 52:
 YY_RULE_SETUP
-#line 562 "toke.l"
+#line 583 "toke.l"
 {
                            LEXTRACE("BEGINSTR ");
                            sudoerslval.string = NULL;
@@ -2348,9 +2464,9 @@ YY_RULE_SETUP
                            BEGIN INSTR;
                        }
        YY_BREAK
-case 49:
+case 53:
 YY_RULE_SETUP
-#line 569 "toke.l"
+#line 590 "toke.l"
 {
                            /* a word */
                            if (!fill(sudoerstext, sudoersleng))
@@ -2359,49 +2475,49 @@ YY_RULE_SETUP
                            LEXRETURN(WORD);
                        }
        YY_BREAK
-case 50:
+case 54:
 YY_RULE_SETUP
-#line 577 "toke.l"
+#line 598 "toke.l"
 {
                            LEXTRACE("( ");
                            LEXRETURN('(');
                        }
        YY_BREAK
-case 51:
+case 55:
 YY_RULE_SETUP
-#line 582 "toke.l"
+#line 603 "toke.l"
 {
                            LEXTRACE(") ");
                            LEXRETURN(')');
                        }
        YY_BREAK
-case 52:
+case 56:
 YY_RULE_SETUP
-#line 587 "toke.l"
+#line 608 "toke.l"
 {
                            LEXTRACE(", ");
                            LEXRETURN(',');
                        }                       /* return ',' */
        YY_BREAK
-case 53:
+case 57:
 YY_RULE_SETUP
-#line 592 "toke.l"
+#line 613 "toke.l"
 {
                            LEXTRACE("= ");
                            LEXRETURN('=');
                        }                       /* return '=' */
        YY_BREAK
-case 54:
+case 58:
 YY_RULE_SETUP
-#line 597 "toke.l"
+#line 618 "toke.l"
 {
                            LEXTRACE(": ");
                            LEXRETURN(':');
                        }                       /* return ':' */
        YY_BREAK
-case 55:
+case 59:
 YY_RULE_SETUP
-#line 602 "toke.l"
+#line 623 "toke.l"
 {
                            if (sudoersleng & 1) {
                                LEXTRACE("!");
@@ -2409,9 +2525,9 @@ YY_RULE_SETUP
                            }
                        }
        YY_BREAK
-case 56:
+case 60:
 YY_RULE_SETUP
-#line 609 "toke.l"
+#line 630 "toke.l"
 {
                            if (YY_START == INSTR) {
                                LEXTRACE("ERROR ");
@@ -2424,25 +2540,25 @@ YY_RULE_SETUP
                            LEXRETURN(COMMENT);
                        }                       /* return newline */
        YY_BREAK
-case 57:
+case 61:
 YY_RULE_SETUP
-#line 621 "toke.l"
+#line 642 "toke.l"
 {                      /* throw away space/tabs */
                            sawspace = true;    /* but remember for fill_args */
                        }
        YY_BREAK
-case 58:
+case 62:
 YY_RULE_SETUP
-#line 625 "toke.l"
+#line 646 "toke.l"
 {
                            sawspace = true;    /* remember for fill_args */
                            sudolineno++;
                            continued = true;
                        }                       /* throw away EOL after \ */
        YY_BREAK
-case 59:
+case 63:
 YY_RULE_SETUP
-#line 631 "toke.l"
+#line 652 "toke.l"
 {
                            BEGIN INITIAL;
                            sudolineno++;
@@ -2451,9 +2567,9 @@ YY_RULE_SETUP
                            LEXRETURN(COMMENT);
                        }                       /* comment, not uid/gid */
        YY_BREAK
-case 60:
+case 64:
 YY_RULE_SETUP
-#line 639 "toke.l"
+#line 660 "toke.l"
 {
                            LEXTRACE("ERROR ");
                            LEXRETURN(ERROR);
@@ -2465,7 +2581,7 @@ case YY_STATE_EOF(GOTCMND):
 case YY_STATE_EOF(STARTDEFS):
 case YY_STATE_EOF(INDEFS):
 case YY_STATE_EOF(INSTR):
-#line 644 "toke.l"
+#line 665 "toke.l"
 {
                            if (YY_START != INITIAL) {
                                BEGIN INITIAL;
@@ -2476,12 +2592,12 @@ case YY_STATE_EOF(INSTR):
                                yyterminate();
                        }
        YY_BREAK
-case 61:
+case 65:
 YY_RULE_SETUP
-#line 654 "toke.l"
+#line 675 "toke.l"
 ECHO;
        YY_BREAK
-#line 2484 "lex.sudoers.c"
+#line 2600 "lex.sudoers.c"
 
        case YY_END_OF_BUFFER:
                {
@@ -2772,7 +2888,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 >= 622 )
+                       if ( yy_current_state >= 635 )
                                yy_c = yy_meta[(unsigned int) yy_c];
                        }
                yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@@ -2807,11 +2923,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 >= 622 )
+               if ( yy_current_state >= 635 )
                        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 == 621);
+       yy_is_jam = (yy_current_state == 634);
 
        return yy_is_jam ? 0 : yy_current_state;
        }
@@ -3372,7 +3488,7 @@ int main()
        return 0;
        }
 #endif
-#line 654 "toke.l"
+#line 675 "toke.l"
 
 struct path_list {
     char *path;
index 012d3780a80000968697b11852949540fa2b413e..b90bb77da6352d4509fbf3dafdd7aca1bef2d585 100644 (file)
@@ -530,6 +530,7 @@ ALL {
                        }
 
 <GOTDEFS>({PATH}|sudoedit) {
+                           /* XXX - no way to specify digest for command */
                            /* no command args allowed for Defaults!/path */
                            if (!fill_cmnd(sudoerstext, sudoersleng))
                                yyterminate();
@@ -537,6 +538,26 @@ ALL {
                            LEXRETURN(COMMAND);
                        }
 
+sha224                 {
+                           LEXTRACE("SHA224 ");
+                           LEXRETURN(SHA224);
+                       }
+
+sha256                 {
+                           LEXTRACE("SHA256 ");
+                           LEXRETURN(SHA256);
+                       }
+
+sha384                 {
+                           LEXTRACE("SHA384 ");
+                           LEXRETURN(SHA384);
+                       }
+
+sha512                 {
+                           LEXTRACE("SHA512 ");
+                           LEXRETURN(SHA512);
+                       }
+
 sudoedit               {
                            BEGIN GOTCMND;
                            LEXTRACE("COMMAND ");
index e717e946f533d1fc19d0418713227eb711675088..703267cf34eee5b85aa4b1fa7ac49bf36a8d6138 100644 (file)
 static int arg_len = 0;
 static int arg_size = 0;
 
-static int
-hexchar(const char *s)
-{
-    int i, result = 0;
-    debug_decl(hexchar, SUDO_DEBUG_PARSER)
-
-    s += 2; /* skip \\x */
-    for (i = 0; i < 2; i++) {
-       switch (*s) {
-       case 'A':
-       case 'a':
-           result += 10;
-           break;
-       case 'B':
-       case 'b':
-           result += 11;
-           break;
-       case 'C':
-       case 'c':
-           result += 12;
-           break;
-       case 'D':
-       case 'd':
-           result += 13;
-           break;
-       case 'E':
-       case 'e':
-           result += 14;
-           break;
-       case 'F':
-       case 'f':
-           result += 15;
-           break;
-       default:
-           result += *s - '0';
-           break;
-       }
-       if (i == 0) {
-           result *= 16;
-           s++;
-       }
-    }
-    debug_return_int(result);
-}
-
 bool
 fill_txt(const char *src, int len, int olen)
 {
@@ -123,7 +78,7 @@ fill_txt(const char *src, int len, int olen)
            if (src[1] == 'x' && len >= 3 && 
                isxdigit((unsigned char) src[2]) &&
                isxdigit((unsigned char) src[3])) {
-               *dst++ = hexchar(src);
+               *dst++ = hexchar(src + 2);
                src += 4;
                len -= 3;
            } else {