]> granicus.if.org Git - sudo/commitdiff
Add support for command-specific Defaults entries. E.g.
authorTodd C. Miller <Todd.Miller@courtesan.com>
Fri, 19 Nov 2004 21:35:12 +0000 (21:35 +0000)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Fri, 19 Nov 2004 21:35:12 +0000 (21:35 +0000)
    Defaults!/usr/bin/vi noexec

defaults.c
defaults.h
gram.c
gram.h
gram.y
mon_systrace.c
sudo.c
testsudoers.c
toke.c
toke.l
visudo.c

index 6d2bb3aa8eea566649b8cfb9b2423dec157eabaf..93295a618c94cee3e36e219b0e7942f02b5cff16 100644 (file)
@@ -495,14 +495,18 @@ init_defaults()
 
 /*
  * Update the defaults based on what was set by sudoers.
+ * If skip_cmnd is 1, skip DEFAULTS_CMND, if it is 0, skip all others.
  * Returns TRUE on success and FALSE on failure.
  */
 int
-update_defaults()
+update_defaults(skip_cmnd)
+    int skip_cmnd;
 {
     struct defaults *def;
 
     for (def = defaults; def != NULL; def = def->next) {
+       if (skip_cmnd == (def->type == DEFAULTS_CMND))
+           continue;
        switch (def->type) {
            case DEFAULTS:
                if (!set_default(def->var, def->val, def->op))
@@ -522,6 +526,10 @@ update_defaults()
                    !set_default(def->var, def->val, def->op))
                    return(FALSE);
                break;
+           case DEFAULTS_CMND:
+               if (cmnd_matches(def->binding) &&
+                   !set_default(def->var, def->val, def->op))
+                   return(FALSE);
        }
     }
     return(TRUE);
index 8d2a04485190de4df341289493abe6762c9ee229..ad0f1043dadfd5efea1dd113a7991e856e1d0087 100644 (file)
@@ -90,13 +90,20 @@ struct sudo_defs_types {
 #undef T_PATH
 #define T_PATH         0x200
 
+/*
+ * Argument to update_defaults()
+ */
+#define        SKIP_CMND       1
+#define        ONLY_CMND       0
+#define        SET_ALL         -1
+
 /*
  * Prototypes
  */
 void dump_default      __P((void));
 int set_default                __P((char *, char *, int));
 void init_defaults     __P((void));
-int update_defaults    __P((void));
+int update_defaults    __P((int));
 void list_options      __P((void));
 
 extern struct sudo_defs_types sudo_defs_table[];
diff --git a/gram.c b/gram.c
index 3afdb82d4a005918eed2d1b6ab167cbd3bc0ce6e..ad63699609d06e3a64294d0c816e0a8afd00dd1c 100644 (file)
--- a/gram.c
+++ b/gram.c
@@ -139,20 +139,21 @@ typedef union {
 #define DEFAULTS_HOST 265
 #define DEFAULTS_USER 266
 #define DEFAULTS_RUNAS 267
-#define RUNAS 268
-#define NOPASSWD 269
-#define PASSWD 270
-#define NOEXEC 271
-#define EXEC 272
-#define MONITOR 273
-#define NOMONITOR 274
-#define ALL 275
-#define COMMENT 276
-#define HOSTALIAS 277
-#define CMNDALIAS 278
-#define USERALIAS 279
-#define RUNASALIAS 280
-#define ERROR 281
+#define DEFAULTS_CMND 268
+#define RUNAS 269
+#define NOPASSWD 270
+#define PASSWD 271
+#define NOEXEC 272
+#define EXEC 273
+#define MONITOR 274
+#define NOMONITOR 275
+#define ALL 276
+#define COMMENT 277
+#define HOSTALIAS 278
+#define CMNDALIAS 279
+#define USERALIAS 280
+#define RUNASALIAS 281
+#define ERROR 282
 #define YYERRCODE 256
 #if defined(__cplusplus) || defined(__STDC__)
 const short yylhs[] =
@@ -161,14 +162,14 @@ short yylhs[] =
 #endif
        {                                        -1,
     0,    0,   21,   21,   22,   22,   22,   22,   22,   22,
-   22,   22,   22,   22,   22,    4,    4,    3,    3,    3,
-    3,    3,   19,   19,   18,   10,   10,    8,    8,    8,
-    8,    8,    2,    2,    1,    6,    6,   14,   14,   13,
-   13,   11,   11,   15,   15,   15,   15,   15,   20,   20,
-   20,   20,   20,   20,   20,    5,    5,    5,   24,   24,
-   27,    9,    9,   25,   25,   28,    7,    7,   26,   26,
-   29,   23,   23,   30,   17,   17,   12,   12,   16,   16,
-   16,   16,   16,
+   22,   22,   22,   22,   22,   22,    4,    4,    3,    3,
+    3,    3,    3,   19,   19,   18,   10,   10,    8,    8,
+    8,    8,    8,    2,    2,    1,    6,    6,   14,   14,
+   13,   13,   11,   11,   15,   15,   15,   15,   15,   20,
+   20,   20,   20,   20,   20,   20,    5,    5,    5,   24,
+   24,   27,    9,    9,   25,   25,   28,    7,    7,   26,
+   26,   29,   23,   23,   30,   17,   17,   12,   12,   16,
+   16,   16,   16,   16,
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const short yylen[] =
@@ -177,14 +178,14 @@ short yylen[] =
 #endif
        {                                         2,
     0,    1,    1,    2,    1,    2,    2,    2,    2,    2,
-    2,    2,    3,    3,    3,    1,    3,    1,    2,    3,
-    3,    3,    1,    3,    3,    1,    2,    1,    1,    1,
-    1,    1,    1,    3,    3,    1,    2,    0,    2,    1,
-    3,    1,    2,    1,    1,    1,    1,    1,    0,    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,
+    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,    3,    1,    2,    0,    2,
+    1,    3,    1,    2,    1,    1,    1,    1,    1,    0,
+    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,
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const short yydefred[] =
@@ -192,29 +193,29 @@ const short yydefred[] =
 short yydefred[] =
 #endif
        {                                      0,
-    0,   79,   81,   82,   83,    0,    0,    0,    0,   80,
-    5,    0,    0,    0,    0,    0,    0,   75,   77,    0,
-    0,    3,    6,    0,    0,   16,    0,   28,   31,   30,
-   32,   29,    0,   26,    0,   62,    0,   44,   46,   47,
-   48,   45,    0,   40,    0,   42,    0,    0,   59,    0,
-    0,   64,    0,    0,   72,    0,    0,   69,   78,    0,
-    0,   23,    0,    4,    0,    0,    0,   19,    0,   27,
-    0,    0,    0,   43,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,   76,    0,    0,   20,   21,   22,
-   17,   63,   41,    0,   60,   58,   57,   56,    0,   36,
-   67,    0,   65,    0,   73,    0,   70,    0,   33,    0,
-   49,   24,   37,    0,    0,    0,    0,   68,   34,   50,
-   51,   52,   53,   54,   55,   35,
+    0,   80,   82,   83,   84,    0,    0,    0,    0,    0,
+   81,    5,    0,    0,    0,    0,    0,    0,   76,   78,
+    0,    0,    3,    6,    0,    0,   17,    0,   29,   32,
+   31,   33,   30,    0,   27,    0,   63,    0,   45,   47,
+   48,   49,   46,    0,   41,    0,   43,   59,   58,   57,
+    0,   37,   68,    0,    0,    0,   60,    0,    0,   65,
+    0,    0,   73,    0,    0,   70,   79,    0,    0,   24,
+    0,    4,    0,    0,    0,   20,    0,   28,    0,    0,
+    0,   44,    0,    0,   38,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,   77,    0,    0,   21,   22,
+   23,   18,   64,   42,   69,    0,   61,    0,   66,    0,
+   74,    0,   71,    0,   34,    0,   50,   25,    0,    0,
+    0,   35,   51,   52,   53,   54,   55,   56,   36,
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const short yydgoto[] =
 #else
 short yydgoto[] =
 #endif
-       {                                      17,
-  109,  110,   26,   27,  100,  101,  102,   34,   61,   36,
-   44,   18,   45,  111,   46,   19,   20,   62,   63,  117,
-   21,   22,   54,   48,   51,   57,   49,   52,   58,   55,
+       {                                      18,
+  115,  116,   27,   28,   52,   53,   54,   35,   69,   37,
+   45,   19,   46,  117,   47,   20,   21,   70,   71,  121,
+   22,   23,   62,   56,   59,   65,   57,   60,   66,   63,
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const short yysindex[] =
@@ -222,122 +223,143 @@ const short yysindex[] =
 short yysindex[] =
 #endif
        {                                    -33,
- -270,    0,    0,    0,    0,   11,   88,  114,  140,    0,
-    0, -237, -234, -231, -226, -244,    0,    0,    0,   62,
-  -33,    0,    0,  -38, -224,    0,   -8,    0,    0,    0,
-    0,    0, -221,    0,  -24,    0,  -11,    0,    0,    0,
-    0,    0, -215,    0,   -3,    0,  -23,   -9,    0,   -5,
  -1,    0,    2,    4,    0,    3,    7,    0,    0,  114,
-  -36,    0,    8,    0, -213, -208, -205,    0,   11,    0,
-   88,   -8,   -8,    0,  140,   -8,   88, -237,  -17, -234,
-  114, -231,  140, -226,    0, -201,   88,    0,    0,    0,
   0,    0,    0,   24,    0,    0,    0,    0, -247,    0,
-    0,   25,    0,   27,    0,   28,    0,  140,    0,   30,
-    0,    0,    0,  -17,   28, -201,  -20,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,};
+ -275,    0,    0,    0,    0,  -10,   -5,  265,  292,  253,
+    0,    0, -253, -251, -250, -248, -243,    0,    0,    0,
+  -22,  -33,    0,    0,  -13, -242,    0,  -28,    0,    0,
+    0,    0,    0, -211,    0,  -19,    0,   -9,    0,    0,
+    0,    0,    0, -222,    0,   -7,    0,    0,    0,    0,
-245,    0,    0,   13,  -40,  -15,    0,  -17,   -3,    0,
+    2,    3,    0,    6,    4,    0,    0,  265,   -2,    0,
+   10,    0, -212, -199, -194,    0,  -10,    0,   -5,  -28,
+  -28,    0,  292,  -28,    0,  253,  -28,   -5, -253,  253,
-251,  265, -250,  292, -248,    0, -198,   -5,    0,    0,
+    0,    0,    0,    0,    0,   26,    0,   28,    0,   29,
+    0,   31,    0,  292,    0,   32,    0,    0,   31, -198,
+  263,    0,    0,    0,    0,    0,    0,    0,    0,};
 #if defined(__cplusplus) || defined(__STDC__)
 const short yyrindex[] =
 #else
 short yyrindex[] =
 #endif
-       {                                     70,
+       {                                     77,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,   78,    0,    0,    1,    0,    0,  157,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-   76,    0,    0,    1,    0,    0,  156,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,  181,    0,    0,
-  206,    0,    0,  236,    0,    0,  261,    0,    0,    0,
-    0,    0,  300,    0,    0,    0,    0,    0,    0,    0,
-    0,  326,  352,    0,    0,  378,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,  274,    0,    0,    0,    0,
-    0,    0,    0,   26,    0,    0,    0,    0,    0,    0,
-    0,   52,    0,   78,    0,  104,    0,    0,    0,  130,
-    0,    0,    0,    0,  391,  274,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,};
+    0,    0,    0,    0,    0,  183,    0,    0,  209,    0,
+    0,  237,    0,    0,  458,    0,    0,    0,    0,    0,
+  492,    0,    0,    0,    0,    0,    0,    0,    0,  519,
+  545,    0,    0,  571,    0,    0,  597,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,  289,    0,    0,    0,
+    0,    0,    0,    0,    0,   27,    0,   53,    0,   79,
+    0,  105,    0,    0,    0,  131,    0,    0,  315,  289,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,};
 #if defined(__cplusplus) || defined(__STDC__)
 const short yygindex[] =
 #else
 short yygindex[] =
 #endif
        {                                      0,
-  -39,    0,   10,   16,  -19, -102,    0,   48,   -4,   12,
-   13,   22,  -79,    0,   43,   71,   -6,    5,    0,    0,
-    0,   68,    0,    0,    0,    0,   15,   14,    6,    9,
+  -39,    0,    5,   20,   33,  -83,    7,   46,   -1,   11,
+    8,   15,  -85,    0,   45,   75,   -4,    9,    0,    0,
+    0,   71,    0,    0,    0,    0,   12,   17,   14,   21,
 };
-#define YYTABLESIZE 666
+#define YYTABLESIZE 878
 #if defined(__cplusplus) || defined(__STDC__)
 const short yytable[] =
 #else
 short yytable[] =
 #endif
-       {                                      16,
-   18,   37,   35,  106,   66,   23,   67,   71,   25,   96,
-   97,  118,   99,    2,  126,   99,    3,    4,    5,   71,
-   47,   25,   65,   50,   86,   61,   53,   98,  115,   25,
-   10,   56,   60,   18,   68,   69,   28,   77,   29,   30,
-   75,   31,   38,   25,   18,   39,   40,   41,   78,   88,
-   72,   66,   73,   32,   89,   79,   80,   90,   61,   42,
-   76,   82,   81,   83,   84,   87,  108,   71,  114,    1,
-   60,   75,   94,  116,  104,    2,  119,   74,   91,  113,
-   70,   85,   92,   61,   66,   74,   59,   93,   64,  107,
-  105,  112,   95,  103,   33,    0,    0,    0,    0,    0,
-    0,    0,    0,   71,    0,   60,    0,    0,    0,   66,
-   74,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-   33,    0,    0,    0,    0,    0,    0,    0,    0,   25,
-    0,    0,    0,    0,    0,   74,   71,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,   16,    0,    0,    0,
-    0,    0,    0,    0,    0,   12,    0,    0,    0,    0,
-    0,   71,   25,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,   43,    0,    0,    0,    0,    0,    0,    0,
-    9,    0,    0,    0,    0,    0,    0,   25,   12,    0,
+       {                                      17,
+   19,   24,  105,   38,   55,   36,   58,   61,  112,   64,
+   34,   48,   49,   26,    2,   77,   76,    3,    4,    5,
+   88,   68,   26,   26,   79,   26,   62,   34,  119,   74,
+   50,   75,   11,   19,   68,   39,   83,  129,   40,   41,
+   42,   79,   89,   90,   19,   26,   29,   73,   30,   31,
+   99,   32,   67,   43,   91,   80,   86,   81,   97,   62,
+   93,   95,   92,  100,   33,   84,   94,   98,  101,   79,
+  114,   86,   68,   87,   83,  120,    1,    2,   75,   78,
+  122,  102,   96,   85,   62,   67,  106,  110,   82,  103,
+  104,   67,   72,    0,    0,    0,  108,    0,    0,    0,
+  107,    0,    0,    0,   72,    0,  118,  109,  113,    0,
+   67,   75,    0,  111,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+   26,    0,    0,    0,    0,    0,   75,   72,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,   10,    0,    0,    0,    0,
-    0,    0,    0,    9,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,   12,    0,    0,    0,
+    0,    0,   72,   26,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    9,    0,    0,    0,    0,    0,   26,   12,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,   10,    0,
+    0,    0,    0,    0,    0,    9,    0,    0,    0,    0,
     0,    0,    1,    0,    2,    0,    0,    3,    4,    5,
-    6,    7,    8,    9,   24,    8,   96,   97,   10,   96,
-   97,   10,   11,   12,   13,   14,   15,   24,  120,  121,
-  122,  123,  124,  125,   98,   24,   18,   98,   18,    0,
-   11,   18,   18,   18,   18,   18,   18,   18,    8,   24,
-    0,    0,    0,    0,    0,   18,   18,   18,   18,   18,
-   18,   61,    0,   61,    0,    0,   61,   61,   61,   61,
-   61,   61,   61,   11,    0,    0,    0,    0,    0,    7,
-   61,   61,   61,   61,   61,   61,   38,   66,    0,   66,
-    0,    0,   66,   66,   66,   66,   66,   66,   66,   28,
-    0,   29,   30,    0,   31,   15,   66,   66,   66,   66,
-   66,   66,    7,   74,    0,   74,   32,    0,   74,   74,
-   74,   74,   74,   74,   74,   28,    0,   29,   30,    0,
-   31,   13,   74,   74,   74,   74,   74,   74,   15,   71,
-    0,   71,   32,    0,   71,   71,   71,   71,   71,   71,
-   71,    2,    0,    0,    3,    4,    5,   14,   71,   71,
-   71,   71,   71,   71,   13,   25,    0,   25,   10,    0,
-   25,   25,   25,   25,   25,   25,   25,   38,    0,    0,
-   39,   40,   41,    0,   25,   25,   25,   25,   25,   25,
-   14,   12,    0,   12,   42,    0,   12,   12,   12,   12,
-   12,   12,   12,   39,    0,    0,    0,    0,    0,    0,
-   12,   12,   12,   12,   12,   12,    9,    0,    9,    0,
-    0,    9,    9,    9,    9,    9,    9,    9,    0,    0,
-    0,    0,    0,    0,    0,    9,    9,    9,    9,    9,
-    9,   10,    0,   10,    0,    0,   10,   10,   10,   10,
-   10,   10,   10,    0,    0,    0,    0,    0,    0,    0,
-   10,   10,   10,   10,   10,   10,    0,    0,    0,    0,
-    0,    8,    0,    8,    0,    0,    8,    8,    8,    8,
-    8,    8,    8,    0,    0,    0,    0,    0,    0,    0,
-    8,    8,    8,    8,    8,    8,   11,    0,   11,    0,
-    0,   11,   11,   11,   11,   11,   11,   11,    0,    0,
-   38,   38,    0,    0,    0,   11,   11,   11,   11,   11,
-   11,    0,   38,   38,   38,   38,   38,   38,   38,    0,
-    0,    0,    0,    0,    0,    7,    0,    7,    0,    0,
-    7,    7,    7,    7,    7,    7,    7,    0,    0,    0,
-    0,    0,    0,    0,    7,    7,    7,    7,    7,    7,
-    0,   15,    0,   15,    0,    0,   15,   15,   15,   15,
-   15,   15,   15,    0,    0,    0,    0,    0,    0,    0,
-   15,   15,   15,   15,   15,   15,    0,   13,    0,   13,
-    0,    0,   13,   13,   13,   13,   13,   13,   13,    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,    0,    0,   39,   39,    0,
-    0,    0,   14,   14,   14,   14,   14,   14,    0,   39,
-   39,   39,   39,   39,   39,   39,
+    6,    7,    8,    9,   10,   29,    8,   30,   31,   25,
+   32,   10,   11,   12,   13,   14,   15,   16,   25,   25,
+    0,   25,   29,   33,   30,   31,   19,   32,   19,    0,
+    0,   19,   19,   19,   19,   19,   19,   19,   19,    8,
+   33,   25,    0,    0,    0,    0,   19,   19,   19,   19,
+   19,   19,   62,    0,   62,   51,    0,   62,   62,   62,
+   62,   62,   62,   62,   62,   51,    0,   17,    0,    0,
+    0,    0,   62,   62,   62,   62,   62,   62,   67,    0,
+   67,    0,    0,   67,   67,   67,   67,   67,   67,   67,
+   67,   39,    0,    0,   44,    0,    0,    0,   67,   67,
+   67,   67,   67,   67,   75,    0,   75,    0,    0,   75,
+   75,   75,   75,   75,   75,   75,   75,   40,    0,    0,
+    0,    0,    0,    0,   75,   75,   75,   75,   75,   75,
+   72,    0,   72,    0,    0,   72,   72,   72,   72,   72,
+   72,   72,   72,    0,    0,    0,    0,    0,    0,    0,
+   72,   72,   72,   72,   72,   72,   26,    0,   26,    0,
+    0,   26,   26,   26,   26,   26,   26,   26,   26,    0,
+    0,    0,    0,    0,    0,    0,   26,   26,   26,   26,
+   26,   26,   12,    0,   12,    0,    0,   12,   12,   12,
+   12,   12,   12,   12,   12,    0,    0,    0,    0,    0,
+    0,    0,   12,   12,   12,   12,   12,   12,    9,    0,
+    9,    0,    0,    9,    9,    9,    9,    9,    9,    9,
+    9,    0,    0,    0,    0,    0,    0,   11,    9,    9,
+    9,    9,    9,    9,   10,    0,   10,    0,    0,   10,
+   10,   10,   10,   10,   10,   10,   10,    0,    0,    0,
+    0,    0,    0,    0,   10,   10,   10,   10,   10,   10,
+   11,    7,    8,    0,    8,    0,    0,    8,    8,    8,
+    8,    8,    8,    8,    8,    0,    0,    0,    0,   48,
+   49,    0,    8,    8,    8,    8,    8,    8,   15,   48,
+   49,    0,    2,    0,    7,    3,    4,    5,   50,    0,
+    0,    0,  123,  124,  125,  126,  127,  128,   50,    0,
+   11,    0,    0,    0,   13,   39,   39,    0,    0,   39,
+    0,   15,   40,   41,   42,    0,    0,    0,   39,   39,
+   39,   39,   39,   39,   39,    0,    0,   43,    0,    0,
+   14,   40,   40,    0,    0,    0,    0,   13,    0,    0,
+    0,    0,    0,    0,   40,   40,   40,   40,   40,   40,
+   40,    0,    0,    0,    0,    0,   16,    0,    0,    0,
+    0,    0,    0,   14,    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,   16,
+    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,   11,    0,   11,    0,    0,   11,   11,
+   11,   11,   11,   11,   11,   11,    0,    0,    0,    0,
+    0,    0,    0,   11,   11,   11,   11,   11,   11,    0,
+    0,    0,    0,    0,    0,    0,    0,    7,    0,    7,
+    0,    0,    7,    7,    7,    7,    7,    7,    7,    7,
+    0,    0,    0,    0,    0,    0,    0,    7,    7,    7,
+    7,    7,    7,    0,   15,    0,   15,    0,    0,   15,
+   15,   15,   15,   15,   15,   15,   15,    0,    0,    0,
+    0,    0,    0,    0,   15,   15,   15,   15,   15,   15,
+   13,    0,   13,    0,    0,   13,   13,   13,   13,   13,
+   13,   13,   13,    0,    0,    0,    0,    0,    0,    0,
+   13,   13,   13,   13,   13,   13,   14,    0,   14,    0,
+    0,   14,   14,   14,   14,   14,   14,   14,   14,    0,
+    0,    0,    0,    0,    0,    0,   14,   14,   14,   14,
+   14,   14,   16,    0,   16,    0,    0,   16,   16,   16,
+   16,   16,   16,   16,   16,    0,    0,    0,    0,    0,
+    0,    0,   16,   16,   16,   16,   16,   16,
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const short yycheck[] =
@@ -345,79 +367,100 @@ const short yycheck[] =
 short yycheck[] =
 #endif
        {                                      33,
-    0,    8,    7,   83,   43,  276,   45,   44,   33,  257,
-  258,  114,   33,  258,  117,   33,  261,  262,  263,   44,
-  258,   33,   61,  258,   61,    0,  258,  275,  108,   33,
-  275,  258,   44,   33,  259,   44,  258,   61,  260,  261,
-   44,  263,  258,   33,   44,  261,  262,  263,   58,  263,
-   35,    0,   37,  275,  263,   61,   58,  263,   33,  275,
-   45,   58,   61,   61,   58,   58,  268,   44,   44,    0,
-   44,   44,   77,   44,   81,    0,  116,    0,   69,   99,
-   33,   60,   71,   58,   33,   43,   16,   75,   21,   84,
-   82,   87,   78,   80,   33,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,    0,   -1,   44,   -1,   -1,   -1,   58,
-   33,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   33,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,    0,
-   -1,   -1,   -1,   -1,   -1,   58,   33,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   33,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,    0,   -1,   -1,   -1,   -1,
-   -1,   58,   33,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   33,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-    0,   -1,   -1,   -1,   -1,   -1,   -1,   58,   33,   -1,
+    0,  277,   86,    8,  258,    7,  258,  258,   94,  258,
+   33,  257,  258,   33,  258,   44,  259,  261,  262,  263,
+   61,   44,   33,   33,   44,   33,    0,   33,  114,   43,
+  276,   45,  276,   33,   44,  258,   44,  121,  261,  262,
+  263,   44,   58,   61,   44,   33,  258,   61,  260,  261,
+  263,  263,    0,  276,   58,   36,   44,   38,   61,   33,
+   58,   58,   61,  263,  276,   46,   61,   58,  263,   44,
+  269,   44,   44,   54,   44,   44,    0,    0,    0,   34,
+  120,   77,   68,   51,   58,   33,   88,   92,   44,   79,
+   83,   17,   22,   -1,   -1,   -1,   90,   -1,   -1,   -1,
+   89,   -1,   -1,   -1,    0,   -1,   98,   91,   95,   -1,
+   58,   33,   -1,   93,   -1,   -1,   -1,   -1,   -1,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,    0,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   33,   -1,   -1,   -1,   -1,   -1,   -1,
+    0,   -1,   -1,   -1,   -1,   -1,   58,   33,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,    0,   -1,   -1,   -1,
+   -1,   -1,   58,   33,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,    0,   -1,   -1,   -1,   -1,   -1,   58,   33,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,    0,   -1,
+   -1,   -1,   -1,   -1,   -1,   33,   -1,   -1,   -1,   -1,
    -1,   -1,  256,   -1,  258,   -1,   -1,  261,  262,  263,
-  264,  265,  266,  267,  259,    0,  257,  258,   33,  257,
-  258,  275,  276,  277,  278,  279,  280,  259,  269,  270,
-  271,  272,  273,  274,  275,  259,  256,  275,  258,   -1,
-    0,  261,  262,  263,  264,  265,  266,  267,   33,  259,
-   -1,   -1,   -1,   -1,   -1,  275,  276,  277,  278,  279,
-  280,  256,   -1,  258,   -1,   -1,  261,  262,  263,  264,
-  265,  266,  267,   33,   -1,   -1,   -1,   -1,   -1,    0,
-  275,  276,  277,  278,  279,  280,   33,  256,   -1,  258,
-   -1,   -1,  261,  262,  263,  264,  265,  266,  267,  258,
-   -1,  260,  261,   -1,  263,    0,  275,  276,  277,  278,
-  279,  280,   33,  256,   -1,  258,  275,   -1,  261,  262,
-  263,  264,  265,  266,  267,  258,   -1,  260,  261,   -1,
-  263,    0,  275,  276,  277,  278,  279,  280,   33,  256,
-   -1,  258,  275,   -1,  261,  262,  263,  264,  265,  266,
-  267,  258,   -1,   -1,  261,  262,  263,    0,  275,  276,
-  277,  278,  279,  280,   33,  256,   -1,  258,  275,   -1,
-  261,  262,  263,  264,  265,  266,  267,  258,   -1,   -1,
-  261,  262,  263,   -1,  275,  276,  277,  278,  279,  280,
-   33,  256,   -1,  258,  275,   -1,  261,  262,  263,  264,
-  265,  266,  267,   33,   -1,   -1,   -1,   -1,   -1,   -1,
-  275,  276,  277,  278,  279,  280,  256,   -1,  258,   -1,
-   -1,  261,  262,  263,  264,  265,  266,  267,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,  275,  276,  277,  278,  279,
-  280,  256,   -1,  258,   -1,   -1,  261,  262,  263,  264,
-  265,  266,  267,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-  275,  276,  277,  278,  279,  280,   -1,   -1,   -1,   -1,
-   -1,  256,   -1,  258,   -1,   -1,  261,  262,  263,  264,
-  265,  266,  267,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-  275,  276,  277,  278,  279,  280,  256,   -1,  258,   -1,
-   -1,  261,  262,  263,  264,  265,  266,  267,   -1,   -1,
-  257,  258,   -1,   -1,   -1,  275,  276,  277,  278,  279,
-  280,   -1,  269,  270,  271,  272,  273,  274,  275,   -1,
-   -1,   -1,   -1,   -1,   -1,  256,   -1,  258,   -1,   -1,
-  261,  262,  263,  264,  265,  266,  267,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,  275,  276,  277,  278,  279,  280,
-   -1,  256,   -1,  258,   -1,   -1,  261,  262,  263,  264,
-  265,  266,  267,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-  275,  276,  277,  278,  279,  280,   -1,  256,   -1,  258,
-   -1,   -1,  261,  262,  263,  264,  265,  266,  267,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,  275,  276,  277,  278,
-  279,  280,   -1,  256,   -1,  258,   -1,   -1,  261,  262,
-  263,  264,  265,  266,  267,   -1,   -1,  257,  258,   -1,
-   -1,   -1,  275,  276,  277,  278,  279,  280,   -1,  269,
-  270,  271,  272,  273,  274,  275,
+  264,  265,  266,  267,  268,  258,    0,  260,  261,  259,
+  263,   33,  276,  277,  278,  279,  280,  281,  259,  259,
+   -1,  259,  258,  276,  260,  261,  256,  263,  258,   -1,
+   -1,  261,  262,  263,  264,  265,  266,  267,  268,   33,
+  276,  259,   -1,   -1,   -1,   -1,  276,  277,  278,  279,
+  280,  281,  256,   -1,  258,   33,   -1,  261,  262,  263,
+  264,  265,  266,  267,  268,   33,   -1,   33,   -1,   -1,
+   -1,   -1,  276,  277,  278,  279,  280,  281,  256,   -1,
+  258,   -1,   -1,  261,  262,  263,  264,  265,  266,  267,
+  268,   33,   -1,   -1,   33,   -1,   -1,   -1,  276,  277,
+  278,  279,  280,  281,  256,   -1,  258,   -1,   -1,  261,
+  262,  263,  264,  265,  266,  267,  268,   33,   -1,   -1,
+   -1,   -1,   -1,   -1,  276,  277,  278,  279,  280,  281,
+  256,   -1,  258,   -1,   -1,  261,  262,  263,  264,  265,
+  266,  267,  268,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+  276,  277,  278,  279,  280,  281,  256,   -1,  258,   -1,
+   -1,  261,  262,  263,  264,  265,  266,  267,  268,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,  276,  277,  278,  279,
+  280,  281,  256,   -1,  258,   -1,   -1,  261,  262,  263,
+  264,  265,  266,  267,  268,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,  276,  277,  278,  279,  280,  281,  256,   -1,
+  258,   -1,   -1,  261,  262,  263,  264,  265,  266,  267,
+  268,   -1,   -1,   -1,   -1,   -1,   -1,    0,  276,  277,
+  278,  279,  280,  281,  256,   -1,  258,   -1,   -1,  261,
+  262,  263,  264,  265,  266,  267,  268,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,  276,  277,  278,  279,  280,  281,
+   33,    0,  256,   -1,  258,   -1,   -1,  261,  262,  263,
+  264,  265,  266,  267,  268,   -1,   -1,   -1,   -1,  257,
+  258,   -1,  276,  277,  278,  279,  280,  281,    0,  257,
+  258,   -1,  258,   -1,   33,  261,  262,  263,  276,   -1,
+   -1,   -1,  270,  271,  272,  273,  274,  275,  276,   -1,
+  276,   -1,   -1,   -1,    0,  257,  258,   -1,   -1,  258,
+   -1,   33,  261,  262,  263,   -1,   -1,   -1,  270,  271,
+  272,  273,  274,  275,  276,   -1,   -1,  276,   -1,   -1,
+    0,  257,  258,   -1,   -1,   -1,   -1,   33,   -1,   -1,
+   -1,   -1,   -1,   -1,  270,  271,  272,  273,  274,  275,
+  276,   -1,   -1,   -1,   -1,   -1,    0,   -1,   -1,   -1,
+   -1,   -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,   -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,   -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,  256,   -1,  258,   -1,   -1,  261,  262,
+  263,  264,  265,  266,  267,  268,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,  276,  277,  278,  279,  280,  281,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,  256,   -1,  258,
+   -1,   -1,  261,  262,  263,  264,  265,  266,  267,  268,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,  276,  277,  278,
+  279,  280,  281,   -1,  256,   -1,  258,   -1,   -1,  261,
+  262,  263,  264,  265,  266,  267,  268,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,  276,  277,  278,  279,  280,  281,
+  256,   -1,  258,   -1,   -1,  261,  262,  263,  264,  265,
+  266,  267,  268,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+  276,  277,  278,  279,  280,  281,  256,   -1,  258,   -1,
+   -1,  261,  262,  263,  264,  265,  266,  267,  268,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,  276,  277,  278,  279,
+  280,  281,  256,   -1,  258,   -1,   -1,  261,  262,  263,
+  264,  265,  266,  267,  268,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,  276,  277,  278,  279,  280,  281,
 };
-#define YYFINAL 17
+#define YYFINAL 18
 #ifndef YYDEBUG
 #define YYDEBUG 0
 #endif
-#define YYMAXTOKEN 281
+#define YYMAXTOKEN 282
 #if YYDEBUG
 #if defined(__cplusplus) || defined(__STDC__)
 const char * const yyname[] =
@@ -433,9 +476,9 @@ char *yyname[] =
 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,
 "COMMAND","ALIAS","DEFVAR","NTWKADDR","NETGROUP","USERGROUP","WORD","DEFAULTS",
-"DEFAULTS_HOST","DEFAULTS_USER","DEFAULTS_RUNAS","RUNAS","NOPASSWD","PASSWD",
-"NOEXEC","EXEC","MONITOR","NOMONITOR","ALL","COMMENT","HOSTALIAS","CMNDALIAS",
-"USERALIAS","RUNASALIAS","ERROR",
+"DEFAULTS_HOST","DEFAULTS_USER","DEFAULTS_RUNAS","DEFAULTS_CMND","RUNAS",
+"NOPASSWD","PASSWD","NOEXEC","EXEC","MONITOR","NOMONITOR","ALL","COMMENT",
+"HOSTALIAS","CMNDALIAS","USERALIAS","RUNASALIAS","ERROR",
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const char * const yyrule[] =
@@ -458,6 +501,7 @@ char *yyrule[] =
 "entry : DEFAULTS_USER userlist defaults_list",
 "entry : DEFAULTS_RUNAS runaslist defaults_list",
 "entry : DEFAULTS_HOST hostlist defaults_list",
+"entry : DEFAULTS_CMND cmndlist defaults_list",
 "defaults_list : defaults_entry",
 "defaults_list : defaults_list ',' defaults_entry",
 "defaults_entry : DEFVAR",
@@ -552,7 +596,7 @@ short *yyss;
 short *yysslim;
 YYSTYPE *yyvs;
 int yystacksize;
-#line 497 "gram.y"
+#line 501 "gram.y"
 /*
  * Add a list of defaults structures to the defaults list.
  * The binding, if non-NULL, specifies a list of hosts, users, or
@@ -682,7 +726,7 @@ init_parser(path, quiet)
     sudolineno = 1;
     verbose = !quiet;
 }
-#line 634 "gram.c"
+#line 678 "gram.c"
 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
 #if defined(__cplusplus) || defined(__STDC__)
 static int yygrowstack(void)
@@ -876,121 +920,127 @@ yyreduce:
     switch (yyn)
     {
 case 1:
-#line 162 "gram.y"
+#line 163 "gram.y"
 { ; }
 break;
 case 5:
-#line 170 "gram.y"
+#line 171 "gram.y"
 {
                            ;
                        }
 break;
 case 6:
-#line 173 "gram.y"
+#line 174 "gram.y"
 {
                            yyerrok;
                        }
 break;
 case 7:
-#line 176 "gram.y"
+#line 177 "gram.y"
 {
                            add_userspec(yyvsp[-1].member, yyvsp[0].privilege);
                        }
 break;
 case 8:
-#line 179 "gram.y"
+#line 180 "gram.y"
 {
                            ;
                        }
 break;
 case 9:
-#line 182 "gram.y"
+#line 183 "gram.y"
 {
                            ;
                        }
 break;
 case 10:
-#line 185 "gram.y"
+#line 186 "gram.y"
 {
                            ;
                        }
 break;
 case 11:
-#line 188 "gram.y"
+#line 189 "gram.y"
 {
                            ;
                        }
 break;
 case 12:
-#line 191 "gram.y"
+#line 192 "gram.y"
 {
                            add_defaults(DEFAULTS, NULL, yyvsp[0].defaults);
                        }
 break;
 case 13:
-#line 194 "gram.y"
+#line 195 "gram.y"
 {
                            add_defaults(DEFAULTS_USER, yyvsp[-1].member, yyvsp[0].defaults);
                        }
 break;
 case 14:
-#line 197 "gram.y"
+#line 198 "gram.y"
 {
                            add_defaults(DEFAULTS_RUNAS, yyvsp[-1].member, yyvsp[0].defaults);
                        }
 break;
 case 15:
-#line 200 "gram.y"
+#line 201 "gram.y"
 {
                            add_defaults(DEFAULTS_HOST, yyvsp[-1].member, yyvsp[0].defaults);
                        }
 break;
-case 17:
-#line 206 "gram.y"
+case 16:
+#line 204 "gram.y"
+{
+                           add_defaults(DEFAULTS_CMND, yyvsp[-1].member, yyvsp[0].defaults);
+                       }
+break;
+case 18:
+#line 210 "gram.y"
 {
                            LIST_APPEND(yyvsp[-2].defaults, yyvsp[0].defaults);
                            yyval.defaults = yyvsp[-2].defaults;
                        }
 break;
-case 18:
-#line 212 "gram.y"
+case 19:
+#line 216 "gram.y"
 {
                            NEW_DEFAULT(yyval.defaults, yyvsp[0].string, NULL, TRUE);
                        }
 break;
-case 19:
-#line 215 "gram.y"
+case 20:
+#line 219 "gram.y"
 {
                            NEW_DEFAULT(yyval.defaults, yyvsp[0].string, NULL, FALSE);
                        }
 break;
-case 20:
-#line 218 "gram.y"
+case 21:
+#line 222 "gram.y"
 {
                            NEW_DEFAULT(yyval.defaults, yyvsp[-2].string, yyvsp[0].string, TRUE);
                        }
 break;
-case 21:
-#line 221 "gram.y"
+case 22:
+#line 225 "gram.y"
 {
                            NEW_DEFAULT(yyval.defaults, yyvsp[-2].string, yyvsp[0].string, '+');
                        }
 break;
-case 22:
-#line 224 "gram.y"
+case 23:
+#line 228 "gram.y"
 {
                            NEW_DEFAULT(yyval.defaults, yyvsp[-2].string, yyvsp[0].string, '-');
                        }
 break;
-case 24:
-#line 230 "gram.y"
+case 25:
+#line 234 "gram.y"
 {
                            LIST_APPEND(yyvsp[-2].privilege, yyvsp[0].privilege);
                            yyval.privilege = yyvsp[-2].privilege;
                        }
 break;
-case 25:
-#line 236 "gram.y"
+case 26:
+#line 240 "gram.y"
 {
                            struct cmndtag tags;
                            struct privilege *p = emalloc(sizeof(*p));
@@ -1013,59 +1063,59 @@ case 25:
                            yyval.privilege = p;
                        }
 break;
-case 26:
-#line 259 "gram.y"
+case 27:
+#line 263 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = FALSE;
                        }
 break;
-case 27:
-#line 263 "gram.y"
+case 28:
+#line 267 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = TRUE;
                        }
 break;
-case 28:
-#line 269 "gram.y"
+case 29:
+#line 273 "gram.y"
 {
                            NEW_MEMBER(yyval.member, yyvsp[0].string, ALIAS);
                        }
 break;
-case 29:
-#line 272 "gram.y"
+case 30:
+#line 276 "gram.y"
 {
                            NEW_MEMBER(yyval.member, NULL, ALL);
                        }
 break;
-case 30:
-#line 275 "gram.y"
+case 31:
+#line 279 "gram.y"
 {
                            NEW_MEMBER(yyval.member, yyvsp[0].string, NETGROUP);
                        }
 break;
-case 31:
-#line 278 "gram.y"
+case 32:
+#line 282 "gram.y"
 {
                            NEW_MEMBER(yyval.member, yyvsp[0].string, NTWKADDR);
                        }
 break;
-case 32:
-#line 281 "gram.y"
+case 33:
+#line 285 "gram.y"
 {
                            NEW_MEMBER(yyval.member, yyvsp[0].string, WORD);
                        }
 break;
-case 34:
-#line 287 "gram.y"
+case 35:
+#line 291 "gram.y"
 {
                            LIST_APPEND(yyvsp[-2].cmndspec, yyvsp[0].cmndspec);
                            yyval.cmndspec = yyvsp[-2].cmndspec;
                        }
 break;
-case 35:
-#line 293 "gram.y"
+case 36:
+#line 297 "gram.y"
 {
                            struct cmndspec *cs = emalloc(sizeof(*cs));
                            cs->runaslist = yyvsp[-2].member;
@@ -1076,127 +1126,127 @@ case 35:
                            yyval.cmndspec = cs;
                        }
 break;
-case 36:
-#line 304 "gram.y"
+case 37:
+#line 308 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = FALSE;
                        }
 break;
-case 37:
-#line 308 "gram.y"
+case 38:
+#line 312 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = TRUE;
                        }
 break;
-case 38:
-#line 314 "gram.y"
+case 39:
+#line 318 "gram.y"
 {
                            yyval.member = NULL;
                        }
 break;
-case 39:
-#line 317 "gram.y"
+case 40:
+#line 321 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                        }
 break;
-case 41:
-#line 323 "gram.y"
+case 42:
+#line 327 "gram.y"
 {
                            LIST_APPEND(yyvsp[-2].member, yyvsp[0].member);
                            yyval.member = yyvsp[-2].member;
                        }
 break;
-case 42:
-#line 329 "gram.y"
+case 43:
+#line 333 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = FALSE;
                        }
 break;
-case 43:
-#line 333 "gram.y"
+case 44:
+#line 337 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = TRUE;
                        }
 break;
-case 44:
-#line 339 "gram.y"
+case 45:
+#line 343 "gram.y"
 {
                            NEW_MEMBER(yyval.member, yyvsp[0].string, ALIAS);
                        }
 break;
-case 45:
-#line 342 "gram.y"
+case 46:
+#line 346 "gram.y"
 {
                            NEW_MEMBER(yyval.member, NULL, ALL);
                        }
 break;
-case 46:
-#line 345 "gram.y"
+case 47:
+#line 349 "gram.y"
 {
                            NEW_MEMBER(yyval.member, yyvsp[0].string, NETGROUP);
                        }
 break;
-case 47:
-#line 348 "gram.y"
+case 48:
+#line 352 "gram.y"
 {
                            NEW_MEMBER(yyval.member, yyvsp[0].string, USERGROUP);
                        }
 break;
-case 48:
-#line 351 "gram.y"
+case 49:
+#line 355 "gram.y"
 {
                            NEW_MEMBER(yyval.member, yyvsp[0].string, WORD);
                        }
 break;
-case 49:
-#line 356 "gram.y"
+case 50:
+#line 360 "gram.y"
 {
                            yyval.tag.nopasswd = yyval.tag.noexec = yyval.tag.monitor = UNSPEC;
                        }
 break;
-case 50:
-#line 359 "gram.y"
+case 51:
+#line 363 "gram.y"
 {
                            yyval.tag.nopasswd = TRUE;
                        }
 break;
-case 51:
-#line 362 "gram.y"
+case 52:
+#line 366 "gram.y"
 {
                            yyval.tag.nopasswd = FALSE;
                        }
 break;
-case 52:
-#line 365 "gram.y"
+case 53:
+#line 369 "gram.y"
 {
                            yyval.tag.noexec = TRUE;
                        }
 break;
-case 53:
-#line 368 "gram.y"
+case 54:
+#line 372 "gram.y"
 {
                            yyval.tag.noexec = FALSE;
                        }
 break;
-case 54:
-#line 371 "gram.y"
+case 55:
+#line 375 "gram.y"
 {
                            yyval.tag.monitor = TRUE;
                        }
 break;
-case 55:
-#line 374 "gram.y"
+case 56:
+#line 378 "gram.y"
 {
                            yyval.tag.monitor = FALSE;
                        }
 break;
-case 56:
-#line 379 "gram.y"
+case 57:
+#line 383 "gram.y"
 {
                            NEW_MEMBER(yyval.member, NULL, ALL);
                            if (safe_cmnd)
@@ -1204,14 +1254,14 @@ case 56:
                            safe_cmnd = estrdup(user_cmnd);
                        }
 break;
-case 57:
-#line 385 "gram.y"
+case 58:
+#line 389 "gram.y"
 {
                            NEW_MEMBER(yyval.member, yyvsp[0].string, ALIAS);
                        }
 break;
-case 58:
-#line 388 "gram.y"
+case 59:
+#line 392 "gram.y"
 {
                            struct sudo_command *c = emalloc(sizeof(*c));
                            c->cmnd = yyvsp[0].command.cmnd;
@@ -1219,8 +1269,8 @@ case 58:
                            NEW_MEMBER(yyval.member, (char *)c, COMMAND);
                        }
 break;
-case 61:
-#line 400 "gram.y"
+case 62:
+#line 404 "gram.y"
 {
                            char *s;
                            if ((s = alias_add(yyvsp[-2].string, HOSTALIAS, yyvsp[0].member)) != NULL) {
@@ -1229,15 +1279,15 @@ case 61:
                            }
                        }
 break;
-case 63:
-#line 410 "gram.y"
+case 64:
+#line 414 "gram.y"
 {
                            LIST_APPEND(yyvsp[-2].member, yyvsp[0].member);
                            yyval.member = yyvsp[-2].member;
                        }
 break;
-case 66:
-#line 420 "gram.y"
+case 67:
+#line 424 "gram.y"
 {
                            char *s;
                            if ((s = alias_add(yyvsp[-2].string, CMNDALIAS, yyvsp[0].member)) != NULL) {
@@ -1246,15 +1296,15 @@ case 66:
                            }
                        }
 break;
-case 68:
-#line 430 "gram.y"
+case 69:
+#line 434 "gram.y"
 {
                            LIST_APPEND(yyvsp[-2].member, yyvsp[0].member);
                            yyval.member = yyvsp[-2].member;
                        }
 break;
-case 71:
-#line 440 "gram.y"
+case 72:
+#line 444 "gram.y"
 {
                            char *s;
                            if ((s = alias_add(yyvsp[-2].string, RUNASALIAS, yyvsp[0].member)) != NULL) {
@@ -1263,8 +1313,8 @@ case 71:
                            }
                        }
 break;
-case 74:
-#line 453 "gram.y"
+case 75:
+#line 457 "gram.y"
 {
                            char *s;
                            if ((s = alias_add(yyvsp[-2].string, USERALIAS, yyvsp[0].member)) != NULL) {
@@ -1273,58 +1323,58 @@ case 74:
                            }
                        }
 break;
-case 76:
-#line 463 "gram.y"
+case 77:
+#line 467 "gram.y"
 {
                            LIST_APPEND(yyvsp[-2].member, yyvsp[0].member);
                            yyval.member = yyvsp[-2].member;
                        }
 break;
-case 77:
-#line 469 "gram.y"
+case 78:
+#line 473 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = FALSE;
                        }
 break;
-case 78:
-#line 473 "gram.y"
+case 79:
+#line 477 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = TRUE;
                        }
 break;
-case 79:
-#line 479 "gram.y"
+case 80:
+#line 483 "gram.y"
 {
                            NEW_MEMBER(yyval.member, yyvsp[0].string, ALIAS);
                        }
 break;
-case 80:
-#line 482 "gram.y"
+case 81:
+#line 486 "gram.y"
 {
                            NEW_MEMBER(yyval.member, NULL, ALL);
                        }
 break;
-case 81:
-#line 485 "gram.y"
+case 82:
+#line 489 "gram.y"
 {
                            NEW_MEMBER(yyval.member, yyvsp[0].string, NETGROUP);
                        }
 break;
-case 82:
-#line 488 "gram.y"
+case 83:
+#line 492 "gram.y"
 {
                            NEW_MEMBER(yyval.member, yyvsp[0].string, USERGROUP);
                        }
 break;
-case 83:
-#line 491 "gram.y"
+case 84:
+#line 495 "gram.y"
 {
                            NEW_MEMBER(yyval.member, yyvsp[0].string, WORD);
                        }
 break;
-#line 1276 "gram.c"
+#line 1326 "gram.c"
     }
     yyssp -= yym;
     yystate = *yyssp;
diff --git a/gram.h b/gram.h
index d3f0e1802db910d7bc2ad8380905752f051af984..1bb3372c616a82b571356746ec9d89b0001e6ccf 100644 (file)
--- a/gram.h
+++ b/gram.h
@@ -9,20 +9,21 @@
 #define DEFAULTS_HOST 265
 #define DEFAULTS_USER 266
 #define DEFAULTS_RUNAS 267
-#define RUNAS 268
-#define NOPASSWD 269
-#define PASSWD 270
-#define NOEXEC 271
-#define EXEC 272
-#define MONITOR 273
-#define NOMONITOR 274
-#define ALL 275
-#define COMMENT 276
-#define HOSTALIAS 277
-#define CMNDALIAS 278
-#define USERALIAS 279
-#define RUNASALIAS 280
-#define ERROR 281
+#define DEFAULTS_CMND 268
+#define RUNAS 269
+#define NOPASSWD 270
+#define PASSWD 271
+#define NOEXEC 272
+#define EXEC 273
+#define MONITOR 274
+#define NOMONITOR 275
+#define ALL 276
+#define COMMENT 277
+#define HOSTALIAS 278
+#define CMNDALIAS 279
+#define USERALIAS 280
+#define RUNASALIAS 281
+#define ERROR 282
 #ifndef YYSTYPE_DEFINED
 #define YYSTYPE_DEFINED
 typedef union {
diff --git a/gram.y b/gram.y
index bbbd4bd96fd1462d7f067bee8b77098b11e3172c..3d14bcbfdd0486e65a02cb701525a266f7b938a6 100644 (file)
--- a/gram.y
+++ b/gram.y
@@ -120,6 +120,7 @@ yyerror(s)
 %token <tok>    DEFAULTS_HOST          /* Host-specific defaults entry */
 %token <tok>    DEFAULTS_USER          /* User-specific defaults entry */
 %token <tok>    DEFAULTS_RUNAS         /* Runas-specific defaults entry */
+%token <tok>    DEFAULTS_CMND          /* Command-specific defaults entry */
 %token <tok>    RUNAS                  /* ( runas_list ) */
 %token <tok>    NOPASSWD               /* no passwd req for command */
 %token <tok>    PASSWD                 /* passwd req for command (default) */
@@ -200,6 +201,9 @@ entry               :       COMMENT {
                |       DEFAULTS_HOST hostlist defaults_list {
                            add_defaults(DEFAULTS_HOST, $2, $3);
                        }
+               |       DEFAULTS_CMND cmndlist defaults_list {
+                           add_defaults(DEFAULTS_CMND, $2, $3);
+                       }
                ;
 
 defaults_list  :       defaults_entry
index 9e449369cfe1c4a886ddc9414638b24235b3c3ca..94bd2a453b57b832d316eed69fa07d8602fd7f90 100644 (file)
@@ -872,7 +872,7 @@ check_execv(fd, pid, seqnr, askp, cookie, policyp, errorp)
     if (!def_ignore_local_sudoers && !ISSET(validated, VALIDATE_OK))
 #endif
     {
-       (void) update_defaults();
+       (void) update_defaults(SET_ALL);
        validated = sudoers_lookup(0);
     }
     if (ISSET(validated, VALIDATE_OK)) {
diff --git a/sudo.c b/sudo.c
index a0bf6f3cc7895d43727a1546f852b0a661960f1b..459b27fe3952a42907109d4074470b102115059c 100644 (file)
--- a/sudo.c
+++ b/sudo.c
@@ -257,7 +257,7 @@ main(argc, argv, envp)
        /* Parse sudoers and set any defaults listed in it. */
        if (parse_sudoers(_PATH_SUDOERS) || parse_error)
            log_error(0, "parse error in %s near line %d", errorfile, errorlineno);
-       if (!update_defaults())
+       if (!update_defaults(SKIP_CMND))
            log_error(NO_STDERR|NO_EXIT, "problem with defaults entries");
     }
 
@@ -612,7 +612,8 @@ init_vars(sudo_mode)
 }
 
 /*
- * Fill in user_cmnd, user_args, user_base and user_stat variables.
+ * Fill in user_cmnd, user_args, user_base and user_stat variables
+ * and apply any command-specific defaults entries.
  */
 static int
 set_cmnd(sudo_mode)
@@ -667,6 +668,9 @@ set_cmnd(sudo_mode)
     else
        user_base = user_cmnd;
 
+    if (!update_defaults(ONLY_CMND))
+       log_error(NO_STDERR|NO_EXIT, "problem with defaults entries");
+
     return(rval);
 }
 
index ecf514e0fdc506c2c76e7bf8b60828e715dd9f98..2bfb711a2063b6eb523f8ec616293fcee24a09ab 100644 (file)
@@ -204,7 +204,7 @@ main(argc, argv)
     else
        (void) fputs("Parses OK", stdout);
 
-    if (!update_defaults())
+    if (!update_defaults(SET_ALL))
        (void) fputs(" (problem with defaults entries)", stdout);
     puts(".");
 
@@ -350,14 +350,14 @@ print_defaults()
            case DEFAULTS_RUNAS:
                putchar('>');
                break;
+           case DEFAULTS_CMND:
+               putchar('!');
+               break;
        }
        for (m = d->binding; m != NULL; m = m->next) {
-           if (m->type == COMMAND)
-               printf("%s\"%s %s\"", m != d->binding ? "," : "",
-                   ((struct sudo_command *)m->name)->cmnd,
-                   ((struct sudo_command *)m->name)->args);
-           else
-               printf("%s%s", m != d->binding ? "," : "", m->name);
+           if (m != d->binding)
+               putchar(',');
+           print_member(m);
        }
        printf("\t%s%s", d->op == FALSE ? "!" : "", d->var);
        if (d->val != NULL) {
diff --git a/toke.c b/toke.c
index 8d6ea15a1949690e38eae7c3273aaa69b9bbdd69..19c7c6c1f84610987d5726bbfa15e2d7f2da14c9 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -289,52 +289,52 @@ static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
        *yy_cp = '\0'; \
        yy_c_buf_p = yy_cp;
 
-#define YY_NUM_RULES 42
-#define YY_END_OF_BUFFER 43
-static yyconst short int yy_accept[385] =
+#define YY_NUM_RULES 43
+#define YY_END_OF_BUFFER 44
+static yyconst short int yy_accept[390] =
     {   0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,   43,   32,   38,   37,   36,   41,   32,   26,
-       41,   32,   33,   32,   32,   32,   32,   35,   34,   27,
-       27,   27,   27,   27,   41,   32,   41,   27,   27,   27,
-       27,   27,   28,   41,   28,   29,   28,   28,   28,   28,
-       28,   27,   27,   27,   27,   27,   41,   28,    1,   12,
-       11,   12,   11,   11,   41,   41,    2,    8,    8,    8,
-        3,    8,    4,   41,   32,    0,   38,   36,    0,   40,
-       23,    0,   22,    0,   31,   31,    0,   32,   32,   32,
-       32,   32,   27,   27,   27,   27,   27,   32,   39,   32,
-
-        0,   32,   32,   32,   32,   32,   28,    0,   28,   23,
-        0,   22,    0,   28,    0,   28,   28,   28,   28,   28,
-       27,   27,   27,   27,   27,   28,   28,    1,   12,   12,
-       10,    9,   10,    0,    2,    8,    0,    8,    0,    0,
-        5,    6,    8,    8,    0,   32,   32,   32,   27,   27,
-       27,   27,   27,   27,   32,    0,   32,   32,   32,   32,
-       32,   28,   28,   28,   27,   27,   27,   27,   27,   27,
-       28,    7,    7,    0,    7,    8,   32,   32,   32,   32,
-       32,   27,   27,   27,   27,   27,   27,   32,    0,   32,
-       32,   32,   28,   28,   28,   28,   28,   27,   27,   27,
-
-       27,   27,   27,   28,    7,   32,   32,   32,    0,   19,
-       27,   27,   27,   27,   27,   32,    0,   32,   32,   28,
-       28,   28,   27,   27,   27,   27,   27,   28,   32,   32,
-       32,   32,   32,   27,   27,   27,   27,   27,   32,    0,
-       32,   32,   28,   28,   28,   28,   28,   27,   27,   27,
-       27,   27,   28,   24,   24,   24,   27,    0,   18,   27,
-       27,    0,   17,   32,    0,   32,   32,   24,   24,   24,
-       27,   27,   27,   28,   32,   24,   24,   24,   24,    0,
-       21,   27,   27,   30,    0,   32,   14,   28,   24,   24,
-       24,   24,   27,   27,   28,   32,   25,   25,   25,   27,
-
-        0,   16,    0,   32,    0,   32,   28,   25,   25,   25,
-       27,   32,   32,   25,   25,   25,   25,   25,    0,   20,
-        0,   15,   14,    0,   14,    0,   28,   28,   25,   25,
-       25,   25,   25,   32,   32,   32,   25,   25,    0,   13,
-       28,   28,   28,   25,   25,   32,   32,   32,   32,   32,
-       28,   28,   28,   28,   28,   32,   32,   32,   28,   28,
-       28,   32,   32,   32,   32,   32,   28,   28,   28,   28,
-       28,   24,   24,   24,   24,   24,   24,   24,   24,   24,
-       24,   24,   24,    0
+        0,    0,   44,   33,   39,   38,   37,   42,   33,   26,
+       42,   33,   34,   33,   33,   33,   33,   36,   35,   27,
+       27,   27,   27,   27,   42,   33,   42,   27,   27,   27,
+       27,   27,   28,   42,   28,   29,   28,   28,   28,   28,
+       28,   27,   27,   27,   27,   27,   42,   28,    1,   33,
+       12,   11,   12,   11,   11,   42,   42,    2,    8,    8,
+        8,    3,    8,    4,   42,   33,    0,   39,   37,    0,
+       41,   23,    0,   22,    0,   32,   32,    0,   33,   33,
+       33,   33,   33,   27,   27,   27,   27,   27,   33,   40,
+
+       33,    0,   33,   33,   33,   33,   33,   28,    0,   28,
+       23,    0,   22,    0,   28,    0,   28,   28,   28,   28,
+       28,   27,   27,   27,   27,   27,   28,   28,    1,   31,
+       31,    0,   12,   12,   10,    9,   10,    0,    2,    8,
+        0,    8,    0,    0,    5,    6,    8,    8,    0,   33,
+       33,   33,   27,   27,   27,   27,   27,   27,   33,    0,
+       33,   33,   33,   33,   33,   28,   28,   28,   27,   27,
+       27,   27,   27,   27,   28,    0,    7,    7,    0,    7,
+        8,   33,   33,   33,   33,   33,   27,   27,   27,   27,
+       27,   27,   33,    0,   33,   33,   33,   28,   28,   28,
+
+       28,   28,   27,   27,   27,   27,   27,   27,   28,    7,
+       33,   33,   33,    0,   19,   27,   27,   27,   27,   27,
+       33,    0,   33,   33,   28,   28,   28,   27,   27,   27,
+       27,   27,   28,   33,   33,   33,   33,   33,   27,   27,
+       27,   27,   27,   33,    0,   33,   33,   28,   28,   28,
+       28,   28,   27,   27,   27,   27,   27,   28,   24,   24,
+       24,   27,    0,   18,   27,   27,    0,   17,   33,    0,
+       33,   33,   24,   24,   24,   27,   27,   27,   28,   33,
+       24,   24,   24,   24,    0,   21,   27,   27,   30,    0,
+       33,   14,   28,   24,   24,   24,   24,   27,   27,   28,
+
+       33,   25,   25,   25,   27,    0,   16,    0,   33,    0,
+       33,   28,   25,   25,   25,   27,   33,   33,   25,   25,
+       25,   25,   25,    0,   20,    0,   15,   14,    0,   14,
+        0,   28,   28,   25,   25,   25,   25,   25,   33,   33,
+       33,   25,   25,    0,   13,   28,   28,   28,   25,   25,
+       33,   33,   33,   33,   33,   28,   28,   28,   28,   28,
+       33,   33,   33,   28,   28,   28,   33,   33,   33,   33,
+       33,   28,   28,   28,   28,   28,   24,   24,   24,   24,
+       24,   24,   24,   24,   24,   24,   24,   24,    0
     } ;
 
 static yyconst int yy_ec[256] =
@@ -379,105 +379,107 @@ static yyconst int yy_meta[61] =
         7,    7,    7,    7,    7,    7,    7,    7,    7,    7
     } ;
 
-static yyconst short int yy_base[407] =
+static yyconst short int yy_base[414] =
     {   0,
         0,   55,   96,    0,   60,   61,  155,  160,  203,  262,
-      321,  364, 1453, 1394, 1435, 2039, 1425, 1417, 1367, 2039,
-     2039, 1362, 2039,  166,  176,  197,  253, 2039, 2039,  408,
-     1362, 1368, 1367, 1375,  467,   20,  170, 1346, 1349, 1342,
-     1337, 1337, 1350,   57, 1347, 2039, 1345,  177,  330,  339,
-      373,  492, 1344, 1346, 1345, 1343,  551,   21, 1365,    0,
-     2039, 1361,    0, 2039,  567,   69,    0, 1319,  580,  136,
-     2039,  144, 2039,   80, 1315,  221, 1356, 1353, 1353, 2039,
-     1311,  275, 1295,  492,  376, 1267,  591,  319,  157,  609,
-      618,  627,    0, 1279, 1266,   55, 1254,  232, 2039,   46,
-
-      173,  145,  180,  168,  188,   44, 1238,  652,  272, 1237,
-      661, 1227,  685,  670,  694,  704,  194,  713,  722,  733,
-        0, 1239, 1234,  205, 1229,  299,  133, 1265,    0, 1262,
-      293, 2039, 2039,  301,    0, 1219,  556,  756,  337,  359,
-     2039, 2039, 1180,  327,  582,  753,  765,  774, 1194, 1180,
-     1151, 1148, 1148, 1126,  342,  234,  329,  234,  338,  356,
-      355,  785,  794,  803, 1135, 1112, 1093, 1099, 1107, 1067,
-      360, 1061, 2039,  367,  825,  830,  839,  552,  859,  868,
-      877,  408, 1064, 1045, 1040, 1035, 1031,  428,  429,  361,
-      143,  430,  888,  558,  897,  906,  917,  585, 1006, 1014,
-
-     1001,  996,  974,  433,  573,  926,  935,  946,  587, 2039,
-      962,  930,  906,  863,  871,  436,  553,  352,  442,  955,
-      964,  975,  856,  805,  793,  759,  759,  440,  984,  598,
-      993, 1004, 1013,  727,  596,  716,  673,  599,  605,  237,
-      565,  607, 1022,  606, 1033, 1042, 1051,  674,  657,  671,
-      663,  681,  638, 1063, 1072, 1081,  690,  705, 2039,  652,
-      642,  714, 2039,  701,  618,  711,  523, 1093, 1102, 1111,
-      839,  619,  603,  804, 1122,  637, 1132, 1141, 1152,  841,
-     2039,  569,  842,  517,  562,  655,  827, 1161,  824, 1171,
-     1182, 1191,  449,  843,  437, 1200, 1211, 1220, 1229,  844,
-
-      849, 2039, 1250,  720,  389,  370, 1240, 1258, 1269, 1278,
-     1172, 1287,  732, 1298, 1307, 1316, 1327, 1336, 1338, 2039,
-      404,  310,  287, 1360,  284, 1384, 1357,  826, 1396, 1405,
-     1414, 1425, 1434, 1443, 1454, 1463, 1472, 1479,  302, 2039,
-     1492, 1508, 1521, 1528, 1487, 1537,  885, 1557, 1566, 1575,
-     1586,  886, 1595, 1604, 1615, 1624, 1633, 1644, 1653, 1662,
-     1673, 1682,  944, 1691, 1702, 1711, 1720,  973, 1731, 1740,
-     1749, 1760, 1769, 1778, 1789, 1798, 1807,  125, 1818, 1827,
-      121, 1836, 1847, 2039, 1891, 1898, 1905, 1912, 1919, 1926,
-     1933, 1940, 1947, 1954, 1961, 1968, 1975,   84, 1982, 1989,
-
-     1996, 2003, 2010, 2017, 2024, 2031
+      321,  364, 1338, 1277, 1307, 2093, 1295, 1295, 1253, 2093,
+     2093, 1252, 2093,  166,  176,  197,  253, 2093, 2093,  408,
+     1252, 1258, 1253, 1252,  467,   20,  170, 1206, 1200, 1193,
+     1180, 1172, 1176,  208, 1166, 2093, 1156,  327,  337,  373,
+      464,  508, 1147, 1144, 1143, 1143,  567,   21, 1158,  335,
+        0, 2093, 1138,    0, 2093,  583,   68,    0, 1097,  596,
+       48, 2093,   50, 2093,   75, 1096,  275, 1129, 1108, 1100,
+     2093, 1058,  508, 1039,  607,  338, 1031,  633,  630,  157,
+      645,  659,  674,    0, 1023, 1018,   52, 1013,  179, 2093,
+
+       46,  157,  121,  136,  142,  133,   29, 1000,  696,  218,
+      981,  705,  980,  729,  376,  738,  748,  188,  757,  766,
+      777,    0,  992,  987,  251,  981,  242,  159, 1017,  795,
+      974,  803,    0, 1013,  166, 2093, 2093,  240,    0,  971,
+      487,  811,  284,  359, 2093, 2093,  932,  293,  598,  824,
+      840,  853,  945,  940,  929,  935,  928,  915,  234,  243,
+      329,  248,  339,  257,  236,  869,  882,  898,  912,  905,
+      892,  896,  868,  855,  285,  921,  849, 2093,  356,  919,
+      934,  931,  358,  948,  963,  977,  384,  842,  850,  845,
+      840,  836,   38,  346,  260,  352,  353,  983,  360,  992,
+
+     1012, 1021,  408,  837,  806,  799,  793,  789,  444,  428,
+     1029, 1041, 1050,  472, 2093,  793,  796,  791,  783,  789,
+      452,  345,  460,  453, 1060, 1070, 1079,  782,  779,  757,
+      719,  727,  454, 1089,  463, 1099, 1108, 1118,  718,  580,
+      709,  701,  582,  286,  569,  530,  537, 1128,  580, 1137,
+     1147, 1157,  694,  610,  685,  681,  615,  362, 1167, 1177,
+     1187,  621,  632, 2093,  676,  680,  683, 2093,  570,  575,
+      536,  610, 1197, 1207, 1217,  699,  663,  657,  584, 1226,
+      582, 1237, 1247,  832,  713, 2093,  622,  722,  592,  667,
+      456, 1267, 1256,  638, 1286, 1297,  890,  539,  725,  461,
+
+     1266, 1306, 1315, 1326,  732,  737, 2093,  669,  639,  388,
+      372, 1335, 1344, 1355, 1364,  749, 1373,  672, 1384, 1393,
+     1402, 1413,  943,  779, 2093,  347,  296,  258, 1436,  232,
+     1460, 1433,  682, 1472, 1481, 1490, 1501,  972, 1510, 1519,
+     1530, 1539,  848,  230, 2093, 1548, 1559, 1568, 1577,  912,
+     1588,  745, 1597, 1606, 1617, 1626,  786, 1635, 1646, 1655,
+     1664, 1675, 1684, 1693, 1704, 1713, 1722,  792, 1733, 1742,
+     1751, 1762,  819, 1771, 1780, 1791, 1800, 1809, 1820, 1829,
+     1838, 1849,  145, 1858, 1867,  141, 1878, 1887, 2093, 1931,
+     1938, 1945, 1952, 1959, 1966, 1973, 1980, 1987, 1994, 2001,
+
+     2008, 2015, 2022,   84, 2029, 2036, 2043, 2050, 2057, 2064,
+     2071, 2078, 2085
     } ;
 
-static yyconst short int yy_def[407] =
+static yyconst short int yy_def[414] =
     {   0,
-      384,    1,  384,    3,    1,    1,  385,  385,  386,  386,
-      387,  387,  384,  388,  384,  384,  384,  389,  390,  384,
-      384,  391,  384,  392,  388,  388,  388,  384,  384,  384,
-       30,   30,   30,   30,  388,  388,  389,   30,   30,   30,
-       30,   30,  393,  384,  394,  384,  395,  396,  393,  393,
-      393,  384,   52,   52,   52,   52,  393,  393,  384,  397,
-      384,  397,  397,  384,  384,  384,  398,  399,  400,  399,
-      384,  399,  384,  401,  388,  388,  384,  384,  389,  384,
-      390,  390,  391,  391,  392,  402,  388,  388,  388,  388,
-      388,  388,   30,   30,   30,   30,   30,  388,  384,  388,
-
-      389,  388,  388,  388,  388,  388,  393,  393,  384,  394,
-      394,  395,  395,  396,  393,  393,  393,  393,  393,  393,
-       52,   52,   52,   52,   52,  393,  393,  384,  397,  397,
-      384,  384,  384,  384,  398,  399,  399,  400,  403,  400,
-      384,  384,  399,  399,  384,  388,  388,  388,   30,   30,
-       30,   30,   30,   30,  388,  389,  388,  388,  388,  388,
-      388,  393,  393,  393,   52,   52,   52,   52,   52,   52,
-      393,  399,  384,  403,  400,  400,  388,  388,  388,  388,
-      388,   30,   30,   30,   30,   30,   30,  388,  389,  388,
-      388,  388,  393,  393,  393,  393,  393,   52,   52,   52,
-
-       52,   52,   52,  393,  403,  388,  388,  388,  384,  384,
-       30,   30,   30,   30,   30,  388,  389,  388,  388,  393,
-      393,  393,   52,   52,   52,   52,   52,  393,  388,  388,
-      388,  388,  388,   30,   30,   30,   30,   30,  388,  389,
-      388,  388,  393,  393,  393,  393,  393,   52,   52,   52,
-       52,   52,  393,  388,  388,  388,   30,  384,  384,   30,
-       30,  384,  384,  388,  389,  388,  388,  393,  393,  393,
-       52,   52,   52,  393,  388,  388,  388,  388,  388,  384,
-      384,   30,   30,  388,  389,  388,  388,  393,  393,  393,
-      393,  393,   52,   52,  393,  388,  388,  388,  388,   30,
-
-      384,  384,  389,  388,  404,  405,  393,  393,  393,  393,
-       52,  388,  388,  388,  388,  388,  388,  388,  384,  384,
-      406,  388,  404,  404,  405,  405,  393,  393,  393,  393,
-      393,  393,  393,  388,  388,  388,  388,  388,  406,  384,
-      393,  393,  393,  393,  393,  388,  388,  388,  388,  388,
-      393,  393,  393,  393,  393,  388,  388,  388,  393,  393,
-      393,  388,  388,  388,  388,  388,  393,  393,  393,  393,
-      393,  388,  388,  388,  393,  393,  393,  388,  388,  388,
-      393,  393,  393,    0,  384,  384,  384,  384,  384,  384,
-      384,  384,  384,  384,  384,  384,  384,  384,  384,  384,
-
-      384,  384,  384,  384,  384,  384
+      389,    1,  389,    3,    1,    1,  390,  390,  391,  391,
+      392,  392,  389,  393,  389,  389,  389,  394,  395,  389,
+      389,  396,  389,  397,  393,  393,  393,  389,  389,  389,
+       30,   30,   30,   30,  393,  393,  394,   30,   30,   30,
+       30,   30,  398,  389,  399,  389,  400,  401,  398,  398,
+      398,  389,   52,   52,   52,   52,  398,  398,  389,  402,
+      403,  389,  403,  403,  389,  389,  389,  404,  405,  406,
+      405,  389,  405,  389,  407,  393,  393,  389,  389,  394,
+      389,  395,  395,  396,  396,  397,  408,  393,  393,  393,
+      393,  393,  393,   30,   30,   30,   30,   30,  393,  389,
+
+      393,  394,  393,  393,  393,  393,  393,  398,  398,  389,
+      399,  399,  400,  400,  401,  398,  398,  398,  398,  398,
+      398,   52,   52,   52,   52,   52,  398,  398,  389,  402,
+      409,  393,  403,  403,  389,  389,  389,  389,  404,  405,
+      405,  406,  410,  406,  389,  389,  405,  405,  389,  393,
+      393,  393,   30,   30,   30,   30,   30,   30,  393,  394,
+      393,  393,  393,  393,  393,  398,  398,  398,   52,   52,
+       52,   52,   52,   52,  398,  389,  405,  389,  410,  406,
+      406,  393,  393,  393,  393,  393,   30,   30,   30,   30,
+       30,   30,  393,  394,  393,  393,  393,  398,  398,  398,
+
+      398,  398,   52,   52,   52,   52,   52,   52,  398,  410,
+      393,  393,  393,  389,  389,   30,   30,   30,   30,   30,
+      393,  394,  393,  393,  398,  398,  398,   52,   52,   52,
+       52,   52,  398,  393,  393,  393,  393,  393,   30,   30,
+       30,   30,   30,  393,  394,  393,  393,  398,  398,  398,
+      398,  398,   52,   52,   52,   52,   52,  398,  393,  393,
+      393,   30,  389,  389,   30,   30,  389,  389,  393,  394,
+      393,  393,  398,  398,  398,   52,   52,   52,  398,  393,
+      393,  393,  393,  393,  389,  389,   30,   30,  393,  394,
+      393,  393,  398,  398,  398,  398,  398,   52,   52,  398,
+
+      393,  393,  393,  393,   30,  389,  389,  394,  393,  411,
+      412,  398,  398,  398,  398,   52,  393,  393,  393,  393,
+      393,  393,  393,  389,  389,  413,  393,  411,  411,  412,
+      412,  398,  398,  398,  398,  398,  398,  398,  393,  393,
+      393,  393,  393,  413,  389,  398,  398,  398,  398,  398,
+      393,  393,  393,  393,  393,  398,  398,  398,  398,  398,
+      393,  393,  393,  398,  398,  398,  393,  393,  393,  393,
+      393,  398,  398,  398,  398,  398,  393,  393,  393,  398,
+      398,  398,  393,  393,  393,  398,  398,  398,    0,  389,
+      389,  389,  389,  389,  389,  389,  389,  389,  389,  389,
+
+      389,  389,  389,  389,  389,  389,  389,  389,  389,  389,
+      389,  389,  389
     } ;
 
-static yyconst short int yy_nxt[2100] =
+static yyconst short int yy_nxt[2154] =
     {   0,
        14,   15,   16,   17,   14,   18,   19,   20,   21,   14,
        22,   23,   14,   14,   24,   25,   26,   27,   25,   25,
@@ -485,234 +487,240 @@ static yyconst short int yy_nxt[2100] =
        31,   30,   30,   32,   33,   30,   34,   30,   30,   30,
        30,   30,   30,   35,   14,   14,   14,   14,   14,   14,
        14,   14,   14,   14,   14,   14,   14,   36,   14,   14,
-       37,   59,   59,   76,  108,   21,   21,   21,   21,  109,
-      134,   99,  109,  109,  109,  109,  109,  109,  109,  100,
-      127,  144,   99,   38,   39,  151,   40,   76,  152,   76,
-      135,  153,   41,  161,  155,   42,   43,   15,   16,   17,
+       37,   59,   59,   77,  109,   21,   21,   21,   21,  138,
+      100,  145,   77,  146,   60,   60,  148,  100,  165,  101,
+      128,   77,  155,   38,   39,  156,   40,  221,  157,   77,
+      139,  141,   41,  141,  159,   42,   43,   15,   16,   17,
 
        43,   44,   45,   21,   46,   43,   47,   23,   43,   43,
        48,   49,   50,   51,   49,   49,   49,   49,   28,   29,
        21,   43,   52,   52,   52,   52,   53,   52,   52,   54,
        55,   52,   56,   52,   52,   52,   52,   52,   52,   57,
        43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
-       43,   43,   43,   58,   43,   43,   15,   61,   62,  141,
-       63,   15,   61,   62,  108,   63,   64,  142,   76,   86,
-       88,   64,   80,   86,   86,   80,  108,   64,   63,  137,
-       86,  171,   64,   63,   86,   86,   76,  137,   76,   88,
-       86,   89,   89,   89,   89,   89,   89,   89,   65,  157,
-
-       76,   86,  219,   65,   15,   16,   17,  116,   18,   87,
-       88,   76,   90,   90,   90,   90,   90,   90,   90,   76,
-      115,  101,   75,   76,   75,  159,   75,  156,   75,   75,
-      158,   76,   75,  134,   99,  167,   80,  108,  168,   80,
-       76,  169,  160,   75,   75,   75,   66,   67,   67,   67,
-       67,   67,   67,   67,   67,   67,   67,   67,   67,   67,
-       67,   67,   67,   15,   16,   17,   88,   18,   91,   91,
-       91,   91,   91,   92,   89,   76,   81,   76,   81,  191,
-       81,  189,   81,   81,  109,  265,   81,  109,  109,  109,
-      109,  109,  109,  109,  134,   99,   76,   81,   81,   81,
-
-      134,   99,  134,   99,  340,   66,   67,   67,   67,   67,
-       67,   67,   67,   67,   67,   67,   67,   67,   67,   67,
-       67,   67,   15,   16,   17,   69,   18,  326,  134,   99,
-      324,   70,   71,   72,  146,  147,  148,  146,  146,  146,
-      146,  173,  108,  116,   73,  117,  117,  117,  117,  117,
-      117,  117,  116,   76,  118,  118,  118,  118,  118,  118,
-      118,  139,   76,  175,   74,   15,   16,   17,   69,   18,
-      137,  205,   76,  108,   70,   71,   72,  190,  241,   86,
-      174,   76,  108,   86,   86,   76,  116,   73,  119,  119,
-      119,  119,  119,  120,  117,   76,  190,  188,   76,   76,
-
-       86,  192,  176,  108,   76,  218,  340,   74,   75,  209,
-      174,  190,   75,  326,   75,  204,  108,   75,   75,   87,
-       75,   75,   75,   93,   93,   93,   93,   93,   93,   93,
-      210,   80,  324,   75,   93,   93,   93,   93,   93,   93,
-       93,   93,   93,   93,   93,   93,   93,   93,   93,   93,
-       93,   76,   93,   75,   75,   75,   75,   75,   75,   75,
-       75,   75,   75,   75,   75,   75,   75,   75,   98,   99,
-       75,   76,   75,   76,   75,   75,  108,  216,   75,   76,
-      108,  217,  228,  108,  239,   76,  311,  190,  253,   75,
-       75,   75,  107,   83,  242,   83,  107,   83,  107,   83,
-
-       83,  107,  107,   83,  107,  107,  107,  121,  121,  121,
-      121,  121,  121,  121,   83,   83,   83,  107,  121,  121,
-      121,  121,  121,  121,  121,  121,  121,  121,  121,  121,
-      121,  121,  121,  121,  121,  108,  121,  107,  107,  107,
-      107,  107,  107,  107,  107,  107,  107,  107,  107,  107,
-      107,  107,  126,   99,  107,   80,  107,  136,  107,  107,
-       76,  136,  107,  303,   80,  177,   76,  136,  131,   99,
-      132,  193,  133,  107,  107,  107,  132,  173,  133,  136,
-      287,  139,  139,   86,  136,  139,  209,   86,  209,  133,
-      133,  139,   85,   86,   75,   76,   85,  258,   75,   75,
-
-      262,  108,   85,  139,   86,   86,  300,  210,   76,  210,
-      133,  229,  240,   85,   85,   75,  174,  266,  259,  243,
-       80,  263,   88,  140,   89,   89,   89,   89,   89,   89,
-       89,   88,  294,   89,   89,   89,   89,   89,   89,   89,
-       88,   76,   89,   89,   89,   89,   89,   89,   76,  108,
-       76,  275,   76,  107,  293,  107,  264,  107,  258,  107,
-      107,   76,  110,  107,  110,  267,  110,  285,  110,  110,
-       76,  283,  110,   86,  107,  107,  107,   86,   86,  259,
-       76,  108,  262,  110,  110,  110,  112,  282,  112,  274,
-      112,  280,  112,  112,   86,  114,  112,  107,   76,  114,
-
-      304,  107,  107,  263,  273,  114,  258,  112,  112,  112,
-      272,  271,  281,  115,  261,  262,  114,  114,  107,  162,
-      163,  164,  162,  162,  162,  162,  116,  259,  117,  117,
-      117,  117,  117,  117,  117,  116,  263,  117,  117,  117,
-      117,  117,  117,  117,   76,  312,  116,  108,  117,  117,
-      117,  117,  117,  117,   76,  260,  108,  139,  139,  284,
-      172,  139,  286,   76,  257,  108,  177,  139,  178,  178,
-      178,  178,  178,  178,  178,   76,  108,  322,  177,  139,
-      179,  179,  179,  179,  179,  179,  179,  177,  252,  180,
-      180,  180,  180,  180,  181,  178,   76,  251,  193,  140,
-
-      194,  194,  194,  194,  194,  194,  194,  193,   76,  195,
-      195,  195,  195,  195,  195,  195,  193,   76,  196,  196,
-      196,  196,  196,  197,  194,  250,  139,  139,  108,  172,
-      139,  139,  139,  249,  175,  139,  139,  108,  288,  327,
-      280,  139,  280,  301,  301,  319,  108,  108,  139,  305,
-      301,  305,  306,  139,  206,  207,  208,  206,  206,  206,
-      206,  281,  295,  281,  302,  302,  320,  108,  140,  108,
-       76,  302,  177,  140,  178,  178,  178,  178,  178,  178,
-      178,  177,   76,  178,  178,  178,  178,  178,  178,  178,
-      177,  248,  178,  178,  178,  178,  178,  178,  346,  351,
-
-      238,  237,   76,  220,  221,  222,  220,  220,  220,  220,
-      193,   76,  194,  194,  194,  194,  194,  194,  194,  193,
-       76,  194,  194,  194,  194,  194,  194,  194,   76,  108,
-      193,  108,  194,  194,  194,  194,  194,  194,  236,  229,
-      108,  230,  230,  230,  230,  230,  230,  230,  229,  108,
-      231,  231,  231,  231,  231,  231,  231,  362,  235,  229,
-      108,  232,  232,  232,  232,  232,  233,  230,  243,   76,
-      244,  244,  244,  244,  244,  244,  244,  243,   76,  245,
-      245,  245,  245,  245,  245,  245,  367,   76,  243,   76,
-      246,  246,  246,  246,  246,  247,  244,  234,  108,  254,
-
-      255,  256,  254,  254,  254,  254,  229,  108,  230,  230,
-      230,  230,  230,  230,  230,  227,  108,  229,  108,  230,
-      230,  230,  230,  230,  230,  230,  229,   76,  230,  230,
-      230,  230,  230,  230,  226,  225,   76,  268,  269,  270,
-      268,  268,  268,  268,  224,  223,  243,   76,  244,  244,
-      244,  244,  244,  244,  244,  243,   76,  244,  244,  244,
-      244,  244,  244,  244,  243,  108,  244,  244,  244,  244,
-      244,  244,  215,  214,  213,  212,  108,  275,  276,  276,
-      276,  276,  276,  276,  276,  108,  275,  277,  277,  277,
-      277,  277,  277,  277,  108,  275,  278,  278,  278,  278,
-
-      278,  279,  276,  211,  137,  203,   76,  288,  289,  289,
-      289,  289,  289,  289,  289,   76,  288,  290,  290,  290,
-      290,  290,  290,  290,   76,  288,  291,  291,  291,  291,
-      291,  292,  289,  202,  201,  200,  108,  296,  297,  298,
-      299,  296,  296,  296,  199,  108,  275,  276,  276,  276,
-      276,  276,  276,  276,  108,  275,  276,  276,  276,  276,
-      276,  276,  276,  198,  187,   76,  275,  276,  276,  276,
-      276,  276,  276,  319,  186,   76,  307,  308,  309,  310,
-      307,  307,  307,  185,   76,  288,  289,  289,  289,  289,
-      289,  289,  289,  184,  320,   76,  288,  289,  289,  289,
-
-      289,  289,  289,  289,  108,  288,  289,  289,  289,  289,
-      289,  289,  183,  312,  108,  313,  313,  313,  313,  313,
-      313,  313,  182,  137,  312,  108,  314,  314,  314,  314,
-      314,  314,  314,  312,  108,  315,  315,  315,  315,  315,
-      316,  317,  312,   76,  318,  318,  318,  313,  313,  313,
-      313,  303,   80,  327,   76,  328,  328,  328,  328,  328,
-      328,  328,  137,   76,  321,  130,  128,  170,  166,  165,
-      113,  327,   76,  329,  329,  329,  329,  329,  329,  329,
-      111,  108,  327,  108,  330,  330,  330,  330,  330,  331,
-      332,  327,  154,  333,  333,  333,  328,  328,  328,  328,
-
-      150,  108,  334,  335,  336,  334,  334,  334,  334,  149,
-      145,  312,  108,  317,  317,  317,  317,  317,  317,  317,
-      312,  108,  317,  317,  317,  317,  317,  317,  317,  312,
-       76,  317,  317,  317,  317,  317,  317,  337,   84,  319,
-      312,   76,  337,  337,  337,  337,  337,  337,  337,  312,
-       76,  338,  338,  338,   82,   80,   78,   77,   76,   76,
-      320,  323,  137,  323,  130,  323,  128,  323,  323,  125,
-       76,  323,  341,  342,  343,  341,  341,  341,  341,   76,
-      124,  123,  323,  323,  323,  325,  122,  325,  113,  325,
-      111,  325,  325,  108,  106,  325,  105,  104,  103,  102,
-
-      108,   97,   96,   95,   94,   84,  325,  325,  325,  327,
-       82,  332,  332,  332,  332,  332,  332,  332,  327,   80,
-      332,  332,  332,  332,  332,  332,  332,  327,   78,  332,
-      332,  332,  332,  332,  332,  344,   77,   76,  327,  108,
-      344,  344,  344,  344,  344,  344,  344,  327,  108,  345,
-      345,  345,  384,  384,  384,  384,  346,  108,  347,  347,
-      347,  347,  347,  347,  347,  384,  384,  346,  108,  348,
-      348,  348,  348,  348,  348,  348,  346,  108,  349,  349,
-      349,  349,  349,  350,  347,  384,   76,  337,  337,  337,
-      337,  337,  337,  337,  338,  338,  338,   76,  384,  384,
-
-      384,  384,  345,  345,  345,  351,   76,  352,  352,  352,
-      352,  352,  352,  352,  384,   76,  384,  384,  384,  384,
-      384,  351,   76,  353,  353,  353,  353,  353,  353,  353,
-      108,  384,  384,  384,  351,  108,  354,  354,  354,  354,
-      354,  355,  352,  344,  344,  344,  344,  344,  344,  344,
-      384,  108,  356,  357,  358,  356,  356,  356,  356,  384,
-      384,  384,  384,  384,  108,  384,  384,  384,  384,  384,
-      346,  108,  347,  347,  347,  347,  347,  347,  347,  346,
-       76,  347,  347,  347,  347,  347,  347,  347,  346,  384,
-      347,  347,  347,  347,  347,  347,  384,  384,  384,  384,
-
-       76,  359,  360,  361,  359,  359,  359,  359,  351,   76,
-      352,  352,  352,  352,  352,  352,  352,  351,   76,  352,
-      352,  352,  352,  352,  352,  352,  384,  384,  351,  108,
-      352,  352,  352,  352,  352,  352,  384,  362,  108,  363,
-      363,  363,  363,  363,  363,  363,  362,  108,  364,  364,
-      364,  364,  364,  364,  364,  384,  384,  362,  108,  365,
-      365,  365,  365,  365,  366,  363,  367,   76,  368,  368,
-      368,  368,  368,  368,  368,  367,   76,  369,  369,  369,
-      369,  369,  369,  369,  384,  384,  367,   76,  370,  370,
-      370,  370,  370,  371,  368,  384,  108,  372,  373,  374,
-
-      372,  372,  372,  372,  362,  108,  363,  363,  363,  363,
-      363,  363,  363,  384,  384,  362,  108,  363,  363,  363,
-      363,  363,  363,  363,  362,   76,  363,  363,  363,  363,
-      363,  363,  384,  384,   76,  375,  376,  377,  375,  375,
-      375,  375,  384,  384,  367,   76,  368,  368,  368,  368,
-      368,  368,  368,  367,   76,  368,  368,  368,  368,  368,
-      368,  368,  367,  108,  368,  368,  368,  368,  368,  368,
-      384,  384,  384,  384,  108,  378,  378,  378,  378,  378,
-      378,  378,  384,  108,  372,  372,  372,  372,  372,  372,
-      372,  384,  108,  379,  379,  379,  379,  379,  380,  378,
-
-      384,  384,  384,   76,  381,  381,  381,  381,  381,  381,
-      381,  384,   76,  375,  375,  375,  375,  375,  375,  375,
-      384,   76,  382,  382,  382,  382,  382,  383,  381,  384,
-      384,  384,  108,  378,  378,  378,  378,  378,  378,  378,
-      384,  108,  378,  378,  378,  378,  378,  378,  384,  384,
-      108,  381,  381,  381,  381,  381,  381,  381,  384,  384,
-      384,   76,  381,  381,  381,  381,  381,  381,  384,  384,
-       76,  384,  384,  384,  384,  384,  384,  384,  384,  108,
-      384,  384,  384,  384,  384,  384,  384,  384,  384,  384,
-      108,   60,   60,   60,   60,   60,   60,   60,   21,   21,
-
-       21,   21,   21,   21,   21,   68,   68,   68,   68,   68,
-       68,   68,   75,  384,  384,  384,  384,   75,   75,   79,
-       79,   79,   79,   79,   79,   79,   81,  384,  384,  384,
-      384,   81,   81,   83,  384,  384,  384,  384,   83,   83,
-       85,  384,   85,  384,  384,   85,   85,  107,  384,  384,
-      384,  384,  107,  107,  110,  384,  384,  384,  384,  110,
-      110,  112,  384,  384,  384,  384,  112,  112,  114,  384,
-      114,  384,  384,  114,  114,  129,  384,  129,  129,  384,
-      384,  129,  136,  384,  136,  384,  136,  136,  136,  138,
-      138,  138,  138,  138,  138,  138,  143,  143,  143,  143,
-
-      143,  143,  143,   86,  384,   86,  384,  384,   86,   86,
-      139,  139,  139,  139,  139,  139,  139,  323,  384,  384,
-      384,  384,  323,  323,  325,  384,  384,  384,  384,  325,
-      325,  339,  339,  339,  339,  339,  339,  339,   13,  384,
-      384,  384,  384,  384,  384,  384,  384,  384,  384,  384,
-      384,  384,  384,  384,  384,  384,  384,  384,  384,  384,
-      384,  384,  384,  384,  384,  384,  384,  384,  384,  384,
-      384,  384,  384,  384,  384,  384,  384,  384,  384,  384,
-      384,  384,  384,  384,  384,  384,  384,  384,  384,  384,
-      384,  384,  384,  384,  384,  384,  384,  384,  384
-
+       43,   43,   43,   58,   43,   43,   15,   62,   63,   81,
+       64,   15,   62,   63,   77,   64,   65,  138,  100,   87,
+       89,   65,   81,   87,   87,  161,   77,   65,   64,   77,
+      138,  100,   65,   64,  109,   77,  162,  164,   77,   89,
+       87,   90,   90,   90,   90,   90,   90,   90,   66,  163,
+
+       77,  117,  109,   66,   15,   16,   17,  175,   18,   88,
+       89,  160,   91,   91,   91,   91,   91,   91,   91,   77,
+      110,  102,   77,  110,  110,  110,  110,  110,  110,  110,
+      110,  109,  345,  110,  110,  110,  110,  110,  110,  110,
+       77,  138,  100,  138,  100,   81,   67,   68,   68,   68,
+       68,   68,   68,   68,   68,   68,   68,   68,   68,   68,
+       68,   68,   68,   15,   16,   17,   89,   18,   92,   92,
+       92,   92,   92,   93,   90,  331,   76,   77,   76,   77,
+       76,  171,   76,   76,  172,  109,   76,  173,  178,  193,
+      194,   77,  195,  196,  138,  100,   77,   76,   76,   76,
+
+       77,  329,  197,   77,  223,   67,   68,   68,   68,   68,
+       68,   68,   68,   68,   68,   68,   68,   68,   68,   68,
+       68,   68,   15,   16,   17,   70,   18,  179,  109,   77,
+       87,   71,   72,   73,   87,   87,  141,  269,  131,   77,
+      209,   87,  131,  131,   74,   87,   87,   81,   81,  345,
+      117,   87,  118,  118,  118,  118,  118,  118,  118,  131,
+      210,  143,   87,  180,   75,   15,   16,   17,   70,   18,
+      116,  182,   77,  198,   71,   72,   73,  195,  132,   87,
+      109,   88,   77,   87,   87,  214,  117,   74,  119,  119,
+      119,  119,  119,  119,  119,   77,   77,  195,  222,  179,
+
+       87,   77,  181,  109,  245,  109,  215,   75,   76,  214,
+      195,  224,   76,  279,   76,  331,  109,   76,   76,  116,
+       76,   76,   76,   94,   94,   94,   94,   94,   94,   94,
+      215,  329,  178,   76,   94,   94,   94,   94,   94,   94,
+       94,   94,   94,   94,   94,   94,   94,   94,   94,   94,
+       94,   77,   94,   76,   76,   76,   76,   76,   76,   76,
+       76,   76,   76,   76,   76,   76,   76,   76,   99,  100,
+       76,  179,   76,  214,   76,   76,  234,  117,   76,  120,
+      120,  120,  120,  120,  121,  118,  246,  109,  140,   76,
+       76,   76,  140,  233,  215,   77,   77,  109,  140,   77,
+
+      244,  309,  258,   77,  109,  247,   77,  109,  108,   82,
+      140,   82,  108,   82,  108,   82,   82,  108,  108,   82,
+      108,  108,  108,  122,  122,  122,  122,  122,  122,  122,
+       82,   82,   82,  108,  122,  122,  122,  122,  122,  122,
+      122,  122,  122,  122,  122,  122,  122,  122,  122,  122,
+      122,  109,  122,  108,  108,  108,  108,  108,  108,  108,
+      108,  108,  108,  108,  108,  108,  108,  108,  127,  100,
+      108,   81,  108,   77,  108,  108,  316,   81,  108,   77,
+       77,  263,  271,  267,  135,  100,  136,  291,  137,  108,
+      108,  108,  136,  248,  137,  272,  280,  143,  143,   87,
+
+      140,  143,  264,   87,  268,  137,  137,  143,   84,   87,
+       84,  263,   84,   77,   84,   84,  267,  270,   84,  143,
+       87,   87,  285,  109,  290,   77,  137,  109,  289,   84,
+       84,   84,  264,  263,   86,   77,   76,  268,   86,  144,
+       76,   76,  300,  286,   86,  150,  151,  152,  150,  150,
+      150,  150,  293,   77,  264,   86,   86,   76,   89,  305,
+       90,   90,   90,   90,   90,   90,   90,  292,  308,   81,
+      308,   81,   89,   77,   90,   90,   90,   90,   90,   90,
+       90,  109,   77,  326,  267,  317,  299,   89,   77,   90,
+       90,   90,   90,   90,   90,  332,  327,  108,  298,  108,
+
+      285,  108,   77,  108,  108,  268,  111,  108,  111,  288,
+      111,  287,  111,  111,  285,   77,  111,   77,  108,  108,
+      108,  286,  278,  306,  277,  109,  306,  111,  111,  111,
+      113,  276,  113,  324,  113,  286,  113,  113,  306,  115,
+      113,  108,  266,  115,  307,  108,  108,  307,  265,  115,
+      324,  113,  113,  113,  325,  262,  257,  256,  351,  307,
+      115,  115,  108,  166,  167,  168,  166,  166,  166,  166,
+      117,  325,  118,  118,  118,  118,  118,  118,  118,  117,
+      324,  118,  118,  118,  118,  118,  118,  118,   77,  255,
+      117,  109,  118,  118,  118,  118,  118,  118,  131,  356,
+
+      109,  325,  131,  131,  130,  367,   76,  254,  130,  109,
+       76,   76,  143,  143,  130,  177,  143,  253,  243,  131,
+      109,  242,  143,  241,  240,  130,  130,   76,  239,  109,
+      232,  231,  372,  230,  143,   77,  229,  182,  132,  183,
+      183,  183,  183,  183,  183,  183,  280,  281,  281,  281,
+      281,  281,  281,  182,  144,  184,  184,  184,  184,  184,
+      184,  184,  109,  343,  343,  343,  182,   77,  185,  185,
+      185,  185,  185,  186,  183,   77,  228,  220,  219,  218,
+      217,  216,  198,   77,  199,  199,  199,  199,  199,  199,
+      199,   77,  141,  208,  207,  198,   77,  200,  200,  200,
+
+      200,  200,  200,  200,  293,  294,  294,  294,  294,  294,
+      294,  198,  109,  201,  201,  201,  201,  201,  202,  199,
+      143,  143,  131,  177,  143,  109,  131,  350,  350,  350,
+      143,  206,  131,  109,  205,  143,  143,  204,  180,  143,
+      203,  109,  143,  131,  131,  143,  211,  212,  213,  211,
+      211,  211,  211,  192,  191,  109,  317,  143,  343,  343,
+      343,  182,  144,  183,  183,  183,  183,  183,  183,  183,
+      190,  189,  188,  187,   77,  141,  182,  144,  183,  183,
+      183,  183,  183,  183,  183,  332,   77,  350,  350,  350,
+      182,   77,  183,  183,  183,  183,  183,  183,  225,  226,
+
+      227,  225,  225,  225,  225,  198,   77,  199,  199,  199,
+      199,  199,  199,  199,  141,  109,  134,  176,  129,  174,
+       77,  170,  169,  114,  112,  198,  109,  199,  199,  199,
+      199,  199,  199,  199,  198,  109,  199,  199,  199,  199,
+      199,  199,  234,  109,  235,  235,  235,  235,  235,  235,
+      235,  158,  154,  153,  234,  109,  236,  236,  236,  236,
+      236,  236,  236,  234,  109,  237,  237,  237,  237,  237,
+      238,  235,   77,  248,  149,  249,  249,  249,  249,  249,
+      249,  249,   85,  248,   77,  250,  250,  250,  250,  250,
+      250,  250,  248,   77,  251,  251,  251,  251,  251,  252,
+
+      249,   83,   81,  109,  259,  260,  261,  259,  259,  259,
+      259,   79,  234,  109,  235,  235,  235,  235,  235,  235,
+      235,  234,  109,  235,  235,  235,  235,  235,  235,  235,
+       78,  234,   77,  235,  235,  235,  235,  235,  235,   77,
+      141,  134,   77,  273,  274,  275,  273,  273,  273,  273,
+      248,   77,  249,  249,  249,  249,  249,  249,  249,  129,
+      248,   77,  249,  249,  249,  249,  249,  249,  249,  126,
+      248,  109,  249,  249,  249,  249,  249,  249,  125,  124,
+      109,  280,  281,  281,  281,  281,  281,  281,  281,  123,
+      109,  280,  282,  282,  282,  282,  282,  282,  282,  114,
+
+      109,  280,  283,  283,  283,  283,  283,  284,  281,  112,
+       77,  293,  294,  294,  294,  294,  294,  294,  294,  109,
+       77,  293,  295,  295,  295,  295,  295,  295,  295,  107,
+       77,  293,  296,  296,  296,  296,  296,  297,  294,  106,
+      109,  301,  302,  303,  304,  301,  301,  301,  105,  104,
+      109,  280,  281,  281,  281,  281,  281,  281,  281,  103,
+      109,  280,  281,  281,  281,  281,  281,  281,  281,   77,
+      310,  312,  313,  314,  315,  312,  312,  312,   98,  317,
+       77,  318,  318,  318,  318,  318,  318,  318,   97,  310,
+       77,  310,  311,   96,   95,   85,   83,   81,   79,  109,
+
+      293,  294,  294,  294,  294,  294,  294,  294,   78,   77,
+       77,  293,  294,  294,  294,  294,  294,  294,  294,  317,
+       77,  319,  319,  319,  319,  319,  319,  319,  317,  109,
+      320,  320,  320,  320,  320,  321,  322,  389,  389,  317,
+      109,  323,  323,  323,  318,  318,  318,  318,  332,   77,
+      333,  333,  333,  333,  333,  333,  333,  332,   77,  334,
+      334,  334,  334,  334,  334,  334,  389,  389,  332,   77,
+      335,  335,  335,  335,  335,  336,  337,  332,  109,  338,
+      338,  338,  333,  333,  333,  333,  389,  109,  339,  340,
+      341,  339,  339,  339,  339,  389,  389,  317,  109,  322,
+
+      322,  322,  322,  322,  322,  322,  317,  109,  322,  322,
+      322,  322,  322,  322,  322,  317,   77,  322,  322,  322,
+      322,  322,  322,  342,  389,  389,  317,   77,  342,  342,
+      342,  342,  342,  342,  342,  389,   77,  328,  389,  328,
+      389,  328,  389,  328,  328,   77,  389,  328,  346,  347,
+      348,  346,  346,  346,  346,  389,   77,  389,  328,  328,
+      328,  330,  389,  330,  389,  330,  389,  330,  330,  389,
+      389,  330,  389,  389,  389,  389,  109,  389,  389,  389,
+      389,  389,  330,  330,  330,  332,  389,  337,  337,  337,
+      337,  337,  337,  337,  332,  389,  337,  337,  337,  337,
+
+      337,  337,  337,  332,  389,  337,  337,  337,  337,  337,
+      337,  349,  389,  389,  332,  109,  349,  349,  349,  349,
+      349,  349,  349,  351,  109,  352,  352,  352,  352,  352,
+      352,  352,  351,  109,  353,  353,  353,  353,  353,  353,
+      353,  389,  389,  351,  109,  354,  354,  354,  354,  354,
+      355,  352,  389,   77,  342,  342,  342,  342,  342,  342,
+      342,  356,   77,  357,  357,  357,  357,  357,  357,  357,
+      389,  389,  356,   77,  358,  358,  358,  358,  358,  358,
+      358,  356,   77,  359,  359,  359,  359,  359,  360,  357,
+      389,  109,  349,  349,  349,  349,  349,  349,  349,  389,
+
+      389,  389,  109,  361,  362,  363,  361,  361,  361,  361,
+      351,  109,  352,  352,  352,  352,  352,  352,  352,  351,
+      109,  352,  352,  352,  352,  352,  352,  352,  389,  389,
+      351,   77,  352,  352,  352,  352,  352,  352,  389,  389,
+       77,  364,  365,  366,  364,  364,  364,  364,  356,   77,
+      357,  357,  357,  357,  357,  357,  357,  389,  389,  356,
+       77,  357,  357,  357,  357,  357,  357,  357,  356,  109,
+      357,  357,  357,  357,  357,  357,  389,  367,  109,  368,
+      368,  368,  368,  368,  368,  368,  389,  389,  367,  109,
+      369,  369,  369,  369,  369,  369,  369,  367,  109,  370,
+
+      370,  370,  370,  370,  371,  368,  372,   77,  373,  373,
+      373,  373,  373,  373,  373,  389,  389,  372,   77,  374,
+      374,  374,  374,  374,  374,  374,  372,   77,  375,  375,
+      375,  375,  375,  376,  373,  389,  109,  377,  378,  379,
+      377,  377,  377,  377,  389,  389,  367,  109,  368,  368,
+      368,  368,  368,  368,  368,  367,  109,  368,  368,  368,
+      368,  368,  368,  368,  367,   77,  368,  368,  368,  368,
+      368,  368,  389,  389,  389,  389,   77,  380,  381,  382,
+      380,  380,  380,  380,  372,   77,  373,  373,  373,  373,
+      373,  373,  373,  372,   77,  373,  373,  373,  373,  373,
+
+      373,  373,  389,  389,  372,  109,  373,  373,  373,  373,
+      373,  373,  389,  389,  109,  383,  383,  383,  383,  383,
+      383,  383,  389,  109,  377,  377,  377,  377,  377,  377,
+      377,  389,  389,  389,  109,  384,  384,  384,  384,  384,
+      385,  383,  389,   77,  386,  386,  386,  386,  386,  386,
+      386,  389,   77,  380,  380,  380,  380,  380,  380,  380,
+      389,  389,  389,   77,  387,  387,  387,  387,  387,  388,
+      386,  389,  109,  383,  383,  383,  383,  383,  383,  383,
+      389,  109,  383,  383,  383,  383,  383,  383,  389,  389,
+      389,  389,  109,  386,  386,  386,  386,  386,  386,  386,
+
+      389,   77,  386,  386,  386,  386,  386,  386,  389,  389,
+       77,  389,  389,  389,  389,  389,  389,  389,  389,  389,
+      389,  109,  389,  389,  389,  389,  389,  389,  389,  389,
+      109,   61,   61,   61,   61,   61,   61,   61,   21,   21,
+       21,   21,   21,   21,   21,   69,   69,   69,   69,   69,
+       69,   69,   76,  389,  389,  389,  389,   76,   76,   80,
+       80,   80,   80,   80,   80,   80,   82,  389,  389,  389,
+      389,   82,   82,   84,  389,  389,  389,  389,   84,   84,
+       86,  389,   86,  389,  389,   86,   86,  108,  389,  389,
+      389,  389,  108,  108,  111,  389,  389,  389,  389,  111,
+
+      111,  113,  389,  389,  389,  389,  113,  113,  115,  389,
+      115,  389,  389,  115,  115,  130,  389,  130,  389,  389,
+      130,  130,  133,  389,  133,  133,  389,  389,  133,  140,
+      389,  140,  389,  140,  140,  140,  142,  142,  142,  142,
+      142,  142,  142,  147,  147,  147,  147,  147,  147,  147,
+       87,  389,   87,  389,  389,   87,   87,  131,  389,  131,
+      389,  389,  131,  131,  143,  143,  143,  143,  143,  143,
+      143,  328,  389,  389,  389,  389,  328,  328,  330,  389,
+      389,  389,  389,  330,  330,  344,  344,  344,  344,  344,
+      344,  344,   13,  389,  389,  389,  389,  389,  389,  389,
+
+      389,  389,  389,  389,  389,  389,  389,  389,  389,  389,
+      389,  389,  389,  389,  389,  389,  389,  389,  389,  389,
+      389,  389,  389,  389,  389,  389,  389,  389,  389,  389,
+      389,  389,  389,  389,  389,  389,  389,  389,  389,  389,
+      389,  389,  389,  389,  389,  389,  389,  389,  389,  389,
+      389,  389,  389
     } ;
 
-static yyconst short int yy_chk[2100] =
+static yyconst short int yy_chk[2154] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -720,231 +728,237 @@ static yyconst short int yy_chk[2100] =
         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,    5,    6,   36,   58,    5,    6,    5,    6,   44,
-       66,   66,   44,   44,   44,   44,   44,   44,   44,   36,
-       58,   74,   74,    2,    2,   96,    2,  106,   96,  100,
-      398,   96,    2,  106,  100,    2,    3,    3,    3,    3,
+        2,    5,    6,   36,   58,    5,    6,    5,    6,   67,
+       67,   71,  107,   73,    5,    6,   75,   75,  107,   36,
+       58,  193,   97,    2,    2,   97,    2,  193,   97,  101,
+      404,   71,    2,   73,  101,    2,    3,    3,    3,    3,
 
         3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
         3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
         3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
         3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
         3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
-        3,    3,    3,    3,    3,    3,    7,    7,    7,   70,
-        7,    8,    8,    8,  381,    8,    7,   72,  378,   24,
-       89,    8,   37,   24,   24,  101,  127,    7,    7,   70,
-       48,  127,    8,    8,   48,   48,  191,   72,  102,   25,
-       24,   25,   25,   25,   25,   25,   25,   25,    7,  102,
-
-       89,   48,  191,    8,    9,    9,    9,  117,    9,   24,
-       26,  104,   26,   26,   26,   26,   26,   26,   26,   25,
-       48,   37,   76,  103,   76,  104,   76,  101,   76,   76,
-      103,  105,   76,   98,   98,  124,  156,  117,  124,  240,
-       26,  124,  105,   76,   76,   76,    9,    9,    9,    9,
+        3,    3,    3,    3,    3,    3,    7,    7,    7,  102,
+        7,    8,    8,    8,  103,    8,    7,  135,  135,   24,
+       90,    8,   37,   24,   24,  103,  106,    7,    7,  104,
+       99,   99,    8,    8,  386,  105,  104,  106,  383,   25,
+       24,   25,   25,   25,   25,   25,   25,   25,    7,  105,
+
+       90,  118,  128,    8,    9,    9,    9,  128,    9,   24,
+       26,  102,   26,   26,   26,   26,   26,   26,   26,   25,
+       44,   37,   99,   44,   44,   44,   44,   44,   44,   44,
+      110,  118,  344,  110,  110,  110,  110,  110,  110,  110,
+       26,  138,  138,  127,  127,  160,    9,    9,    9,    9,
         9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
         9,    9,    9,   10,   10,   10,   27,   10,   27,   27,
-       27,   27,   27,   27,   27,   98,   82,  158,   82,  158,
-       82,  156,   82,   82,  109,  240,   82,  109,  109,  109,
-      109,  109,  109,  109,  131,  131,   27,   82,   82,   82,
+       27,   27,   27,   27,   27,  330,   77,  159,   77,  165,
+       77,  125,   77,   77,  125,  127,   77,  125,  143,  159,
+      160,  162,  165,  162,  148,  148,   27,   77,   77,   77,
 
-      126,  126,  134,  134,  339,   10,   10,   10,   10,   10,
+      164,  328,  164,  195,  195,   10,   10,   10,   10,   10,
        10,   10,   10,   10,   10,   10,   10,   10,   10,   10,
-       10,   10,   11,   11,   11,   11,   11,  325,  144,  144,
-      323,   11,   11,   11,   88,   88,   88,   88,   88,   88,
-       88,  139,  126,   49,   11,   49,   49,   49,   49,   49,
-       49,   49,   50,  322,   50,   50,   50,   50,   50,   50,
-       50,  140,   88,  140,   11,   12,   12,   12,   12,   12,
-      144,  174,  157,   49,   12,   12,   12,  157,  218,   85,
-      139,  159,   50,   85,   85,  155,   51,   12,   51,   51,
-       51,   51,   51,   51,   51,  218,  159,  155,  161,  160,
-
-       85,  160,  140,  171,  190,  190,  321,   12,   30,  182,
-      174,  161,   30,  306,   30,  171,   51,   30,   30,   85,
+       10,   10,   11,   11,   11,   11,   11,  143,  175,  244,
+       48,   11,   11,   11,   48,   48,  148,  244,   60,  327,
+      175,   86,   60,   60,   11,   86,   86,  222,  194,  326,
+       49,   48,   49,   49,   49,   49,   49,   49,   49,   60,
+      179,  144,   86,  144,   11,   12,   12,   12,   12,   12,
+       48,  183,  161,  199,   12,   12,   12,  161,   60,  115,
+       49,   86,  163,  115,  115,  187,   50,   12,   50,   50,
+       50,   50,   50,   50,   50,  196,  197,  163,  194,  179,
+
+      115,  183,  144,  199,  222,  258,  187,   12,   30,  203,
+      197,  196,   30,  258,   30,  311,   50,   30,   30,  115,
        30,   30,   30,   30,   30,   30,   30,   30,   30,   30,
-      182,  189,  305,   30,   30,   30,   30,   30,   30,   30,
+      203,  310,  210,   30,   30,   30,   30,   30,   30,   30,
        30,   30,   30,   30,   30,   30,   30,   30,   30,   30,
        30,   30,   30,   30,   30,   30,   30,   30,   30,   30,
        30,   30,   30,   30,   30,   30,   30,   30,   35,   35,
-       35,  188,   35,  192,   35,   35,  204,  188,   35,  216,
-      295,  189,  204,  228,  216,  219,  293,  192,  228,   35,
-       35,   35,   52,   84,  219,   84,   52,   84,   52,   84,
+       35,  210,   35,  214,   35,   35,  235,   51,   35,   51,
+       51,   51,   51,   51,   51,   51,  223,  209,  141,   35,
+       35,   35,  141,  209,  214,  221,  224,  233,  141,  291,
 
-       84,   52,   52,   84,   52,   52,   52,   52,   52,   52,
-       52,   52,   52,   52,   84,   84,   84,   52,   52,   52,
+      221,  291,  233,  223,  300,  224,  235,   51,   52,   83,
+      141,   83,   52,   83,   52,   83,   83,   52,   52,   83,
        52,   52,   52,   52,   52,   52,   52,   52,   52,   52,
+       83,   83,   83,   52,   52,   52,   52,   52,   52,   52,
        52,   52,   52,   52,   52,   52,   52,   52,   52,   52,
        52,   52,   52,   52,   52,   52,   52,   52,   52,   52,
-       52,   52,   57,   57,   57,  217,   57,  137,   57,   57,
-      284,  137,   57,  285,  285,  178,  267,  137,   65,   65,
-       65,  194,   65,   57,   57,   57,   65,  205,   65,  137,
-      267,   69,   69,  145,   69,   69,  198,  145,  209,   65,
-       65,   69,   87,  145,   87,  178,   87,  235,   87,   87,
-
-      238,  194,   87,   69,  145,  145,  282,  198,  241,  209,
-       65,  230,  217,   87,   87,   87,  205,  241,  235,  244,
-      265,  238,   90,   69,   90,   90,   90,   90,   90,   90,
-       90,   91,  273,   91,   91,   91,   91,   91,   91,   91,
-       92,  230,   92,   92,   92,   92,   92,   92,  239,  244,
-      242,  276,   90,  108,  272,  108,  239,  108,  249,  108,
-      108,   91,  111,  108,  111,  242,  111,  265,  111,  111,
-       92,  261,  111,  114,  108,  108,  108,  114,  114,  249,
-      276,  253,  252,  111,  111,  111,  113,  260,  113,  253,
-      113,  257,  113,  113,  114,  115,  113,  115,  286,  115,
-
-      286,  115,  115,  252,  251,  115,  258,  113,  113,  113,
-      250,  248,  257,  114,  237,  262,  115,  115,  115,  116,
-      116,  116,  116,  116,  116,  116,  118,  258,  118,  118,
-      118,  118,  118,  118,  118,  119,  262,  119,  119,  119,
-      119,  119,  119,  119,  264,  313,  120,  116,  120,  120,
-      120,  120,  120,  120,  266,  236,  118,  138,  138,  264,
-      138,  138,  266,  304,  234,  119,  146,  138,  146,  146,
-      146,  146,  146,  146,  146,  313,  120,  304,  147,  138,
-      147,  147,  147,  147,  147,  147,  147,  148,  227,  148,
-      148,  148,  148,  148,  148,  148,  146,  226,  162,  138,
-
-      162,  162,  162,  162,  162,  162,  162,  163,  147,  163,
-      163,  163,  163,  163,  163,  163,  164,  148,  164,  164,
-      164,  164,  164,  164,  164,  225,  175,  175,  162,  175,
-      175,  176,  176,  224,  176,  176,  175,  163,  289,  328,
-      271,  176,  280,  283,  294,  300,  164,  274,  175,  287,
-      301,  287,  287,  176,  177,  177,  177,  177,  177,  177,
-      177,  271,  274,  280,  283,  294,  300,  289,  175,  328,
-      287,  301,  179,  176,  179,  179,  179,  179,  179,  179,
-      179,  180,  177,  180,  180,  180,  180,  180,  180,  180,
-      181,  223,  181,  181,  181,  181,  181,  181,  347,  352,
-
-      215,  214,  179,  193,  193,  193,  193,  193,  193,  193,
-      195,  180,  195,  195,  195,  195,  195,  195,  195,  196,
-      181,  196,  196,  196,  196,  196,  196,  196,  347,  352,
-      197,  193,  197,  197,  197,  197,  197,  197,  213,  206,
-      195,  206,  206,  206,  206,  206,  206,  206,  207,  196,
-      207,  207,  207,  207,  207,  207,  207,  363,  212,  208,
-      197,  208,  208,  208,  208,  208,  208,  208,  220,  206,
-      220,  220,  220,  220,  220,  220,  220,  221,  207,  221,
-      221,  221,  221,  221,  221,  221,  368,  363,  222,  208,
-      222,  222,  222,  222,  222,  222,  222,  211,  220,  229,
-
-      229,  229,  229,  229,  229,  229,  231,  221,  231,  231,
-      231,  231,  231,  231,  231,  203,  368,  232,  222,  232,
-      232,  232,  232,  232,  232,  232,  233,  229,  233,  233,
-      233,  233,  233,  233,  202,  201,  231,  243,  243,  243,
-      243,  243,  243,  243,  200,  199,  245,  232,  245,  245,
-      245,  245,  245,  245,  245,  246,  233,  246,  246,  246,
-      246,  246,  246,  246,  247,  243,  247,  247,  247,  247,
-      247,  247,  187,  186,  185,  184,  245,  254,  254,  254,
-      254,  254,  254,  254,  254,  246,  255,  255,  255,  255,
-      255,  255,  255,  255,  247,  256,  256,  256,  256,  256,
-
-      256,  256,  256,  183,  172,  170,  254,  268,  268,  268,
-      268,  268,  268,  268,  268,  255,  269,  269,  269,  269,
-      269,  269,  269,  269,  256,  270,  270,  270,  270,  270,
-      270,  270,  270,  169,  168,  167,  268,  275,  275,  275,
-      275,  275,  275,  275,  166,  269,  277,  277,  277,  277,
-      277,  277,  277,  277,  270,  278,  278,  278,  278,  278,
-      278,  278,  278,  165,  154,  275,  279,  279,  279,  279,
-      279,  279,  279,  311,  153,  277,  288,  288,  288,  288,
-      288,  288,  288,  152,  278,  290,  290,  290,  290,  290,
-      290,  290,  290,  151,  311,  279,  291,  291,  291,  291,
-
-      291,  291,  291,  291,  288,  292,  292,  292,  292,  292,
-      292,  292,  150,  296,  290,  296,  296,  296,  296,  296,
-      296,  296,  149,  143,  297,  291,  297,  297,  297,  297,
-      297,  297,  297,  298,  292,  298,  298,  298,  298,  298,
-      298,  298,  299,  296,  299,  299,  299,  299,  299,  299,
-      299,  303,  303,  307,  297,  307,  307,  307,  307,  307,
-      307,  307,  136,  298,  303,  130,  128,  125,  123,  122,
-      112,  308,  299,  308,  308,  308,  308,  308,  308,  308,
-      110,  107,  309,  307,  309,  309,  309,  309,  309,  309,
-      309,  310,   97,  310,  310,  310,  310,  310,  310,  310,
-
-       95,  308,  312,  312,  312,  312,  312,  312,  312,   94,
-       86,  314,  309,  314,  314,  314,  314,  314,  314,  314,
-      315,  310,  315,  315,  315,  315,  315,  315,  315,  316,
-      312,  316,  316,  316,  316,  316,  316,  316,   83,  319,
-      317,  314,  317,  317,  317,  317,  317,  317,  317,  318,
-      315,  318,  318,  318,   81,   79,   78,   77,   75,  316,
-      319,  324,   68,  324,   62,  324,   59,  324,  324,   56,
-      317,  324,  327,  327,  327,  327,  327,  327,  327,  318,
-       55,   54,  324,  324,  324,  326,   53,  326,   47,  326,
-       45,  326,  326,   43,   42,  326,   41,   40,   39,   38,
-
-      327,   34,   33,   32,   31,   22,  326,  326,  326,  329,
-       19,  329,  329,  329,  329,  329,  329,  329,  330,   18,
-      330,  330,  330,  330,  330,  330,  330,  331,   17,  331,
-      331,  331,  331,  331,  331,  331,   15,   14,  332,  329,
-      332,  332,  332,  332,  332,  332,  332,  333,  330,  333,
-      333,  333,   13,    0,    0,    0,  334,  331,  334,  334,
-      334,  334,  334,  334,  334,    0,    0,  335,  332,  335,
-      335,  335,  335,  335,  335,  335,  336,  333,  336,  336,
-      336,  336,  336,  336,  336,    0,  334,  337,  337,  337,
-      337,  337,  337,  337,  338,  338,  338,  335,    0,    0,
-
-        0,    0,  345,  345,  345,  341,  336,  341,  341,  341,
-      341,  341,  341,  341,    0,  337,    0,    0,    0,    0,
-        0,  342,  338,  342,  342,  342,  342,  342,  342,  342,
-      345,    0,    0,    0,  343,  341,  343,  343,  343,  343,
-      343,  343,  343,  344,  344,  344,  344,  344,  344,  344,
-        0,  342,  346,  346,  346,  346,  346,  346,  346,    0,
-        0,    0,    0,    0,  343,    0,    0,    0,    0,    0,
-      348,  344,  348,  348,  348,  348,  348,  348,  348,  349,
-      346,  349,  349,  349,  349,  349,  349,  349,  350,    0,
-      350,  350,  350,  350,  350,  350,    0,    0,    0,    0,
-
-      348,  351,  351,  351,  351,  351,  351,  351,  353,  349,
-      353,  353,  353,  353,  353,  353,  353,  354,  350,  354,
-      354,  354,  354,  354,  354,  354,    0,    0,  355,  351,
-      355,  355,  355,  355,  355,  355,    0,  356,  353,  356,
-      356,  356,  356,  356,  356,  356,  357,  354,  357,  357,
-      357,  357,  357,  357,  357,    0,    0,  358,  355,  358,
-      358,  358,  358,  358,  358,  358,  359,  356,  359,  359,
-      359,  359,  359,  359,  359,  360,  357,  360,  360,  360,
-      360,  360,  360,  360,    0,    0,  361,  358,  361,  361,
-      361,  361,  361,  361,  361,    0,  359,  362,  362,  362,
-
-      362,  362,  362,  362,  364,  360,  364,  364,  364,  364,
-      364,  364,  364,    0,    0,  365,  361,  365,  365,  365,
-      365,  365,  365,  365,  366,  362,  366,  366,  366,  366,
-      366,  366,    0,    0,  364,  367,  367,  367,  367,  367,
-      367,  367,    0,    0,  369,  365,  369,  369,  369,  369,
-      369,  369,  369,  370,  366,  370,  370,  370,  370,  370,
-      370,  370,  371,  367,  371,  371,  371,  371,  371,  371,
-        0,    0,    0,    0,  369,  372,  372,  372,  372,  372,
-      372,  372,    0,  370,  373,  373,  373,  373,  373,  373,
-      373,    0,  371,  374,  374,  374,  374,  374,  374,  374,
-
-        0,    0,    0,  372,  375,  375,  375,  375,  375,  375,
-      375,    0,  373,  376,  376,  376,  376,  376,  376,  376,
-        0,  374,  377,  377,  377,  377,  377,  377,  377,    0,
-        0,    0,  375,  379,  379,  379,  379,  379,  379,  379,
-        0,  376,  380,  380,  380,  380,  380,  380,    0,    0,
-      377,  382,  382,  382,  382,  382,  382,  382,    0,    0,
-        0,  379,  383,  383,  383,  383,  383,  383,    0,    0,
-      380,    0,    0,    0,    0,    0,    0,    0,    0,  382,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-      383,  385,  385,  385,  385,  385,  385,  385,  386,  386,
-
-      386,  386,  386,  386,  386,  387,  387,  387,  387,  387,
-      387,  387,  388,    0,    0,    0,    0,  388,  388,  389,
-      389,  389,  389,  389,  389,  389,  390,    0,    0,    0,
-        0,  390,  390,  391,    0,    0,    0,    0,  391,  391,
-      392,    0,  392,    0,    0,  392,  392,  393,    0,    0,
-        0,    0,  393,  393,  394,    0,    0,    0,    0,  394,
-      394,  395,    0,    0,    0,    0,  395,  395,  396,    0,
-      396,    0,    0,  396,  396,  397,    0,  397,  397,    0,
-        0,  397,  399,    0,  399,    0,  399,  399,  399,  400,
-      400,  400,  400,  400,  400,  400,  401,  401,  401,  401,
-
-      401,  401,  401,  402,    0,  402,    0,    0,  402,  402,
-      403,  403,  403,  403,  403,  403,  403,  404,    0,    0,
-        0,    0,  404,  404,  405,    0,    0,    0,    0,  405,
-      405,  406,  406,  406,  406,  406,  406,  406,  384,  384,
-      384,  384,  384,  384,  384,  384,  384,  384,  384,  384,
-      384,  384,  384,  384,  384,  384,  384,  384,  384,  384,
-      384,  384,  384,  384,  384,  384,  384,  384,  384,  384,
-      384,  384,  384,  384,  384,  384,  384,  384,  384,  384,
-      384,  384,  384,  384,  384,  384,  384,  384,  384,  384,
-      384,  384,  384,  384,  384,  384,  384,  384,  384
-
+       52,   52,   52,   52,   52,   52,   52,   52,   57,   57,
+       57,  245,   57,  246,   57,   57,  298,  270,   57,  271,
+      247,  240,  246,  243,   66,   66,   66,  271,   66,   57,
+       57,   57,   66,  249,   66,  247,  281,   70,   70,  149,
+
+       70,   70,  240,  149,  243,   66,   66,   70,   85,  149,
+       85,  254,   85,  269,   85,   85,  257,  245,   85,   70,
+      149,  149,  262,  249,  270,  281,   66,  279,  269,   85,
+       85,   85,  254,  263,   88,  289,   88,  257,   88,   70,
+       88,   88,  279,  262,   88,   89,   89,   89,   89,   89,
+       89,   89,  294,  272,  263,   88,   88,   88,   91,  287,
+       91,   91,   91,   91,   91,   91,   91,  272,  290,  290,
+      308,  308,   92,   89,   92,   92,   92,   92,   92,   92,
+       92,  294,  309,  308,  267,  318,  278,   93,   91,   93,
+       93,   93,   93,   93,   93,  333,  309,  109,  277,  109,
+
+      276,  109,   92,  109,  109,  267,  112,  109,  112,  266,
+      112,  265,  112,  112,  285,  318,  112,   93,  109,  109,
+      109,  276,  256,  288,  255,  333,  299,  112,  112,  112,
+      114,  253,  114,  305,  114,  285,  114,  114,  306,  116,
+      114,  116,  242,  116,  288,  116,  116,  299,  241,  116,
+      316,  114,  114,  114,  305,  239,  232,  231,  352,  306,
+      116,  116,  116,  117,  117,  117,  117,  117,  117,  117,
+      119,  316,  119,  119,  119,  119,  119,  119,  119,  120,
+      324,  120,  120,  120,  120,  120,  120,  120,  352,  230,
+      121,  117,  121,  121,  121,  121,  121,  121,  130,  357,
+
+      119,  324,  130,  130,  132,  368,  132,  229,  132,  120,
+      132,  132,  142,  142,  132,  142,  142,  228,  220,  130,
+      121,  219,  142,  218,  217,  132,  132,  132,  216,  357,
+      208,  207,  373,  206,  142,  368,  205,  150,  130,  150,
+      150,  150,  150,  150,  150,  150,  284,  284,  284,  284,
+      284,  284,  284,  151,  142,  151,  151,  151,  151,  151,
+      151,  151,  373,  343,  343,  343,  152,  150,  152,  152,
+      152,  152,  152,  152,  152,  284,  204,  192,  191,  190,
+      189,  188,  166,  151,  166,  166,  166,  166,  166,  166,
+      166,  343,  177,  174,  173,  167,  152,  167,  167,  167,
+
+      167,  167,  167,  167,  297,  297,  297,  297,  297,  297,
+      297,  168,  166,  168,  168,  168,  168,  168,  168,  168,
+      180,  180,  176,  180,  180,  167,  176,  350,  350,  350,
+      180,  172,  176,  297,  171,  181,  181,  170,  181,  181,
+      169,  168,  180,  176,  176,  181,  182,  182,  182,  182,
+      182,  182,  182,  158,  157,  350,  323,  181,  323,  323,
+      323,  184,  180,  184,  184,  184,  184,  184,  184,  184,
+      156,  155,  154,  153,  182,  147,  185,  181,  185,  185,
+      185,  185,  185,  185,  185,  338,  323,  338,  338,  338,
+      186,  184,  186,  186,  186,  186,  186,  186,  198,  198,
+
+      198,  198,  198,  198,  198,  200,  185,  200,  200,  200,
+      200,  200,  200,  200,  140,  338,  134,  131,  129,  126,
+      186,  124,  123,  113,  111,  201,  198,  201,  201,  201,
+      201,  201,  201,  201,  202,  200,  202,  202,  202,  202,
+      202,  202,  211,  108,  211,  211,  211,  211,  211,  211,
+      211,   98,   96,   95,  212,  201,  212,  212,  212,  212,
+      212,  212,  212,  213,  202,  213,  213,  213,  213,  213,
+      213,  213,  211,  225,   87,  225,  225,  225,  225,  225,
+      225,  225,   84,  226,  212,  226,  226,  226,  226,  226,
+      226,  226,  227,  213,  227,  227,  227,  227,  227,  227,
+
+      227,   82,   80,  225,  234,  234,  234,  234,  234,  234,
+      234,   79,  236,  226,  236,  236,  236,  236,  236,  236,
+      236,  237,  227,  237,  237,  237,  237,  237,  237,  237,
+       78,  238,  234,  238,  238,  238,  238,  238,  238,   76,
+       69,   63,  236,  248,  248,  248,  248,  248,  248,  248,
+      250,  237,  250,  250,  250,  250,  250,  250,  250,   59,
+      251,  238,  251,  251,  251,  251,  251,  251,  251,   56,
+      252,  248,  252,  252,  252,  252,  252,  252,   55,   54,
+      250,  259,  259,  259,  259,  259,  259,  259,  259,   53,
+      251,  260,  260,  260,  260,  260,  260,  260,  260,   47,
+
+      252,  261,  261,  261,  261,  261,  261,  261,  261,   45,
+      259,  273,  273,  273,  273,  273,  273,  273,  273,   43,
+      260,  274,  274,  274,  274,  274,  274,  274,  274,   42,
+      261,  275,  275,  275,  275,  275,  275,  275,  275,   41,
+      273,  280,  280,  280,  280,  280,  280,  280,   40,   39,
+      274,  282,  282,  282,  282,  282,  282,  282,  282,   38,
+      275,  283,  283,  283,  283,  283,  283,  283,  283,  280,
+      292,  293,  293,  293,  293,  293,  293,  293,   34,  301,
+      282,  301,  301,  301,  301,  301,  301,  301,   33,  292,
+      283,  292,  292,   32,   31,   22,   19,   18,   17,  293,
+
+      295,  295,  295,  295,  295,  295,  295,  295,   15,  301,
+      292,  296,  296,  296,  296,  296,  296,  296,  296,  302,
+       14,  302,  302,  302,  302,  302,  302,  302,  303,  295,
+      303,  303,  303,  303,  303,  303,  303,   13,    0,  304,
+      296,  304,  304,  304,  304,  304,  304,  304,  312,  302,
+      312,  312,  312,  312,  312,  312,  312,  313,  303,  313,
+      313,  313,  313,  313,  313,  313,    0,    0,  314,  304,
+      314,  314,  314,  314,  314,  314,  314,  315,  312,  315,
+      315,  315,  315,  315,  315,  315,    0,  313,  317,  317,
+      317,  317,  317,  317,  317,    0,    0,  319,  314,  319,
+
+      319,  319,  319,  319,  319,  319,  320,  315,  320,  320,
+      320,  320,  320,  320,  320,  321,  317,  321,  321,  321,
+      321,  321,  321,  321,    0,    0,  322,  319,  322,  322,
+      322,  322,  322,  322,  322,    0,  320,  329,    0,  329,
+        0,  329,    0,  329,  329,  321,    0,  329,  332,  332,
+      332,  332,  332,  332,  332,    0,  322,    0,  329,  329,
+      329,  331,    0,  331,    0,  331,    0,  331,  331,    0,
+        0,  331,    0,    0,    0,    0,  332,    0,    0,    0,
+        0,    0,  331,  331,  331,  334,    0,  334,  334,  334,
+      334,  334,  334,  334,  335,    0,  335,  335,  335,  335,
+
+      335,  335,  335,  336,    0,  336,  336,  336,  336,  336,
+      336,  336,    0,    0,  337,  334,  337,  337,  337,  337,
+      337,  337,  337,  339,  335,  339,  339,  339,  339,  339,
+      339,  339,  340,  336,  340,  340,  340,  340,  340,  340,
+      340,    0,    0,  341,  337,  341,  341,  341,  341,  341,
+      341,  341,    0,  339,  342,  342,  342,  342,  342,  342,
+      342,  346,  340,  346,  346,  346,  346,  346,  346,  346,
+        0,    0,  347,  341,  347,  347,  347,  347,  347,  347,
+      347,  348,  342,  348,  348,  348,  348,  348,  348,  348,
+        0,  346,  349,  349,  349,  349,  349,  349,  349,    0,
+
+        0,    0,  347,  351,  351,  351,  351,  351,  351,  351,
+      353,  348,  353,  353,  353,  353,  353,  353,  353,  354,
+      349,  354,  354,  354,  354,  354,  354,  354,    0,    0,
+      355,  351,  355,  355,  355,  355,  355,  355,    0,    0,
+      353,  356,  356,  356,  356,  356,  356,  356,  358,  354,
+      358,  358,  358,  358,  358,  358,  358,    0,    0,  359,
+      355,  359,  359,  359,  359,  359,  359,  359,  360,  356,
+      360,  360,  360,  360,  360,  360,    0,  361,  358,  361,
+      361,  361,  361,  361,  361,  361,    0,    0,  362,  359,
+      362,  362,  362,  362,  362,  362,  362,  363,  360,  363,
+
+      363,  363,  363,  363,  363,  363,  364,  361,  364,  364,
+      364,  364,  364,  364,  364,    0,    0,  365,  362,  365,
+      365,  365,  365,  365,  365,  365,  366,  363,  366,  366,
+      366,  366,  366,  366,  366,    0,  364,  367,  367,  367,
+      367,  367,  367,  367,    0,    0,  369,  365,  369,  369,
+      369,  369,  369,  369,  369,  370,  366,  370,  370,  370,
+      370,  370,  370,  370,  371,  367,  371,  371,  371,  371,
+      371,  371,    0,    0,    0,    0,  369,  372,  372,  372,
+      372,  372,  372,  372,  374,  370,  374,  374,  374,  374,
+      374,  374,  374,  375,  371,  375,  375,  375,  375,  375,
+
+      375,  375,    0,    0,  376,  372,  376,  376,  376,  376,
+      376,  376,    0,    0,  374,  377,  377,  377,  377,  377,
+      377,  377,    0,  375,  378,  378,  378,  378,  378,  378,
+      378,    0,    0,    0,  376,  379,  379,  379,  379,  379,
+      379,  379,    0,  377,  380,  380,  380,  380,  380,  380,
+      380,    0,  378,  381,  381,  381,  381,  381,  381,  381,
+        0,    0,    0,  379,  382,  382,  382,  382,  382,  382,
+      382,    0,  380,  384,  384,  384,  384,  384,  384,  384,
+        0,  381,  385,  385,  385,  385,  385,  385,    0,    0,
+        0,    0,  382,  387,  387,  387,  387,  387,  387,  387,
+
+        0,  384,  388,  388,  388,  388,  388,  388,    0,    0,
+      385,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,  387,    0,    0,    0,    0,    0,    0,    0,    0,
+      388,  390,  390,  390,  390,  390,  390,  390,  391,  391,
+      391,  391,  391,  391,  391,  392,  392,  392,  392,  392,
+      392,  392,  393,    0,    0,    0,    0,  393,  393,  394,
+      394,  394,  394,  394,  394,  394,  395,    0,    0,    0,
+        0,  395,  395,  396,    0,    0,    0,    0,  396,  396,
+      397,    0,  397,    0,    0,  397,  397,  398,    0,    0,
+        0,    0,  398,  398,  399,    0,    0,    0,    0,  399,
+
+      399,  400,    0,    0,    0,    0,  400,  400,  401,    0,
+      401,    0,    0,  401,  401,  402,    0,  402,    0,    0,
+      402,  402,  403,    0,  403,  403,    0,    0,  403,  405,
+        0,  405,    0,  405,  405,  405,  406,  406,  406,  406,
+      406,  406,  406,  407,  407,  407,  407,  407,  407,  407,
+      408,    0,  408,    0,    0,  408,  408,  409,    0,  409,
+        0,    0,  409,  409,  410,  410,  410,  410,  410,  410,
+      410,  411,    0,    0,    0,    0,  411,  411,  412,    0,
+        0,    0,    0,  412,  412,  413,  413,  413,  413,  413,
+      413,  413,  389,  389,  389,  389,  389,  389,  389,  389,
+
+      389,  389,  389,  389,  389,  389,  389,  389,  389,  389,
+      389,  389,  389,  389,  389,  389,  389,  389,  389,  389,
+      389,  389,  389,  389,  389,  389,  389,  389,  389,  389,
+      389,  389,  389,  389,  389,  389,  389,  389,  389,  389,
+      389,  389,  389,  389,  389,  389,  389,  389,  389,  389,
+      389,  389,  389
     } ;
 
 static yy_state_type yy_last_accepting_state;
@@ -1055,7 +1069,7 @@ extern void yyerror               __P((const char *));
 
 #define INDEFS 5
 
-#line 1059 "toke.c"
+#line 1073 "toke.c"
 
 /* Macros after this point can all be overridden by user definitions in
  * section 1.
@@ -1209,9 +1223,9 @@ YY_DECL
        register char *yy_cp, *yy_bp;
        register int yy_act;
 
-#line 103 "toke.l"
+#line 104 "toke.l"
 
-#line 1215 "toke.c"
+#line 1229 "toke.c"
 
        if ( yy_init )
                {
@@ -1263,13 +1277,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 >= 385 )
+                               if ( yy_current_state >= 390 )
                                        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] != 2039 );
+               while ( yy_base[yy_current_state] != 2093 );
 
 yy_find_action:
                yy_act = yy_accept[yy_current_state];
@@ -1297,12 +1311,12 @@ do_action:      /* This label is used only to access EOF actions. */
 
 case 1:
 YY_RULE_SETUP
-#line 104 "toke.l"
+#line 105 "toke.l"
 BEGIN STARTDEFS;
        YY_BREAK
 case 2:
 YY_RULE_SETUP
-#line 106 "toke.l"
+#line 107 "toke.l"
 {
                            BEGIN INDEFS;
                            LEXTRACE("DEFVAR ");
@@ -1314,7 +1328,7 @@ YY_RULE_SETUP
 
 case 3:
 YY_RULE_SETUP
-#line 115 "toke.l"
+#line 116 "toke.l"
 {
                            BEGIN STARTDEFS;
                            LEXTRACE(", ");
@@ -1323,7 +1337,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 4:
 YY_RULE_SETUP
-#line 121 "toke.l"
+#line 122 "toke.l"
 {
                            LEXTRACE("= ");
                            return('=');
@@ -1331,7 +1345,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 5:
 YY_RULE_SETUP
-#line 126 "toke.l"
+#line 127 "toke.l"
 {
                            LEXTRACE("+= ");
                            return('+');
@@ -1339,7 +1353,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 6:
 YY_RULE_SETUP
-#line 131 "toke.l"
+#line 132 "toke.l"
 {
                            LEXTRACE("-= ");
                            return('-');
@@ -1347,7 +1361,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 7:
 YY_RULE_SETUP
-#line 136 "toke.l"
+#line 137 "toke.l"
 {
                            LEXTRACE("WORD(1) ");
                            if (!fill(yytext + 1, yyleng - 2))
@@ -1357,7 +1371,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 143 "toke.l"
+#line 144 "toke.l"
 {
                            LEXTRACE("WORD(2) ");
                            if (!fill(yytext, yyleng))
@@ -1369,7 +1383,7 @@ YY_RULE_SETUP
 
 case 9:
 YY_RULE_SETUP
-#line 152 "toke.l"
+#line 153 "toke.l"
 {
                            /* quoted fnmatch glob char, pass verbatim */
                            LEXTRACE("QUOTEDCHAR ");
@@ -1380,7 +1394,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 10:
 YY_RULE_SETUP
-#line 160 "toke.l"
+#line 161 "toke.l"
 {
                            /* quoted sudoers special char, strip backslash */
                            LEXTRACE("QUOTEDCHAR ");
@@ -1391,7 +1405,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 11:
 YY_RULE_SETUP
-#line 168 "toke.l"
+#line 169 "toke.l"
 {
                            BEGIN INITIAL;
                            yyless(0);
@@ -1400,7 +1414,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 12:
 YY_RULE_SETUP
-#line 174 "toke.l"
+#line 175 "toke.l"
 {
                            LEXTRACE("ARG ");
                            if (!fill_args(yytext, yyleng, sawspace))
@@ -1411,7 +1425,7 @@ YY_RULE_SETUP
 
 case 13:
 YY_RULE_SETUP
-#line 182 "toke.l"
+#line 183 "toke.l"
 {
                            char *cp, *ep;
                            ++sudolineno;
@@ -1430,7 +1444,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 14:
 YY_RULE_SETUP
-#line 198 "toke.l"
+#line 199 "toke.l"
 {
                            BEGIN GOTDEFS;
                            switch (yytext[8]) {
@@ -1446,6 +1460,10 @@ YY_RULE_SETUP
                                    yyless(9);
                                    LEXTRACE("DEFAULTS_HOST ");
                                    return(DEFAULTS_HOST);
+                               case '!':
+                                   yyless(9);
+                                   LEXTRACE("DEFAULTS_CMND ");
+                                   return(DEFAULTS_CMND);
                                default:
                                    LEXTRACE("DEFAULTS ");
                                    return(DEFAULTS);
@@ -1454,7 +1472,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 219 "toke.l"
+#line 224 "toke.l"
 {
                            if (!fill(yytext, yyleng))
                                yyterminate();
@@ -1477,7 +1495,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 16:
 YY_RULE_SETUP
-#line 239 "toke.l"
+#line 244 "toke.l"
 {
                                /* cmnd does not require passwd for this user */
                                LEXTRACE("NOPASSWD ");
@@ -1486,7 +1504,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 17:
 YY_RULE_SETUP
-#line 245 "toke.l"
+#line 250 "toke.l"
 {
                                /* cmnd requires passwd for this user */
                                LEXTRACE("PASSWD ");
@@ -1495,7 +1513,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 18:
 YY_RULE_SETUP
-#line 251 "toke.l"
+#line 256 "toke.l"
 {
                                LEXTRACE("NOEXEC ");
                                return(NOEXEC);
@@ -1503,7 +1521,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 19:
 YY_RULE_SETUP
-#line 256 "toke.l"
+#line 261 "toke.l"
 {
                                LEXTRACE("EXEC ");
                                return(EXEC);
@@ -1511,7 +1529,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 20:
 YY_RULE_SETUP
-#line 261 "toke.l"
+#line 266 "toke.l"
 {
                                LEXTRACE("NOMONITOR ");
                                return(NOMONITOR);
@@ -1519,7 +1537,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 21:
 YY_RULE_SETUP
-#line 266 "toke.l"
+#line 271 "toke.l"
 {
                                LEXTRACE("MONITOR ");
                                return(MONITOR);
@@ -1527,7 +1545,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 22:
 YY_RULE_SETUP
-#line 271 "toke.l"
+#line 276 "toke.l"
 {
                            /* netgroup */
                            if (!fill(yytext, yyleng))
@@ -1538,7 +1556,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 23:
 YY_RULE_SETUP
-#line 279 "toke.l"
+#line 284 "toke.l"
 {
                            /* UN*X group */
                            if (!fill(yytext, yyleng))
@@ -1549,7 +1567,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 24:
 YY_RULE_SETUP
-#line 287 "toke.l"
+#line 292 "toke.l"
 {
                            if (!fill(yytext, yyleng))
                                yyterminate();
@@ -1559,7 +1577,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 25:
 YY_RULE_SETUP
-#line 294 "toke.l"
+#line 299 "toke.l"
 {
                            if (!fill(yytext, yyleng))
                                yyterminate();
@@ -1569,7 +1587,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 26:
 YY_RULE_SETUP
-#line 301 "toke.l"
+#line 306 "toke.l"
 {
                                BEGIN GOTRUNAS;
                                LEXTRACE("RUNAS ");
@@ -1578,7 +1596,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 27:
 YY_RULE_SETUP
-#line 307 "toke.l"
+#line 312 "toke.l"
 {
                            if (strcmp(yytext, "ALL") == 0) {
                                LEXTRACE("ALL ");
@@ -1593,7 +1611,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 28:
 YY_RULE_SETUP
-#line 319 "toke.l"
+#line 324 "toke.l"
 {
                            /* username/uid that user can run command as */
                            if (!fill(yytext, yyleng))
@@ -1604,14 +1622,14 @@ YY_RULE_SETUP
        YY_BREAK
 case 29:
 YY_RULE_SETUP
-#line 327 "toke.l"
+#line 332 "toke.l"
 {
                            BEGIN INITIAL;
                        }
        YY_BREAK
 case 30:
 YY_RULE_SETUP
-#line 331 "toke.l"
+#line 336 "toke.l"
 {
                            BEGIN GOTCMND;
                            LEXTRACE("COMMAND ");
@@ -1621,7 +1639,18 @@ YY_RULE_SETUP
        YY_BREAK
 case 31:
 YY_RULE_SETUP
-#line 338 "toke.l"
+#line 343 "toke.l"
+{
+                           /* no command args allowed for Defaults!/path */
+                           if (!fill_cmnd(yytext, yyleng))
+                               yyterminate();
+                           LEXTRACE("COMMAND ");
+                           return(COMMAND);
+                       }
+       YY_BREAK
+case 32:
+YY_RULE_SETUP
+#line 351 "toke.l"
 {
                            /* directories can't have args... */
                            if (yytext[yyleng - 1] == '/') {
@@ -1637,9 +1666,9 @@ YY_RULE_SETUP
                            }
                        }                       /* a pathname */
        YY_BREAK
-case 32:
+case 33:
 YY_RULE_SETUP
-#line 353 "toke.l"
+#line 366 "toke.l"
 {
                            /* a word */
                            if (!fill(yytext, yyleng))
@@ -1648,41 +1677,41 @@ YY_RULE_SETUP
                            return(WORD);
                        }
        YY_BREAK
-case 33:
+case 34:
 YY_RULE_SETUP
-#line 361 "toke.l"
+#line 374 "toke.l"
 {
                            LEXTRACE(", ");
                            return(',');
                        }                       /* return ',' */
        YY_BREAK
-case 34:
+case 35:
 YY_RULE_SETUP
-#line 366 "toke.l"
+#line 379 "toke.l"
 {
                            LEXTRACE("= ");
                            return('=');
                        }                       /* return '=' */
        YY_BREAK
-case 35:
+case 36:
 YY_RULE_SETUP
-#line 371 "toke.l"
+#line 384 "toke.l"
 {
                            LEXTRACE(": ");
                            return(':');
                        }                       /* return ':' */
        YY_BREAK
-case 36:
+case 37:
 YY_RULE_SETUP
-#line 376 "toke.l"
+#line 389 "toke.l"
 {
                            if (yyleng % 2 == 1)
                                return('!');    /* return '!' */
                        }
        YY_BREAK
-case 37:
+case 38:
 YY_RULE_SETUP
-#line 381 "toke.l"
+#line 394 "toke.l"
 {
                            BEGIN INITIAL;
                            ++sudolineno;
@@ -1690,25 +1719,25 @@ YY_RULE_SETUP
                            return(COMMENT);
                        }                       /* return newline */
        YY_BREAK
-case 38:
+case 39:
 YY_RULE_SETUP
-#line 388 "toke.l"
+#line 401 "toke.l"
 {                      /* throw away space/tabs */
                            sawspace = TRUE;    /* but remember for fill_args */
                        }
        YY_BREAK
-case 39:
+case 40:
 YY_RULE_SETUP
-#line 392 "toke.l"
+#line 405 "toke.l"
 {
                            sawspace = TRUE;    /* remember for fill_args */
                            ++sudolineno;
                            LEXTRACE("\n\t");
                        }                       /* throw away EOL after \ */
        YY_BREAK
-case 40:
+case 41:
 YY_RULE_SETUP
-#line 398 "toke.l"
+#line 411 "toke.l"
 {
                            BEGIN INITIAL;
                            ++sudolineno;
@@ -1716,9 +1745,9 @@ YY_RULE_SETUP
                            return(COMMENT);
                        }                       /* return comments */
        YY_BREAK
-case 41:
+case 42:
 YY_RULE_SETUP
-#line 405 "toke.l"
+#line 418 "toke.l"
 {
                            LEXTRACE("ERROR ");
                            return(ERROR);
@@ -1730,7 +1759,7 @@ case YY_STATE_EOF(GOTDEFS):
 case YY_STATE_EOF(GOTCMND):
 case YY_STATE_EOF(STARTDEFS):
 case YY_STATE_EOF(INDEFS):
-#line 410 "toke.l"
+#line 423 "toke.l"
 {
                            if (YY_START != INITIAL) {
                                BEGIN INITIAL;
@@ -1741,12 +1770,12 @@ case YY_STATE_EOF(INDEFS):
                                yyterminate();
                        }
        YY_BREAK
-case 42:
+case 43:
 YY_RULE_SETUP
-#line 420 "toke.l"
+#line 433 "toke.l"
 ECHO;
        YY_BREAK
-#line 1750 "toke.c"
+#line 1779 "toke.c"
 
        case YY_END_OF_BUFFER:
                {
@@ -2037,7 +2066,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 >= 385 )
+                       if ( yy_current_state >= 390 )
                                yy_c = yy_meta[(unsigned int) yy_c];
                        }
                yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@@ -2072,11 +2101,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 >= 385 )
+               if ( yy_current_state >= 390 )
                        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 == 384);
+       yy_is_jam = (yy_current_state == 389);
 
        return yy_is_jam ? 0 : yy_current_state;
        }
@@ -2635,7 +2664,7 @@ int main()
        return 0;
        }
 #endif
-#line 420 "toke.l"
+#line 433 "toke.l"
 
 static int
 fill(s, len)
diff --git a/toke.l b/toke.l
index 0c2ae92b7ec9245082fb9a1db115f0f3d265bfe8..566581392cc1efb43b50fb98e2cd05963b963f93 100644 (file)
--- a/toke.l
+++ b/toke.l
@@ -87,6 +87,7 @@ OCTET                 (1?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5])
 DOTTEDQUAD             {OCTET}(\.{OCTET}){3}
 HOSTNAME               [[:alnum:]_-]+
 WORD                   ([^#>!=:,\(\) \t\n\\]|\\[^\n])+
+PATH                   \/(\\[\,:= \t#]|[^\,:=\\ \t\n#])+
 ENVAR                  ([^#!=, \t\n\\]|\\[^\n])([^#=, \t\n\\]|\\[^\n])*
 DEFVAR                 [a-z_]+
 
@@ -195,7 +196,7 @@ DEFVAR                      [a-z_]+
                            return(COMMENT);
                        }
 
-<INITIAL>^Defaults([:@>]{WORD})? {
+<INITIAL>^Defaults([:@>\!]{WORD})? {
                            BEGIN GOTDEFS;
                            switch (yytext[8]) {
                                case ':':
@@ -210,6 +211,10 @@ DEFVAR                     [a-z_]+
                                    yyless(9);
                                    LEXTRACE("DEFAULTS_HOST ");
                                    return(DEFAULTS_HOST);
+                               case '!':
+                                   yyless(9);
+                                   LEXTRACE("DEFAULTS_CMND ");
+                                   return(DEFAULTS_CMND);
                                default:
                                    LEXTRACE("DEFAULTS ");
                                    return(DEFAULTS);
@@ -335,7 +340,15 @@ sudoedit           {
                                yyterminate();
                        }                       /* sudo -e */
 
-\/(\\[\,:= \t#]|[^\,:=\\ \t\n#])+      {
+<GOTDEFS>{PATH}                {
+                           /* no command args allowed for Defaults!/path */
+                           if (!fill_cmnd(yytext, yyleng))
+                               yyterminate();
+                           LEXTRACE("COMMAND ");
+                           return(COMMAND);
+                       }
+
+{PATH}                 {
                            /* directories can't have args... */
                            if (yytext[yyleng - 1] == '/') {
                                LEXTRACE("COMMAND ");
index 75a0fd01df6018291f26936b6f9321d9c85e9541..160fbe4e051de752315e87a2e85a98de9f8af122 100644 (file)
--- a/visudo.c
+++ b/visudo.c
@@ -203,7 +203,7 @@ main(argc, argv)
        errorx(1, "%s busy, try again later", sudoers_path);
     init_parser(sudoers_path, 0);
     yyparse();
-    (void) update_defaults();
+    (void) update_defaults(SKIP_CMND);
 
     editor = get_editor(&args);