]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#365,!194] kea-dhcp4 can be configured to calculate T1 and T2
authorThomas Markwalder <tmark@isc.org>
Wed, 9 Jan 2019 16:14:01 +0000 (11:14 -0500)
committerThomas Markwalder <tmark@isc.org>
Wed, 9 Jan 2019 16:14:01 +0000 (11:14 -0500)
doc/guide/dhcp4-srv.xml
    Updated user guide with new parameters and details on rules

src/lib/cc/data.cc
    DoubleElement::toJSON(std::ostream& ss) - modified to ensure whole number
     values are suffixed with ".0"

src/lib/utils/doubles.h - new file
   provides a function for equating doubles within a given tolerance

src/lib/cc/simple_parser.*
    SimpleParser::getDouble() - new method for fetching real number
    parameters as DoulbeElements

src/lib/dhcpsrv/network.*
    Added members and support for new paramters to Network4:
        calculate_tee_times_, t1_percent_, t2_percent_

src/lib/dhcpsrv/parsers/dhcp_parsers.cc
src/lib/dhcpsrv/parsers/simple_parser4.cc
    Added support for new parameters to Subnet4ConfigParser

src/bin/dhcp4/dhcp4_lexer.ll
src/bin/dhcp4/dhcp4_parser.yy
src/bin/dhcp4/json_config_parser.cc
    Added parser support for calculate-tee-times, t1-percent, and t2-percent

src/bin/dhcp4/dhcp4_srv.*
    Dhcpv4Srv::setTeeTimes(lease, subnet, resp) - new method for
    determining T1 adn T2 values

31 files changed:
doc/guide/dhcp4-srv.xml
src/bin/d2/d2_lexer.cc
src/bin/dhcp4/dhcp4_lexer.cc
src/bin/dhcp4/dhcp4_lexer.ll
src/bin/dhcp4/dhcp4_parser.cc
src/bin/dhcp4/dhcp4_parser.h
src/bin/dhcp4/dhcp4_parser.yy
src/bin/dhcp4/dhcp4_srv.cc
src/bin/dhcp4/dhcp4_srv.h
src/bin/dhcp4/json_config_parser.cc
src/bin/dhcp4/location.hh
src/bin/dhcp4/position.hh
src/bin/dhcp4/stack.hh
src/bin/dhcp4/tests/config_parser_unittest.cc
src/bin/dhcp4/tests/dhcp4_srv_unittest.cc
src/lib/cc/data.cc
src/lib/cc/simple_parser.cc
src/lib/cc/simple_parser.h
src/lib/cc/tests/data_unittests.cc
src/lib/cc/tests/simple_parser_unittest.cc
src/lib/dhcpsrv/network.cc
src/lib/dhcpsrv/network.h
src/lib/dhcpsrv/parsers/dhcp_parsers.cc
src/lib/dhcpsrv/parsers/simple_parser4.cc
src/lib/dhcpsrv/tests/cfg_shared_networks4_unittest.cc
src/lib/dhcpsrv/tests/cfg_subnets4_unittest.cc
src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc
src/lib/util/Makefile.am
src/lib/util/doubles.h [new file with mode: 0644]
src/lib/util/tests/Makefile.am
src/lib/util/tests/doubles_unittest.cc [new file with mode: 0644]

index 88b4ca6916b4e3d23fbdbbc1c546cde5a67554c5..bad83fe09bafd47208c8dfaa75a5aab63260e842 100644 (file)
@@ -1,5 +1,5 @@
 <!--
- - Copyright (C) 2014-2018 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2014-2019 Internet Systems Consortium, Inc. ("ISC")
  -
  - This Source Code Form is subject to the terms of the Mozilla Public
  - License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -231,16 +231,11 @@ defines how long the addresses (leases) given out by the
 server are valid. If nothing changes, a client that got an address is allowed to
 use it for 4000 seconds. (Note that integer numbers are specified as is,
 without any quotes around them.) <command>renew-timer</command> and
-<command>rebind-timer</command> are values (also in seconds) that
-define T1 and T2 timers that govern when the client will begin the renewal and
-rebind procedures. <note> Both <command>renew-timer</command> and
-<command>rebind-timer</command> are optional.  The server will only send
-rebind-timer to the client, via DHPv4 option code 59, if it is less than
-valid-lifetime; and it will only send renew-timer, via DHCPv4 option code 58,
-if it is less than rebind-timer (or valid-lifetime if rebind-timer was not
-specified).  In their absence, the client should select values for T1 and T2
-timers according to the <link xmlns:xlink="http://www.w3.org/1999/xlink"
-xlink:href="http://tools.ietf.org/html/rfc2131">RFC 2131</link>.</note></para>
+<command>rebind-timer</command> are values (also in seconds) that may be
+used to define T1 and T2 timers that govern when the client will begin the renewal
+and rebind procedures. Please see this section:<xref linkend="dhcp4-std-options-list"/>
+for more details on generating T1 and T2.
+</para>
 
 <para>The <command>interfaces-config</command> map specifies the server
 configuration concerning the network interfaces, on which the server should
@@ -1141,10 +1136,73 @@ temporarily override a list of interface names and listen on all interfaces.
     address) and the last (typically broadcast address) address from that pool.
     In the aforementioned example of pool 192.0.3.0/24, both 192.0.3.0 and
     192.0.3.255 addresses may be assigned as well. This may be invalid in some
-    network configurations. If you want to avoid this, please use the "min-max" notation.
+    network configurations. If you want to avoid this, please use the "min-max" 
+    notation.
   </para>
 </section>
-
+    <section xml:id="dhcp4-t1-t2-times">
+      <title>Sending T1 (Option 58) and T2 (Option 59)</title>
+      According to <link xmlns:xlink="http://www.w3.org/1999/xlink"
+      xlink:href="http://tools.ietf.org/html/rfc2131">RFC 2131</link>,
+      servers should send values for T1 and T2 that are 50% and 87.5%
+      of the lease life time, repsectively.   By default, kea-dhcp4 does
+      not send either value.  It can be configured to send values that
+      are specified explicitly or that are calculated as percentages of
+      the lease time.  The server's behavior is governed by combination of
+      configuration parameters, two of which have already been mentioned.
+      <para>
+      To send specific, fixed values use the following two parameters:
+      <itemizedlist>
+        <listitem>
+          <simpara><command>renew-timer</command> - specifies the value of T1 in
+          seconds.
+          </simpara>
+        </listitem>
+        <listitem>
+          <simpara><command>rebind-timer</command> - specifies the value of T2 in
+          seconds.
+          </simpara>
+        </listitem>
+      </itemizedlist>
+      The server will only send T2 if it is less than valid lease time.  T1 will
+      only be sent if a: T2 is being sent and T1 is less than T2 or b: T2 is not being
+      sent and T1 is less than the valid lease time.
+      </para>
+      <para>
+      Calculating the values is controlled by the following three parameters.
+      <itemizedlist>
+        <listitem>
+          <simpara>
+            <command>calculate-tee-times</command> - when true, T1 and T2 will be
+            calculated as percentages of the valid lease time. It defaults to false.
+          </simpara>
+        </listitem>
+        <listitem>
+          <simpara>
+            <command>t1-percent</command> - the percentage of the valid lease time to
+            use for T1. It is expressed as a real number between 0.0 and 1.0 and must
+            be less than t2-percent. The default value is 0.50 per RFC 2131.
+          </simpara>
+        </listitem>
+        <listitem>
+          <simpara>
+            <command>t2-percent</command> - the percentage of the valid lease time to
+            use for T2. It is expressed as a real number between 0.0 and 1.0 and must
+            be greater than t1-percent. The default value is .875 per RFC 2131.
+          </simpara>
+        </listitem>
+        </itemizedlist>
+      </para>
+      <note>
+      In the event that both explicit values are specified and calculate-tee-times
+      is true, the server will use the explicit values.  If you plan on having a
+      mixture where some subnets or share-networks will use explicit values and some
+      will use calculated values you must not define the explicit values at any level
+      higher than where they will be used.  Inheriting them from too high of a scope,
+      such as global, will cause them to have values at every level underneath (shared-
+      networks and subnets), effectively disabling calculated values.
+      </note>
+    </section>
     <section xml:id="dhcp4-std-options">
       <title>Standard DHCPv4 Options</title>
       <para>
index 823f62b4b6f5c344ad9a3138940b13dcf057ea0d..75c9bd2649ea89965055155be19f7b5c4a1e36ff 100644 (file)
@@ -1,6 +1,6 @@
-#line 1 "d2_lexer.cc"
+#line 2 "d2_lexer.cc"
 
-#line 3 "d2_lexer.cc"
+#line 4 "d2_lexer.cc"
 
 #define  YY_INT_ALIGNED short int
 
@@ -1146,7 +1146,7 @@ unsigned int comment_start_line = 0;
 
 /* To avoid the call to exit... oops! */
 #define YY_FATAL_ERROR(msg) isc::d2::D2ParserContext::fatal(msg)
-#line 1149 "d2_lexer.cc"
+#line 1150 "d2_lexer.cc"
 /* noyywrap disables automatic rewinding for the next file to parse. Since we
    always parse only a single string, there's no need to do any wraps. And
    using yywrap requires linking with -lfl, which provides the default yywrap
@@ -1172,8 +1172,8 @@ unsigned int comment_start_line = 0;
    by moving it ahead by yyleng bytes. yyleng specifies the length of the
    currently matched token. */
 #define YY_USER_ACTION  driver.loc_.columns(yyleng);
-#line 1175 "d2_lexer.cc"
 #line 1176 "d2_lexer.cc"
+#line 1177 "d2_lexer.cc"
 
 #define INITIAL 0
 #define COMMENT 1
@@ -1491,7 +1491,7 @@ YY_DECL
     }
 
 
-#line 1494 "d2_lexer.cc"
+#line 1495 "d2_lexer.cc"
 
        while ( /*CONSTCOND*/1 )                /* loops until end-of-file is reached */
                {
@@ -2393,7 +2393,7 @@ YY_RULE_SETUP
 #line 738 "d2_lexer.ll"
 ECHO;
        YY_BREAK
-#line 2396 "d2_lexer.cc"
+#line 2397 "d2_lexer.cc"
 
        case YY_END_OF_BUFFER:
                {
index 994640bbfd3c68da9bda39bdace3ff969b0a97f9..39d9efb5418540d3456a390a17d109e8d0e72ea5 100644 (file)
@@ -1,6 +1,6 @@
-#line 1 "dhcp4_lexer.cc"
+#line 2 "dhcp4_lexer.cc"
 
-#line 3 "dhcp4_lexer.cc"
+#line 4 "dhcp4_lexer.cc"
 
 #define  YY_INT_ALIGNED short int
 
@@ -691,8 +691,8 @@ static void yynoreturn yy_fatal_error ( const char* msg  );
 /* %% [3.0] code to copy yytext_ptr to yytext[] goes here, if %array \ */\
        (yy_c_buf_p) = yy_cp;
 /* %% [4.0] data tables for the DFA and the user's section 1 definitions go here */
-#define YY_NUM_RULES 175
-#define YY_END_OF_BUFFER 176
+#define YY_NUM_RULES 178
+#define YY_END_OF_BUFFER 179
 /* This struct is not used in this scanner,
    but its presence is necessary. */
 struct yy_trans_info
@@ -700,169 +700,174 @@ struct yy_trans_info
        flex_int32_t yy_verify;
        flex_int32_t yy_nxt;
        };
-static const flex_int16_t yy_accept[1468] =
+static const flex_int16_t yy_accept[1507] =
     {   0,
-      168,  168,    0,    0,    0,    0,    0,    0,    0,    0,
-      176,  174,   10,   11,  174,    1,  168,  165,  168,  168,
-      174,  167,  166,  174,  174,  174,  174,  174,  161,  162,
-      174,  174,  174,  163,  164,    5,    5,    5,  174,  174,
-      174,   10,   11,    0,    0,  157,    0,    0,    0,    0,
+      171,  171,    0,    0,    0,    0,    0,    0,    0,    0,
+      179,  177,   10,   11,  177,    1,  171,  168,  171,  171,
+      177,  170,  169,  177,  177,  177,  177,  177,  164,  165,
+      177,  177,  177,  166,  167,    5,    5,    5,  177,  177,
+      177,   10,   11,    0,    0,  160,    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,    1,
-      168,  168,    0,  167,  168,    3,    2,    6,    0,  168,
+      171,  171,    0,  170,  171,    3,    2,    6,    0,  171,
         0,    0,    0,    0,    0,    0,    4,    0,    0,    9,
 
-        0,  158,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,  160,    0,    0,    0,
+        0,  161,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,  163,    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,    2,    0,
-        0,    0,    0,    0,    0,    0,    8,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    2,    0,    0,    0,    0,    0,    0,    0,    8,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
 
-        0,  159,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  162,    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,   67,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,   67,    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,  173,  171,    0,
-      170,  169,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,  176,  174,    0,  173,  172,    0,    0,
 
-        0,    0,  137,    0,  136,    0,    0,   73,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,   34,
+        0,    0,    0,    0,    0,    0,    0,    0,  140,    0,
+      139,    0,    0,   73,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,   34,    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,   70,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,   17,
+        0,    0,   70,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,   17,    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,   18,    0,    0,    0,    0,  172,  169,    0,
 
-        0,    0,    0,    0,    0,    0,    0,    0,    0,  138,
-        0,    0,  140,    0,    0,    0,    0,    0,    0,    0,
+        0,   18,    0,    0,    0,    0,  175,  172,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,  141,    0,
+        0,  143,    0,    0,    0,    0,    0,    0,    0,    0,
         0,   74,    0,    0,    0,    0,    0,    0,   59,    0,
-        0,    0,    0,    0,   91,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,   94,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,   37,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,   58,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,   62,    0,   38,
         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,   88,   30,    0,    0,   35,
-        0,    0,    0,    0,    0,    0,    0,    0,   12,  145,
-        0,  142,    0,  141,    0,    0,    0,  101,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,   91,   30,    0,
+        0,   35,    0,    0,    0,    0,    0,    0,    0,    0,
+       12,  148,    0,  145,    0,  144,    0,    0,    0,  104,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-       81,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,   32,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,   61,    0,    0,    0,
-        0,    0,    0,    0,    0,  102,    0,    0,    0,    0,
-
-        0,    0,    0,    0,    0,    0,    0,    0,   97,    0,
-        0,    0,    0,    0,    0,    0,    7,    0,    0,  143,
+        0,    0,    0,   84,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,   32,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,   61,
+
+        0,    0,    0,    0,    0,    0,    0,    0,  105,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,  100,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    7,    0,    0,  146,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-       72,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,   83,
-        0,    0,    0,    0,    0,    0,    0,    0,   79,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,   72,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,   86,    0,    0,    0,    0,
+        0,    0,    0,    0,   82,    0,    0,    0,    0,    0,
 
-        0,    0,    0,    0,   65,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,   76,    0,    0,    0,
-        0,    0,    0,    0,    0,   64,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,   95,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,  107,   77,
-        0,    0,    0,    0,   82,   31,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,   39,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+       65,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,   79,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,   64,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,   98,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,  110,   80,    0,
+        0,    0,    0,   85,   31,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,   39,    0,    0,    0,
 
-        0,    0,    0,   54,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,  146,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,   69,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,   96,    0,    0,    0,    0,    0,
-       42,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,   36,
-        0,    0,    0,   29,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,   84,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,   54,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  149,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,   69,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,   99,    0,    0,    0,
+        0,    0,   42,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,   36,    0,    0,    0,   29,    0,    0,    0,    0,
 
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,   93,    0,    0,    0,    0,    0,    0,    0,    0,
-      120,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,   66,    0,    0,    0,
+        0,    0,    0,   87,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,   96,    0,    0,    0,
+        0,    0,    0,    0,    0,  123,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-       23,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,  125,    0,    0,  123,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,  150,    0,
-        0,    0,    0,    0,    0,   94,    0,    0,    0,    0,
-
-        0,    0,   98,   80,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,   92,
-       22,    0,  103,    0,    0,    0,    0,    0,    0,    0,
-        0,  129,    0,    0,    0,    0,   56,    0,    0,    0,
-        0,    0,  106,   33,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,   53,
+        0,   66,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,   23,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,  128,    0,    0,
+
+      126,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,  153,    0,    0,    0,    0,
+        0,    0,    0,   97,    0,    0,    0,    0,    0,    0,
+      101,   83,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,   95,   22,    0,
+      106,    0,    0,    0,    0,    0,    0,    0,    0,  132,
+        0,    0,    0,    0,   56,    0,    0,    0,    0,    0,
+      109,   33,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,   53,    0,    0,
+        0,   77,   78,    0,    0,    0,    0,    0,    0,    0,
+
         0,    0,    0,   60,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,  100,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  103,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,  157,    0,
+       57,   71,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,   50,    0,    0,    0,    0,    0,    0,    0,  129,
+        0,  127,    0,  121,  120,    0,   46,    0,   21,    0,
+        0,    0,    0,    0,  142,    0,    0,    0,   90,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,  118,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
 
-        0,    0,    0,    0,    0,    0,    0,  154,    0,   57,
-       71,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-       50,    0,    0,    0,    0,    0,    0,    0,  126,    0,
-      124,    0,  118,  117,    0,   46,    0,   21,    0,    0,
-        0,    0,    0,  139,    0,    0,   87,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,  115,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,  104,   15,
-        0,   40,    0,    0,    0,    0,    0,  128,    0,    0,
-        0,    0,    0,    0,   51,    0,    0,   99,    0,    0,
-        0,    0,   90,    0,    0,    0,    0,    0,    0,   63,
-
-        0,  148,    0,  147,    0,  153,    0,    0,    0,    0,
+      107,   15,    0,   40,    0,    0,    0,    0,    0,  131,
+        0,    0,    0,    0,    0,    0,   51,    0,    0,  102,
+        0,    0,    0,    0,   93,    0,    0,    0,    0,    0,
+        0,   63,    0,  151,    0,  150,    0,  156,    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,   14,    0,    0,   45,
-        0,    0,    0,    0,  156,   85,   27,    0,    0,   47,
-      116,    0,    0,    0,  151,  121,    0,    0,    0,    0,
-        0,    0,    0,    0,   25,    0,    0,   24,    0,  127,
-        0,    0,    0,    0,    0,   78,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,   49,
-
-        0,    0,    0,   41,    0,    0,    0,    0,    0,    0,
-        0,  105,    0,    0,    0,   26,    0,  152,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,   44,
-        0,    0,   20,  155,   55,    0,  149,  144,   28,    0,
-        0,   16,    0,    0,  133,    0,    0,    0,    0,    0,
-        0,  113,    0,   89,    0,    0,    0,    0,    0,    0,
-        0,    0,   68,    0,    0,    0,    0,    0,    0,    0,
-        0,  134,   13,    0,    0,    0,    0,    0,  122,    0,
-        0,    0,    0,    0,    0,  119,    0,    0,    0,    0,
-        0,  112,    0,   19,    0,  130,    0,    0,    0,    0,
-
-        0,    0,    0,    0,  111,    0,    0,   48,    0,    0,
-       43,  132,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,   14,
+        0,    0,   45,    0,    0,    0,    0,  159,    0,   88,
+       27,    0,    0,   47,  119,    0,    0,    0,  154,  124,
+
+        0,    0,    0,    0,    0,    0,    0,    0,   25,    0,
+        0,   24,    0,  130,    0,    0,    0,    0,    0,   81,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,   49,    0,    0,    0,    0,   41,    0,
+        0,    0,    0,    0,    0,    0,  108,    0,    0,    0,
+       26,    0,  155,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,   44,    0,    0,   20,  158,   55,
+        0,  152,  147,    0,   28,    0,    0,   16,    0,    0,
+      136,    0,    0,    0,    0,    0,    0,  116,    0,   92,
+        0,    0,    0,    0,    0,    0,    0,    0,   68,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,  137,   13,
+        0,    0,    0,    0,    0,  125,    0,    0,    0,    0,
+        0,    0,    0,  122,    0,    0,    0,    0,    0,  115,
+        0,   19,    0,  133,    0,    0,    0,    0,    0,   76,
+        0,    0,    0,  114,    0,    0,   48,    0,    0,   43,
+      135,    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,  131,    0,   86,
-        0,    0,    0,    0,    0,    0,  109,  114,   52,    0,
-        0,    0,    0,  108,    0,    0,  135,    0,    0,    0,
-        0,    0,   75,    0,    0,  110,    0
+        0,    0,    0,    0,    0,    0,  134,    0,   89,    0,
+        0,    0,    0,    0,    0,  112,  117,   52,    0,    0,
+        0,    0,  111,    0,    0,  138,    0,    0,    0,    0,
+
+        0,   75,    0,    0,  113,    0
     } ;
 
 static const YY_CHAR yy_ec[256] =
@@ -871,16 +876,16 @@ static const YY_CHAR yy_ec[256] =
         1,    1,    2,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    4,    5,    6,    7,    5,    5,    5,    5,    5,
-        5,    8,    9,   10,   11,   12,   13,   14,   14,   14,
-       14,   15,   14,   16,   14,   14,   14,   17,    5,   18,
-        5,   19,   20,    5,   21,   22,   23,   24,   25,   26,
-        5,   27,    5,   28,    5,   29,    5,   30,   31,   32,
-        5,   33,   34,   35,   36,   37,   38,    5,   39,    5,
-       40,   41,   42,    5,   43,    5,   44,   45,   46,   47,
-
-       48,   49,   50,   51,   52,   53,   54,   55,   56,   57,
-       58,   59,   60,   61,   62,   63,   64,   65,   66,   67,
-       68,   69,   70,    5,   71,    5,    5,    5,    5,    5,
+        5,    8,    9,   10,   11,   12,   13,   14,   15,   16,
+       14,   17,   14,   18,   14,   14,   14,   19,    5,   20,
+        5,   21,   22,    5,   23,   24,   25,   26,   27,   28,
+        5,   29,    5,   30,    5,   31,    5,   32,   33,   34,
+        5,   35,   36,   37,   38,   39,   40,    5,   41,    5,
+       42,   43,   44,    5,   45,    5,   46,   47,   48,   49,
+
+       50,   51,   52,   53,   54,   55,   56,   57,   58,   59,
+       60,   61,   62,   63,   64,   65,   66,   67,   68,   69,
+       70,   71,   72,    5,   73,    5,    5,    5,    5,    5,
         5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
         5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
         5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
@@ -897,582 +902,600 @@ static const YY_CHAR yy_ec[256] =
         5,    5,    5,    5,    5
     } ;
 
-static const YY_CHAR yy_meta[72] =
+static const YY_CHAR yy_meta[74] =
     {   0,
         1,    1,    2,    3,    3,    4,    3,    3,    3,    3,
-        3,    3,    3,    5,    5,    5,    3,    3,    3,    3,
-        5,    5,    5,    5,    5,    5,    3,    3,    3,    3,
-        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
-        3,    3,    3,    5,    5,    5,    5,    5,    5,    3,
+        3,    3,    3,    5,    5,    5,    5,    5,    3,    3,
+        3,    3,    5,    5,    5,    5,    5,    5,    3,    3,
         3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+        3,    3,    3,    3,    3,    5,    5,    5,    5,    5,
+        5,    3,    3,    3,    3,    3,    3,    3,    3,    3,
         3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
-        3
+        3,    3,    3
     } ;
 
-static const flex_int16_t yy_base[1480] =
+static const flex_int16_t yy_base[1519] =
     {   0,
-        0,   70,   19,   29,   41,   49,   52,   58,   87,   95,
-     1830, 1831,   32, 1826,  141,    0,  201, 1831,  206,   88,
-       11,  213, 1831, 1808,  114,   25,    2,    6, 1831, 1831,
-       73,   11,   17, 1831, 1831, 1831,  104, 1814, 1769,    0,
-     1806,  107, 1821,  217,  247, 1831, 1765,  185, 1764, 1770,
-       93,   58, 1762,   91,  211,  195,   14,  273,  195, 1761,
-      181,  275,  207,  211,   76,   68,  188, 1770,  232,  219,
-      296,  284,  280, 1753,  204,  302,  322,  305, 1772,    0,
-      349,  357,  370,  377,  362, 1831,    0, 1831,  301,  342,
-      296,  325,  201,  346,  359,  224, 1831, 1769, 1808, 1831,
-
-      353, 1831,  390, 1797,  357, 1755, 1765,  369,  220, 1760,
-      362,  288,  364,  374,  221, 1803,    0,  441,  366, 1747,
-     1744, 1748, 1744, 1752,  360, 1748, 1737, 1738,   76, 1754,
-     1737, 1746, 1746,  365, 1737,  365, 1738, 1736,  357, 1782,
-     1786, 1728, 1779, 1721, 1744, 1741, 1741, 1735,  268, 1728,
-     1721, 1726, 1720,  371, 1731, 1724, 1715, 1714, 1728,  379,
-     1714,  384, 1730, 1707,  415,  387,  419, 1728, 1725, 1726,
-     1724,  390, 1706, 1708,  420, 1700, 1717, 1709,    0,  386,
-      439,  425,  396,  440,  453, 1708, 1831,    0, 1751,  460,
-     1698, 1701,  437,  452, 1709,  458, 1752,  466, 1751,  462,
-
-     1750, 1831,  506, 1749,  472, 1710, 1702, 1689, 1705, 1702,
-     1701, 1692,  448, 1741, 1735, 1701, 1680, 1688, 1683, 1697,
-     1693, 1681, 1693, 1693, 1684, 1668, 1672, 1685, 1687, 1684,
-     1676, 1666, 1684, 1831, 1679, 1682, 1663, 1662, 1712, 1661,
-     1671, 1674,  496, 1670, 1658, 1669, 1705, 1652, 1708, 1645,
-     1660,  489, 1650, 1666, 1647, 1646, 1652, 1643, 1642, 1649,
-     1697, 1655, 1654, 1648,   77, 1655, 1650, 1642, 1632, 1647,
-     1646, 1641, 1645, 1626, 1642, 1628, 1634, 1641, 1629,  492,
-     1622, 1636, 1677, 1638,  485, 1629,  477, 1831, 1831,  485,
-     1831, 1831, 1616,    0,  456,  473, 1618,  520,  490, 1672,
-
-     1625,  484, 1831, 1670, 1831, 1664,  548, 1831,  474, 1606,
-     1615, 1661, 1607, 1613, 1663, 1620, 1615, 1618,  479, 1831,
-     1616, 1658, 1613, 1610,  528, 1616, 1654, 1648, 1603, 1598,
-     1595, 1644, 1603, 1592, 1608, 1640, 1588,  554, 1602, 1587,
-     1600, 1587, 1597, 1592, 1599, 1594, 1590,  496, 1588, 1591,
-     1586, 1582, 1630,  488, 1624, 1831, 1623, 1575, 1574, 1573,
-     1566, 1568, 1572, 1561, 1574,  518, 1619, 1574, 1571, 1831,
-     1574, 1563, 1563, 1575,  518, 1550, 1551, 1572,  529, 1554,
-     1603, 1550, 1564, 1563, 1549, 1561, 1560, 1559, 1558,  380,
-     1599, 1598, 1831, 1542, 1541,  572, 1554, 1831, 1831, 1553,
-
-        0, 1542, 1534,  525, 1539, 1590, 1589, 1547, 1587, 1831,
-     1535, 1585, 1831,  556,  603,  542, 1584, 1528, 1539, 1535,
-     1523, 1831, 1528, 1534, 1537, 1536, 1523, 1522, 1831, 1524,
-     1521,  538, 1519, 1521, 1831, 1529, 1526, 1511, 1524, 1519,
-      578, 1526, 1514, 1507, 1556, 1831, 1505, 1521, 1553, 1516,
-     1513, 1514, 1516, 1548, 1501, 1496, 1495, 1544, 1490, 1505,
-     1483, 1490, 1495, 1543, 1831, 1490, 1486, 1484, 1493, 1487,
-     1494, 1478, 1478, 1488, 1491, 1480, 1475, 1831, 1530, 1831,
-     1474, 1485, 1470, 1475, 1484, 1478, 1472, 1481, 1521, 1515,
-     1479, 1462, 1462, 1457, 1477, 1452, 1458, 1457, 1465, 1469,
-
-     1452, 1508, 1450, 1464, 1453, 1831, 1831, 1453, 1451, 1831,
-     1462, 1496, 1458,    0, 1442, 1459, 1497, 1447, 1831, 1831,
-     1444, 1831, 1450, 1831,  551,  569,  595, 1831, 1447, 1446,
-     1434, 1485, 1432, 1483, 1430, 1429, 1436, 1429, 1441, 1440,
-     1440, 1422, 1427, 1468, 1435, 1427, 1470, 1416, 1432, 1431,
-     1831, 1416, 1413, 1469, 1426, 1418, 1424, 1415, 1423, 1408,
-     1424, 1406, 1420,  520, 1402, 1396, 1401, 1416, 1413, 1414,
-     1411, 1452, 1409, 1831, 1395, 1397, 1406, 1404, 1441, 1440,
-     1393,  562, 1402, 1385, 1386, 1383, 1831, 1397, 1376, 1395,
-     1387, 1430, 1384, 1391, 1427, 1831, 1374, 1388, 1372, 1386,
-
-     1389, 1370, 1420, 1419, 1418, 1365, 1416, 1415, 1831,   14,
-     1377, 1377, 1375, 1358, 1363, 1365, 1831, 1371, 1361, 1831,
-     1406, 1354, 1409,  568,  501, 1352, 1350, 1357, 1400,  562,
-     1404,  544, 1398, 1397, 1396, 1350, 1340, 1393, 1346, 1354,
-     1355, 1389, 1352, 1346, 1333, 1341, 1384, 1388, 1345, 1344,
-     1831, 1345, 1338, 1327, 1340, 1343, 1338, 1339, 1336, 1335,
-     1331, 1337, 1332, 1373, 1372, 1322, 1312,  552, 1369, 1831,
-     1368, 1317, 1309, 1310, 1359, 1322, 1309, 1320, 1831, 1308,
-     1317, 1316, 1316, 1356, 1299, 1308, 1313, 1290, 1294, 1345,
-     1309, 1291, 1301, 1341, 1340, 1339, 1286, 1337, 1301,  580,
-
-      582, 1278, 1288,  579, 1831, 1338, 1284, 1294, 1294, 1277,
-     1282, 1286, 1276, 1288, 1291, 1328, 1831, 1322,  578, 1284,
-       15,   20,   86,  175,  242, 1831,  274,  374,  536,  561,
-      559,  578,  575,  576,  575,  574,  589,  585,  640,  605,
-      595,  611,  601, 1831,  611,  611,  604,  615,  613,  656,
-      600,  602,  617,  604,  662,  621,  607,  610, 1831, 1831,
-      620,  625,  630,  618, 1831, 1831,  632,  619,  613,  618,
-      636,  623,  671,  624,  674,  625,  681, 1831,  628,  632,
-      627,  685,  640,  630,  631,  627,  640,  651,  635,  653,
-      648,  649,  651,  644,  646,  647,  647,  649,  664,  703,
-
-      662,  667,  644, 1831,  669,  659,  704,  664,  654,  669,
-      670,  657,  671, 1831,  690,  698,  667,  662,  715,  680,
-      684,  723,  673,  668,  680,  675,  676,  672,  681,  676,
-      732,  691,  692,  683, 1831,  685,  696,  681,  697,  692,
-      737,  706,  690,  691, 1831,  707,  710,  693,  750,  695,
-     1831,  712,  715,  695,  713,  751,  711,  707,  702,  720,
-      719,  720,  706,  721,  713,  720,  710,  728,  713, 1831,
-      721,  727,  772, 1831,  723,  728,  770,  723,  735,  729,
-      734,  732,  730,  732,  742,  785,  731,  731,  788,  734,
-      746, 1831,  734,  742,  740,  745,  757,  741,  746,  756,
-
-      757,  762,  801,  760,  776,  781,  763,  761,  757,  809,
-      754, 1831,  754,  774,  763,  768,  775,  816,  817,  766,
-     1831,  814,  763,  766,  765,  785,  782,  787,  788,  774,
-      782,  791,  771,  788,  795,  835, 1831,  836,  837,  790,
-      800,  802,  791,  787,  794,  803,  846,  795,  793,  795,
-      812,  851,  803,  802,  808,  806,  804,  857,  858,  854,
-     1831,  818,  811,  802,  821,  809,  819,  816,  821,  817,
-      830,  830, 1831,  814,  815, 1831,  816,  874,  815,  834,
-      835,  832,  818,  839,  838,  822,  827,  845, 1831,  835,
-      868,  859,  889,  831,  853, 1831,  836,  838,  855,  853,
-
-      845,  849, 1831, 1831,  859,  859,  895,  844,  897,  846,
-      904,  849,  860,  852,  858,  854,  873,  874,  875, 1831,
-     1831,  874, 1831,  859,  861,  880,  870,  863,  875,  917,
-      883, 1831,  875,  925,  868,  927, 1831,  928,  872,  878,
-      885,  927, 1831, 1831,  877,  879,  893,  898,  881,  938,
-      897,  898,  899,  937,  891,  896,  945,  895,  947, 1831,
-      896,  949,  950,  892,  952,  913,  954,  898,  910,  915,
-      901,  931,  960, 1831,  919,  912,  963,  912,  927,  914,
-      910,  926,  931,  918,  914,  972,  927,  932, 1831,  933,
-      926,  935,  936,  933,  923,  926,  926,  931,  984,  985,
-
-      930,  988,  984,  927,  942,  935,  994, 1831,  949, 1831,
-     1831,  954,  946,  956,  942,  943, 1002,  948,  958, 1006,
-     1831,  956,  956,  958,  960, 1011,  954,  957, 1831,  976,
-     1831,  960, 1831, 1831,  974, 1831,  968, 1831, 1018,  969,
-     1020, 1021, 1003, 1831, 1023,  982, 1831,  970,  978,  972,
-      971,  974,  974,  975,  982,  972, 1831,  994,  980,  981,
-      996,  996,  999,  999,  996, 1038, 1002,  995, 1831, 1831,
-     1005, 1831, 1002, 1007, 1008, 1005, 1047, 1831,  998,  999,
-      999, 1005, 1004, 1015, 1831, 1054, 1003, 1831, 1004, 1004,
-     1006, 1012, 1831, 1014, 1066, 1017, 1020, 1069, 1032, 1831,
-
-     1029, 1831, 1026, 1831, 1049, 1831, 1074, 1075, 1076, 1035,
-     1021, 1079, 1080, 1035, 1025, 1030, 1084, 1085, 1081, 1046,
-     1042, 1084, 1034, 1039, 1037, 1094, 1052, 1096, 1056, 1098,
-     1061, 1051, 1045, 1061, 1061, 1105, 1049, 1066, 1065, 1049,
-     1105, 1106, 1055, 1108, 1073, 1074, 1831, 1074, 1061, 1831,
-     1072, 1119, 1079, 1092, 1831, 1831, 1831, 1066, 1123, 1831,
-     1831, 1072, 1070, 1084, 1831, 1831, 1074, 1123, 1068, 1073,
-     1131, 1081, 1091, 1092, 1831, 1135, 1090, 1831, 1137, 1831,
-     1082, 1097, 1085, 1100, 1104, 1831, 1138, 1106, 1099, 1108,
-     1090, 1097, 1151, 1112, 1111, 1154, 1155, 1156, 1107, 1831,
-
-     1158, 1159, 1160, 1831, 1110, 1110, 1163, 1109, 1108, 1166,
-     1121, 1831, 1163, 1116, 1113, 1831, 1127, 1831, 1130, 1173,
-     1128, 1175, 1136, 1119, 1121, 1118, 1134, 1135, 1144, 1831,
-     1134, 1184, 1831, 1831, 1831, 1180, 1831, 1831, 1831, 1181,
-     1138, 1831, 1136, 1143, 1831, 1140, 1145, 1143, 1193, 1194,
-     1139, 1831, 1154, 1831, 1155, 1145, 1157, 1200, 1144, 1152,
-     1153, 1166, 1831, 1165, 1153, 1207, 1168, 1159, 1168, 1170,
-     1174, 1831, 1831, 1213, 1158, 1215, 1175, 1217, 1831, 1213,
-     1177, 1178, 1165, 1160, 1181, 1831, 1182, 1183, 1226, 1185,
-     1188, 1831, 1229, 1831, 1192, 1831, 1174, 1232, 1233, 1178,
-
-     1195, 1181, 1181, 1183, 1831, 1188, 1198, 1831, 1184, 1196,
-     1831, 1831, 1201, 1195, 1199, 1190, 1242, 1191, 1199, 1208,
-     1201, 1196, 1211, 1202, 1209, 1196, 1211, 1216, 1259, 1218,
-     1261, 1206, 1222, 1213, 1227, 1223, 1216, 1831, 1268, 1831,
-     1269, 1270, 1227, 1226, 1227, 1217, 1831, 1831, 1831, 1275,
-     1219, 1235, 1278, 1831, 1274, 1225, 1831, 1224, 1226, 1237,
-     1284, 1235, 1831, 1244, 1287, 1831, 1831, 1293, 1298, 1303,
-     1308, 1313, 1318, 1323, 1326, 1300, 1305, 1307, 1320
+        0,   72,   21,   31,   43,   51,   54,   60,   91,   99,
+     1907, 1908,   34, 1903,  145,    0,  207, 1908,  214,  221,
+       13,  228, 1908, 1883,  118,   25,    2,    6, 1908, 1908,
+       73,   11,   17, 1908, 1908, 1908,  104, 1891, 1844,    0,
+     1881,  108, 1898,   24,  262, 1908, 1840,   67, 1839, 1845,
+       84,   75, 1837,   88,  226,   91,   89,  290,  196, 1836,
+      206,  285,  206,  210,  219,   60,  223, 1845,  247,  290,
+      315,  303,  231, 1828,  297,  321,  343,  324, 1847,    0,
+      380,  387,  401,  408,  424, 1908,    0, 1908,  429,  438,
+      216,  249,  220,  315,  335,  266, 1908, 1844, 1885, 1908,
+
+      342, 1908,  421, 1872,  312, 1830, 1840,  400,   10, 1835,
+      361,  323,  370,  387,  359, 1880,    0,  474,  392, 1822,
+     1819, 1823, 1825, 1818, 1826,  412, 1822, 1811, 1812,   78,
+     1828, 1811, 1820, 1820,   95, 1811,  400, 1812, 1810,  405,
+     1858, 1862, 1802, 1855, 1795, 1818, 1815, 1815, 1809,  310,
+     1802, 1795, 1800, 1794,  436, 1805, 1798, 1789, 1788, 1802,
+      186, 1788,  413, 1804, 1781,  470,  286,  400, 1802, 1799,
+     1800, 1798, 1833, 1832,  445, 1778, 1780,  448, 1772, 1789,
+     1781,    0,  447,  447,  458,  471,  462,  483, 1780, 1908,
+        0, 1825,  490, 1770, 1773,  476,  482, 1781,  488, 1826,
+
+      499, 1825,  496, 1824, 1908,  542, 1823,  507, 1782, 1774,
+     1761, 1777, 1776, 1773, 1772, 1763,  486, 1814, 1808, 1772,
+     1751, 1759, 1754, 1768, 1764, 1752, 1764, 1764, 1755, 1739,
+     1743, 1756, 1758, 1755, 1747, 1737, 1755, 1908, 1750, 1753,
+     1734, 1733, 1785, 1732, 1742, 1745,  483, 1741, 1729, 1740,
+     1778, 1723, 1781, 1716, 1731,  533, 1721, 1737, 1718, 1717,
+     1723, 1714, 1713, 1720, 1770, 1726, 1725, 1719,  482, 1726,
+     1721, 1713, 1703, 1718, 1717, 1712, 1716, 1697, 1713, 1699,
+     1705, 1712, 1700, 1697, 1696,  537, 1691, 1705, 1748, 1707,
+      366, 1698,  525, 1908, 1908,  527, 1908, 1908, 1685,    0,
+
+      241,  530, 1687,  546,  534, 1743, 1694,  511, 1908, 1741,
+     1908, 1735,  587, 1908,  537, 1675, 1684, 1732, 1676, 1675,
+     1681, 1733, 1688, 1683, 1686,  516, 1908, 1684, 1728, 1681,
+     1678,  565, 1684, 1724, 1718, 1671, 1666, 1663, 1714, 1671,
+     1660, 1676, 1710, 1656,  610, 1670, 1655, 1668, 1655, 1665,
+     1660, 1667, 1662, 1658,  327, 1656, 1659, 1654, 1650, 1700,
+      522, 1694, 1908, 1693, 1643, 1642, 1641, 1634, 1636, 1640,
+     1629, 1642,  575, 1689, 1642, 1639, 1908, 1642, 1631, 1631,
+     1643,  536, 1618, 1619, 1640,  568, 1622, 1673, 1618, 1632,
+     1631, 1617, 1629, 1628, 1627, 1626, 1625, 1624,  550, 1667,
+
+     1666, 1908, 1608, 1607,  613, 1620, 1908, 1908, 1619,    0,
+     1608, 1600,  561, 1605, 1658, 1657, 1613, 1655, 1908, 1601,
+     1653, 1908,  594,  661,  581, 1652, 1594, 1605, 1598, 1600,
+     1588, 1908, 1593, 1599, 1602, 1601, 1588, 1587, 1908, 1589,
+     1586,  578, 1584, 1586, 1908, 1594, 1591, 1576, 1589, 1584,
+      635, 1591, 1579, 1572, 1623, 1908, 1570, 1586, 1620, 1581,
+     1578, 1579, 1581, 1615, 1566, 1561, 1560, 1611, 1555, 1570,
+     1548, 1555, 1560, 1610, 1908, 1555, 1551, 1549, 1558, 1552,
+     1559, 1543, 1543, 1553, 1556, 1545, 1540, 1908, 1597, 1908,
+     1539, 1550, 1535, 1540, 1549, 1543, 1537, 1546, 1588, 1582,
+
+     1544, 1527, 1527, 1522, 1542, 1517, 1523, 1522, 1530, 1534,
+     1517, 1575, 1515, 1516, 1515, 1527, 1516, 1908, 1908, 1516,
+     1514, 1908, 1525, 1561, 1521,    0, 1505, 1522, 1562, 1510,
+     1908, 1908, 1507, 1908, 1513, 1908,  563,  585,  638, 1908,
+     1510, 1509, 1516, 1496, 1549, 1494, 1547, 1492, 1491, 1498,
+     1491, 1503, 1502, 1502, 1484, 1489, 1530, 1497, 1489, 1534,
+     1478, 1494, 1493, 1908, 1478, 1475, 1533, 1488, 1480, 1486,
+     1477, 1485, 1470, 1486, 1468, 1482,  447, 1464, 1458, 1463,
+     1478, 1475, 1476, 1473, 1516, 1471, 1908, 1457, 1459, 1468,
+     1466, 1505, 1504, 1455,   16, 1464, 1447, 1448, 1445, 1908,
+
+     1459, 1438, 1457, 1449, 1494, 1446, 1453, 1491, 1908, 1436,
+     1450, 1434, 1448, 1451, 1432, 1484, 1483, 1482, 1427, 1480,
+     1479, 1908,  581, 1441, 1440, 1437, 1437, 1435, 1418, 1423,
+     1425, 1908, 1431, 1421, 1908, 1468, 1414, 1471,  592,  558,
+     1412, 1410, 1417, 1408, 1461,  602, 1465,  582, 1459, 1458,
+     1457, 1409, 1399, 1454, 1405, 1413, 1414, 1450, 1411, 1405,
+     1392, 1400, 1445, 1449, 1404, 1403, 1908, 1404, 1397, 1386,
+     1399, 1402, 1397, 1398, 1395, 1394, 1390, 1396, 1391, 1434,
+     1433, 1381, 1371,  594, 1430, 1908, 1429, 1376, 1368, 1369,
+     1420, 1381, 1368, 1379, 1908, 1367, 1376, 1375, 1375, 1417,
+
+     1358, 1367, 1372, 1349, 1353, 1406, 1368, 1350, 1360, 1402,
+     1401, 1400, 1345, 1398,  172,  598,  607,  213,  275,  599,
+     1908,  370,  361,  383,  525,  582,  594,  582,  603,  609,
+      602,  616,  621,  664, 1908,  660,  637,  630,  635,  632,
+      633,  636,  634,  643, 1908,  633,  648,  630,  635,  633,
+      652,  649,  639,  638,  637,  648,  644,  700,  663,  653,
+      669,  659, 1908,  669,  669,  662,  673,  671,  716,  658,
+      660,  675,  662,  722,  679,  665,  668, 1908, 1908,  678,
+      683,  688,  676, 1908, 1908,  690,  677,  671,  676,  694,
+      681,  731,  682,  734,  683,  741, 1908,  686,  690,  685,
+
+      745,  698,  688,  689,  685,  698,  709,  693,  711,  706,
+      707,  709,  702,  704,  705,  705,  707,  722,  763,  720,
+      725,  702, 1908,  714,  715,  729,  719,  766,  724,  714,
+      729,  730,  717,  731, 1908,  750,  758,  727,  722,  777,
+      778,  741,  745,  786,  734,  729,  741,  736,  737,  733,
+      742,  737,  795,  752,  753,  744, 1908,  746,  757,  742,
+      759,  753,  801,  767,  751,  752, 1908,  768,  771,  754,
+      813,  756, 1908,  773,  776,  756,  774,  814,  772,  768,
+      763,  781,  780,  781,  767,  782,  774,  781,  771,  789,
+      774, 1908,  782,  788,  835, 1908,  784,  789,  833,  784,
+
+      796,  790,  795,  793,  791,  793,  803,  848,  792,  792,
+      851,  795,  807, 1908,  795,  803,  801,  798,  799,  808,
+      820,  804,  809,  819,  820,  825,  866,  823,  839,  844,
+      826,  824,  820,  815,  875,  818, 1908,  818,  838,  827,
+      832,  839,  882,  883,  830, 1908,  880,  827,  830,  829,
+      849,  846,  851,  852,  838,  846,  855,  837,  852,  859,
+      901, 1908,  902,  903,  854,  864,  866,  855,  851,  858,
+      867,  912,  859,  857,  859,  876,  917,  867,  866,  872,
+      870,  868,  923,  924,  920, 1908,  882,  875,  866,  885,
+      873,  883,  880,  885,  881,  894,  894, 1908,  878,  879,
+
+     1908,  880,  940,  879,  898,  899,  944,  945,  898,  884,
+      905,  904,  888,  893,  911, 1908,  901,  934,  925,  957,
+      897,  919,  916, 1908,  903,  905,  922,  920,  912,  916,
+     1908, 1908,  926,  926,  964,  911,  966,  913,  973,  916,
+      927,  919,  925,  922,  940,  941,  942, 1908, 1908,  941,
+     1908,  927,  928,  947,  937,  930,  942,  986,  950, 1908,
+      942,  994,  935,  996, 1908,  997,  939,  945,  952,  996,
+     1908, 1908,  944,  946,  960,  965,  948, 1007,  964,  965,
+      966, 1006,  958,  963, 1014,  962, 1016, 1908,  963, 1018,
+     1019, 1908, 1908,  959, 1021,  980, 1023,  965,  977,  982,
+
+      968,  998, 1029, 1908,  986,  979,  988, 1033,  980,  995,
+      982,  978,  994,  999,  986,  982, 1042,  995, 1000, 1908,
+     1001,  994, 1003, 1004, 1001,  991,  994,  994,  999, 1054,
+     1055,  999, 1058, 1054,  995, 1010, 1003, 1063, 1908, 1017,
+     1908, 1908, 1022, 1014, 1024, 1010, 1011, 1072, 1016, 1026,
+     1075, 1908, 1023, 1024, 1026, 1028, 1081, 1022, 1025, 1908,
+     1044, 1908, 1028, 1908, 1908, 1042, 1908, 1036, 1908, 1088,
+     1037, 1090, 1091, 1071, 1908, 1093, 1050, 1091, 1908, 1039,
+     1047, 1041, 1040, 1043, 1043, 1044, 1051, 1041, 1908, 1063,
+     1049, 1050, 1065, 1065, 1068, 1068, 1065, 1109, 1072, 1064,
+
+     1908, 1908, 1074, 1908, 1071, 1076, 1077, 1074, 1118, 1908,
+     1067, 1068, 1068, 1074, 1073, 1084, 1908, 1125, 1072, 1908,
+     1073, 1073, 1075, 1081, 1908, 1083, 1137, 1086, 1089, 1140,
+     1101, 1908, 1098, 1908, 1095, 1908, 1118, 1908, 1145, 1087,
+     1147, 1148, 1105, 1091, 1151, 1152, 1105, 1095, 1100, 1156,
+     1157, 1153, 1116, 1112, 1156, 1104, 1109, 1107, 1166, 1122,
+     1168, 1126, 1170, 1132, 1121, 1115, 1131, 1131, 1177, 1119,
+     1136, 1135, 1119, 1177, 1178, 1125, 1180, 1143, 1144, 1908,
+     1144, 1131, 1908, 1142, 1191, 1149, 1162, 1908, 1146, 1908,
+     1908, 1137, 1196, 1908, 1908, 1143, 1141, 1155, 1908, 1908,
+
+     1145, 1196, 1139, 1144, 1204, 1152, 1162, 1163, 1908, 1208,
+     1161, 1908, 1210, 1908, 1153, 1168, 1156, 1171, 1175, 1908,
+     1211, 1177, 1170, 1179, 1161, 1169, 1223, 1183, 1182, 1227,
+     1228, 1229, 1178, 1908, 1231, 1232, 1181, 1234, 1908, 1182,
+     1182, 1237, 1181, 1180, 1240, 1193, 1908, 1237, 1188, 1185,
+     1908, 1199, 1908, 1202, 1247, 1200, 1249, 1208, 1191, 1193,
+     1190, 1206, 1207, 1216, 1908, 1206, 1258, 1908, 1908, 1908,
+     1254, 1908, 1908, 1216, 1908, 1256, 1211, 1908, 1209, 1216,
+     1908, 1213, 1218, 1216, 1268, 1269, 1212, 1908, 1227, 1908,
+     1228, 1218, 1230, 1275, 1217, 1225, 1226, 1239, 1908, 1238,
+
+     1223, 1227, 1283, 1242, 1233, 1242, 1244, 1248, 1908, 1908,
+     1289, 1232, 1291, 1249, 1293, 1908, 1289, 1251, 1252, 1239,
+     1234, 1299, 1256, 1908, 1257, 1258, 1303, 1260, 1263, 1908,
+     1306, 1908, 1267, 1908, 1249, 1309, 1310, 1253, 1270, 1908,
+     1256, 1256, 1258, 1908, 1263, 1273, 1908, 1259, 1271, 1908,
+     1908, 1276, 1270, 1274, 1265, 1319, 1266, 1274, 1283, 1276,
+     1271, 1286, 1277, 1284, 1271, 1286, 1291, 1336, 1293, 1338,
+     1281, 1297, 1288, 1302, 1298, 1291, 1908, 1345, 1908, 1346,
+     1347, 1302, 1301, 1302, 1292, 1908, 1908, 1908, 1352, 1294,
+     1310, 1355, 1908, 1351, 1300, 1908, 1299, 1301, 1312, 1361,
+
+     1310, 1908, 1319, 1364, 1908, 1908, 1370, 1375, 1380, 1385,
+     1390, 1395, 1400, 1403, 1377, 1382, 1384, 1397
     } ;
 
-static const flex_int16_t yy_def[1480] =
+static const flex_int16_t yy_def[1519] =
     {   0,
-     1468, 1468, 1469, 1469, 1468, 1468, 1468, 1468, 1468, 1468,
-     1467, 1467, 1467, 1467, 1467, 1470, 1467, 1467, 1467, 1467,
-     1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467,
-     1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1471,
-     1467, 1467, 1467, 1472,   15, 1467,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45, 1473,   45,   45,
+     1507, 1507, 1508, 1508, 1507, 1507, 1507, 1507, 1507, 1507,
+     1506, 1506, 1506, 1506, 1506, 1509, 1506, 1506, 1506, 1506,
+     1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+     1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1510,
+     1506, 1506, 1506, 1511,   15, 1506,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45, 1512,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45,   45,   45, 1470,
-     1467, 1467, 1467, 1467, 1467, 1467, 1474, 1467, 1467, 1467,
-     1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1471, 1467,
+       45,   45,   45,   45,   45,   45,   45,   45,   45, 1509,
+     1506, 1506, 1506, 1506, 1506, 1506, 1513, 1506, 1506, 1506,
+     1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1510, 1506,
 
-     1472, 1467, 1467,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45, 1475,   45, 1473,   45,   45,
+     1511, 1506, 1506,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45, 1514,   45, 1512,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45,   45, 1474, 1467,
-     1467, 1467, 1467, 1467, 1467, 1467, 1467, 1476,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       45, 1513, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+     1515,   45,   45,   45,   45,   45,   45,   45,   45,   45,
 
-     1475, 1467, 1473,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45, 1514, 1506, 1512,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45, 1467,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45, 1506,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45, 1467, 1467, 1467, 1467,
-     1467, 1467, 1467, 1477,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1516,
 
-       45,   45, 1467,   45, 1467,   45, 1473, 1467,   45,   45,
-       45,   45,   45,   45,   45,   45,   45,   45,   45, 1467,
+       45,   45,   45,   45,   45,   45,   45,   45, 1506,   45,
+     1506,   45, 1512, 1506,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45, 1506,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45, 1467,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45,   45,   45, 1467,
+       45,   45, 1506,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45, 1506,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45, 1467,   45,   45,   45,   45, 1467, 1467, 1467,
 
-     1478,   45,   45,   45,   45,   45,   45,   45,   45, 1467,
-       45,   45, 1467,   45, 1473,   45,   45,   45,   45,   45,
-       45, 1467,   45,   45,   45,   45,   45,   45, 1467,   45,
-       45,   45,   45,   45, 1467,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45, 1467,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45, 1467,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45, 1467,   45, 1467,
+       45, 1506,   45,   45,   45,   45, 1506, 1506, 1506, 1517,
+       45,   45,   45,   45,   45,   45,   45,   45, 1506,   45,
+       45, 1506,   45, 1512,   45,   45,   45,   45,   45,   45,
+       45, 1506,   45,   45,   45,   45,   45,   45, 1506,   45,
+       45,   45,   45,   45, 1506,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45, 1506,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45, 1506,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45, 1506,   45, 1506,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
 
-       45,   45,   45,   45,   45, 1467, 1467,   45,   45, 1467,
-       45,   45, 1467, 1479,   45,   45,   45,   45, 1467, 1467,
-       45, 1467,   45, 1467,   45,   45,   45, 1467,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45, 1506, 1506,   45,
+       45, 1506,   45,   45, 1506, 1518,   45,   45,   45,   45,
+     1506, 1506,   45, 1506,   45, 1506,   45,   45,   45, 1506,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-     1467,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45, 1467,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45, 1467,   45,   45,   45,
-       45,   45,   45,   45,   45, 1467,   45,   45,   45,   45,
-
-       45,   45,   45,   45,   45,   45,   45,   45, 1467,   45,
-       45,   45,   45,   45,   45,   45, 1467,   45,   45, 1467,
+       45,   45,   45, 1506,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45, 1506,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45,   45,   45, 1506,
+
+       45,   45,   45,   45,   45,   45,   45,   45, 1506,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       45, 1506,   45,   45,   45,   45,   45,   45,   45,   45,
+       45, 1506,   45,   45, 1506,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-     1467,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45,   45,   45, 1467,
-       45,   45,   45,   45,   45,   45,   45,   45, 1467,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45, 1506,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45, 1506,   45,   45,   45,   45,
+       45,   45,   45,   45, 1506,   45,   45,   45,   45,   45,
 
-       45,   45,   45,   45, 1467,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45, 1467,   45,   45,   45,
-       45,   45,   45,   45,   45, 1467,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45, 1467,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45,   45, 1467, 1467,
-       45,   45,   45,   45, 1467, 1467,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45, 1467,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+     1506,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45, 1506,   45,   45,   45,   45,   45,
+       45,   45,   45,   45, 1506,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45, 1506,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45, 1506, 1506,   45,
+       45,   45,   45, 1506, 1506,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45, 1506,   45,   45,   45,
 
-       45,   45,   45, 1467,   45,   45,   45,   45,   45,   45,
-       45,   45,   45, 1467,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45, 1467,   45,   45,   45,   45,   45,
-       45,   45,   45,   45, 1467,   45,   45,   45,   45,   45,
-     1467,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45,   45,   45, 1467,
-       45,   45,   45, 1467,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45, 1467,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45, 1506,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45, 1506,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45, 1506,   45,   45,   45,
+       45,   45,   45,   45,   45,   45, 1506,   45,   45,   45,
+       45,   45, 1506,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       45, 1506,   45,   45,   45, 1506,   45,   45,   45,   45,
 
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45, 1467,   45,   45,   45,   45,   45,   45,   45,   45,
-     1467,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45, 1467,   45,   45,   45,
+       45,   45,   45, 1506,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45, 1506,   45,   45,   45,
+       45,   45,   45,   45,   45, 1506,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-     1467,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45, 1467,   45,   45, 1467,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45,   45, 1467,   45,
-       45,   45,   45,   45,   45, 1467,   45,   45,   45,   45,
-
-       45,   45, 1467, 1467,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45,   45,   45, 1467,
-     1467,   45, 1467,   45,   45,   45,   45,   45,   45,   45,
-       45, 1467,   45,   45,   45,   45, 1467,   45,   45,   45,
-       45,   45, 1467, 1467,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45,   45,   45, 1467,
+       45, 1506,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45, 1467,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45,   45, 1467,   45,
+       45,   45,   45,   45,   45, 1506,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45, 1506,   45,   45,
+
+     1506,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45, 1506,   45,   45,   45,   45,
+       45,   45,   45, 1506,   45,   45,   45,   45,   45,   45,
+     1506, 1506,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45, 1506, 1506,   45,
+     1506,   45,   45,   45,   45,   45,   45,   45,   45, 1506,
+       45,   45,   45,   45, 1506,   45,   45,   45,   45,   45,
+     1506, 1506,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45, 1506,   45,   45,
+       45, 1506, 1506,   45,   45,   45,   45,   45,   45,   45,
+
+       45,   45,   45, 1506,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45,   45,   45, 1506,
+       45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45,   45, 1506,   45,
+     1506, 1506,   45,   45,   45,   45,   45,   45,   45,   45,
+       45, 1506,   45,   45,   45,   45,   45,   45,   45, 1506,
+       45, 1506,   45, 1506, 1506,   45, 1506,   45, 1506,   45,
+       45,   45,   45,   45, 1506,   45,   45,   45, 1506,   45,
+       45,   45,   45,   45,   45,   45,   45,   45, 1506,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
 
-       45,   45,   45,   45,   45,   45,   45, 1467,   45, 1467,
-     1467,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-     1467,   45,   45,   45,   45,   45,   45,   45, 1467,   45,
-     1467,   45, 1467, 1467,   45, 1467,   45, 1467,   45,   45,
-       45,   45,   45, 1467,   45,   45, 1467,   45,   45,   45,
-       45,   45,   45,   45,   45,   45, 1467,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45,   45, 1467, 1467,
-       45, 1467,   45,   45,   45,   45,   45, 1467,   45,   45,
-       45,   45,   45,   45, 1467,   45,   45, 1467,   45,   45,
-       45,   45, 1467,   45,   45,   45,   45,   45,   45, 1467,
-
-       45, 1467,   45, 1467,   45, 1467,   45,   45,   45,   45,
+     1506, 1506,   45, 1506,   45,   45,   45,   45,   45, 1506,
+       45,   45,   45,   45,   45,   45, 1506,   45,   45, 1506,
+       45,   45,   45,   45, 1506,   45,   45,   45,   45,   45,
+       45, 1506,   45, 1506,   45, 1506,   45, 1506,   45,   45,
+       45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45,   45,   45, 1506,
+       45,   45, 1506,   45,   45,   45,   45, 1506,   45, 1506,
+     1506,   45,   45, 1506, 1506,   45,   45,   45, 1506, 1506,
+
+       45,   45,   45,   45,   45,   45,   45,   45, 1506,   45,
+       45, 1506,   45, 1506,   45,   45,   45,   45,   45, 1506,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45, 1467,   45,   45, 1467,
-       45,   45,   45,   45, 1467, 1467, 1467,   45,   45, 1467,
-     1467,   45,   45,   45, 1467, 1467,   45,   45,   45,   45,
-       45,   45,   45,   45, 1467,   45,   45, 1467,   45, 1467,
-       45,   45,   45,   45,   45, 1467,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45,   45,   45, 1467,
-
-       45,   45,   45, 1467,   45,   45,   45,   45,   45,   45,
-       45, 1467,   45,   45,   45, 1467,   45, 1467,   45,   45,
-       45,   45,   45,   45,   45,   45,   45,   45,   45, 1467,
-       45,   45, 1467, 1467, 1467,   45, 1467, 1467, 1467,   45,
-       45, 1467,   45,   45, 1467,   45,   45,   45,   45,   45,
-       45, 1467,   45, 1467,   45,   45,   45,   45,   45,   45,
-       45,   45, 1467,   45,   45,   45,   45,   45,   45,   45,
-       45, 1467, 1467,   45,   45,   45,   45,   45, 1467,   45,
-       45,   45,   45,   45,   45, 1467,   45,   45,   45,   45,
-       45, 1467,   45, 1467,   45, 1467,   45,   45,   45,   45,
-
-       45,   45,   45,   45, 1467,   45,   45, 1467,   45,   45,
-     1467, 1467,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45, 1506,   45,   45,   45,   45, 1506,   45,
+       45,   45,   45,   45,   45,   45, 1506,   45,   45,   45,
+     1506,   45, 1506,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45, 1506,   45,   45, 1506, 1506, 1506,
+       45, 1506, 1506,   45, 1506,   45,   45, 1506,   45,   45,
+     1506,   45,   45,   45,   45,   45,   45, 1506,   45, 1506,
+       45,   45,   45,   45,   45,   45,   45,   45, 1506,   45,
+
+       45,   45,   45,   45,   45,   45,   45,   45, 1506, 1506,
+       45,   45,   45,   45,   45, 1506,   45,   45,   45,   45,
+       45,   45,   45, 1506,   45,   45,   45,   45,   45, 1506,
+       45, 1506,   45, 1506,   45,   45,   45,   45,   45, 1506,
+       45,   45,   45, 1506,   45,   45, 1506,   45,   45, 1506,
+     1506,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45, 1467,   45, 1467,
-       45,   45,   45,   45,   45,   45, 1467, 1467, 1467,   45,
-       45,   45,   45, 1467,   45,   45, 1467,   45,   45,   45,
-       45,   45, 1467,   45,   45, 1467,    0, 1467, 1467, 1467,
-     1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467
+       45,   45,   45,   45,   45,   45, 1506,   45, 1506,   45,
+       45,   45,   45,   45,   45, 1506, 1506, 1506,   45,   45,
+       45,   45, 1506,   45,   45, 1506,   45,   45,   45,   45,
+
+       45, 1506,   45,   45, 1506,    0, 1506, 1506, 1506, 1506,
+     1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506
     } ;
 
-static const flex_int16_t yy_nxt[1903] =
+static const flex_int16_t yy_nxt[1982] =
     {   0,
-     1467,   13,   14,   13, 1467,   15,   16, 1467,   17,   18,
-       19,   20,   21,   22,   22,   22,   23,   24,   86,  705,
-       37,   14,   37,   87,   25,   26,   38, 1467,  706,   27,
-       37,   14,   37,   42,   28,   42,   38,   92,   93,   29,
-      115,   30,   13,   14,   13,   91,   92,   25,   31,   93,
-       13,   14,   13,   13,   14,   13,   32,   40,  818,   13,
-       14,   13,   33,   40,  115,   92,   93,  819,   91,   34,
-       35,   13,   14,   13,   95,   15,   16,   96,   17,   18,
-       19,   20,   21,   22,   22,   22,   23,   24,   13,   14,
-       13,  109,   39,   91,   25,   26,   13,   14,   13,   27,
-
-       39,   85,   85,   85,   28,   42,   41,   42,   42,   29,
-       42,   30,   83,  108,   41,  111,   94,   25,   31,  109,
-      217,  218,   89,  137,   89,  139,   32,   90,   90,   90,
-      138,  374,   33,  140,  375,   83,  108,  820,  111,   34,
-       35,   44,   44,   44,   45,   45,   46,   45,   45,   45,
-       45,   45,   45,   45,   45,   47,   45,   45,   45,   45,
-       45,   48,   45,   49,   50,   45,   51,   45,   52,   53,
-       54,   45,   45,   45,   45,   55,   56,   45,   57,   45,
-       45,   58,   45,   45,   59,   60,   61,   62,   63,   64,
-       65,   66,   67,   52,   68,   69,   70,   71,   72,   73,
-
-       74,   75,   76,   77,   78,   79,   57,   45,   45,   45,
-       45,   45,   81,  105,   82,   82,   82,   81,  114,   84,
-       84,   84,  102,  105,   81,   83,   84,   84,   84,  821,
-       83,  108,  123,  112,  141,  124,  182,   83,  125,  105,
-      126,  114,  127,  113,  142,  200,  143,  164,   83,  119,
-      194,  165,  133,   83,  108,  120,  112,  103,  121,  182,
-       83,   45,  149,  134,  182,  136,  150,   45,  200,   45,
-       45,  113,   45,  135,   45,   45,   45,  194,  117,  145,
-      146,   45,   45,  147,   45,   45,  151,  185,  822,  148,
+     1506,   13,   14,   13, 1506,   15,   16, 1506,   17,   18,
+       19,   20,   21,   22,   22,   22,   22,   22,   23,   24,
+       86,  695,   37,   14,   37,   87,   25,   26,   38,  102,
+     1506,   27,   37,   14,   37,   42,   28,   42,   38,   92,
+       93,   29,  197,   30,   13,   14,   13,   91,   92,   25,
+       31,   93,   13,   14,   13,   13,   14,   13,   32,   40,
+      696,   13,   14,   13,   33,   40,  103,   92,   93,  197,
+       91,   34,   35,   13,   14,   13,   95,   15,   16,   96,
+       17,   18,   19,   20,   21,   22,   22,   22,   22,   22,
+       23,   24,   13,   14,   13,   91,   39,  105,   25,   26,
+
+       13,   14,   13,   27,   39,   42,  108,   42,   28,   42,
+      109,   42,   41,   29,  111,   30,  114,  115,   94,  140,
+       41,   25,   31,  105,  221,  222,   89,  141,   89,  108,
+       32,   90,   90,   90,   90,   90,   33,  111,  109,  114,
+      227,  115,  228,   34,   35,   44,   44,   44,   45,   45,
+       46,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   47,   45,   45,   45,   45,   45,   48,   45,   49,
+       50,   45,   51,   45,   52,   53,   54,   45,   45,   45,
+       45,   55,   56,   45,   57,   45,   45,   58,   45,   45,
+       59,   60,   61,   62,   63,   64,   65,   66,   67,   52,
+
+       68,   69,   70,   71,   72,   73,   74,   75,   76,   77,
+       78,   79,   57,   45,   45,   45,   45,   45,   81,  812,
+       82,   82,   82,   82,   82,   81,  105,   84,   84,   84,
+       84,   84,  108,   83,   85,   85,   85,   85,   85,   81,
+       83,   84,   84,   84,   84,   84,  183,   83,  258,  259,
+      112,  123,  119,  134,   83,  108,   83,  185,  120,  124,
+      113,  121,  125,   83,  135,  126,  137,  127,  138,  128,
+       83,  142,  183,  112,  136,  139,  161,   83,   45,  184,
+      162,  143,  819,  144,   45,  185,   45,   45,  113,   45,
+      163,   45,   45,   45,  411,  117,  146,  147,   45,   45,
+
+      148,   45,   45,  185,  412,  184,  149,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   90,   90,   90,   45,  128,  197,
-      111,   45,  129,  160,  180,  130,  131,  161,  114,   45,
-      242,  823,  155,   45,  243,   45,  118,  162,  132,  152,
-      156,  153,  157,  154,  112,  166,  197,  158,  159,  167,
-      180,  175,  168,  181,  113,   90,   90,   90,  102,  169,
-      170,  176,   85,   85,   85,  171,  177,  172,   81,  173,
-       82,   82,   82,   83,  180,   85,   85,   85,   89,  181,
-       89,   83,  113,   90,   90,   90,   83,  181,   81,  174,
-       84,   84,   84,  103,  190,  101,   83,  193,  196,  198,
-
-      183,   83,  101,  190,   83,  199,  211,  196,  223,   83,
-      224,  230,  226,  184,  231,  212,  213,  824,  232,  287,
-      204,  197,  190,  193,   83,  262,  196,  198,  227,  287,
-      101,  205,  199,  504,  101,  196,  505,  248,  101,  254,
-      255,  257,  271,  272,  258,  259,  101,  287,  280,  289,
-      101,  199,  101,  188,  203,  203,  203,  290,  263,  264,
-      265,  203,  203,  203,  203,  203,  203,  288,  288,  266,
-      299,  267,  289,  268,  269,  273,  270,  289,  283,  274,
-      296,  300,  302,  275,  203,  203,  203,  203,  203,  203,
-      304,  306,  296,  288,  291,  395,  317,  303,  299,  359,
-
-      292,  398,  390,  296,  318,  302,  348,  402,  300,  398,
-      319,  404,  404,  304,  409,  309,  412,  403,  306,  307,
-      307,  307,  426,  478,  398,  719,  307,  307,  307,  307,
-      307,  307,  399,  360,  406,  407,  466,  409,  432,  427,
-      404,  416,  433,  408,  412,  396,  467,  361,  719,  307,
-      307,  307,  307,  307,  307,  459,  460,  349,  517,  446,
-      350,  415,  415,  415,  447,  661,  662,  679,  415,  415,
-      415,  415,  415,  415,  487,  517,  492,  510,  488,  479,
-      493,  624,  511,  551,  541,  525,  517,  526,  552,  727,
-      728,  415,  415,  415,  415,  415,  415,  542,  825,  543,
-
-      620,  625,  718,  527,  680,  626,  763,  724,  624,  764,
-      448,  816,  525,  725,  526,  449,   45,   45,   45,  826,
-      827,  828,  829,   45,   45,   45,   45,   45,   45,  625,
-      718,  794,  796,  797,  830,  802,  831,  832,  795,  816,
-      798,  803,  833,  834,  799,  835,   45,   45,   45,   45,
-       45,   45,  836,  837,  838,  839,  840,  841,  842,  843,
-      844,  845,  847,  848,  849,  850,  846,  851,  852,  853,
-      854,  855,  856,  857,  858,  859,  860,  861,  862,  863,
-      865,  866,  867,  864,  868,  869,  870,  871,  872,  873,
-      874,  875,  876,  877,  878,  879,  880,  881,  882,  883,
-
-      884,  885,  886,  887,  888,  889,  890,  891,  892,  893,
-      894,  895,  896,  897,  898,  899,  900,  901,  902,  903,
-      904,  905,  906,  907,  908,  909,  910,  911,  912,  913,
-      914,  915,  916,  917,  918,  919,  920,  921,  922,  923,
-      924,  925,  926,  927,  928,  906,  929,  930,  905,  931,
-      932,  933,  934,  935,  936,  937,  939,  940,  941,  942,
-      943,  944,  945,  946,  947,  948,  949,  950,  951,  952,
-      953,  954,  955,  956,  958,  959,  960,  961,  962,  963,
-      964,  965,  966,  967,  957,  968,  969,  970,  971,  972,
-      973,  974,  975,  976,  977,  978,  979,  980,  981,  982,
-
-      983,  984,  985,  986,  987,  988,  989,  990,  991,  993,
-      992,  938,  994,  995,  996,  997,  998,  999, 1000, 1001,
-     1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011,
-     1012, 1013, 1014, 1015, 1016, 1017,  991,  992, 1018, 1019,
-     1020, 1021, 1023, 1025, 1026, 1027, 1022, 1028, 1029, 1030,
-     1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040,
-     1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050,
-     1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060,
-     1061, 1062, 1063, 1064, 1024, 1065, 1066, 1067, 1068, 1069,
-     1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079,
-
-     1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089,
-     1090, 1091, 1092, 1093, 1094, 1072, 1095, 1096, 1097, 1098,
-     1099, 1073, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107,
-     1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117,
-     1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1127, 1128,
-     1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138,
-     1139, 1140, 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1149,
-     1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157, 1158, 1159,
-     1160, 1161, 1162, 1163, 1164, 1165, 1166, 1167, 1168, 1169,
-     1170, 1171, 1143, 1172, 1173, 1174, 1175, 1177, 1126, 1178,
-
-     1179, 1180, 1181, 1182, 1176, 1183, 1184, 1185, 1186, 1187,
-     1148, 1188, 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196,
-     1197, 1198, 1199, 1200, 1201, 1202, 1204, 1205, 1206, 1207,
-     1203, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216,
-     1217, 1218, 1219, 1220, 1221, 1222, 1223, 1224, 1225, 1226,
-     1205, 1227, 1228, 1229, 1230, 1231, 1232, 1233, 1234, 1235,
-     1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245,
-     1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255,
-     1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, 1264, 1265,
-     1266, 1267, 1268, 1269, 1270, 1271, 1272, 1273, 1274, 1275,
-
-     1277, 1278, 1279, 1280, 1281, 1254, 1282, 1283, 1284, 1285,
-     1286, 1287, 1288, 1289, 1290, 1291, 1292, 1293, 1294, 1295,
-     1296, 1297, 1298, 1299, 1300, 1301, 1302, 1303, 1304, 1305,
-     1306, 1307, 1308, 1309, 1310, 1311, 1312, 1313, 1314, 1315,
-     1316, 1317, 1318, 1319, 1320, 1321, 1322, 1323, 1324, 1325,
-     1326, 1327, 1328, 1329, 1302, 1276, 1330, 1331, 1332, 1333,
-     1334, 1335, 1336, 1337, 1338, 1339, 1340, 1341, 1342, 1343,
-     1344, 1345, 1346, 1347, 1348, 1349, 1350, 1351, 1352, 1353,
-     1354, 1355, 1356, 1357, 1358, 1359, 1360, 1361, 1362, 1363,
-     1364, 1365, 1366, 1367, 1368, 1369, 1370, 1371, 1372, 1373,
-
-     1374, 1375, 1376, 1377, 1378, 1379, 1380, 1381, 1382, 1383,
-     1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393,
-     1394, 1395, 1396, 1397, 1398, 1399, 1400, 1401, 1402, 1403,
-     1404, 1405, 1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413,
-     1414, 1415, 1416, 1417, 1418, 1419, 1420, 1421, 1422, 1423,
-     1424, 1425, 1426, 1427, 1428, 1429, 1430, 1431, 1432, 1433,
-     1434, 1435, 1436, 1437, 1438, 1439, 1440, 1441, 1442, 1443,
-     1444, 1445, 1446, 1447, 1448, 1449, 1450, 1451, 1452, 1453,
-     1454, 1455, 1456, 1457, 1458, 1459, 1460, 1461, 1462, 1463,
-     1464, 1465, 1466,   12,   12,   12,   12,   12,   36,   36,
-
-       36,   36,   36,   80,  294,   80,   80,   80,   99,  401,
-       99,  514,   99,  101,  101,  101,  101,  101,  116,  116,
-      116,  116,  116,  179,  101,  179,  179,  179,  201,  201,
-      201,  817,  815,  814,  813,  812,  811,  810,  809,  808,
-      807,  806,  805,  804,  801,  800,  793,  792,  791,  790,
-      789,  788,  787,  786,  785,  784,  783,  782,  781,  780,
-      779,  778,  777,  776,  775,  774,  773,  772,  771,  770,
-      769,  768,  767,  766,  765,  762,  761,  760,  759,  758,
+      129,  188,   45,  820,  130,  150,   45,  131,  132,  151,
+       45,  111,  165,  275,  276,  183,  166,  102,   45,  114,
+      133,  193,   45,  156,   45,  118,  200,  173,  174,  152,
+      153,  157,  154,  158,  155,  184,  167,  112,  159,  160,
+      168,  186,  178,  169,  246,  823,  404,  113,  247,  193,
+      170,  171,  179,  200,  103,  203,  172,  180,  469,  470,
+      175,  187,  176,   85,   85,   85,   85,   85,   81,  199,
+
+       82,   82,   82,   82,   82,  113,   83,  201,  203,   89,
+      824,   89,  177,   83,   90,   90,   90,   90,   90,   81,
+      202,   84,   84,   84,   84,   84,  101,  199,  405,   83,
+      196,  193,  825,  101,   83,  201,   83,   85,   85,   85,
+       85,   85,   90,   90,   90,   90,   90,  202,  207,  230,
+       83,   90,   90,   90,   90,   90,  196,   83,  277,  208,
+      215,  234,  278,  101,  235,  231,  279,  101,  236,  216,
+      217,  101,  261,   83,  199,  262,  263,  294,  200,  101,
+      266,  202,  293,  101,  295,  101,  191,  206,  206,  206,
+      206,  206,  294,  355,  677,  678,  206,  206,  206,  206,
+
+      206,  206,  199,  294,  252,  286,  293,  295,  289,  295,
+      293,  305,  302,  306,  308,  267,  268,  269,  297,  206,
+      206,  206,  206,  206,  206,  310,  270,  312,  271,  302,
+      272,  273,  298,  274,  296,  302,  324,  308,  381,  305,
+      306,  382,  309,  366,  325,  421,  356,  399,  310,  357,
+      326,  407,  315,  407,  312,  313,  313,  313,  313,  313,
+      418,  436,  415,  416,  313,  313,  313,  313,  313,  313,
+      413,  417,  476,  421,  407,  442,  408,  413,  437,  367,
+      488,  443,  477,  418,  737,  826,  721,  313,  313,  313,
+      313,  313,  313,  368,  497,  639,  529,  722,  498,  413,
+
+      424,  424,  424,  424,  424,  516,  425,  737,  517,  424,
+      424,  424,  424,  424,  424,  456,  529,  502,  522,  640,
+      457,  503,  639,  523,  529,  537,  554,  538,  736,  746,
+      747,  827,  424,  424,  424,  424,  424,  424,  489,  555,
+      564,  556,  828,  635,  539,  565,  829,  640,  641,  743,
+      782,  813,  537,  783,  538,  744,  736,  821,  814,  815,
+      816,  830,  831,  822,  832,  833,  834,  817,  458,  835,
+      836,  818,  837,  459,   45,   45,   45,   45,   45,  838,
+      839,  840,  841,   45,   45,   45,   45,   45,   45,  842,
+      843,  844,  845,  846,  847,  848,  849,  850,  851,  852,
+
+      837,  853,  854,  855,  856,  857,   45,   45,   45,   45,
+       45,   45,  858,  859,  860,  861,  862,  863,  864,  865,
+      866,  867,  869,  870,  871,  872,  868,  873,  874,  875,
+      876,  877,  878,  879,  880,  881,  882,  883,  884,  885,
+      887,  888,  889,  886,  890,  891,  892,  893,  894,  895,
+      896,  897,  898,  899,  900,  901,  902,  903,  904,  905,
+      906,  907,  908,  909,  910,  911,  912,  913,  914,  915,
+      916,  917,  918,  919,  920,  921,  922,  923,  924,  925,
+      926,  927,  928,  929,  930,  931,  932,  933,  934,  935,
+      936,  937,  938,  939,  940,  941,  942,  943,  944,  945,
+
+      946,  947,  948,  949,  950,  951,  952,  930,  953,  954,
+      929,  955,  956,  957,  958,  959,  960,  961,  962,  964,
+      965,  966,  967,  968,  969,  970,  971,  972,  973,  974,
+      975,  976,  977,  978,  979,  980,  981,  983,  984,  985,
+      986,  987,  988,  989,  990,  991,  992,  982,  993,  994,
+      995,  996,  997,  998,  999, 1000, 1001, 1002, 1003, 1004,
+     1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014,
+     1015, 1016, 1017, 1018, 1020, 1019,  963, 1021, 1022, 1023,
+     1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033,
+     1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043,
+
+     1044, 1018, 1019, 1045, 1046, 1047, 1048, 1049, 1051, 1053,
+     1054, 1055, 1050, 1056, 1057, 1058, 1059, 1060, 1061, 1062,
+     1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072,
+     1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082,
+     1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092,
+     1093, 1094, 1052, 1095, 1096, 1097, 1098, 1099, 1100, 1101,
+     1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111,
+     1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1120, 1121,
+     1122, 1123, 1124, 1102, 1125, 1126, 1127, 1128, 1129, 1103,
+     1130, 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138, 1139,
+
+     1140, 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148, 1149,
+     1150, 1151, 1152, 1153, 1154, 1155, 1156, 1158, 1159, 1160,
+     1161, 1162, 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170,
+     1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1181,
+     1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191,
+     1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201,
+     1202, 1174, 1203, 1204, 1205, 1206, 1207, 1209, 1210, 1157,
+     1211, 1212, 1213, 1214, 1208, 1215, 1216, 1217, 1218, 1219,
+     1220, 1221, 1180, 1222, 1223, 1224, 1225, 1226, 1227, 1228,
+     1229, 1230, 1231, 1232, 1233, 1234, 1236, 1237, 1238, 1239,
+
+     1235, 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1247, 1248,
+     1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258,
+     1237, 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1266, 1267,
+     1268, 1269, 1270, 1271, 1272, 1273, 1274, 1275, 1276, 1277,
+     1278, 1279, 1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287,
+     1288, 1289, 1290, 1291, 1292, 1293, 1294, 1295, 1296, 1297,
+     1298, 1299, 1300, 1301, 1302, 1303, 1304, 1305, 1306, 1307,
+     1308, 1309, 1311, 1312, 1313, 1314, 1287, 1315, 1316, 1317,
+     1318, 1319, 1320, 1321, 1322, 1323, 1324, 1325, 1326, 1327,
+     1328, 1329, 1330, 1331, 1332, 1333, 1334, 1335, 1336, 1337,
+
+     1338, 1339, 1340, 1341, 1342, 1343, 1344, 1345, 1346, 1347,
+     1348, 1349, 1350, 1351, 1352, 1353, 1354, 1355, 1356, 1357,
+     1358, 1359, 1360, 1361, 1362, 1363, 1336, 1364, 1365, 1310,
+     1366, 1367, 1368, 1369, 1370, 1371, 1372, 1373, 1374, 1375,
+     1376, 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1384, 1385,
+     1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, 1395,
+     1396, 1397, 1398, 1399, 1400, 1401, 1402, 1403, 1404, 1405,
+     1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1415,
+     1416, 1417, 1418, 1419, 1420, 1421, 1422, 1423, 1424, 1425,
+     1426, 1427, 1428, 1429, 1430, 1431, 1432, 1433, 1434, 1435,
+
+     1436, 1437, 1438, 1439, 1440, 1441, 1442, 1443, 1444, 1445,
+     1446, 1447, 1448, 1449, 1450, 1451, 1452, 1453, 1454, 1455,
+     1456, 1457, 1458, 1459, 1460, 1461, 1462, 1463, 1464, 1465,
+     1466, 1467, 1468, 1469, 1470, 1471, 1472, 1473, 1474, 1475,
+     1476, 1477, 1478, 1479, 1480, 1481, 1482, 1483, 1484, 1485,
+     1486, 1487, 1488, 1489, 1490, 1491, 1492, 1493, 1494, 1495,
+     1496, 1497, 1498, 1499, 1500, 1501, 1502, 1503, 1504, 1505,
+       12,   12,   12,   12,   12,   36,   36,   36,   36,   36,
+       80,  300,   80,   80,   80,   99,  410,   99,  526,   99,
+      101,  101,  101,  101,  101,  116,  116,  116,  116,  116,
+
+      182,  101,  182,  182,  182,  204,  204,  204,  811,  810,
+      809,  808,  807,  806,  805,  804,  803,  802,  801,  800,
+      799,  798,  797,  796,  795,  794,  793,  792,  791,  790,
+      789,  788,  787,  786,  785,  784,  781,  780,  779,  778,
+      777,  776,  775,  774,  773,  772,  771,  770,  769,  768,
+      767,  766,  765,  764,  763,  762,  761,  760,  759,  758,
       757,  756,  755,  754,  753,  752,  751,  750,  749,  748,
-      747,  746,  745,  744,  743,  742,  741,  740,  739,  738,
-
-      737,  736,  735,  734,  733,  732,  731,  730,  729,  726,
-      723,  722,  721,  720,  717,  716,  715,  714,  713,  712,
-      711,  710,  709,  708,  707,  704,  703,  702,  701,  700,
-      699,  698,  697,  696,  695,  694,  693,  692,  691,  690,
-      689,  688,  687,  686,  685,  684,  683,  682,  681,  678,
-      677,  676,  675,  674,  673,  672,  671,  670,  669,  668,
-      667,  666,  665,  664,  663,  660,  659,  658,  657,  656,
+      745,  742,  741,  740,  739,  738,  735,  734,  733,  732,
+      731,  730,  729,  728,  727,  726,  725,  724,  723,  720,
+      719,  718,  717,  716,  715,  714,  713,  712,  711,  710,
+
+      709,  708,  707,  706,  705,  704,  703,  702,  701,  700,
+      699,  698,  697,  694,  693,  692,  691,  690,  689,  688,
+      687,  686,  685,  684,  683,  682,  681,  680,  679,  676,
+      675,  674,  673,  672,  671,  670,  669,  668,  667,  666,
+      665,  664,  663,  662,  661,  660,  659,  658,  657,  656,
       655,  654,  653,  652,  651,  650,  649,  648,  647,  646,
-      645,  644,  643,  642,  641,  640,  639,  638,  637,  636,
-      635,  634,  633,  632,  631,  630,  629,  628,  627,  623,
-
+      645,  644,  643,  642,  638,  637,  636,  635,  634,  633,
+      632,  631,  630,  629,  628,  627,  626,  625,  624,  623,
       622,  621,  620,  619,  618,  617,  616,  615,  614,  613,
       612,  611,  610,  609,  608,  607,  606,  605,  604,  603,
+
       602,  601,  600,  599,  598,  597,  596,  595,  594,  593,
       592,  591,  590,  589,  588,  587,  586,  585,  584,  583,
       582,  581,  580,  579,  578,  577,  576,  575,  574,  573,
-      572,  571,  570,  569,  568,  567,  566,  565,  564,  563,
-      562,  561,  560,  559,  558,  557,  556,  555,  554,  553,
-      550,  549,  548,  547,  546,  545,  544,  540,  539,  538,
-      537,  536,  535,  534,  533,  532,  531,  530,  529,  528,
-      524,  523,  522,  521,  520,  519,  518,  516,  515,  513,
-
-      512,  509,  508,  507,  506,  503,  502,  501,  500,  499,
-      498,  497,  496,  495,  494,  491,  490,  489,  486,  485,
-      484,  483,  482,  481,  480,  477,  476,  475,  474,  473,
-      472,  471,  470,  469,  468,  465,  464,  463,  462,  461,
-      458,  457,  456,  455,  454,  453,  452,  451,  450,  445,
-      444,  443,  442,  441,  440,  439,  438,  437,  436,  435,
-      434,  431,  430,  429,  428,  425,  424,  423,  422,  421,
-      420,  419,  418,  417,  414,  413,  411,  410,  405,  400,
-      397,  394,  393,  392,  391,  389,  388,  387,  386,  385,
-      384,  383,  382,  381,  380,  379,  378,  377,  376,  373,
-
-      372,  371,  370,  369,  368,  367,  366,  365,  364,  363,
-      362,  358,  357,  356,  355,  354,  353,  352,  351,  347,
+      572,  571,  570,  569,  568,  567,  566,  563,  562,  561,
+      560,  559,  558,  557,  553,  552,  551,  550,  549,  548,
+      547,  546,  545,  544,  543,  542,  541,  540,  536,  535,
+      534,  533,  532,  531,  530,  528,  527,  525,  524,  521,
+      520,  519,  518,  515,  514,  513,  512,  511,  510,  509,
+      508,  507,  506,  505,  504,  501,  500,  499,  496,  495,
+      494,  493,  492,  491,  490,  487,  486,  485,  484,  483,
+
+      482,  481,  480,  479,  478,  475,  474,  473,  472,  471,
+      468,  467,  466,  465,  464,  463,  462,  461,  460,  455,
+      454,  453,  452,  451,  450,  449,  448,  447,  446,  445,
+      444,  441,  440,  439,  438,  435,  434,  433,  432,  431,
+      430,  429,  428,  427,  426,  423,  422,  420,  419,  414,
+      409,  406,  403,  402,  401,  400,  398,  397,  396,  395,
+      394,  393,  392,  391,  390,  389,  388,  387,  386,  385,
+      384,  383,  380,  379,  378,  377,  376,  375,  374,  373,
+      372,  371,  370,  369,  365,  364,  363,  362,  361,  360,
+      359,  358,  354,  353,  352,  351,  350,  349,  348,  347,
+
       346,  345,  344,  343,  342,  341,  340,  339,  338,  337,
       336,  335,  334,  333,  332,  331,  330,  329,  328,  327,
-      326,  325,  324,  323,  322,  321,  320,  316,  315,  314,
-      313,  312,  311,  310,  308,  202,  305,  303,  301,  298,
-      297,  295,  293,  286,  285,  284,  282,  281,  279,  278,
-      277,  276,  261,  260,  256,  253,  252,  251,  250,  249,
-      247,  246,  245,  244,  241,  240,  239,  238,  237,  236,
-      235,  234,  233,  229,  228,  225,  222,  221,  220,  219,
-
-      216,  215,  214,  210,  209,  208,  207,  206,  202,  195,
-      192,  191,  189,  187,  186,  178,  163,  144,  122,  110,
-      107,  106,  104,   43,  100,   98,   97,   88,   43, 1467,
-       11, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467,
-     1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467,
-     1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467,
-     1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467,
-     1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467,
-     1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467,
-     1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467,
-
-     1467, 1467
+      323,  322,  321,  320,  319,  318,  317,  316,  314,  205,
+      311,  309,  307,  304,  303,  301,  299,  292,  291,  290,
+      288,  287,  285,  284,  283,  282,  281,  280,  265,  264,
+      260,  257,  256,  255,  254,  253,  251,  250,  249,  248,
+      245,  244,  243,  242,  241,  240,  239,  238,  237,  233,
+      232,  229,  226,  225,  224,  223,  220,  219,  218,  214,
+      213,  212,  211,  210,  209,  205,  198,  195,  194,  192,
+      190,  189,  181,  164,  145,  122,  110,  107,  106,  104,
+
+       43,  100,   98,   97,   88,   43, 1506,   11, 1506, 1506,
+     1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+     1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+     1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+     1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+     1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+     1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+     1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+     1506
     } ;
 
-static const flex_int16_t yy_chk[1903] =
+static const flex_int16_t yy_chk[1982] =
     {   0,
         0,    1,    1,    1,    0,    1,    1,    0,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,   21,  610,
-        3,    3,    3,   21,    1,    1,    3,    0,  610,    1,
-        4,    4,    4,   13,    1,   13,    4,   27,   28,    1,
-       57,    1,    5,    5,    5,   26,   32,    1,    1,   33,
-        6,    6,    6,    7,    7,    7,    1,    7,  721,    8,
-        8,    8,    1,    8,   57,   27,   28,  722,   26,    1,
-        1,    2,    2,    2,   32,    2,    2,   33,    2,    2,
-        2,    2,    2,    2,    2,    2,    2,    2,    9,    9,
-        9,   52,    5,   31,    2,    2,   10,   10,   10,    2,
-
-        6,   20,   20,   20,    2,   37,    9,   37,   42,    2,
-       42,    2,   20,   51,   10,   54,   31,    2,    2,   52,
-      129,  129,   25,   65,   25,   66,    2,   25,   25,   25,
-       65,  265,    2,   66,  265,   20,   51,  723,   54,    2,
-        2,   15,   15,   15,   15,   15,   15,   15,   15,   15,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+       21,  595,    3,    3,    3,   21,    1,    1,    3,   44,
+        0,    1,    4,    4,    4,   13,    1,   13,    4,   27,
+       28,    1,  109,    1,    5,    5,    5,   26,   32,    1,
+        1,   33,    6,    6,    6,    7,    7,    7,    1,    7,
+      595,    8,    8,    8,    1,    8,   44,   27,   28,  109,
+       26,    1,    1,    2,    2,    2,   32,    2,    2,   33,
+        2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
+        2,    2,    9,    9,    9,   31,    5,   48,    2,    2,
+
+       10,   10,   10,    2,    6,   37,   51,   37,    2,   42,
+       52,   42,    9,    2,   54,    2,   56,   57,   31,   66,
+       10,    2,    2,   48,  130,  130,   25,   66,   25,   51,
+        2,   25,   25,   25,   25,   25,    2,   54,   52,   56,
+      135,   57,  135,    2,    2,   15,   15,   15,   15,   15,
        15,   15,   15,   15,   15,   15,   15,   15,   15,   15,
        15,   15,   15,   15,   15,   15,   15,   15,   15,   15,
        15,   15,   15,   15,   15,   15,   15,   15,   15,   15,
@@ -1480,193 +1503,201 @@ static const flex_int16_t yy_chk[1903] =
        15,   15,   15,   15,   15,   15,   15,   15,   15,   15,
 
        15,   15,   15,   15,   15,   15,   15,   15,   15,   15,
-       15,   15,   17,   48,   17,   17,   17,   19,   56,   19,
-       19,   19,   44,   59,   22,   17,   22,   22,   22,  724,
-       19,   64,   61,   55,   67,   61,   93,   22,   61,   48,
-       61,   56,   61,   55,   67,  115,   67,   75,   17,   59,
-      109,   75,   63,   19,   64,   59,   55,   44,   59,   96,
-       22,   45,   70,   63,   93,   64,   70,   45,  115,   45,
-       45,   55,   45,   63,   45,   45,   45,  109,   58,   69,
-       69,   45,   45,   69,   45,   58,   70,   96,  725,   69,
+       15,   15,   15,   15,   15,   15,   15,   15,   17,  715,
+       17,   17,   17,   17,   17,   19,   59,   19,   19,   19,
+       19,   19,   64,   17,   20,   20,   20,   20,   20,   22,
+       19,   22,   22,   22,   22,   22,   91,   20,  161,  161,
+       55,   61,   59,   63,   22,   64,   17,   93,   59,   61,
+       55,   59,   61,   19,   63,   61,   64,   61,   65,   61,
+       20,   67,   91,   55,   63,   65,   73,   22,   45,   92,
+       73,   67,  718,   67,   45,   93,   45,   45,   55,   45,
+       73,   45,   45,   45,  301,   58,   69,   69,   45,   45,
+
+       69,   45,   58,   96,  301,   92,   69,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   58,   89,   89,   89,   58,   62,  112,
-       71,   58,   62,   73,   91,   62,   62,   73,   78,   58,
-      149,  727,   72,   58,  149,   58,   58,   73,   62,   71,
-       72,   71,   72,   71,   77,   76,  112,   72,   72,   76,
-       91,   78,   76,   92,   77,   90,   90,   90,  101,   76,
-       76,   78,   81,   81,   81,   76,   78,   77,   82,   77,
-       82,   82,   82,   81,   94,   85,   85,   85,   83,   92,
-       83,   82,   77,   83,   83,   83,   85,   95,   84,   77,
-       84,   84,   84,  101,  105,  103,   81,  108,  111,  113,
-
-       94,   84,  103,  119,   82,  114,  125,  154,  134,   85,
-      134,  139,  136,   95,  139,  125,  125,  728,  139,  180,
-      119,  172,  105,  108,   84,  165,  111,  113,  136,  183,
-      103,  119,  114,  390,  103,  154,  390,  154,  103,  160,
-      160,  162,  166,  166,  162,  162,  103,  180,  172,  182,
-      103,  175,  103,  103,  118,  118,  118,  183,  165,  165,
-      165,  118,  118,  118,  118,  118,  118,  181,  184,  165,
-      193,  165,  182,  165,  165,  167,  165,  185,  175,  167,
-      190,  194,  196,  167,  118,  118,  118,  118,  118,  118,
-      198,  200,  205,  181,  184,  285,  213,  280,  193,  252,
-
-      185,  287,  280,  190,  213,  196,  243,  295,  194,  290,
-      213,  296,  309,  198,  299,  205,  302,  295,  200,  203,
-      203,  203,  319,  366,  287,  625,  203,  203,  203,  203,
-      203,  203,  290,  252,  298,  298,  354,  299,  325,  319,
-      296,  309,  325,  298,  302,  285,  354,  252,  625,  203,
-      203,  203,  203,  203,  203,  348,  348,  243,  404,  338,
-      243,  307,  307,  307,  338,  564,  564,  582,  307,  307,
-      307,  307,  307,  307,  375,  416,  379,  396,  375,  366,
-      379,  525,  396,  441,  432,  414,  404,  414,  441,  632,
-      632,  307,  307,  307,  307,  307,  307,  432,  729,  432,
-
-      527,  526,  624,  416,  582,  527,  668,  630,  525,  668,
-      338,  719,  414,  630,  414,  338,  415,  415,  415,  730,
-      731,  732,  733,  415,  415,  415,  415,  415,  415,  526,
-      624,  700,  701,  701,  734,  704,  735,  736,  700,  719,
-      701,  704,  737,  738,  701,  739,  415,  415,  415,  415,
-      415,  415,  740,  741,  742,  743,  745,  746,  747,  748,
-      749,  750,  751,  752,  753,  754,  750,  755,  756,  757,
-      758,  761,  762,  763,  764,  767,  768,  769,  770,  771,
-      772,  773,  774,  771,  775,  776,  777,  779,  780,  781,
-      782,  783,  784,  785,  786,  787,  788,  789,  790,  791,
-
-      792,  793,  794,  795,  796,  797,  798,  799,  800,  801,
-      802,  803,  805,  806,  807,  808,  809,  810,  811,  812,
-      813,  815,  816,  817,  818,  819,  820,  821,  822,  823,
-      824,  825,  826,  827,  828,  829,  830,  831,  832,  833,
-      834,  836,  837,  838,  839,  816,  840,  841,  815,  842,
-      843,  844,  846,  847,  848,  849,  850,  852,  853,  854,
-      855,  856,  857,  858,  859,  860,  861,  862,  863,  864,
-      865,  866,  867,  868,  869,  871,  872,  873,  875,  876,
-      877,  878,  879,  880,  868,  881,  882,  883,  884,  885,
-      886,  887,  888,  889,  890,  891,  893,  894,  895,  896,
-
-      897,  898,  899,  900,  901,  902,  903,  904,  905,  907,
-      906,  849,  908,  909,  910,  911,  913,  914,  915,  916,
-      917,  918,  919,  920,  922,  923,  924,  925,  926,  927,
-      928,  929,  930,  931,  932,  933,  905,  906,  934,  935,
-      936,  938,  939,  940,  941,  942,  938,  943,  944,  945,
-      946,  947,  948,  949,  950,  951,  952,  953,  954,  955,
-      956,  957,  958,  959,  960,  962,  963,  964,  965,  966,
-      967,  968,  969,  970,  971,  972,  974,  975,  977,  978,
-      979,  980,  981,  982,  939,  983,  984,  985,  986,  987,
-      988,  990,  991,  992,  993,  994,  995,  997,  998,  999,
-
-     1000, 1001, 1002, 1005, 1006, 1007, 1008, 1009, 1010, 1011,
-     1012, 1013, 1014, 1015, 1016,  991, 1017, 1018, 1019, 1022,
-     1024,  992, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1033,
-     1034, 1035, 1036, 1038, 1039, 1040, 1041, 1042, 1045, 1046,
-     1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056,
-     1057, 1058, 1059, 1061, 1062, 1063, 1064, 1065, 1066, 1067,
-     1068, 1069, 1070, 1071, 1072, 1073, 1075, 1076, 1077, 1078,
-     1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088,
-     1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099,
-     1100, 1101, 1072, 1102, 1103, 1104, 1105, 1106, 1054, 1107,
-
-     1109, 1112, 1113, 1114, 1105, 1115, 1116, 1117, 1118, 1119,
-     1077, 1120, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1130,
-     1132, 1135, 1137, 1139, 1140, 1141, 1142, 1143, 1145, 1146,
-     1141, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 1156,
-     1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, 1166, 1167,
-     1143, 1168, 1171, 1173, 1174, 1175, 1176, 1177, 1179, 1180,
-     1181, 1182, 1183, 1184, 1186, 1187, 1189, 1190, 1191, 1192,
-     1194, 1195, 1196, 1197, 1198, 1199, 1201, 1203, 1205, 1207,
-     1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217,
-     1218, 1219, 1220, 1221, 1222, 1223, 1224, 1225, 1225, 1226,
-
-     1227, 1228, 1229, 1230, 1231, 1205, 1232, 1233, 1234, 1235,
-     1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245,
-     1246, 1248, 1249, 1251, 1252, 1253, 1254, 1258, 1259, 1262,
-     1263, 1264, 1267, 1268, 1269, 1270, 1271, 1272, 1273, 1274,
-     1276, 1277, 1279, 1281, 1282, 1283, 1284, 1285, 1287, 1288,
-     1289, 1290, 1291, 1292, 1254, 1226, 1293, 1294, 1295, 1296,
-     1297, 1298, 1299, 1301, 1302, 1303, 1305, 1306, 1307, 1308,
-     1309, 1310, 1311, 1313, 1314, 1315, 1317, 1319, 1320, 1321,
-     1322, 1323, 1324, 1325, 1326, 1327, 1328, 1329, 1331, 1332,
-     1336, 1340, 1341, 1343, 1344, 1346, 1347, 1348, 1349, 1350,
-
-     1351, 1353, 1355, 1356, 1357, 1358, 1359, 1360, 1361, 1362,
-     1364, 1365, 1366, 1367, 1368, 1369, 1370, 1371, 1374, 1375,
-     1376, 1377, 1378, 1380, 1381, 1382, 1383, 1384, 1385, 1387,
-     1388, 1389, 1390, 1391, 1393, 1395, 1397, 1398, 1399, 1400,
-     1401, 1402, 1403, 1404, 1406, 1407, 1409, 1410, 1413, 1414,
-     1415, 1416, 1417, 1418, 1419, 1420, 1421, 1422, 1423, 1424,
-     1425, 1426, 1427, 1428, 1429, 1430, 1431, 1432, 1433, 1434,
-     1435, 1436, 1437, 1439, 1441, 1442, 1443, 1444, 1445, 1446,
-     1450, 1451, 1452, 1453, 1455, 1456, 1458, 1459, 1460, 1461,
-     1462, 1464, 1465, 1468, 1468, 1468, 1468, 1468, 1469, 1469,
-
-     1469, 1469, 1469, 1470, 1476, 1470, 1470, 1470, 1471, 1477,
-     1471, 1478, 1471, 1472, 1472, 1472, 1472, 1472, 1473, 1473,
-     1473, 1473, 1473, 1474, 1479, 1474, 1474, 1474, 1475, 1475,
-     1475,  720,  718,  716,  715,  714,  713,  712,  711,  710,
-      709,  708,  707,  706,  703,  702,  699,  698,  697,  696,
-      695,  694,  693,  692,  691,  690,  689,  688,  687,  686,
-      685,  684,  683,  682,  681,  680,  678,  677,  676,  675,
-      674,  673,  672,  671,  669,  667,  666,  665,  664,  663,
-      662,  661,  660,  659,  658,  657,  656,  655,  654,  653,
-      652,  650,  649,  648,  647,  646,  645,  644,  643,  642,
-
-      641,  640,  639,  638,  637,  636,  635,  634,  633,  631,
-      629,  628,  627,  626,  623,  622,  621,  619,  618,  616,
-      615,  614,  613,  612,  611,  608,  607,  606,  605,  604,
-      603,  602,  601,  600,  599,  598,  597,  595,  594,  593,
-      592,  591,  590,  589,  588,  586,  585,  584,  583,  581,
-      580,  579,  578,  577,  576,  575,  573,  572,  571,  570,
-      569,  568,  567,  566,  565,  563,  562,  561,  560,  559,
-      558,  557,  556,  555,  554,  553,  552,  550,  549,  548,
-      547,  546,  545,  544,  543,  542,  541,  540,  539,  538,
-      537,  536,  535,  534,  533,  532,  531,  530,  529,  523,
-
-      521,  518,  517,  516,  515,  513,  512,  511,  509,  508,
-      505,  504,  503,  502,  501,  500,  499,  498,  497,  496,
-      495,  494,  493,  492,  491,  490,  489,  488,  487,  486,
-      485,  484,  483,  482,  481,  479,  477,  476,  475,  474,
-      473,  472,  471,  470,  469,  468,  467,  466,  464,  463,
-      462,  461,  460,  459,  458,  457,  456,  455,  454,  453,
-      452,  451,  450,  449,  448,  447,  445,  444,  443,  442,
-      440,  439,  438,  437,  436,  434,  433,  431,  430,  428,
-      427,  426,  425,  424,  423,  421,  420,  419,  418,  417,
-      412,  411,  409,  408,  407,  406,  405,  403,  402,  400,
-
-      397,  395,  394,  392,  391,  389,  388,  387,  386,  385,
-      384,  383,  382,  381,  380,  378,  377,  376,  374,  373,
-      372,  371,  369,  368,  367,  365,  364,  363,  362,  361,
-      360,  359,  358,  357,  355,  353,  352,  351,  350,  349,
-      347,  346,  345,  344,  343,  342,  341,  340,  339,  337,
-      336,  335,  334,  333,  332,  331,  330,  329,  328,  327,
-      326,  324,  323,  322,  321,  318,  317,  316,  315,  314,
-      313,  312,  311,  310,  306,  304,  301,  300,  297,  293,
-      286,  284,  283,  282,  281,  279,  278,  277,  276,  275,
-      274,  273,  272,  271,  270,  269,  268,  267,  266,  264,
-
-      263,  262,  261,  260,  259,  258,  257,  256,  255,  254,
-      253,  251,  250,  249,  248,  247,  246,  245,  244,  242,
-      241,  240,  239,  238,  237,  236,  235,  233,  232,  231,
-      230,  229,  228,  227,  226,  225,  224,  223,  222,  221,
-      220,  219,  218,  217,  216,  215,  214,  212,  211,  210,
-      209,  208,  207,  206,  204,  201,  199,  197,  195,  192,
-      191,  189,  186,  178,  177,  176,  174,  173,  171,  170,
-      169,  168,  164,  163,  161,  159,  158,  157,  156,  155,
-      153,  152,  151,  150,  148,  147,  146,  145,  144,  143,
-      142,  141,  140,  138,  137,  135,  133,  132,  131,  130,
-
-      128,  127,  126,  124,  123,  122,  121,  120,  116,  110,
-      107,  106,  104,   99,   98,   79,   74,   68,   60,   53,
-       50,   49,   47,   43,   41,   39,   38,   24,   14,   11,
-     1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467,
-     1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467,
-     1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467,
-     1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467,
-     1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467,
-     1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467,
-     1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467,
-
-     1467, 1467
+       62,   96,   58,  719,   62,   70,   58,   62,   62,   70,
+       58,   71,   75,  167,  167,   94,   75,  101,   58,   78,
+       62,  105,   58,   72,   58,   58,  112,   77,   77,   70,
+       71,   72,   71,   72,   71,   95,   76,   77,   72,   72,
+       76,   94,   78,   76,  150,  722,  291,   77,  150,  105,
+       76,   76,   78,  112,  101,  115,   76,   78,  355,  355,
+       77,   95,   77,   81,   81,   81,   81,   81,   82,  111,
+
+       82,   82,   82,   82,   82,   77,   81,  113,  115,   83,
+      723,   83,   77,   82,   83,   83,   83,   83,   83,   84,
+      114,   84,   84,   84,   84,   84,  103,  111,  291,   81,
+      108,  119,  724,  103,   84,  113,   82,   85,   85,   85,
+       85,   85,   89,   89,   89,   89,   89,  114,  119,  137,
+       85,   90,   90,   90,   90,   90,  108,   84,  168,  119,
+      126,  140,  168,  103,  140,  137,  168,  103,  140,  126,
+      126,  103,  163,   85,  155,  163,  163,  184,  175,  103,
+      166,  178,  183,  103,  185,  103,  103,  118,  118,  118,
+      118,  118,  187,  247,  577,  577,  118,  118,  118,  118,
+
+      118,  118,  155,  184,  155,  175,  186,  185,  178,  188,
+      183,  196,  193,  197,  199,  166,  166,  166,  187,  118,
+      118,  118,  118,  118,  118,  201,  166,  203,  166,  208,
+      166,  166,  188,  166,  186,  193,  217,  199,  269,  196,
+      197,  269,  286,  256,  217,  308,  247,  286,  201,  247,
+      217,  293,  208,  296,  203,  206,  206,  206,  206,  206,
+      305,  326,  304,  304,  206,  206,  206,  206,  206,  206,
+      302,  304,  361,  308,  293,  332,  296,  315,  326,  256,
+      373,  332,  361,  305,  640,  725,  623,  206,  206,  206,
+      206,  206,  206,  256,  382,  537,  413,  623,  382,  302,
+
+      313,  313,  313,  313,  313,  399,  315,  640,  399,  313,
+      313,  313,  313,  313,  313,  345,  425,  386,  405,  538,
+      345,  386,  537,  405,  413,  423,  442,  423,  639,  648,
+      648,  726,  313,  313,  313,  313,  313,  313,  373,  442,
+      451,  442,  727,  539,  425,  451,  728,  538,  539,  646,
+      684,  716,  423,  684,  423,  646,  639,  720,  716,  717,
+      717,  729,  730,  720,  731,  732,  733,  717,  345,  734,
+      736,  717,  737,  345,  424,  424,  424,  424,  424,  738,
+      739,  740,  741,  424,  424,  424,  424,  424,  424,  742,
+      743,  744,  746,  747,  748,  749,  750,  751,  752,  753,
+
+      737,  754,  755,  756,  757,  758,  424,  424,  424,  424,
+      424,  424,  759,  760,  761,  762,  764,  765,  766,  767,
+      768,  769,  770,  771,  772,  773,  769,  774,  775,  776,
+      777,  780,  781,  782,  783,  786,  787,  788,  789,  790,
+      791,  792,  793,  790,  794,  795,  796,  798,  799,  800,
+      801,  802,  803,  804,  805,  806,  807,  808,  809,  810,
+      811,  812,  813,  814,  815,  816,  817,  818,  819,  820,
+      821,  822,  824,  825,  826,  827,  828,  829,  830,  831,
+      832,  833,  834,  836,  837,  838,  839,  840,  841,  842,
+      843,  844,  845,  846,  847,  848,  849,  850,  851,  852,
+
+      853,  854,  855,  856,  858,  859,  860,  837,  861,  862,
+      836,  863,  864,  865,  866,  868,  869,  870,  871,  872,
+      874,  875,  876,  877,  878,  879,  880,  881,  882,  883,
+      884,  885,  886,  887,  888,  889,  890,  891,  893,  894,
+      895,  897,  898,  899,  900,  901,  902,  890,  903,  904,
+      905,  906,  907,  908,  909,  910,  911,  912,  913,  915,
+      916,  917,  918,  919,  920,  921,  922,  923,  924,  925,
+      926,  927,  928,  929,  931,  930,  871,  932,  933,  934,
+      935,  936,  938,  939,  940,  941,  942,  943,  944,  945,
+      947,  948,  949,  950,  951,  952,  953,  954,  955,  956,
+
+      957,  929,  930,  958,  959,  960,  961,  963,  964,  965,
+      966,  967,  963,  968,  969,  970,  971,  972,  973,  974,
+      975,  976,  977,  978,  979,  980,  981,  982,  983,  984,
+      985,  987,  988,  989,  990,  991,  992,  993,  994,  995,
+      996,  997,  999, 1000, 1002, 1003, 1004, 1005, 1006, 1007,
+     1008, 1009,  964, 1010, 1011, 1012, 1013, 1014, 1015, 1017,
+     1018, 1019, 1020, 1021, 1022, 1023, 1025, 1026, 1027, 1028,
+     1029, 1030, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040,
+     1041, 1042, 1043, 1018, 1044, 1045, 1046, 1047, 1050, 1019,
+     1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1061, 1062,
+
+     1063, 1064, 1066, 1067, 1068, 1069, 1070, 1073, 1074, 1075,
+     1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085,
+     1086, 1087, 1089, 1090, 1091, 1094, 1095, 1096, 1097, 1098,
+     1099, 1100, 1101, 1102, 1103, 1105, 1106, 1107, 1108, 1109,
+     1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119,
+     1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129, 1130,
+     1131, 1102, 1132, 1133, 1134, 1135, 1136, 1137, 1138, 1082,
+     1140, 1143, 1144, 1145, 1136, 1146, 1147, 1148, 1149, 1150,
+     1151, 1153, 1108, 1154, 1155, 1156, 1157, 1158, 1159, 1161,
+     1163, 1166, 1168, 1170, 1171, 1172, 1173, 1174, 1176, 1177,
+
+     1172, 1178, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187,
+     1188, 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198,
+     1174, 1199, 1200, 1203, 1205, 1206, 1207, 1208, 1209, 1211,
+     1212, 1213, 1214, 1215, 1216, 1218, 1219, 1221, 1222, 1223,
+     1224, 1226, 1227, 1228, 1229, 1230, 1231, 1233, 1235, 1237,
+     1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1247, 1248,
+     1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258,
+     1258, 1259, 1260, 1261, 1262, 1263, 1237, 1264, 1265, 1266,
+     1267, 1268, 1269, 1270, 1271, 1272, 1273, 1274, 1275, 1276,
+     1277, 1278, 1279, 1281, 1282, 1284, 1285, 1286, 1287, 1289,
+
+     1292, 1293, 1296, 1297, 1298, 1301, 1302, 1303, 1304, 1305,
+     1306, 1307, 1308, 1310, 1311, 1313, 1315, 1316, 1317, 1318,
+     1319, 1321, 1322, 1323, 1324, 1325, 1287, 1326, 1327, 1259,
+     1328, 1329, 1330, 1331, 1332, 1333, 1335, 1336, 1337, 1338,
+     1340, 1341, 1342, 1343, 1344, 1345, 1346, 1348, 1349, 1350,
+     1352, 1354, 1355, 1356, 1357, 1358, 1359, 1360, 1361, 1362,
+     1363, 1364, 1366, 1367, 1371, 1374, 1376, 1377, 1379, 1380,
+     1382, 1383, 1384, 1385, 1386, 1387, 1389, 1391, 1392, 1393,
+     1394, 1395, 1396, 1397, 1398, 1400, 1401, 1402, 1403, 1404,
+     1405, 1406, 1407, 1408, 1411, 1412, 1413, 1414, 1415, 1417,
+
+     1418, 1419, 1420, 1421, 1422, 1423, 1425, 1426, 1427, 1428,
+     1429, 1431, 1433, 1435, 1436, 1437, 1438, 1439, 1441, 1442,
+     1443, 1445, 1446, 1448, 1449, 1452, 1453, 1454, 1455, 1456,
+     1457, 1458, 1459, 1460, 1461, 1462, 1463, 1464, 1465, 1466,
+     1467, 1468, 1469, 1470, 1471, 1472, 1473, 1474, 1475, 1476,
+     1478, 1480, 1481, 1482, 1483, 1484, 1485, 1489, 1490, 1491,
+     1492, 1494, 1495, 1497, 1498, 1499, 1500, 1501, 1503, 1504,
+     1507, 1507, 1507, 1507, 1507, 1508, 1508, 1508, 1508, 1508,
+     1509, 1515, 1509, 1509, 1509, 1510, 1516, 1510, 1517, 1510,
+     1511, 1511, 1511, 1511, 1511, 1512, 1512, 1512, 1512, 1512,
+
+     1513, 1518, 1513, 1513, 1513, 1514, 1514, 1514,  714,  713,
+      712,  711,  710,  709,  708,  707,  706,  705,  704,  703,
+      702,  701,  700,  699,  698,  697,  696,  694,  693,  692,
+      691,  690,  689,  688,  687,  685,  683,  682,  681,  680,
+      679,  678,  677,  676,  675,  674,  673,  672,  671,  670,
+      669,  668,  666,  665,  664,  663,  662,  661,  660,  659,
+      658,  657,  656,  655,  654,  653,  652,  651,  650,  649,
+      647,  645,  644,  643,  642,  641,  638,  637,  636,  634,
+      633,  631,  630,  629,  628,  627,  626,  625,  624,  621,
+      620,  619,  618,  617,  616,  615,  614,  613,  612,  611,
+
+      610,  608,  607,  606,  605,  604,  603,  602,  601,  599,
+      598,  597,  596,  594,  593,  592,  591,  590,  589,  588,
+      586,  585,  584,  583,  582,  581,  580,  579,  578,  576,
+      575,  574,  573,  572,  571,  570,  569,  568,  567,  566,
+      565,  563,  562,  561,  560,  559,  558,  557,  556,  555,
+      554,  553,  552,  551,  550,  549,  548,  547,  546,  545,
+      544,  543,  542,  541,  535,  533,  530,  529,  528,  527,
+      525,  524,  523,  521,  520,  517,  516,  515,  514,  513,
+      512,  511,  510,  509,  508,  507,  506,  505,  504,  503,
+      502,  501,  500,  499,  498,  497,  496,  495,  494,  493,
+
+      492,  491,  489,  487,  486,  485,  484,  483,  482,  481,
+      480,  479,  478,  477,  476,  474,  473,  472,  471,  470,
+      469,  468,  467,  466,  465,  464,  463,  462,  461,  460,
+      459,  458,  457,  455,  454,  453,  452,  450,  449,  448,
+      447,  446,  444,  443,  441,  440,  438,  437,  436,  435,
+      434,  433,  431,  430,  429,  428,  427,  426,  421,  420,
+      418,  417,  416,  415,  414,  412,  411,  409,  406,  404,
+      403,  401,  400,  398,  397,  396,  395,  394,  393,  392,
+      391,  390,  389,  388,  387,  385,  384,  383,  381,  380,
+      379,  378,  376,  375,  374,  372,  371,  370,  369,  368,
+
+      367,  366,  365,  364,  362,  360,  359,  358,  357,  356,
+      354,  353,  352,  351,  350,  349,  348,  347,  346,  344,
+      343,  342,  341,  340,  339,  338,  337,  336,  335,  334,
+      333,  331,  330,  329,  328,  325,  324,  323,  322,  321,
+      320,  319,  318,  317,  316,  312,  310,  307,  306,  303,
+      299,  292,  290,  289,  288,  287,  285,  284,  283,  282,
+      281,  280,  279,  278,  277,  276,  275,  274,  273,  272,
+      271,  270,  268,  267,  266,  265,  264,  263,  262,  261,
+      260,  259,  258,  257,  255,  254,  253,  252,  251,  250,
+      249,  248,  246,  245,  244,  243,  242,  241,  240,  239,
+
+      237,  236,  235,  234,  233,  232,  231,  230,  229,  228,
+      227,  226,  225,  224,  223,  222,  221,  220,  219,  218,
+      216,  215,  214,  213,  212,  211,  210,  209,  207,  204,
+      202,  200,  198,  195,  194,  192,  189,  181,  180,  179,
+      177,  176,  174,  173,  172,  171,  170,  169,  165,  164,
+      162,  160,  159,  158,  157,  156,  154,  153,  152,  151,
+      149,  148,  147,  146,  145,  144,  143,  142,  141,  139,
+      138,  136,  134,  133,  132,  131,  129,  128,  127,  125,
+      124,  123,  122,  121,  120,  116,  110,  107,  106,  104,
+       99,   98,   79,   74,   68,   60,   53,   50,   49,   47,
+
+       43,   41,   39,   38,   24,   14,   11, 1506, 1506, 1506,
+     1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+     1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+     1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+     1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+     1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+     1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+     1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+     1506
     } ;
 
 static yy_state_type yy_last_accepting_state;
@@ -1675,7 +1706,7 @@ static char *yy_last_accepting_cpos;
 extern int yy_flex_debug;
 int yy_flex_debug = 1;
 
-static const flex_int16_t yy_rule_linenum[175] =
+static const flex_int16_t yy_rule_linenum[178] =
     {   0,
       147,  149,  151,  156,  157,  162,  163,  164,  176,  179,
       184,  191,  200,  209,  218,  227,  236,  245,  255,  264,
@@ -1684,18 +1715,18 @@ static const flex_int16_t yy_rule_linenum[175] =
       466,  477,  488,  499,  510,  521,  532,  543,  554,  565,
       576,  587,  596,  605,  615,  624,  634,  648,  664,  673,
       682,  691,  700,  721,  742,  751,  761,  770,  781,  790,
-      799,  808,  817,  826,  836,  845,  854,  863,  872,  881,
-      890,  899,  908,  917,  926,  936,  947,  959,  968,  977,
-      987,  997, 1007, 1017, 1027, 1037, 1046, 1056, 1065, 1074,
-
-     1083, 1092, 1102, 1112, 1121, 1131, 1140, 1149, 1158, 1167,
-     1176, 1185, 1194, 1203, 1212, 1221, 1230, 1239, 1248, 1257,
-     1266, 1275, 1284, 1293, 1302, 1311, 1320, 1329, 1338, 1347,
-     1356, 1365, 1374, 1383, 1392, 1401, 1411, 1421, 1431, 1441,
-     1451, 1461, 1471, 1481, 1491, 1500, 1509, 1518, 1527, 1536,
-     1545, 1554, 1565, 1576, 1589, 1602, 1617, 1716, 1721, 1726,
-     1731, 1732, 1733, 1734, 1735, 1736, 1738, 1756, 1769, 1774,
-     1778, 1780, 1782, 1784
+      799,  808,  817,  826,  836,  845,  856,  867,  879,  888,
+      897,  906,  915,  924,  933,  942,  951,  960,  970,  981,
+      993, 1002, 1011, 1021, 1031, 1041, 1051, 1061, 1071, 1080,
+
+     1090, 1099, 1108, 1117, 1126, 1136, 1146, 1155, 1165, 1174,
+     1183, 1192, 1201, 1210, 1219, 1228, 1237, 1246, 1255, 1264,
+     1273, 1282, 1291, 1300, 1309, 1318, 1327, 1336, 1345, 1354,
+     1363, 1372, 1381, 1390, 1399, 1408, 1417, 1426, 1435, 1445,
+     1455, 1465, 1475, 1485, 1495, 1505, 1515, 1525, 1534, 1543,
+     1552, 1561, 1570, 1579, 1588, 1599, 1610, 1623, 1636, 1651,
+     1750, 1755, 1760, 1765, 1766, 1767, 1768, 1769, 1770, 1772,
+     1790, 1803, 1808, 1812, 1814, 1816, 1818
     } ;
 
 /* The intent behind this definition is that it'll catch
@@ -1748,7 +1779,7 @@ using namespace isc::dhcp;
 
 /* To avoid the call to exit... oops! */
 #define YY_FATAL_ERROR(msg) isc::dhcp::Parser4Context::fatal(msg)
-#line 1751 "dhcp4_lexer.cc"
+#line 1783 "dhcp4_lexer.cc"
 /* noyywrap disables automatic rewinding for the next file to parse. Since we
    always parse only a single string, there's no need to do any wraps. And
    using yywrap requires linking with -lfl, which provides the default yywrap
@@ -1774,8 +1805,8 @@ using namespace isc::dhcp;
    by moving it ahead by yyleng bytes. yyleng specifies the length of the
    currently matched token. */
 #define YY_USER_ACTION  driver.loc_.columns(yyleng);
-#line 1777 "dhcp4_lexer.cc"
-#line 1778 "dhcp4_lexer.cc"
+#line 1809 "dhcp4_lexer.cc"
+#line 1810 "dhcp4_lexer.cc"
 
 #define INITIAL 0
 #define COMMENT 1
@@ -2105,7 +2136,7 @@ YY_DECL
     }
 
 
-#line 2108 "dhcp4_lexer.cc"
+#line 2140 "dhcp4_lexer.cc"
 
        while ( /*CONSTCOND*/1 )                /* loops until end-of-file is reached */
                {
@@ -2134,13 +2165,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 >= 1468 )
+                               if ( yy_current_state >= 1507 )
                                        yy_c = yy_meta[yy_c];
                                }
                        yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
                        ++yy_cp;
                        }
-               while ( yy_current_state != 1467 );
+               while ( yy_current_state != 1506 );
                yy_cp = (yy_last_accepting_cpos);
                yy_current_state = (yy_last_accepting_state);
 
@@ -2159,13 +2190,13 @@ do_action:      /* This label is used only to access EOF actions. */
                        {
                        if ( yy_act == 0 )
                                fprintf( stderr, "--scanner backing up\n" );
-                       else if ( yy_act < 175 )
+                       else if ( yy_act < 178 )
                                fprintf( stderr, "--accepting rule at line %ld (\"%s\")\n",
                                         (long)yy_rule_linenum[yy_act], yytext );
-                       else if ( yy_act == 175 )
+                       else if ( yy_act == 178 )
                                fprintf( stderr, "--accepting default rule (\"%s\")\n",
                                         yytext );
-                       else if ( yy_act == 176 )
+                       else if ( yy_act == 179 )
                                fprintf( stderr, "--(end of buffer or a NUL)\n" );
                        else
                                fprintf( stderr, "--EOF (start condition %d)\n", YY_START );
@@ -3118,6 +3149,48 @@ YY_RULE_SETUP
 case 76:
 YY_RULE_SETUP
 #line 845 "dhcp4_lexer.ll"
+{
+    switch(driver.ctx_) {
+    case isc::dhcp::Parser4Context::DHCP4:
+    case isc::dhcp::Parser4Context::SUBNET4:
+    case isc::dhcp::Parser4Context::SHARED_NETWORK:
+        return isc::dhcp::Dhcp4Parser::make_CALCULATE_TEE_TIMES(driver.loc_);
+    default:
+        return isc::dhcp::Dhcp4Parser::make_STRING("calculate-tee-times", driver.loc_);
+    }
+}
+       YY_BREAK
+case 77:
+YY_RULE_SETUP
+#line 856 "dhcp4_lexer.ll"
+{
+    switch(driver.ctx_) {
+    case isc::dhcp::Parser4Context::DHCP4:
+    case isc::dhcp::Parser4Context::SUBNET4:
+    case isc::dhcp::Parser4Context::SHARED_NETWORK:
+        return isc::dhcp::Dhcp4Parser::make_T1_PERCENT(driver.loc_);
+    default:
+        return isc::dhcp::Dhcp4Parser::make_STRING("t1-percent", driver.loc_);
+    }
+}
+       YY_BREAK
+case 78:
+YY_RULE_SETUP
+#line 867 "dhcp4_lexer.ll"
+{
+    switch(driver.ctx_) {
+    case isc::dhcp::Parser4Context::DHCP4:
+    case isc::dhcp::Parser4Context::SUBNET4:
+    case isc::dhcp::Parser4Context::SHARED_NETWORK:
+        return isc::dhcp::Dhcp4Parser::make_T2_PERCENT(driver.loc_);
+    default:
+        return isc::dhcp::Dhcp4Parser::make_STRING("t2-percent", driver.loc_);
+    }
+}
+       YY_BREAK
+case 79:
+YY_RULE_SETUP
+#line 879 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CONFIG:
@@ -3127,9 +3200,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 77:
+case 80:
 YY_RULE_SETUP
-#line 854 "dhcp4_lexer.ll"
+#line 888 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::LOGGING:
@@ -3139,9 +3212,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 78:
+case 81:
 YY_RULE_SETUP
-#line 863 "dhcp4_lexer.ll"
+#line 897 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::LOGGERS:
@@ -3151,9 +3224,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 79:
+case 82:
 YY_RULE_SETUP
-#line 872 "dhcp4_lexer.ll"
+#line 906 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::OUTPUT_OPTIONS:
@@ -3163,9 +3236,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 80:
+case 83:
 YY_RULE_SETUP
-#line 881 "dhcp4_lexer.ll"
+#line 915 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::LOGGERS:
@@ -3175,9 +3248,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 81:
+case 84:
 YY_RULE_SETUP
-#line 890 "dhcp4_lexer.ll"
+#line 924 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::OUTPUT_OPTIONS:
@@ -3187,9 +3260,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 82:
+case 85:
 YY_RULE_SETUP
-#line 899 "dhcp4_lexer.ll"
+#line 933 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::OUTPUT_OPTIONS:
@@ -3199,9 +3272,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 83:
+case 86:
 YY_RULE_SETUP
-#line 908 "dhcp4_lexer.ll"
+#line 942 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::OUTPUT_OPTIONS:
@@ -3211,9 +3284,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 84:
+case 87:
 YY_RULE_SETUP
-#line 917 "dhcp4_lexer.ll"
+#line 951 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::LOGGERS:
@@ -3223,9 +3296,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 85:
+case 88:
 YY_RULE_SETUP
-#line 926 "dhcp4_lexer.ll"
+#line 960 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -3236,9 +3309,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 86:
+case 89:
 YY_RULE_SETUP
-#line 936 "dhcp4_lexer.ll"
+#line 970 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::SUBNET4:
@@ -3250,9 +3323,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 87:
+case 90:
 YY_RULE_SETUP
-#line 947 "dhcp4_lexer.ll"
+#line 981 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::SUBNET4:
@@ -3265,9 +3338,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 88:
+case 91:
 YY_RULE_SETUP
-#line 959 "dhcp4_lexer.ll"
+#line 993 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CLIENT_CLASSES:
@@ -3277,9 +3350,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 89:
+case 92:
 YY_RULE_SETUP
-#line 968 "dhcp4_lexer.ll"
+#line 1002 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CLIENT_CLASSES:
@@ -3289,9 +3362,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 90:
+case 93:
 YY_RULE_SETUP
-#line 977 "dhcp4_lexer.ll"
+#line 1011 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -3302,9 +3375,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 91:
+case 94:
 YY_RULE_SETUP
-#line 987 "dhcp4_lexer.ll"
+#line 1021 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS:
@@ -3315,9 +3388,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 92:
+case 95:
 YY_RULE_SETUP
-#line 997 "dhcp4_lexer.ll"
+#line 1031 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS:
@@ -3328,9 +3401,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 93:
+case 96:
 YY_RULE_SETUP
-#line 1007 "dhcp4_lexer.ll"
+#line 1041 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS:
@@ -3341,9 +3414,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 94:
+case 97:
 YY_RULE_SETUP
-#line 1017 "dhcp4_lexer.ll"
+#line 1051 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS:
@@ -3354,9 +3427,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 95:
+case 98:
 YY_RULE_SETUP
-#line 1027 "dhcp4_lexer.ll"
+#line 1061 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS:
@@ -3367,9 +3440,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 96:
+case 99:
 YY_RULE_SETUP
-#line 1037 "dhcp4_lexer.ll"
+#line 1071 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::RESERVATIONS:
@@ -3379,9 +3452,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 97:
+case 100:
 YY_RULE_SETUP
-#line 1046 "dhcp4_lexer.ll"
+#line 1080 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::OPTION_DEF:
@@ -3392,9 +3465,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 98:
+case 101:
 YY_RULE_SETUP
-#line 1056 "dhcp4_lexer.ll"
+#line 1090 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::OPTION_DATA:
@@ -3404,9 +3477,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 99:
+case 102:
 YY_RULE_SETUP
-#line 1065 "dhcp4_lexer.ll"
+#line 1099 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::OPTION_DEF:
@@ -3416,9 +3489,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 100:
+case 103:
 YY_RULE_SETUP
-#line 1074 "dhcp4_lexer.ll"
+#line 1108 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::OPTION_DEF:
@@ -3428,9 +3501,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 101:
+case 104:
 YY_RULE_SETUP
-#line 1083 "dhcp4_lexer.ll"
+#line 1117 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::OPTION_DEF:
@@ -3440,9 +3513,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 102:
+case 105:
 YY_RULE_SETUP
-#line 1092 "dhcp4_lexer.ll"
+#line 1126 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::SUBNET4:
@@ -3453,9 +3526,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 103:
+case 106:
 YY_RULE_SETUP
-#line 1102 "dhcp4_lexer.ll"
+#line 1136 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::RELAY:
@@ -3466,9 +3539,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 104:
+case 107:
 YY_RULE_SETUP
-#line 1112 "dhcp4_lexer.ll"
+#line 1146 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::RELAY:
@@ -3478,9 +3551,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 105:
+case 108:
 YY_RULE_SETUP
-#line 1121 "dhcp4_lexer.ll"
+#line 1155 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -3490,9 +3563,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 106:
+case 109:
 YY_RULE_SETUP
-#line 1131 "dhcp4_lexer.ll"
+#line 1165 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::HOOKS_LIBRARIES:
@@ -3502,9 +3575,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 107:
+case 110:
 YY_RULE_SETUP
-#line 1140 "dhcp4_lexer.ll"
+#line 1174 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::HOOKS_LIBRARIES:
@@ -3514,9 +3587,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 108:
+case 111:
 YY_RULE_SETUP
-#line 1149 "dhcp4_lexer.ll"
+#line 1183 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -3526,9 +3599,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 109:
+case 112:
 YY_RULE_SETUP
-#line 1158 "dhcp4_lexer.ll"
+#line 1192 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING:
@@ -3538,9 +3611,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 110:
+case 113:
 YY_RULE_SETUP
-#line 1167 "dhcp4_lexer.ll"
+#line 1201 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING:
@@ -3550,9 +3623,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 111:
+case 114:
 YY_RULE_SETUP
-#line 1176 "dhcp4_lexer.ll"
+#line 1210 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING:
@@ -3562,9 +3635,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 112:
+case 115:
 YY_RULE_SETUP
-#line 1185 "dhcp4_lexer.ll"
+#line 1219 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING:
@@ -3574,9 +3647,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 113:
+case 116:
 YY_RULE_SETUP
-#line 1194 "dhcp4_lexer.ll"
+#line 1228 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING:
@@ -3586,9 +3659,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 114:
+case 117:
 YY_RULE_SETUP
-#line 1203 "dhcp4_lexer.ll"
+#line 1237 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING:
@@ -3598,9 +3671,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 115:
+case 118:
 YY_RULE_SETUP
-#line 1212 "dhcp4_lexer.ll"
+#line 1246 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -3610,9 +3683,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 116:
+case 119:
 YY_RULE_SETUP
-#line 1221 "dhcp4_lexer.ll"
+#line 1255 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -3622,9 +3695,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 117:
+case 120:
 YY_RULE_SETUP
-#line 1230 "dhcp4_lexer.ll"
+#line 1264 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CONTROL_SOCKET:
@@ -3634,9 +3707,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 118:
+case 121:
 YY_RULE_SETUP
-#line 1239 "dhcp4_lexer.ll"
+#line 1273 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CONTROL_SOCKET:
@@ -3646,9 +3719,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 119:
+case 122:
 YY_RULE_SETUP
-#line 1248 "dhcp4_lexer.ll"
+#line 1282 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -3658,9 +3731,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 120:
+case 123:
 YY_RULE_SETUP
-#line 1257 "dhcp4_lexer.ll"
+#line 1291 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -3670,9 +3743,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 121:
+case 124:
 YY_RULE_SETUP
-#line 1266 "dhcp4_lexer.ll"
+#line 1300 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_DDNS:
@@ -3682,9 +3755,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 122:
+case 125:
 YY_RULE_SETUP
-#line 1275 "dhcp4_lexer.ll"
+#line 1309 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_DDNS:
@@ -3694,9 +3767,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 123:
+case 126:
 YY_RULE_SETUP
-#line 1284 "dhcp4_lexer.ll"
+#line 1318 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_DDNS:
@@ -3706,9 +3779,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 124:
+case 127:
 YY_RULE_SETUP
-#line 1293 "dhcp4_lexer.ll"
+#line 1327 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_DDNS:
@@ -3718,9 +3791,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 125:
+case 128:
 YY_RULE_SETUP
-#line 1302 "dhcp4_lexer.ll"
+#line 1336 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_DDNS:
@@ -3730,9 +3803,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 126:
+case 129:
 YY_RULE_SETUP
-#line 1311 "dhcp4_lexer.ll"
+#line 1345 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_DDNS:
@@ -3742,9 +3815,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 127:
+case 130:
 YY_RULE_SETUP
-#line 1320 "dhcp4_lexer.ll"
+#line 1354 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_DDNS:
@@ -3754,9 +3827,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 128:
+case 131:
 YY_RULE_SETUP
-#line 1329 "dhcp4_lexer.ll"
+#line 1363 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_DDNS:
@@ -3766,9 +3839,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 129:
+case 132:
 YY_RULE_SETUP
-#line 1338 "dhcp4_lexer.ll"
+#line 1372 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_DDNS:
@@ -3778,9 +3851,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 130:
+case 133:
 YY_RULE_SETUP
-#line 1347 "dhcp4_lexer.ll"
+#line 1381 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_DDNS:
@@ -3790,9 +3863,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 131:
+case 134:
 YY_RULE_SETUP
-#line 1356 "dhcp4_lexer.ll"
+#line 1390 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_DDNS:
@@ -3802,9 +3875,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 132:
+case 135:
 YY_RULE_SETUP
-#line 1365 "dhcp4_lexer.ll"
+#line 1399 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_DDNS:
@@ -3814,9 +3887,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 133:
+case 136:
 YY_RULE_SETUP
-#line 1374 "dhcp4_lexer.ll"
+#line 1408 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_DDNS:
@@ -3826,9 +3899,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 134:
+case 137:
 YY_RULE_SETUP
-#line 1383 "dhcp4_lexer.ll"
+#line 1417 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_DDNS:
@@ -3838,9 +3911,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 135:
+case 138:
 YY_RULE_SETUP
-#line 1392 "dhcp4_lexer.ll"
+#line 1426 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_DDNS:
@@ -3850,9 +3923,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 136:
+case 139:
 YY_RULE_SETUP
-#line 1401 "dhcp4_lexer.ll"
+#line 1435 "dhcp4_lexer.ll"
 {
     /* dhcp-ddns value keywords are case insensitive */
     if (driver.ctx_ == isc::dhcp::Parser4Context::NCR_PROTOCOL) {
@@ -3863,9 +3936,9 @@ YY_RULE_SETUP
     return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_);
 }
        YY_BREAK
-case 137:
+case 140:
 YY_RULE_SETUP
-#line 1411 "dhcp4_lexer.ll"
+#line 1445 "dhcp4_lexer.ll"
 {
     /* dhcp-ddns value keywords are case insensitive */
     if (driver.ctx_ == isc::dhcp::Parser4Context::NCR_PROTOCOL) {
@@ -3876,9 +3949,9 @@ YY_RULE_SETUP
     return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_);
 }
        YY_BREAK
-case 138:
+case 141:
 YY_RULE_SETUP
-#line 1421 "dhcp4_lexer.ll"
+#line 1455 "dhcp4_lexer.ll"
 {
     /* dhcp-ddns value keywords are case insensitive */
     if (driver.ctx_ == isc::dhcp::Parser4Context::NCR_FORMAT) {
@@ -3889,9 +3962,9 @@ YY_RULE_SETUP
     return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_);
 }
        YY_BREAK
-case 139:
+case 142:
 YY_RULE_SETUP
-#line 1431 "dhcp4_lexer.ll"
+#line 1465 "dhcp4_lexer.ll"
 {
     /* dhcp-ddns value keywords are case insensitive */
     if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) {
@@ -3902,9 +3975,9 @@ YY_RULE_SETUP
     return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_);
 }
        YY_BREAK
-case 140:
+case 143:
 YY_RULE_SETUP
-#line 1441 "dhcp4_lexer.ll"
+#line 1475 "dhcp4_lexer.ll"
 {
     /* dhcp-ddns value keywords are case insensitive */
     if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) {
@@ -3915,9 +3988,9 @@ YY_RULE_SETUP
     return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_);
 }
        YY_BREAK
-case 141:
+case 144:
 YY_RULE_SETUP
-#line 1451 "dhcp4_lexer.ll"
+#line 1485 "dhcp4_lexer.ll"
 {
     /* dhcp-ddns value keywords are case insensitive */
     if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) {
@@ -3928,9 +4001,9 @@ YY_RULE_SETUP
     return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_);
 }
        YY_BREAK
-case 142:
+case 145:
 YY_RULE_SETUP
-#line 1461 "dhcp4_lexer.ll"
+#line 1495 "dhcp4_lexer.ll"
 {
     /* dhcp-ddns value keywords are case insensitive */
     if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) {
@@ -3941,9 +4014,9 @@ YY_RULE_SETUP
     return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_);
 }
        YY_BREAK
-case 143:
+case 146:
 YY_RULE_SETUP
-#line 1471 "dhcp4_lexer.ll"
+#line 1505 "dhcp4_lexer.ll"
 {
     /* dhcp-ddns value keywords are case insensitive */
     if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) {
@@ -3954,9 +4027,9 @@ YY_RULE_SETUP
     return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_);
 }
        YY_BREAK
-case 144:
+case 147:
 YY_RULE_SETUP
-#line 1481 "dhcp4_lexer.ll"
+#line 1515 "dhcp4_lexer.ll"
 {
     /* dhcp-ddns value keywords are case insensitive */
     if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) {
@@ -3967,9 +4040,9 @@ YY_RULE_SETUP
     return isc::dhcp::Dhcp4Parser::make_STRING(tmp, driver.loc_);
 }
        YY_BREAK
-case 145:
+case 148:
 YY_RULE_SETUP
-#line 1491 "dhcp4_lexer.ll"
+#line 1525 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CONFIG:
@@ -3979,9 +4052,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 146:
+case 149:
 YY_RULE_SETUP
-#line 1500 "dhcp4_lexer.ll"
+#line 1534 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CONFIG:
@@ -3991,9 +4064,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 147:
+case 150:
 YY_RULE_SETUP
-#line 1509 "dhcp4_lexer.ll"
+#line 1543 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CONFIG:
@@ -4003,9 +4076,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 148:
+case 151:
 YY_RULE_SETUP
-#line 1518 "dhcp4_lexer.ll"
+#line 1552 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::SUBNET4:
@@ -4015,9 +4088,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 149:
+case 152:
 YY_RULE_SETUP
-#line 1527 "dhcp4_lexer.ll"
+#line 1561 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::SUBNET4:
@@ -4027,9 +4100,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 150:
+case 153:
 YY_RULE_SETUP
-#line 1536 "dhcp4_lexer.ll"
+#line 1570 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::SUBNET4:
@@ -4039,9 +4112,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 151:
+case 154:
 YY_RULE_SETUP
-#line 1545 "dhcp4_lexer.ll"
+#line 1579 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4051,9 +4124,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 152:
+case 155:
 YY_RULE_SETUP
-#line 1554 "dhcp4_lexer.ll"
+#line 1588 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4065,9 +4138,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 153:
+case 156:
 YY_RULE_SETUP
-#line 1565 "dhcp4_lexer.ll"
+#line 1599 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4079,9 +4152,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 154:
+case 157:
 YY_RULE_SETUP
-#line 1576 "dhcp4_lexer.ll"
+#line 1610 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4095,9 +4168,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 155:
+case 158:
 YY_RULE_SETUP
-#line 1589 "dhcp4_lexer.ll"
+#line 1623 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4111,9 +4184,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 156:
+case 159:
 YY_RULE_SETUP
-#line 1602 "dhcp4_lexer.ll"
+#line 1636 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4127,9 +4200,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 157:
+case 160:
 YY_RULE_SETUP
-#line 1617 "dhcp4_lexer.ll"
+#line 1651 "dhcp4_lexer.ll"
 {
     /* A string has been matched. It contains the actual string and single quotes.
        We need to get those quotes out of the way and just use its content, e.g.
@@ -4229,65 +4302,65 @@ YY_RULE_SETUP
     return isc::dhcp::Dhcp4Parser::make_STRING(decoded, driver.loc_);
 }
        YY_BREAK
-case 158:
-/* rule 158 can match eol */
+case 161:
+/* rule 161 can match eol */
 YY_RULE_SETUP
-#line 1716 "dhcp4_lexer.ll"
+#line 1750 "dhcp4_lexer.ll"
 {
     /* Bad string with a forbidden control character inside */
     driver.error(driver.loc_, "Invalid control in " + std::string(yytext));
 }
        YY_BREAK
-case 159:
-/* rule 159 can match eol */
+case 162:
+/* rule 162 can match eol */
 YY_RULE_SETUP
-#line 1721 "dhcp4_lexer.ll"
+#line 1755 "dhcp4_lexer.ll"
 {
     /* Bad string with a bad escape inside */
     driver.error(driver.loc_, "Bad escape in " + std::string(yytext));
 }
        YY_BREAK
-case 160:
+case 163:
 YY_RULE_SETUP
-#line 1726 "dhcp4_lexer.ll"
+#line 1760 "dhcp4_lexer.ll"
 {
     /* Bad string with an open escape at the end */
     driver.error(driver.loc_, "Overflow escape in " + std::string(yytext));
 }
        YY_BREAK
-case 161:
+case 164:
 YY_RULE_SETUP
-#line 1731 "dhcp4_lexer.ll"
+#line 1765 "dhcp4_lexer.ll"
 { return isc::dhcp::Dhcp4Parser::make_LSQUARE_BRACKET(driver.loc_); }
        YY_BREAK
-case 162:
+case 165:
 YY_RULE_SETUP
-#line 1732 "dhcp4_lexer.ll"
+#line 1766 "dhcp4_lexer.ll"
 { return isc::dhcp::Dhcp4Parser::make_RSQUARE_BRACKET(driver.loc_); }
        YY_BREAK
-case 163:
+case 166:
 YY_RULE_SETUP
-#line 1733 "dhcp4_lexer.ll"
+#line 1767 "dhcp4_lexer.ll"
 { return isc::dhcp::Dhcp4Parser::make_LCURLY_BRACKET(driver.loc_); }
        YY_BREAK
-case 164:
+case 167:
 YY_RULE_SETUP
-#line 1734 "dhcp4_lexer.ll"
+#line 1768 "dhcp4_lexer.ll"
 { return isc::dhcp::Dhcp4Parser::make_RCURLY_BRACKET(driver.loc_); }
        YY_BREAK
-case 165:
+case 168:
 YY_RULE_SETUP
-#line 1735 "dhcp4_lexer.ll"
+#line 1769 "dhcp4_lexer.ll"
 { return isc::dhcp::Dhcp4Parser::make_COMMA(driver.loc_); }
        YY_BREAK
-case 166:
+case 169:
 YY_RULE_SETUP
-#line 1736 "dhcp4_lexer.ll"
+#line 1770 "dhcp4_lexer.ll"
 { return isc::dhcp::Dhcp4Parser::make_COLON(driver.loc_); }
        YY_BREAK
-case 167:
+case 170:
 YY_RULE_SETUP
-#line 1738 "dhcp4_lexer.ll"
+#line 1772 "dhcp4_lexer.ll"
 {
     /* An integer was found. */
     std::string tmp(yytext);
@@ -4306,9 +4379,9 @@ YY_RULE_SETUP
     return isc::dhcp::Dhcp4Parser::make_INTEGER(integer, driver.loc_);
 }
        YY_BREAK
-case 168:
+case 171:
 YY_RULE_SETUP
-#line 1756 "dhcp4_lexer.ll"
+#line 1790 "dhcp4_lexer.ll"
 {
     /* A floating point was found. */
     std::string tmp(yytext);
@@ -4322,43 +4395,43 @@ YY_RULE_SETUP
     return isc::dhcp::Dhcp4Parser::make_FLOAT(fp, driver.loc_);
 }
        YY_BREAK
-case 169:
+case 172:
 YY_RULE_SETUP
-#line 1769 "dhcp4_lexer.ll"
+#line 1803 "dhcp4_lexer.ll"
 {
     string tmp(yytext);
     return isc::dhcp::Dhcp4Parser::make_BOOLEAN(tmp == "true", driver.loc_);
 }
        YY_BREAK
-case 170:
+case 173:
 YY_RULE_SETUP
-#line 1774 "dhcp4_lexer.ll"
+#line 1808 "dhcp4_lexer.ll"
 {
    return isc::dhcp::Dhcp4Parser::make_NULL_TYPE(driver.loc_);
 }
        YY_BREAK
-case 171:
+case 174:
 YY_RULE_SETUP
-#line 1778 "dhcp4_lexer.ll"
+#line 1812 "dhcp4_lexer.ll"
 driver.error (driver.loc_, "JSON true reserved keyword is lower case only");
        YY_BREAK
-case 172:
+case 175:
 YY_RULE_SETUP
-#line 1780 "dhcp4_lexer.ll"
+#line 1814 "dhcp4_lexer.ll"
 driver.error (driver.loc_, "JSON false reserved keyword is lower case only");
        YY_BREAK
-case 173:
+case 176:
 YY_RULE_SETUP
-#line 1782 "dhcp4_lexer.ll"
+#line 1816 "dhcp4_lexer.ll"
 driver.error (driver.loc_, "JSON null reserved keyword is lower case only");
        YY_BREAK
-case 174:
+case 177:
 YY_RULE_SETUP
-#line 1784 "dhcp4_lexer.ll"
+#line 1818 "dhcp4_lexer.ll"
 driver.error (driver.loc_, "Invalid character: " + std::string(yytext));
        YY_BREAK
 case YY_STATE_EOF(INITIAL):
-#line 1786 "dhcp4_lexer.ll"
+#line 1820 "dhcp4_lexer.ll"
 {
     if (driver.states_.empty()) {
         return isc::dhcp::Dhcp4Parser::make_END(driver.loc_);
@@ -4382,12 +4455,12 @@ case YY_STATE_EOF(INITIAL):
     BEGIN(DIR_EXIT);
 }
        YY_BREAK
-case 175:
+case 178:
 YY_RULE_SETUP
-#line 1809 "dhcp4_lexer.ll"
+#line 1843 "dhcp4_lexer.ll"
 ECHO;
        YY_BREAK
-#line 4390 "dhcp4_lexer.cc"
+#line 4464 "dhcp4_lexer.cc"
 
        case YY_END_OF_BUFFER:
                {
@@ -4706,7 +4779,7 @@ static int yy_get_next_buffer (void)
                while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                        {
                        yy_current_state = (int) yy_def[yy_current_state];
-                       if ( yy_current_state >= 1468 )
+                       if ( yy_current_state >= 1507 )
                                yy_c = yy_meta[yy_c];
                        }
                yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
@@ -4739,11 +4812,11 @@ static int yy_get_next_buffer (void)
        while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                {
                yy_current_state = (int) yy_def[yy_current_state];
-               if ( yy_current_state >= 1468 )
+               if ( yy_current_state >= 1507 )
                        yy_c = yy_meta[yy_c];
                }
        yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
-       yy_is_jam = (yy_current_state == 1467);
+       yy_is_jam = (yy_current_state == 1506);
 
                return yy_is_jam ? 0 : yy_current_state;
 }
@@ -5492,7 +5565,7 @@ void yyfree (void * ptr )
 
 /* %ok-for-header */
 
-#line 1809 "dhcp4_lexer.ll"
+#line 1843 "dhcp4_lexer.ll"
 
 
 using namespace isc::dhcp;
index 46b3d41a051aa9655e23673bff1e4ca4e6996ead..f5d2293c79192de9961b73f47230f7dc10a64c6b 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2016-2018 Internet Systems Consortium, Inc. ("ISC")
+/* Copyright (C) 2016-2019 Internet Systems Consortium, Inc. ("ISC")
 
    This Source Code Form is subject to the terms of the Mozilla Public
    License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -841,6 +841,40 @@ ControlCharacterFill            [^"\\]|\\{JSONEscapeSequence}
     }
 }
 
+\"calculate-tee-times\" {
+    switch(driver.ctx_) {
+    case isc::dhcp::Parser4Context::DHCP4:
+    case isc::dhcp::Parser4Context::SUBNET4:
+    case isc::dhcp::Parser4Context::SHARED_NETWORK:
+        return isc::dhcp::Dhcp4Parser::make_CALCULATE_TEE_TIMES(driver.loc_);
+    default:
+        return isc::dhcp::Dhcp4Parser::make_STRING("calculate-tee-times", driver.loc_);
+    }
+}
+
+\"t1-percent\" {
+    switch(driver.ctx_) {
+    case isc::dhcp::Parser4Context::DHCP4:
+    case isc::dhcp::Parser4Context::SUBNET4:
+    case isc::dhcp::Parser4Context::SHARED_NETWORK:
+        return isc::dhcp::Dhcp4Parser::make_T1_PERCENT(driver.loc_);
+    default:
+        return isc::dhcp::Dhcp4Parser::make_STRING("t1-percent", driver.loc_);
+    }
+}
+
+\"t2-percent\" {
+    switch(driver.ctx_) {
+    case isc::dhcp::Parser4Context::DHCP4:
+    case isc::dhcp::Parser4Context::SUBNET4:
+    case isc::dhcp::Parser4Context::SHARED_NETWORK:
+        return isc::dhcp::Dhcp4Parser::make_T2_PERCENT(driver.loc_);
+    default:
+        return isc::dhcp::Dhcp4Parser::make_STRING("t2-percent", driver.loc_);
+    }
+}
+
+
 \"Logging\" {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CONFIG:
index 053941784ec18370845bd3ff2e17261206471e87..177138f22bd23431b8a57d4aa65998dfb21d5a94 100644 (file)
@@ -1,8 +1,8 @@
-// A Bison parser, made by GNU Bison 3.2.1.
+// A Bison parser, made by GNU Bison 3.0.4.
 
 // Skeleton implementation for Bison LALR(1) parsers in C++
 
-// Copyright (C) 2002-2015, 2018 Free Software Foundation, Inc.
+// Copyright (C) 2002-2015 Free Software Foundation, Inc.
 
 // This program is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
 // This special exception was added by the Free Software Foundation in
 // version 2.2 of Bison.
 
-// Undocumented macros, especially those whose name start with YY_,
-// are private implementation details.  Do not rely on them.
-
-
 // Take the name prefix into account.
 #define yylex   parser4_lex
 
+// First part of user declarations.
+
+#line 39 "dhcp4_parser.cc" // lalr1.cc:404
 
+# ifndef YY_NULLPTR
+#  if defined __cplusplus && 201103L <= __cplusplus
+#   define YY_NULLPTR nullptr
+#  else
+#   define YY_NULLPTR 0
+#  endif
+# endif
 
 #include "dhcp4_parser.h"
 
+// User implementation prologue.
 
+#line 53 "dhcp4_parser.cc" // lalr1.cc:412
 // Unqualified %code blocks.
-#line 34 "dhcp4_parser.yy" // lalr1.cc:438
+#line 34 "dhcp4_parser.yy" // lalr1.cc:413
 
 #include <dhcp4/parser_context.h>
 
-#line 51 "dhcp4_parser.cc" // lalr1.cc:438
+#line 59 "dhcp4_parser.cc" // lalr1.cc:413
 
 
 #ifndef YY_
 # endif
 #endif
 
-// Whether we are compiled with exception support.
-#ifndef YY_EXCEPTIONS
-# if defined __GNUC__ && !defined __EXCEPTIONS
-#  define YY_EXCEPTIONS 0
-# else
-#  define YY_EXCEPTIONS 1
-# endif
-#endif
-
 #define YYRHSLOC(Rhs, K) ((Rhs)[K].location)
 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
    If N is 0, then set CURRENT to the empty location which ends
     {                                           \
       *yycdebug_ << Title << ' ';               \
       yy_print_ (*yycdebug_, Symbol);           \
-      *yycdebug_ << '\n';                       \
+      *yycdebug_ << std::endl;                  \
     }                                           \
   } while (false)
 
 #else // !PARSER4_DEBUG
 
 # define YYCDEBUG if (false) std::cerr
-# define YY_SYMBOL_PRINT(Title, Symbol)  YYUSE (Symbol)
-# define YY_REDUCE_PRINT(Rule)           static_cast<void> (0)
-# define YY_STACK_PRINT()                static_cast<void> (0)
+# define YY_SYMBOL_PRINT(Title, Symbol)  YYUSE(Symbol)
+# define YY_REDUCE_PRINT(Rule)           static_cast<void>(0)
+# define YY_STACK_PRINT()                static_cast<void>(0)
 
 #endif // !PARSER4_DEBUG
 
 #define YYERROR         goto yyerrorlab
 #define YYRECOVERING()  (!!yyerrstatus_)
 
-#line 14 "dhcp4_parser.yy" // lalr1.cc:513
+#line 14 "dhcp4_parser.yy" // lalr1.cc:479
 namespace isc { namespace dhcp {
-#line 146 "dhcp4_parser.cc" // lalr1.cc:513
+#line 145 "dhcp4_parser.cc" // lalr1.cc:479
 
   /* Return YYSTR after stripping away unnecessary quotes and
      backslashes, so that it's suitable for yyerror.  The heuristic is
@@ -203,20 +202,24 @@ namespace isc { namespace dhcp {
 
 
   // by_state.
+  inline
   Dhcp4Parser::by_state::by_state ()
     : state (empty_state)
   {}
 
+  inline
   Dhcp4Parser::by_state::by_state (const by_state& other)
     : state (other.state)
   {}
 
+  inline
   void
   Dhcp4Parser::by_state::clear ()
   {
     state = empty_state;
   }
 
+  inline
   void
   Dhcp4Parser::by_state::move (by_state& that)
   {
@@ -224,10 +227,12 @@ namespace isc { namespace dhcp {
     that.clear ();
   }
 
+  inline
   Dhcp4Parser::by_state::by_state (state_type s)
     : state (s)
   {}
 
+  inline
   Dhcp4Parser::symbol_number_type
   Dhcp4Parser::by_state::type_get () const
   {
@@ -237,81 +242,42 @@ namespace isc { namespace dhcp {
       return yystos_[state];
   }
 
+  inline
   Dhcp4Parser::stack_symbol_type::stack_symbol_type ()
   {}
 
-  Dhcp4Parser::stack_symbol_type::stack_symbol_type (YY_RVREF (stack_symbol_type) that)
-    : super_type (YY_MOVE (that.state), YY_MOVE (that.location))
-  {
-    switch (that.type_get ())
-    {
-      case 185: // value
-      case 189: // map_value
-      case 230: // socket_type
-      case 233: // outbound_interface_value
-      case 255: // db_type
-      case 337: // hr_mode
-      case 486: // ncr_protocol_value
-      case 493: // replace_client_name_value
-        value.YY_MOVE_OR_COPY< ElementPtr > (YY_MOVE (that.value));
-        break;
-
-      case 168: // "boolean"
-        value.YY_MOVE_OR_COPY< bool > (YY_MOVE (that.value));
-        break;
-
-      case 167: // "floating point"
-        value.YY_MOVE_OR_COPY< double > (YY_MOVE (that.value));
-        break;
-
-      case 166: // "integer"
-        value.YY_MOVE_OR_COPY< int64_t > (YY_MOVE (that.value));
-        break;
-
-      case 165: // "constant string"
-        value.YY_MOVE_OR_COPY< std::string > (YY_MOVE (that.value));
-        break;
-
-      default:
-        break;
-    }
-
-#if 201103L <= YY_CPLUSPLUS
-    // that is emptied.
-    that.state = empty_state;
-#endif
-  }
 
-  Dhcp4Parser::stack_symbol_type::stack_symbol_type (state_type s, YY_MOVE_REF (symbol_type) that)
-    : super_type (s, YY_MOVE (that.location))
+  inline
+  Dhcp4Parser::stack_symbol_type::stack_symbol_type (state_type s, symbol_type& that)
+    : super_type (s, that.location)
   {
-    switch (that.type_get ())
-    {
-      case 185: // value
-      case 189: // map_value
-      case 230: // socket_type
-      case 233: // outbound_interface_value
-      case 255: // db_type
-      case 337: // hr_mode
-      case 486: // ncr_protocol_value
-      case 493: // replace_client_name_value
-        value.move< ElementPtr > (YY_MOVE (that.value));
+      switch (that.type_get ())
+    {
+      case 188: // value
+      case 192: // map_value
+      case 236: // socket_type
+      case 239: // outbound_interface_value
+      case 261: // db_type
+      case 343: // hr_mode
+      case 492: // ncr_protocol_value
+      case 499: // replace_client_name_value
+        value.move< ElementPtr > (that.value);
         break;
 
-      case 168: // "boolean"
-        value.move< bool > (YY_MOVE (that.value));
+      case 171: // "boolean"
+        value.move< bool > (that.value);
         break;
 
-      case 167: // "floating point"
-        value.move< double > (YY_MOVE (that.value));
+      case 170: // "floating point"
+        value.move< double > (that.value);
         break;
 
-      case 166: // "integer"
-        value.move< int64_t > (YY_MOVE (that.value));
+      case 169: // "integer"
+        value.move< int64_t > (that.value);
         break;
 
-      case 165: // "constant string"
-        value.move< std::string > (YY_MOVE (that.value));
+      case 168: // "constant string"
+        value.move< std::string > (that.value);
         break;
 
       default:
@@ -322,38 +288,38 @@ namespace isc { namespace dhcp {
     that.type = empty_symbol;
   }
 
-#if YY_CPLUSPLUS < 201103L
+  inline
   Dhcp4Parser::stack_symbol_type&
-  Dhcp4Parser::stack_symbol_type::operator= (stack_symbol_type& that)
+  Dhcp4Parser::stack_symbol_type::operator= (const stack_symbol_type& that)
   {
     state = that.state;
-    switch (that.type_get ())
-    {
-      case 185: // value
-      case 189: // map_value
-      case 230: // socket_type
-      case 233: // outbound_interface_value
-      case 255: // db_type
-      case 337: // hr_mode
-      case 486: // ncr_protocol_value
-      case 493: // replace_client_name_value
-        value.move< ElementPtr > (that.value);
+      switch (that.type_get ())
+    {
+      case 188: // value
+      case 192: // map_value
+      case 236: // socket_type
+      case 239: // outbound_interface_value
+      case 261: // db_type
+      case 343: // hr_mode
+      case 492: // ncr_protocol_value
+      case 499: // replace_client_name_value
+        value.copy< ElementPtr > (that.value);
         break;
 
-      case 168: // "boolean"
-        value.move< bool > (that.value);
+      case 171: // "boolean"
+        value.copy< bool > (that.value);
         break;
 
-      case 167: // "floating point"
-        value.move< double > (that.value);
+      case 170: // "floating point"
+        value.copy< double > (that.value);
         break;
 
-      case 166: // "integer"
-        value.move< int64_t > (that.value);
+      case 169: // "integer"
+        value.copy< int64_t > (that.value);
         break;
 
-      case 165: // "constant string"
-        value.move< std::string > (that.value);
+      case 168: // "constant string"
+        value.copy< std::string > (that.value);
         break;
 
       default:
@@ -361,13 +327,12 @@ namespace isc { namespace dhcp {
     }
 
     location = that.location;
-    // that is emptied.
-    that.state = empty_state;
     return *this;
   }
-#endif
+
 
   template <typename Base>
+  inline
   void
   Dhcp4Parser::yy_destroy_ (const char* yymsg, basic_symbol<Base>& yysym) const
   {
@@ -393,88 +358,88 @@ namespace isc { namespace dhcp {
         << yysym.location << ": ";
     switch (yytype)
     {
-            case 165: // "constant string"
+            case 168: // "constant string"
 
-#line 245 "dhcp4_parser.yy" // lalr1.cc:672
+#line 248 "dhcp4_parser.yy" // lalr1.cc:636
         { yyoutput << yysym.value.template as< std::string > (); }
-#line 401 "dhcp4_parser.cc" // lalr1.cc:672
+#line 366 "dhcp4_parser.cc" // lalr1.cc:636
         break;
 
-      case 166: // "integer"
+      case 169: // "integer"
 
-#line 245 "dhcp4_parser.yy" // lalr1.cc:672
+#line 248 "dhcp4_parser.yy" // lalr1.cc:636
         { yyoutput << yysym.value.template as< int64_t > (); }
-#line 408 "dhcp4_parser.cc" // lalr1.cc:672
+#line 373 "dhcp4_parser.cc" // lalr1.cc:636
         break;
 
-      case 167: // "floating point"
+      case 170: // "floating point"
 
-#line 245 "dhcp4_parser.yy" // lalr1.cc:672
+#line 248 "dhcp4_parser.yy" // lalr1.cc:636
         { yyoutput << yysym.value.template as< double > (); }
-#line 415 "dhcp4_parser.cc" // lalr1.cc:672
+#line 380 "dhcp4_parser.cc" // lalr1.cc:636
         break;
 
-      case 168: // "boolean"
+      case 171: // "boolean"
 
-#line 245 "dhcp4_parser.yy" // lalr1.cc:672
+#line 248 "dhcp4_parser.yy" // lalr1.cc:636
         { yyoutput << yysym.value.template as< bool > (); }
-#line 422 "dhcp4_parser.cc" // lalr1.cc:672
+#line 387 "dhcp4_parser.cc" // lalr1.cc:636
         break;
 
-      case 185: // value
+      case 188: // value
 
-#line 245 "dhcp4_parser.yy" // lalr1.cc:672
+#line 248 "dhcp4_parser.yy" // lalr1.cc:636
         { yyoutput << yysym.value.template as< ElementPtr > (); }
-#line 429 "dhcp4_parser.cc" // lalr1.cc:672
+#line 394 "dhcp4_parser.cc" // lalr1.cc:636
         break;
 
-      case 189: // map_value
+      case 192: // map_value
 
-#line 245 "dhcp4_parser.yy" // lalr1.cc:672
+#line 248 "dhcp4_parser.yy" // lalr1.cc:636
         { yyoutput << yysym.value.template as< ElementPtr > (); }
-#line 436 "dhcp4_parser.cc" // lalr1.cc:672
+#line 401 "dhcp4_parser.cc" // lalr1.cc:636
         break;
 
-      case 230: // socket_type
+      case 236: // socket_type
 
-#line 245 "dhcp4_parser.yy" // lalr1.cc:672
+#line 248 "dhcp4_parser.yy" // lalr1.cc:636
         { yyoutput << yysym.value.template as< ElementPtr > (); }
-#line 443 "dhcp4_parser.cc" // lalr1.cc:672
+#line 408 "dhcp4_parser.cc" // lalr1.cc:636
         break;
 
-      case 233: // outbound_interface_value
+      case 239: // outbound_interface_value
 
-#line 245 "dhcp4_parser.yy" // lalr1.cc:672
+#line 248 "dhcp4_parser.yy" // lalr1.cc:636
         { yyoutput << yysym.value.template as< ElementPtr > (); }
-#line 450 "dhcp4_parser.cc" // lalr1.cc:672
+#line 415 "dhcp4_parser.cc" // lalr1.cc:636
         break;
 
-      case 255: // db_type
+      case 261: // db_type
 
-#line 245 "dhcp4_parser.yy" // lalr1.cc:672
+#line 248 "dhcp4_parser.yy" // lalr1.cc:636
         { yyoutput << yysym.value.template as< ElementPtr > (); }
-#line 457 "dhcp4_parser.cc" // lalr1.cc:672
+#line 422 "dhcp4_parser.cc" // lalr1.cc:636
         break;
 
-      case 337: // hr_mode
+      case 343: // hr_mode
 
-#line 245 "dhcp4_parser.yy" // lalr1.cc:672
+#line 248 "dhcp4_parser.yy" // lalr1.cc:636
         { yyoutput << yysym.value.template as< ElementPtr > (); }
-#line 464 "dhcp4_parser.cc" // lalr1.cc:672
+#line 429 "dhcp4_parser.cc" // lalr1.cc:636
         break;
 
-      case 486: // ncr_protocol_value
+      case 492: // ncr_protocol_value
 
-#line 245 "dhcp4_parser.yy" // lalr1.cc:672
+#line 248 "dhcp4_parser.yy" // lalr1.cc:636
         { yyoutput << yysym.value.template as< ElementPtr > (); }
-#line 471 "dhcp4_parser.cc" // lalr1.cc:672
+#line 436 "dhcp4_parser.cc" // lalr1.cc:636
         break;
 
-      case 493: // replace_client_name_value
+      case 499: // replace_client_name_value
 
-#line 245 "dhcp4_parser.yy" // lalr1.cc:672
+#line 248 "dhcp4_parser.yy" // lalr1.cc:636
         { yyoutput << yysym.value.template as< ElementPtr > (); }
-#line 478 "dhcp4_parser.cc" // lalr1.cc:672
+#line 443 "dhcp4_parser.cc" // lalr1.cc:636
         break;
 
 
@@ -485,27 +450,26 @@ namespace isc { namespace dhcp {
   }
 #endif
 
+  inline
   void
-  Dhcp4Parser::yypush_ (const char* m, YY_MOVE_REF (stack_symbol_type) sym)
+  Dhcp4Parser::yypush_ (const char* m, state_type s, symbol_type& sym)
   {
-    if (m)
-      YY_SYMBOL_PRINT (m, sym);
-    yystack_.push (YY_MOVE (sym));
+    stack_symbol_type t (s, sym);
+    yypush_ (m, t);
   }
 
+  inline
   void
-  Dhcp4Parser::yypush_ (const char* m, state_type s, YY_MOVE_REF (symbol_type) sym)
+  Dhcp4Parser::yypush_ (const char* m, stack_symbol_type& s)
   {
-#if 201103L <= YY_CPLUSPLUS
-    yypush_ (m, stack_symbol_type (s, std::move (sym)));
-#else
-    stack_symbol_type ss (s, sym);
-    yypush_ (m, ss);
-#endif
+    if (m)
+      YY_SYMBOL_PRINT (m, s);
+    yystack_.push (s);
   }
 
+  inline
   void
-  Dhcp4Parser::yypop_ (int n)
+  Dhcp4Parser::yypop_ (unsigned int n)
   {
     yystack_.pop (n);
   }
@@ -537,7 +501,7 @@ namespace isc { namespace dhcp {
   }
 #endif // PARSER4_DEBUG
 
-  Dhcp4Parser::state_type
+  inline Dhcp4Parser::state_type
   Dhcp4Parser::yy_lr_goto_state_ (state_type yystate, int yysym)
   {
     int yyr = yypgoto_[yysym - yyntokens_] + yystate;
@@ -547,24 +511,18 @@ namespace isc { namespace dhcp {
       return yydefgoto_[yysym - yyntokens_];
   }
 
-  bool
+  inline bool
   Dhcp4Parser::yy_pact_value_is_default_ (int yyvalue)
   {
     return yyvalue == yypact_ninf_;
   }
 
-  bool
+  inline bool
   Dhcp4Parser::yy_table_value_is_error_ (int yyvalue)
   {
     return yyvalue == yytable_ninf_;
   }
 
-  int
-  Dhcp4Parser::operator() ()
-  {
-    return parse ();
-  }
-
   int
   Dhcp4Parser::parse ()
   {
@@ -586,11 +544,11 @@ namespace isc { namespace dhcp {
     /// The return value of parse ().
     int yyresult;
 
-#if YY_EXCEPTIONS
+    // FIXME: This shoud be completely indented.  It is not yet to
+    // avoid gratuitous conflicts when merging into the master branch.
     try
-#endif // YY_EXCEPTIONS
       {
-    YYCDEBUG << "Starting parse\n";
+    YYCDEBUG << "Starting parse" << std::endl;
 
 
     /* Initialize the stack.  The initial state will be set in
@@ -598,11 +556,11 @@ namespace isc { namespace dhcp {
        location values to have been already stored, initialize these
        stacks with a primary value.  */
     yystack_.clear ();
-    yypush_ (YY_NULLPTR, 0, YY_MOVE (yyla));
+    yypush_ (YY_NULLPTR, 0, yyla);
 
     // A new symbol was pushed on the stack.
   yynewstate:
-    YYCDEBUG << "Entering state " << yystack_[0].state << '\n';
+    YYCDEBUG << "Entering state " << yystack_[0].state << std::endl;
 
     // Accept?
     if (yystack_[0].state == yyfinal_)
@@ -612,6 +570,7 @@ namespace isc { namespace dhcp {
 
     // Backup.
   yybackup:
+
     // Try to take a decision without lookahead.
     yyn = yypact_[yystack_[0].state];
     if (yy_pact_value_is_default_ (yyn))
@@ -621,20 +580,16 @@ namespace isc { namespace dhcp {
     if (yyla.empty ())
       {
         YYCDEBUG << "Reading a token: ";
-#if YY_EXCEPTIONS
         try
-#endif // YY_EXCEPTIONS
           {
             symbol_type yylookahead (yylex (ctx));
             yyla.move (yylookahead);
           }
-#if YY_EXCEPTIONS
         catch (const syntax_error& yyexc)
           {
             error (yyexc);
             goto yyerrlab1;
           }
-#endif // YY_EXCEPTIONS
       }
     YY_SYMBOL_PRINT ("Next token is", yyla);
 
@@ -659,7 +614,7 @@ namespace isc { namespace dhcp {
       --yyerrstatus_;
 
     // Shift the lookahead token.
-    yypush_ ("Shifting", yyn, YY_MOVE (yyla));
+    yypush_ ("Shifting", yyn, yyla);
     goto yynewstate;
 
   /*-----------------------------------------------------------.
@@ -678,37 +633,37 @@ namespace isc { namespace dhcp {
     yylen = yyr2_[yyn];
     {
       stack_symbol_type yylhs;
-      yylhs.state = yy_lr_goto_state_ (yystack_[yylen].state, yyr1_[yyn]);
+      yylhs.state = yy_lr_goto_state_(yystack_[yylen].state, yyr1_[yyn]);
       /* Variants are always initialized to an empty instance of the
          correct type. The default '$$ = $1' action is NOT applied
          when using variants.  */
-      switch (yyr1_[yyn])
-    {
-      case 185: // value
-      case 189: // map_value
-      case 230: // socket_type
-      case 233: // outbound_interface_value
-      case 255: // db_type
-      case 337: // hr_mode
-      case 486: // ncr_protocol_value
-      case 493: // replace_client_name_value
-        yylhs.value.emplace< ElementPtr > ();
+        switch (yyr1_[yyn])
+    {
+      case 188: // value
+      case 192: // map_value
+      case 236: // socket_type
+      case 239: // outbound_interface_value
+      case 261: // db_type
+      case 343: // hr_mode
+      case 492: // ncr_protocol_value
+      case 499: // replace_client_name_value
+        yylhs.value.build< ElementPtr > ();
         break;
 
-      case 168: // "boolean"
-        yylhs.value.emplace< bool > ();
+      case 171: // "boolean"
+        yylhs.value.build< bool > ();
         break;
 
-      case 167: // "floating point"
-        yylhs.value.emplace< double > ();
+      case 170: // "floating point"
+        yylhs.value.build< double > ();
         break;
 
-      case 166: // "integer"
-        yylhs.value.emplace< int64_t > ();
+      case 169: // "integer"
+        yylhs.value.build< int64_t > ();
         break;
 
-      case 165: // "constant string"
-        yylhs.value.emplace< std::string > ();
+      case 168: // "constant string"
+        yylhs.value.build< std::string > ();
         break;
 
       default:
@@ -716,296 +671,293 @@ namespace isc { namespace dhcp {
     }
 
 
-      // Default location.
+      // Compute the default @$.
       {
         slice<stack_symbol_type, stack_type> slice (yystack_, yylen);
         YYLLOC_DEFAULT (yylhs.location, slice, yylen);
-        yyerror_range[1].location = yylhs.location;
       }
 
       // Perform the reduction.
       YY_REDUCE_PRINT (yyn);
-#if YY_EXCEPTIONS
       try
-#endif // YY_EXCEPTIONS
         {
           switch (yyn)
             {
   case 2:
-#line 254 "dhcp4_parser.yy" // lalr1.cc:907
+#line 257 "dhcp4_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.NO_KEYWORD; }
-#line 738 "dhcp4_parser.cc" // lalr1.cc:907
+#line 690 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 4:
-#line 255 "dhcp4_parser.yy" // lalr1.cc:907
+#line 258 "dhcp4_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.CONFIG; }
-#line 744 "dhcp4_parser.cc" // lalr1.cc:907
+#line 696 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 6:
-#line 256 "dhcp4_parser.yy" // lalr1.cc:907
+#line 259 "dhcp4_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.DHCP4; }
-#line 750 "dhcp4_parser.cc" // lalr1.cc:907
+#line 702 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 8:
-#line 257 "dhcp4_parser.yy" // lalr1.cc:907
+#line 260 "dhcp4_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.INTERFACES_CONFIG; }
-#line 756 "dhcp4_parser.cc" // lalr1.cc:907
+#line 708 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 10:
-#line 258 "dhcp4_parser.yy" // lalr1.cc:907
+#line 261 "dhcp4_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.SUBNET4; }
-#line 762 "dhcp4_parser.cc" // lalr1.cc:907
+#line 714 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 12:
-#line 259 "dhcp4_parser.yy" // lalr1.cc:907
+#line 262 "dhcp4_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.POOLS; }
-#line 768 "dhcp4_parser.cc" // lalr1.cc:907
+#line 720 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 14:
-#line 260 "dhcp4_parser.yy" // lalr1.cc:907
+#line 263 "dhcp4_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.RESERVATIONS; }
-#line 774 "dhcp4_parser.cc" // lalr1.cc:907
+#line 726 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 16:
-#line 261 "dhcp4_parser.yy" // lalr1.cc:907
+#line 264 "dhcp4_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.DHCP4; }
-#line 780 "dhcp4_parser.cc" // lalr1.cc:907
+#line 732 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 18:
-#line 262 "dhcp4_parser.yy" // lalr1.cc:907
+#line 265 "dhcp4_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.OPTION_DEF; }
-#line 786 "dhcp4_parser.cc" // lalr1.cc:907
+#line 738 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 20:
-#line 263 "dhcp4_parser.yy" // lalr1.cc:907
+#line 266 "dhcp4_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.OPTION_DATA; }
-#line 792 "dhcp4_parser.cc" // lalr1.cc:907
+#line 744 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 22:
-#line 264 "dhcp4_parser.yy" // lalr1.cc:907
+#line 267 "dhcp4_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.HOOKS_LIBRARIES; }
-#line 798 "dhcp4_parser.cc" // lalr1.cc:907
+#line 750 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 24:
-#line 265 "dhcp4_parser.yy" // lalr1.cc:907
+#line 268 "dhcp4_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.DHCP_DDNS; }
-#line 804 "dhcp4_parser.cc" // lalr1.cc:907
+#line 756 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 26:
-#line 266 "dhcp4_parser.yy" // lalr1.cc:907
+#line 269 "dhcp4_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.LOGGING; }
-#line 810 "dhcp4_parser.cc" // lalr1.cc:907
+#line 762 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 28:
-#line 267 "dhcp4_parser.yy" // lalr1.cc:907
+#line 270 "dhcp4_parser.yy" // lalr1.cc:859
     { ctx.ctx_ = ctx.CONFIG_CONTROL; }
-#line 816 "dhcp4_parser.cc" // lalr1.cc:907
+#line 768 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 30:
-#line 275 "dhcp4_parser.yy" // lalr1.cc:907
+#line 278 "dhcp4_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ElementPtr(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); }
-#line 822 "dhcp4_parser.cc" // lalr1.cc:907
+#line 774 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 31:
-#line 276 "dhcp4_parser.yy" // lalr1.cc:907
+#line 279 "dhcp4_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ElementPtr(new DoubleElement(yystack_[0].value.as< double > (), ctx.loc2pos(yystack_[0].location))); }
-#line 828 "dhcp4_parser.cc" // lalr1.cc:907
+#line 780 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 32:
-#line 277 "dhcp4_parser.yy" // lalr1.cc:907
+#line 280 "dhcp4_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ElementPtr(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); }
-#line 834 "dhcp4_parser.cc" // lalr1.cc:907
+#line 786 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 33:
-#line 278 "dhcp4_parser.yy" // lalr1.cc:907
+#line 281 "dhcp4_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); }
-#line 840 "dhcp4_parser.cc" // lalr1.cc:907
+#line 792 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 34:
-#line 279 "dhcp4_parser.yy" // lalr1.cc:907
+#line 282 "dhcp4_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ElementPtr(new NullElement(ctx.loc2pos(yystack_[0].location))); }
-#line 846 "dhcp4_parser.cc" // lalr1.cc:907
+#line 798 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 35:
-#line 280 "dhcp4_parser.yy" // lalr1.cc:907
+#line 283 "dhcp4_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); }
-#line 852 "dhcp4_parser.cc" // lalr1.cc:907
+#line 804 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 36:
-#line 281 "dhcp4_parser.yy" // lalr1.cc:907
+#line 284 "dhcp4_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); }
-#line 858 "dhcp4_parser.cc" // lalr1.cc:907
+#line 810 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 37:
-#line 284 "dhcp4_parser.yy" // lalr1.cc:907
+#line 287 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // Push back the JSON value on the stack
     ctx.stack_.push_back(yystack_[0].value.as< ElementPtr > ());
 }
-#line 867 "dhcp4_parser.cc" // lalr1.cc:907
+#line 819 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 38:
-#line 289 "dhcp4_parser.yy" // lalr1.cc:907
+#line 292 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // This code is executed when we're about to start parsing
     // the content of the map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 878 "dhcp4_parser.cc" // lalr1.cc:907
+#line 830 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 39:
-#line 294 "dhcp4_parser.yy" // lalr1.cc:907
+#line 297 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // map parsing completed. If we ever want to do any wrap up
     // (maybe some sanity checking), this would be the best place
     // for it.
 }
-#line 888 "dhcp4_parser.cc" // lalr1.cc:907
+#line 840 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 40:
-#line 300 "dhcp4_parser.yy" // lalr1.cc:907
+#line 303 "dhcp4_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); }
-#line 894 "dhcp4_parser.cc" // lalr1.cc:907
+#line 846 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 43:
-#line 307 "dhcp4_parser.yy" // lalr1.cc:907
+#line 310 "dhcp4_parser.yy" // lalr1.cc:859
     {
                   // map containing a single entry
                   ctx.stack_.back()->set(yystack_[2].value.as< std::string > (), yystack_[0].value.as< ElementPtr > ());
                   }
-#line 903 "dhcp4_parser.cc" // lalr1.cc:907
+#line 855 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 44:
-#line 311 "dhcp4_parser.yy" // lalr1.cc:907
+#line 314 "dhcp4_parser.yy" // lalr1.cc:859
     {
                   // map consisting of a shorter map followed by
                   // comma and string:value
                   ctx.stack_.back()->set(yystack_[2].value.as< std::string > (), yystack_[0].value.as< ElementPtr > ());
                   }
-#line 913 "dhcp4_parser.cc" // lalr1.cc:907
+#line 865 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 45:
-#line 318 "dhcp4_parser.yy" // lalr1.cc:907
+#line 321 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(l);
 }
-#line 922 "dhcp4_parser.cc" // lalr1.cc:907
+#line 874 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 46:
-#line 321 "dhcp4_parser.yy" // lalr1.cc:907
+#line 324 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // list parsing complete. Put any sanity checking here
 }
-#line 930 "dhcp4_parser.cc" // lalr1.cc:907
+#line 882 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 49:
-#line 329 "dhcp4_parser.yy" // lalr1.cc:907
+#line 332 "dhcp4_parser.yy" // lalr1.cc:859
     {
                   // List consisting of a single element.
                   ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ());
                   }
-#line 939 "dhcp4_parser.cc" // lalr1.cc:907
+#line 891 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 50:
-#line 333 "dhcp4_parser.yy" // lalr1.cc:907
+#line 336 "dhcp4_parser.yy" // lalr1.cc:859
     {
                   // List ending with , and a value.
                   ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ());
                   }
-#line 948 "dhcp4_parser.cc" // lalr1.cc:907
+#line 900 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 51:
-#line 340 "dhcp4_parser.yy" // lalr1.cc:907
+#line 343 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // List parsing about to start
 }
-#line 956 "dhcp4_parser.cc" // lalr1.cc:907
+#line 908 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 52:
-#line 342 "dhcp4_parser.yy" // lalr1.cc:907
+#line 345 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // list parsing complete. Put any sanity checking here
     //ctx.stack_.pop_back();
 }
-#line 965 "dhcp4_parser.cc" // lalr1.cc:907
+#line 917 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 55:
-#line 351 "dhcp4_parser.yy" // lalr1.cc:907
+#line 354 "dhcp4_parser.yy" // lalr1.cc:859
     {
                           ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
                           ctx.stack_.back()->add(s);
                           }
-#line 974 "dhcp4_parser.cc" // lalr1.cc:907
+#line 926 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 56:
-#line 355 "dhcp4_parser.yy" // lalr1.cc:907
+#line 358 "dhcp4_parser.yy" // lalr1.cc:859
     {
                           ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
                           ctx.stack_.back()->add(s);
                           }
-#line 983 "dhcp4_parser.cc" // lalr1.cc:907
+#line 935 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 57:
-#line 366 "dhcp4_parser.yy" // lalr1.cc:907
+#line 369 "dhcp4_parser.yy" // lalr1.cc:859
     {
     const std::string& where = ctx.contextName();
     const std::string& keyword = yystack_[1].value.as< std::string > ();
     error(yystack_[1].location,
           "got unexpected keyword \"" + keyword + "\" in " + where + " map.");
 }
-#line 994 "dhcp4_parser.cc" // lalr1.cc:907
+#line 946 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 58:
-#line 376 "dhcp4_parser.yy" // lalr1.cc:907
+#line 379 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // This code is executed when we're about to start parsing
     // the content of the map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 1005 "dhcp4_parser.cc" // lalr1.cc:907
+#line 957 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 59:
-#line 381 "dhcp4_parser.yy" // lalr1.cc:907
+#line 384 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // map parsing completed. If we ever want to do any wrap up
     // (maybe some sanity checking), this would be the best place
@@ -1014,11 +966,11 @@ namespace isc { namespace dhcp {
     // Dhcp4 is required
     ctx.require("Dhcp4", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
 }
-#line 1018 "dhcp4_parser.cc" // lalr1.cc:907
+#line 970 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 68:
-#line 405 "dhcp4_parser.yy" // lalr1.cc:907
+#line 408 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // This code is executed when we're about to start parsing
     // the content of the map
@@ -1027,302 +979,329 @@ namespace isc { namespace dhcp {
     ctx.stack_.push_back(m);
     ctx.enter(ctx.DHCP4);
 }
-#line 1031 "dhcp4_parser.cc" // lalr1.cc:907
+#line 983 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 69:
-#line 412 "dhcp4_parser.yy" // lalr1.cc:907
+#line 415 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // No global parameter is required
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1041 "dhcp4_parser.cc" // lalr1.cc:907
+#line 993 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 70:
-#line 420 "dhcp4_parser.yy" // lalr1.cc:907
+#line 423 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // Parse the Dhcp4 map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 1051 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1003 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
   case 71:
-#line 424 "dhcp4_parser.yy" // lalr1.cc:907
+#line 427 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // No global parameter is required
     // parsing completed
 }
-#line 1060 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1012 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 108:
-#line 471 "dhcp4_parser.yy" // lalr1.cc:907
+  case 111:
+#line 477 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("valid-lifetime", prf);
 }
-#line 1069 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1021 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 109:
-#line 476 "dhcp4_parser.yy" // lalr1.cc:907
+  case 112:
+#line 482 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("renew-timer", prf);
 }
-#line 1078 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1030 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 110:
-#line 481 "dhcp4_parser.yy" // lalr1.cc:907
+  case 113:
+#line 487 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("rebind-timer", prf);
 }
-#line 1087 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1039 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 111:
-#line 486 "dhcp4_parser.yy" // lalr1.cc:907
+  case 114:
+#line 492 "dhcp4_parser.yy" // lalr1.cc:859
+    {
+    ElementPtr ctt(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
+    ctx.stack_.back()->set("calculate-tee-times", ctt);
+}
+#line 1048 "dhcp4_parser.cc" // lalr1.cc:859
+    break;
+
+  case 115:
+#line 497 "dhcp4_parser.yy" // lalr1.cc:859
+    {
+    ElementPtr t1(new DoubleElement(yystack_[0].value.as< double > (), ctx.loc2pos(yystack_[0].location)));
+    ctx.stack_.back()->set("t1-percent", t1);
+}
+#line 1057 "dhcp4_parser.cc" // lalr1.cc:859
+    break;
+
+  case 116:
+#line 502 "dhcp4_parser.yy" // lalr1.cc:859
+    {
+    ElementPtr t2(new DoubleElement(yystack_[0].value.as< double > (), ctx.loc2pos(yystack_[0].location)));
+    ctx.stack_.back()->set("t2-percent", t2);
+}
+#line 1066 "dhcp4_parser.cc" // lalr1.cc:859
+    break;
+
+  case 117:
+#line 507 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr dpp(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("decline-probation-period", dpp);
 }
-#line 1096 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1075 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 112:
-#line 491 "dhcp4_parser.yy" // lalr1.cc:907
+  case 118:
+#line 512 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1104 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1083 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 113:
-#line 493 "dhcp4_parser.yy" // lalr1.cc:907
+  case 119:
+#line 514 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr stag(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("server-tag", stag);
     ctx.leave();
 }
-#line 1114 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1093 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 114:
-#line 499 "dhcp4_parser.yy" // lalr1.cc:907
+  case 120:
+#line 520 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr echo(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("echo-client-id", echo);
 }
-#line 1123 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1102 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 115:
-#line 504 "dhcp4_parser.yy" // lalr1.cc:907
+  case 121:
+#line 525 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr match(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("match-client-id", match);
 }
-#line 1132 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1111 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 116:
-#line 509 "dhcp4_parser.yy" // lalr1.cc:907
+  case 122:
+#line 530 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr prf(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("authoritative", prf);
 }
-#line 1141 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1120 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 117:
-#line 515 "dhcp4_parser.yy" // lalr1.cc:907
+  case 123:
+#line 536 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("interfaces-config", i);
     ctx.stack_.push_back(i);
     ctx.enter(ctx.INTERFACES_CONFIG);
 }
-#line 1152 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1131 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 118:
-#line 520 "dhcp4_parser.yy" // lalr1.cc:907
+  case 124:
+#line 541 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // No interfaces config param is required
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1162 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1141 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 128:
-#line 539 "dhcp4_parser.yy" // lalr1.cc:907
+  case 134:
+#line 560 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // Parse the interfaces-config map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 1172 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1151 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 129:
-#line 543 "dhcp4_parser.yy" // lalr1.cc:907
+  case 135:
+#line 564 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // No interfaces config param is required
     // parsing completed
 }
-#line 1181 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1160 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 130:
-#line 548 "dhcp4_parser.yy" // lalr1.cc:907
+  case 136:
+#line 569 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("interfaces", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1192 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1171 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 131:
-#line 553 "dhcp4_parser.yy" // lalr1.cc:907
+  case 137:
+#line 574 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1201 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1180 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 132:
-#line 558 "dhcp4_parser.yy" // lalr1.cc:907
+  case 138:
+#line 579 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.DHCP_SOCKET_TYPE);
 }
-#line 1209 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1188 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 133:
-#line 560 "dhcp4_parser.yy" // lalr1.cc:907
+  case 139:
+#line 581 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.back()->set("dhcp-socket-type", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 1218 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1197 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 134:
-#line 565 "dhcp4_parser.yy" // lalr1.cc:907
+  case 140:
+#line 586 "dhcp4_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("raw", ctx.loc2pos(yystack_[0].location))); }
-#line 1224 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1203 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 135:
-#line 566 "dhcp4_parser.yy" // lalr1.cc:907
+  case 141:
+#line 587 "dhcp4_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("udp", ctx.loc2pos(yystack_[0].location))); }
-#line 1230 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1209 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 136:
-#line 569 "dhcp4_parser.yy" // lalr1.cc:907
+  case 142:
+#line 590 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.OUTBOUND_INTERFACE);
 }
-#line 1238 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1217 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 137:
-#line 571 "dhcp4_parser.yy" // lalr1.cc:907
+  case 143:
+#line 592 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.back()->set("outbound-interface", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 1247 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1226 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 138:
-#line 576 "dhcp4_parser.yy" // lalr1.cc:907
+  case 144:
+#line 597 "dhcp4_parser.yy" // lalr1.cc:859
     {
     yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("same-as-inbound", ctx.loc2pos(yystack_[0].location)));
 }
-#line 1255 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1234 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 139:
-#line 578 "dhcp4_parser.yy" // lalr1.cc:907
+  case 145:
+#line 599 "dhcp4_parser.yy" // lalr1.cc:859
     {
     yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("use-routing", ctx.loc2pos(yystack_[0].location)));
     }
-#line 1263 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1242 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 140:
-#line 582 "dhcp4_parser.yy" // lalr1.cc:907
+  case 146:
+#line 603 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("re-detect", b);
 }
-#line 1272 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1251 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 141:
-#line 588 "dhcp4_parser.yy" // lalr1.cc:907
+  case 147:
+#line 609 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("lease-database", i);
     ctx.stack_.push_back(i);
     ctx.enter(ctx.LEASE_DATABASE);
 }
-#line 1283 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1262 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 142:
-#line 593 "dhcp4_parser.yy" // lalr1.cc:907
+  case 148:
+#line 614 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // The type parameter is required
     ctx.require("type", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location));
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1294 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1273 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 143:
-#line 600 "dhcp4_parser.yy" // lalr1.cc:907
+  case 149:
+#line 621 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("sanity-checks", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.SANITY_CHECKS);
 }
-#line 1305 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1284 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 144:
-#line 605 "dhcp4_parser.yy" // lalr1.cc:907
+  case 150:
+#line 626 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1314 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1293 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 148:
-#line 615 "dhcp4_parser.yy" // lalr1.cc:907
+  case 154:
+#line 636 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1322 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1301 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 149:
-#line 617 "dhcp4_parser.yy" // lalr1.cc:907
+  case 155:
+#line 638 "dhcp4_parser.yy" // lalr1.cc:859
     {
 
     if ( (string(yystack_[0].value.as< std::string > ()) == "none") ||
@@ -1338,577 +1317,577 @@ namespace isc { namespace dhcp {
               ", supported values are: none, warn, fix, fix-del, del");
     }
 }
-#line 1342 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1321 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 150:
-#line 633 "dhcp4_parser.yy" // lalr1.cc:907
+  case 156:
+#line 654 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("hosts-database", i);
     ctx.stack_.push_back(i);
     ctx.enter(ctx.HOSTS_DATABASE);
 }
-#line 1353 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1332 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 151:
-#line 638 "dhcp4_parser.yy" // lalr1.cc:907
+  case 157:
+#line 659 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // The type parameter is required
     ctx.require("type", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location));
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1364 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1343 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 152:
-#line 645 "dhcp4_parser.yy" // lalr1.cc:907
+  case 158:
+#line 666 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("hosts-databases", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.HOSTS_DATABASE);
 }
-#line 1375 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1354 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 153:
-#line 650 "dhcp4_parser.yy" // lalr1.cc:907
+  case 159:
+#line 671 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1384 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1363 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 158:
-#line 663 "dhcp4_parser.yy" // lalr1.cc:907
+  case 164:
+#line 684 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1394 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1373 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 159:
-#line 667 "dhcp4_parser.yy" // lalr1.cc:907
+  case 165:
+#line 688 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // The type parameter is required
     ctx.require("type", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
     ctx.stack_.pop_back();
 }
-#line 1404 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1383 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 180:
-#line 697 "dhcp4_parser.yy" // lalr1.cc:907
+  case 186:
+#line 718 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.DATABASE_TYPE);
 }
-#line 1412 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1391 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 181:
-#line 699 "dhcp4_parser.yy" // lalr1.cc:907
+  case 187:
+#line 720 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.back()->set("type", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 1421 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1400 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 182:
-#line 704 "dhcp4_parser.yy" // lalr1.cc:907
+  case 188:
+#line 725 "dhcp4_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("memfile", ctx.loc2pos(yystack_[0].location))); }
-#line 1427 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1406 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 183:
-#line 705 "dhcp4_parser.yy" // lalr1.cc:907
+  case 189:
+#line 726 "dhcp4_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("mysql", ctx.loc2pos(yystack_[0].location))); }
-#line 1433 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1412 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 184:
-#line 706 "dhcp4_parser.yy" // lalr1.cc:907
+  case 190:
+#line 727 "dhcp4_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("postgresql", ctx.loc2pos(yystack_[0].location))); }
-#line 1439 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1418 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 185:
-#line 707 "dhcp4_parser.yy" // lalr1.cc:907
+  case 191:
+#line 728 "dhcp4_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("cql", ctx.loc2pos(yystack_[0].location))); }
-#line 1445 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1424 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 186:
-#line 710 "dhcp4_parser.yy" // lalr1.cc:907
+  case 192:
+#line 731 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1453 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1432 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 187:
-#line 712 "dhcp4_parser.yy" // lalr1.cc:907
+  case 193:
+#line 733 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr user(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("user", user);
     ctx.leave();
 }
-#line 1463 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1442 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 188:
-#line 718 "dhcp4_parser.yy" // lalr1.cc:907
+  case 194:
+#line 739 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1471 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1450 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 189:
-#line 720 "dhcp4_parser.yy" // lalr1.cc:907
+  case 195:
+#line 741 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr pwd(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("password", pwd);
     ctx.leave();
 }
-#line 1481 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1460 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 190:
-#line 726 "dhcp4_parser.yy" // lalr1.cc:907
+  case 196:
+#line 747 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1489 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1468 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 191:
-#line 728 "dhcp4_parser.yy" // lalr1.cc:907
+  case 197:
+#line 749 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr h(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("host", h);
     ctx.leave();
 }
-#line 1499 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1478 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 192:
-#line 734 "dhcp4_parser.yy" // lalr1.cc:907
+  case 198:
+#line 755 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr p(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("port", p);
 }
-#line 1508 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1487 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 193:
-#line 739 "dhcp4_parser.yy" // lalr1.cc:907
+  case 199:
+#line 760 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1516 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1495 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 194:
-#line 741 "dhcp4_parser.yy" // lalr1.cc:907
+  case 200:
+#line 762 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr name(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("name", name);
     ctx.leave();
 }
-#line 1526 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1505 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 195:
-#line 747 "dhcp4_parser.yy" // lalr1.cc:907
+  case 201:
+#line 768 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr n(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("persist", n);
 }
-#line 1535 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1514 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 196:
-#line 752 "dhcp4_parser.yy" // lalr1.cc:907
+  case 202:
+#line 773 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr n(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("lfc-interval", n);
 }
-#line 1544 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1523 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 197:
-#line 757 "dhcp4_parser.yy" // lalr1.cc:907
+  case 203:
+#line 778 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr n(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("readonly", n);
 }
-#line 1553 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1532 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 198:
-#line 762 "dhcp4_parser.yy" // lalr1.cc:907
+  case 204:
+#line 783 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr n(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("connect-timeout", n);
 }
-#line 1562 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1541 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 199:
-#line 767 "dhcp4_parser.yy" // lalr1.cc:907
+  case 205:
+#line 788 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr n(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("request-timeout", n);
 }
-#line 1571 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1550 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 200:
-#line 772 "dhcp4_parser.yy" // lalr1.cc:907
+  case 206:
+#line 793 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr n(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("tcp-keepalive", n);
 }
-#line 1580 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1559 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 201:
-#line 777 "dhcp4_parser.yy" // lalr1.cc:907
+  case 207:
+#line 798 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr n(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("tcp-nodelay", n);
 }
-#line 1589 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1568 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 202:
-#line 782 "dhcp4_parser.yy" // lalr1.cc:907
+  case 208:
+#line 803 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1597 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1576 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 203:
-#line 784 "dhcp4_parser.yy" // lalr1.cc:907
+  case 209:
+#line 805 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr cp(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("contact-points", cp);
     ctx.leave();
 }
-#line 1607 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1586 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 204:
-#line 790 "dhcp4_parser.yy" // lalr1.cc:907
+  case 210:
+#line 811 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1615 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1594 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 205:
-#line 792 "dhcp4_parser.yy" // lalr1.cc:907
+  case 211:
+#line 813 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr ks(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("keyspace", ks);
     ctx.leave();
 }
-#line 1625 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1604 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 206:
-#line 798 "dhcp4_parser.yy" // lalr1.cc:907
+  case 212:
+#line 819 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr n(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("max-reconnect-tries", n);
 }
-#line 1634 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1613 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 207:
-#line 803 "dhcp4_parser.yy" // lalr1.cc:907
+  case 213:
+#line 824 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr n(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("reconnect-wait-time", n);
 }
-#line 1643 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1622 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 208:
-#line 808 "dhcp4_parser.yy" // lalr1.cc:907
+  case 214:
+#line 829 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("host-reservation-identifiers", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.HOST_RESERVATION_IDENTIFIERS);
 }
-#line 1654 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1633 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 209:
-#line 813 "dhcp4_parser.yy" // lalr1.cc:907
+  case 215:
+#line 834 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1663 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1642 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 217:
-#line 829 "dhcp4_parser.yy" // lalr1.cc:907
+  case 223:
+#line 850 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr duid(new StringElement("duid", ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(duid);
 }
-#line 1672 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1651 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 218:
-#line 834 "dhcp4_parser.yy" // lalr1.cc:907
+  case 224:
+#line 855 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr hwaddr(new StringElement("hw-address", ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(hwaddr);
 }
-#line 1681 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1660 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 219:
-#line 839 "dhcp4_parser.yy" // lalr1.cc:907
+  case 225:
+#line 860 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr circuit(new StringElement("circuit-id", ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(circuit);
 }
-#line 1690 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1669 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 220:
-#line 844 "dhcp4_parser.yy" // lalr1.cc:907
+  case 226:
+#line 865 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr client(new StringElement("client-id", ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(client);
 }
-#line 1699 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1678 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 221:
-#line 849 "dhcp4_parser.yy" // lalr1.cc:907
+  case 227:
+#line 870 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr flex_id(new StringElement("flex-id", ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(flex_id);
 }
-#line 1708 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1687 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 222:
-#line 854 "dhcp4_parser.yy" // lalr1.cc:907
+  case 228:
+#line 875 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("hooks-libraries", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.HOOKS_LIBRARIES);
 }
-#line 1719 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1698 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 223:
-#line 859 "dhcp4_parser.yy" // lalr1.cc:907
+  case 229:
+#line 880 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1728 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1707 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 228:
-#line 872 "dhcp4_parser.yy" // lalr1.cc:907
+  case 234:
+#line 893 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1738 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1717 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 229:
-#line 876 "dhcp4_parser.yy" // lalr1.cc:907
+  case 235:
+#line 897 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // The library hooks parameter is required
     ctx.require("library", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
     ctx.stack_.pop_back();
 }
-#line 1748 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1727 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 230:
-#line 882 "dhcp4_parser.yy" // lalr1.cc:907
+  case 236:
+#line 903 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // Parse the hooks-libraries list entry map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 1758 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1737 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 231:
-#line 886 "dhcp4_parser.yy" // lalr1.cc:907
+  case 237:
+#line 907 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // The library hooks parameter is required
     ctx.require("library", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
     // parsing completed
 }
-#line 1768 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1747 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 237:
-#line 901 "dhcp4_parser.yy" // lalr1.cc:907
+  case 243:
+#line 922 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1776 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1755 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 238:
-#line 903 "dhcp4_parser.yy" // lalr1.cc:907
+  case 244:
+#line 924 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr lib(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("library", lib);
     ctx.leave();
 }
-#line 1786 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1765 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 239:
-#line 909 "dhcp4_parser.yy" // lalr1.cc:907
+  case 245:
+#line 930 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1794 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1773 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 240:
-#line 911 "dhcp4_parser.yy" // lalr1.cc:907
+  case 246:
+#line 932 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.back()->set("parameters", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 1803 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1782 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 241:
-#line 917 "dhcp4_parser.yy" // lalr1.cc:907
+  case 247:
+#line 938 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("expired-leases-processing", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.EXPIRED_LEASES_PROCESSING);
 }
-#line 1814 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1793 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 242:
-#line 922 "dhcp4_parser.yy" // lalr1.cc:907
+  case 248:
+#line 943 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // No expired lease parameter is required
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1824 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1803 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 251:
-#line 940 "dhcp4_parser.yy" // lalr1.cc:907
+  case 257:
+#line 961 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("reclaim-timer-wait-time", value);
 }
-#line 1833 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1812 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 252:
-#line 945 "dhcp4_parser.yy" // lalr1.cc:907
+  case 258:
+#line 966 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("flush-reclaimed-timer-wait-time", value);
 }
-#line 1842 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1821 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 253:
-#line 950 "dhcp4_parser.yy" // lalr1.cc:907
+  case 259:
+#line 971 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("hold-reclaimed-time", value);
 }
-#line 1851 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1830 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 254:
-#line 955 "dhcp4_parser.yy" // lalr1.cc:907
+  case 260:
+#line 976 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("max-reclaim-leases", value);
 }
-#line 1860 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1839 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 255:
-#line 960 "dhcp4_parser.yy" // lalr1.cc:907
+  case 261:
+#line 981 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("max-reclaim-time", value);
 }
-#line 1869 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1848 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 256:
-#line 965 "dhcp4_parser.yy" // lalr1.cc:907
+  case 262:
+#line 986 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("unwarned-reclaim-cycles", value);
 }
-#line 1878 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1857 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 257:
-#line 973 "dhcp4_parser.yy" // lalr1.cc:907
+  case 263:
+#line 994 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("subnet4", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.SUBNET4);
 }
-#line 1889 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1868 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 258:
-#line 978 "dhcp4_parser.yy" // lalr1.cc:907
+  case 264:
+#line 999 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1898 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1877 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 263:
-#line 998 "dhcp4_parser.yy" // lalr1.cc:907
+  case 269:
+#line 1019 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1908 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1887 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 264:
-#line 1002 "dhcp4_parser.yy" // lalr1.cc:907
+  case 270:
+#line 1023 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // Once we reached this place, the subnet parsing is now complete.
     // If we want to, we can implement default values here.
@@ -1930,294 +1909,294 @@ namespace isc { namespace dhcp {
     ctx.require("subnet", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
     ctx.stack_.pop_back();
 }
-#line 1934 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1913 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 265:
-#line 1024 "dhcp4_parser.yy" // lalr1.cc:907
+  case 271:
+#line 1045 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // Parse the subnet4 list entry map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 1944 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1923 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 266:
-#line 1028 "dhcp4_parser.yy" // lalr1.cc:907
+  case 272:
+#line 1049 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // The subnet subnet4 parameter is required
     ctx.require("subnet", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
     // parsing completed
 }
-#line 1954 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1933 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 293:
-#line 1066 "dhcp4_parser.yy" // lalr1.cc:907
+  case 302:
+#line 1090 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1962 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1941 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 294:
-#line 1068 "dhcp4_parser.yy" // lalr1.cc:907
+  case 303:
+#line 1092 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr subnet(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("subnet", subnet);
     ctx.leave();
 }
-#line 1972 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1951 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 295:
-#line 1074 "dhcp4_parser.yy" // lalr1.cc:907
+  case 304:
+#line 1098 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1980 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1959 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 296:
-#line 1076 "dhcp4_parser.yy" // lalr1.cc:907
+  case 305:
+#line 1100 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("4o6-interface", iface);
     ctx.leave();
 }
-#line 1990 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1969 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 297:
-#line 1082 "dhcp4_parser.yy" // lalr1.cc:907
+  case 306:
+#line 1106 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1998 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1977 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 298:
-#line 1084 "dhcp4_parser.yy" // lalr1.cc:907
+  case 307:
+#line 1108 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("4o6-interface-id", iface);
     ctx.leave();
 }
-#line 2008 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1987 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 299:
-#line 1090 "dhcp4_parser.yy" // lalr1.cc:907
+  case 308:
+#line 1114 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2016 "dhcp4_parser.cc" // lalr1.cc:907
+#line 1995 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 300:
-#line 1092 "dhcp4_parser.yy" // lalr1.cc:907
+  case 309:
+#line 1116 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("4o6-subnet", iface);
     ctx.leave();
 }
-#line 2026 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2005 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 301:
-#line 1098 "dhcp4_parser.yy" // lalr1.cc:907
+  case 310:
+#line 1122 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2034 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2013 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 302:
-#line 1100 "dhcp4_parser.yy" // lalr1.cc:907
+  case 311:
+#line 1124 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("interface", iface);
     ctx.leave();
 }
-#line 2044 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2023 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 303:
-#line 1106 "dhcp4_parser.yy" // lalr1.cc:907
+  case 312:
+#line 1130 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2052 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2031 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 304:
-#line 1108 "dhcp4_parser.yy" // lalr1.cc:907
+  case 313:
+#line 1132 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr cls(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("client-class", cls);
     ctx.leave();
 }
-#line 2062 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2041 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 305:
-#line 1114 "dhcp4_parser.yy" // lalr1.cc:907
+  case 314:
+#line 1138 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr c(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("require-client-classes", c);
     ctx.stack_.push_back(c);
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2073 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2052 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 306:
-#line 1119 "dhcp4_parser.yy" // lalr1.cc:907
+  case 315:
+#line 1143 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2082 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2061 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 307:
-#line 1124 "dhcp4_parser.yy" // lalr1.cc:907
+  case 316:
+#line 1148 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.RESERVATION_MODE);
 }
-#line 2090 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2069 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 308:
-#line 1126 "dhcp4_parser.yy" // lalr1.cc:907
+  case 317:
+#line 1150 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.back()->set("reservation-mode", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 2099 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2078 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 309:
-#line 1131 "dhcp4_parser.yy" // lalr1.cc:907
+  case 318:
+#line 1155 "dhcp4_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("disabled", ctx.loc2pos(yystack_[0].location))); }
-#line 2105 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2084 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 310:
-#line 1132 "dhcp4_parser.yy" // lalr1.cc:907
+  case 319:
+#line 1156 "dhcp4_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("out-of-pool", ctx.loc2pos(yystack_[0].location))); }
-#line 2111 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2090 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 311:
-#line 1133 "dhcp4_parser.yy" // lalr1.cc:907
+  case 320:
+#line 1157 "dhcp4_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("global", ctx.loc2pos(yystack_[0].location))); }
-#line 2117 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2096 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 312:
-#line 1134 "dhcp4_parser.yy" // lalr1.cc:907
+  case 321:
+#line 1158 "dhcp4_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("all", ctx.loc2pos(yystack_[0].location))); }
-#line 2123 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2102 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 313:
-#line 1137 "dhcp4_parser.yy" // lalr1.cc:907
+  case 322:
+#line 1161 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr id(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("id", id);
 }
-#line 2132 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2111 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 314:
-#line 1144 "dhcp4_parser.yy" // lalr1.cc:907
+  case 323:
+#line 1168 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("shared-networks", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.SHARED_NETWORK);
 }
-#line 2143 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2122 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 315:
-#line 1149 "dhcp4_parser.yy" // lalr1.cc:907
+  case 324:
+#line 1173 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2152 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2131 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 320:
-#line 1164 "dhcp4_parser.yy" // lalr1.cc:907
+  case 329:
+#line 1188 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 2162 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2141 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 321:
-#line 1168 "dhcp4_parser.yy" // lalr1.cc:907
+  case 330:
+#line 1192 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 2170 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2149 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 343:
-#line 1201 "dhcp4_parser.yy" // lalr1.cc:907
+  case 355:
+#line 1228 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("option-def", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.OPTION_DEF);
 }
-#line 2181 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2160 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 344:
-#line 1206 "dhcp4_parser.yy" // lalr1.cc:907
+  case 356:
+#line 1233 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2190 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2169 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 345:
-#line 1214 "dhcp4_parser.yy" // lalr1.cc:907
+  case 357:
+#line 1241 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 2199 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2178 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 346:
-#line 1217 "dhcp4_parser.yy" // lalr1.cc:907
+  case 358:
+#line 1244 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // parsing completed
 }
-#line 2207 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2186 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 351:
-#line 1233 "dhcp4_parser.yy" // lalr1.cc:907
+  case 363:
+#line 1260 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 2217 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2196 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 352:
-#line 1237 "dhcp4_parser.yy" // lalr1.cc:907
+  case 364:
+#line 1264 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // The name, code and type option def parameters are required.
     ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
@@ -2225,21 +2204,21 @@ namespace isc { namespace dhcp {
     ctx.require("type", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
     ctx.stack_.pop_back();
 }
-#line 2229 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2208 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 353:
-#line 1248 "dhcp4_parser.yy" // lalr1.cc:907
+  case 365:
+#line 1275 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // Parse the option-def list entry map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 2239 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2218 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 354:
-#line 1252 "dhcp4_parser.yy" // lalr1.cc:907
+  case 366:
+#line 1279 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // The name, code and type option def parameters are required.
     ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
@@ -2247,281 +2226,281 @@ namespace isc { namespace dhcp {
     ctx.require("type", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
     // parsing completed
 }
-#line 2251 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2230 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 370:
-#line 1284 "dhcp4_parser.yy" // lalr1.cc:907
+  case 382:
+#line 1311 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr code(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("code", code);
 }
-#line 2260 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2239 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 372:
-#line 1291 "dhcp4_parser.yy" // lalr1.cc:907
+  case 384:
+#line 1318 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2268 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2247 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 373:
-#line 1293 "dhcp4_parser.yy" // lalr1.cc:907
+  case 385:
+#line 1320 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr prf(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("type", prf);
     ctx.leave();
 }
-#line 2278 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2257 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 374:
-#line 1299 "dhcp4_parser.yy" // lalr1.cc:907
+  case 386:
+#line 1326 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2286 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2265 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 375:
-#line 1301 "dhcp4_parser.yy" // lalr1.cc:907
+  case 387:
+#line 1328 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr rtypes(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("record-types", rtypes);
     ctx.leave();
 }
-#line 2296 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2275 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 376:
-#line 1307 "dhcp4_parser.yy" // lalr1.cc:907
+  case 388:
+#line 1334 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2304 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2283 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 377:
-#line 1309 "dhcp4_parser.yy" // lalr1.cc:907
+  case 389:
+#line 1336 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr space(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("space", space);
     ctx.leave();
 }
-#line 2314 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2293 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 379:
-#line 1317 "dhcp4_parser.yy" // lalr1.cc:907
+  case 391:
+#line 1344 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2322 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2301 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 380:
-#line 1319 "dhcp4_parser.yy" // lalr1.cc:907
+  case 392:
+#line 1346 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr encap(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("encapsulate", encap);
     ctx.leave();
 }
-#line 2332 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2311 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 381:
-#line 1325 "dhcp4_parser.yy" // lalr1.cc:907
+  case 393:
+#line 1352 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr array(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("array", array);
 }
-#line 2341 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2320 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 382:
-#line 1334 "dhcp4_parser.yy" // lalr1.cc:907
+  case 394:
+#line 1361 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("option-data", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.OPTION_DATA);
 }
-#line 2352 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2331 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 383:
-#line 1339 "dhcp4_parser.yy" // lalr1.cc:907
+  case 395:
+#line 1366 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2361 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2340 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 388:
-#line 1358 "dhcp4_parser.yy" // lalr1.cc:907
+  case 400:
+#line 1385 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 2371 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2350 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 389:
-#line 1362 "dhcp4_parser.yy" // lalr1.cc:907
+  case 401:
+#line 1389 "dhcp4_parser.yy" // lalr1.cc:859
     {
     /// @todo: the code or name parameters are required.
     ctx.stack_.pop_back();
 }
-#line 2380 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2359 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 390:
-#line 1370 "dhcp4_parser.yy" // lalr1.cc:907
+  case 402:
+#line 1397 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // Parse the option-data list entry map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 2390 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2369 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 391:
-#line 1374 "dhcp4_parser.yy" // lalr1.cc:907
+  case 403:
+#line 1401 "dhcp4_parser.yy" // lalr1.cc:859
     {
     /// @todo: the code or name parameters are required.
     // parsing completed
 }
-#line 2399 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2378 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 406:
-#line 1407 "dhcp4_parser.yy" // lalr1.cc:907
+  case 418:
+#line 1434 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2407 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2386 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 407:
-#line 1409 "dhcp4_parser.yy" // lalr1.cc:907
+  case 419:
+#line 1436 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr data(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("data", data);
     ctx.leave();
 }
-#line 2417 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2396 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 410:
-#line 1419 "dhcp4_parser.yy" // lalr1.cc:907
+  case 422:
+#line 1446 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr space(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("csv-format", space);
 }
-#line 2426 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2405 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 411:
-#line 1424 "dhcp4_parser.yy" // lalr1.cc:907
+  case 423:
+#line 1451 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr persist(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("always-send", persist);
 }
-#line 2435 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2414 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 412:
-#line 1432 "dhcp4_parser.yy" // lalr1.cc:907
+  case 424:
+#line 1459 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("pools", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.POOLS);
 }
-#line 2446 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2425 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 413:
-#line 1437 "dhcp4_parser.yy" // lalr1.cc:907
+  case 425:
+#line 1464 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2455 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2434 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 418:
-#line 1452 "dhcp4_parser.yy" // lalr1.cc:907
+  case 430:
+#line 1479 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 2465 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2444 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 419:
-#line 1456 "dhcp4_parser.yy" // lalr1.cc:907
+  case 431:
+#line 1483 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // The pool parameter is required.
     ctx.require("pool", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
     ctx.stack_.pop_back();
 }
-#line 2475 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2454 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 420:
-#line 1462 "dhcp4_parser.yy" // lalr1.cc:907
+  case 432:
+#line 1489 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // Parse the pool list entry map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 2485 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2464 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 421:
-#line 1466 "dhcp4_parser.yy" // lalr1.cc:907
+  case 433:
+#line 1493 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // The pool parameter is required.
     ctx.require("pool", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
     // parsing completed
 }
-#line 2495 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2474 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 431:
-#line 1485 "dhcp4_parser.yy" // lalr1.cc:907
+  case 443:
+#line 1512 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2503 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2482 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 432:
-#line 1487 "dhcp4_parser.yy" // lalr1.cc:907
+  case 444:
+#line 1514 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr pool(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("pool", pool);
     ctx.leave();
 }
-#line 2513 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2492 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 433:
-#line 1493 "dhcp4_parser.yy" // lalr1.cc:907
+  case 445:
+#line 1520 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2521 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2500 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 434:
-#line 1495 "dhcp4_parser.yy" // lalr1.cc:907
+  case 446:
+#line 1522 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr parent = ctx.stack_.back();
     ElementPtr user_context = yystack_[0].value.as< ElementPtr > ();
@@ -2544,19 +2523,19 @@ namespace isc { namespace dhcp {
     parent->set("user-context", user_context);
     ctx.leave();
 }
-#line 2548 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2527 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 435:
-#line 1518 "dhcp4_parser.yy" // lalr1.cc:907
+  case 447:
+#line 1545 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2556 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2535 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 436:
-#line 1520 "dhcp4_parser.yy" // lalr1.cc:907
+  case 448:
+#line 1547 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr parent = ctx.stack_.back();
     ElementPtr user_context(new MapElement(ctx.loc2pos(yystack_[3].location)));
@@ -2581,449 +2560,449 @@ namespace isc { namespace dhcp {
     parent->set("user-context", user_context);
     ctx.leave();
 }
-#line 2585 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2564 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 437:
-#line 1548 "dhcp4_parser.yy" // lalr1.cc:907
+  case 449:
+#line 1575 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("reservations", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.RESERVATIONS);
 }
-#line 2596 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2575 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 438:
-#line 1553 "dhcp4_parser.yy" // lalr1.cc:907
+  case 450:
+#line 1580 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2605 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2584 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 443:
-#line 1566 "dhcp4_parser.yy" // lalr1.cc:907
+  case 455:
+#line 1593 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 2615 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2594 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 444:
-#line 1570 "dhcp4_parser.yy" // lalr1.cc:907
+  case 456:
+#line 1597 "dhcp4_parser.yy" // lalr1.cc:859
     {
     /// @todo: an identifier parameter is required.
     ctx.stack_.pop_back();
 }
-#line 2624 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2603 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 445:
-#line 1575 "dhcp4_parser.yy" // lalr1.cc:907
+  case 457:
+#line 1602 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // Parse the reservations list entry map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 2634 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2613 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 446:
-#line 1579 "dhcp4_parser.yy" // lalr1.cc:907
+  case 458:
+#line 1606 "dhcp4_parser.yy" // lalr1.cc:859
     {
     /// @todo: an identifier parameter is required.
     // parsing completed
 }
-#line 2643 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2622 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 466:
-#line 1610 "dhcp4_parser.yy" // lalr1.cc:907
+  case 478:
+#line 1637 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2651 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2630 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 467:
-#line 1612 "dhcp4_parser.yy" // lalr1.cc:907
+  case 479:
+#line 1639 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr next_server(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("next-server", next_server);
     ctx.leave();
 }
-#line 2661 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2640 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 468:
-#line 1618 "dhcp4_parser.yy" // lalr1.cc:907
+  case 480:
+#line 1645 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2669 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2648 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 469:
-#line 1620 "dhcp4_parser.yy" // lalr1.cc:907
+  case 481:
+#line 1647 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr srv(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("server-hostname", srv);
     ctx.leave();
 }
-#line 2679 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2658 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 470:
-#line 1626 "dhcp4_parser.yy" // lalr1.cc:907
+  case 482:
+#line 1653 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2687 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2666 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 471:
-#line 1628 "dhcp4_parser.yy" // lalr1.cc:907
+  case 483:
+#line 1655 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr bootfile(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("boot-file-name", bootfile);
     ctx.leave();
 }
-#line 2697 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2676 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 472:
-#line 1634 "dhcp4_parser.yy" // lalr1.cc:907
+  case 484:
+#line 1661 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2705 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2684 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 473:
-#line 1636 "dhcp4_parser.yy" // lalr1.cc:907
+  case 485:
+#line 1663 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr addr(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("ip-address", addr);
     ctx.leave();
 }
-#line 2715 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2694 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 474:
-#line 1642 "dhcp4_parser.yy" // lalr1.cc:907
+  case 486:
+#line 1669 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("ip-addresses", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2726 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2705 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 475:
-#line 1647 "dhcp4_parser.yy" // lalr1.cc:907
+  case 487:
+#line 1674 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2735 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2714 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 476:
-#line 1652 "dhcp4_parser.yy" // lalr1.cc:907
+  case 488:
+#line 1679 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2743 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2722 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 477:
-#line 1654 "dhcp4_parser.yy" // lalr1.cc:907
+  case 489:
+#line 1681 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr d(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("duid", d);
     ctx.leave();
 }
-#line 2753 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2732 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 478:
-#line 1660 "dhcp4_parser.yy" // lalr1.cc:907
+  case 490:
+#line 1687 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2761 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2740 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 479:
-#line 1662 "dhcp4_parser.yy" // lalr1.cc:907
+  case 491:
+#line 1689 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("hw-address", hw);
     ctx.leave();
 }
-#line 2771 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2750 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 480:
-#line 1668 "dhcp4_parser.yy" // lalr1.cc:907
+  case 492:
+#line 1695 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2779 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2758 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 481:
-#line 1670 "dhcp4_parser.yy" // lalr1.cc:907
+  case 493:
+#line 1697 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("client-id", hw);
     ctx.leave();
 }
-#line 2789 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2768 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 482:
-#line 1676 "dhcp4_parser.yy" // lalr1.cc:907
+  case 494:
+#line 1703 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2797 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2776 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 483:
-#line 1678 "dhcp4_parser.yy" // lalr1.cc:907
+  case 495:
+#line 1705 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("circuit-id", hw);
     ctx.leave();
 }
-#line 2807 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2786 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 484:
-#line 1684 "dhcp4_parser.yy" // lalr1.cc:907
+  case 496:
+#line 1711 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2815 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2794 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 485:
-#line 1686 "dhcp4_parser.yy" // lalr1.cc:907
+  case 497:
+#line 1713 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("flex-id", hw);
     ctx.leave();
 }
-#line 2825 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2804 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 486:
-#line 1692 "dhcp4_parser.yy" // lalr1.cc:907
+  case 498:
+#line 1719 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2833 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2812 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 487:
-#line 1694 "dhcp4_parser.yy" // lalr1.cc:907
+  case 499:
+#line 1721 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr host(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("hostname", host);
     ctx.leave();
 }
-#line 2843 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2822 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 488:
-#line 1700 "dhcp4_parser.yy" // lalr1.cc:907
+  case 500:
+#line 1727 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr c(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("client-classes", c);
     ctx.stack_.push_back(c);
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2854 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2833 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 489:
-#line 1705 "dhcp4_parser.yy" // lalr1.cc:907
+  case 501:
+#line 1732 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2863 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2842 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 490:
-#line 1713 "dhcp4_parser.yy" // lalr1.cc:907
+  case 502:
+#line 1740 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("relay", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.RELAY);
 }
-#line 2874 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2853 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 491:
-#line 1718 "dhcp4_parser.yy" // lalr1.cc:907
+  case 503:
+#line 1745 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2883 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2862 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 494:
-#line 1730 "dhcp4_parser.yy" // lalr1.cc:907
+  case 506:
+#line 1757 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("client-classes", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.CLIENT_CLASSES);
 }
-#line 2894 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2873 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 495:
-#line 1735 "dhcp4_parser.yy" // lalr1.cc:907
+  case 507:
+#line 1762 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2903 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2882 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 498:
-#line 1744 "dhcp4_parser.yy" // lalr1.cc:907
+  case 510:
+#line 1771 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 2913 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2892 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 499:
-#line 1748 "dhcp4_parser.yy" // lalr1.cc:907
+  case 511:
+#line 1775 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // The name client class parameter is required.
     ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
     ctx.stack_.pop_back();
 }
-#line 2923 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2902 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 516:
-#line 1777 "dhcp4_parser.yy" // lalr1.cc:907
+  case 528:
+#line 1804 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2931 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2910 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 517:
-#line 1779 "dhcp4_parser.yy" // lalr1.cc:907
+  case 529:
+#line 1806 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr test(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("test", test);
     ctx.leave();
 }
-#line 2941 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2920 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 518:
-#line 1785 "dhcp4_parser.yy" // lalr1.cc:907
+  case 530:
+#line 1812 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("only-if-required", b);
 }
-#line 2950 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2929 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 519:
-#line 1794 "dhcp4_parser.yy" // lalr1.cc:907
+  case 531:
+#line 1821 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr time(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("dhcp4o6-port", time);
 }
-#line 2959 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2938 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 520:
-#line 1801 "dhcp4_parser.yy" // lalr1.cc:907
+  case 532:
+#line 1828 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("control-socket", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.CONTROL_SOCKET);
 }
-#line 2970 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2949 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 521:
-#line 1806 "dhcp4_parser.yy" // lalr1.cc:907
+  case 533:
+#line 1833 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2979 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2958 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 529:
-#line 1822 "dhcp4_parser.yy" // lalr1.cc:907
+  case 541:
+#line 1849 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2987 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2966 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 530:
-#line 1824 "dhcp4_parser.yy" // lalr1.cc:907
+  case 542:
+#line 1851 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr stype(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("socket-type", stype);
     ctx.leave();
 }
-#line 2997 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2976 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 531:
-#line 1830 "dhcp4_parser.yy" // lalr1.cc:907
+  case 543:
+#line 1857 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 3005 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2984 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 532:
-#line 1832 "dhcp4_parser.yy" // lalr1.cc:907
+  case 544:
+#line 1859 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr name(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("socket-name", name);
     ctx.leave();
 }
-#line 3015 "dhcp4_parser.cc" // lalr1.cc:907
+#line 2994 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 533:
-#line 1841 "dhcp4_parser.yy" // lalr1.cc:907
+  case 545:
+#line 1868 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 3023 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3002 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 534:
-#line 1843 "dhcp4_parser.yy" // lalr1.cc:907
+  case 546:
+#line 1870 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr qc = yystack_[0].value.as< ElementPtr > ();
     ctx.stack_.back()->set("dhcp-queue-control", qc);
@@ -3057,635 +3036,633 @@ namespace isc { namespace dhcp {
 
     ctx.leave();
 }
-#line 3061 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3040 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 535:
-#line 1879 "dhcp4_parser.yy" // lalr1.cc:907
+  case 547:
+#line 1906 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("dhcp-ddns", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.DHCP_DDNS);
 }
-#line 3072 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3051 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 536:
-#line 1884 "dhcp4_parser.yy" // lalr1.cc:907
+  case 548:
+#line 1911 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // The enable updates DHCP DDNS parameter is required.
     ctx.require("enable-updates", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location));
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 3083 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3062 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 537:
-#line 1891 "dhcp4_parser.yy" // lalr1.cc:907
+  case 549:
+#line 1918 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // Parse the dhcp-ddns map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 3093 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3072 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 538:
-#line 1895 "dhcp4_parser.yy" // lalr1.cc:907
+  case 550:
+#line 1922 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // The enable updates DHCP DDNS parameter is required.
     ctx.require("enable-updates", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
     // parsing completed
 }
-#line 3103 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3082 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 559:
-#line 1925 "dhcp4_parser.yy" // lalr1.cc:907
+  case 571:
+#line 1952 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("enable-updates", b);
 }
-#line 3112 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3091 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 560:
-#line 1930 "dhcp4_parser.yy" // lalr1.cc:907
+  case 572:
+#line 1957 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 3120 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3099 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 561:
-#line 1932 "dhcp4_parser.yy" // lalr1.cc:907
+  case 573:
+#line 1959 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("qualifying-suffix", s);
     ctx.leave();
 }
-#line 3130 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3109 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 562:
-#line 1938 "dhcp4_parser.yy" // lalr1.cc:907
+  case 574:
+#line 1965 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 3138 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3117 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 563:
-#line 1940 "dhcp4_parser.yy" // lalr1.cc:907
+  case 575:
+#line 1967 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("server-ip", s);
     ctx.leave();
 }
-#line 3148 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3127 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 564:
-#line 1946 "dhcp4_parser.yy" // lalr1.cc:907
+  case 576:
+#line 1973 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("server-port", i);
 }
-#line 3157 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3136 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 565:
-#line 1951 "dhcp4_parser.yy" // lalr1.cc:907
+  case 577:
+#line 1978 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 3165 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3144 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 566:
-#line 1953 "dhcp4_parser.yy" // lalr1.cc:907
+  case 578:
+#line 1980 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("sender-ip", s);
     ctx.leave();
 }
-#line 3175 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3154 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 567:
-#line 1959 "dhcp4_parser.yy" // lalr1.cc:907
+  case 579:
+#line 1986 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("sender-port", i);
 }
-#line 3184 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3163 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 568:
-#line 1964 "dhcp4_parser.yy" // lalr1.cc:907
+  case 580:
+#line 1991 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("max-queue-size", i);
 }
-#line 3193 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3172 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 569:
-#line 1969 "dhcp4_parser.yy" // lalr1.cc:907
+  case 581:
+#line 1996 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NCR_PROTOCOL);
 }
-#line 3201 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3180 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 570:
-#line 1971 "dhcp4_parser.yy" // lalr1.cc:907
+  case 582:
+#line 1998 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.back()->set("ncr-protocol", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 3210 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3189 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 571:
-#line 1977 "dhcp4_parser.yy" // lalr1.cc:907
+  case 583:
+#line 2004 "dhcp4_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("UDP", ctx.loc2pos(yystack_[0].location))); }
-#line 3216 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3195 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 572:
-#line 1978 "dhcp4_parser.yy" // lalr1.cc:907
+  case 584:
+#line 2005 "dhcp4_parser.yy" // lalr1.cc:859
     { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("TCP", ctx.loc2pos(yystack_[0].location))); }
-#line 3222 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3201 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 573:
-#line 1981 "dhcp4_parser.yy" // lalr1.cc:907
+  case 585:
+#line 2008 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NCR_FORMAT);
 }
-#line 3230 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3209 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 574:
-#line 1983 "dhcp4_parser.yy" // lalr1.cc:907
+  case 586:
+#line 2010 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr json(new StringElement("JSON", ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("ncr-format", json);
     ctx.leave();
 }
-#line 3240 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3219 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 575:
-#line 1989 "dhcp4_parser.yy" // lalr1.cc:907
+  case 587:
+#line 2016 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("override-no-update", b);
 }
-#line 3249 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3228 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 576:
-#line 1994 "dhcp4_parser.yy" // lalr1.cc:907
+  case 588:
+#line 2021 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("override-client-update", b);
 }
-#line 3258 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3237 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 577:
-#line 1999 "dhcp4_parser.yy" // lalr1.cc:907
+  case 589:
+#line 2026 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.REPLACE_CLIENT_NAME);
 }
-#line 3266 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3245 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 578:
-#line 2001 "dhcp4_parser.yy" // lalr1.cc:907
+  case 590:
+#line 2028 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.back()->set("replace-client-name", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 3275 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3254 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 579:
-#line 2007 "dhcp4_parser.yy" // lalr1.cc:907
+  case 591:
+#line 2034 "dhcp4_parser.yy" // lalr1.cc:859
     {
       yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("when-present", ctx.loc2pos(yystack_[0].location)));
       }
-#line 3283 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3262 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 580:
-#line 2010 "dhcp4_parser.yy" // lalr1.cc:907
+  case 592:
+#line 2037 "dhcp4_parser.yy" // lalr1.cc:859
     {
       yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("never", ctx.loc2pos(yystack_[0].location)));
       }
-#line 3291 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3270 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 581:
-#line 2013 "dhcp4_parser.yy" // lalr1.cc:907
+  case 593:
+#line 2040 "dhcp4_parser.yy" // lalr1.cc:859
     {
       yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("always", ctx.loc2pos(yystack_[0].location)));
       }
-#line 3299 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3278 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 582:
-#line 2016 "dhcp4_parser.yy" // lalr1.cc:907
+  case 594:
+#line 2043 "dhcp4_parser.yy" // lalr1.cc:859
     {
       yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("when-not-present", ctx.loc2pos(yystack_[0].location)));
       }
-#line 3307 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3286 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 583:
-#line 2019 "dhcp4_parser.yy" // lalr1.cc:907
+  case 595:
+#line 2046 "dhcp4_parser.yy" // lalr1.cc:859
     {
       error(yystack_[0].location, "boolean values for the replace-client-name are "
                 "no longer supported");
       }
-#line 3316 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3295 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 584:
-#line 2025 "dhcp4_parser.yy" // lalr1.cc:907
+  case 596:
+#line 2052 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 3324 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3303 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 585:
-#line 2027 "dhcp4_parser.yy" // lalr1.cc:907
+  case 597:
+#line 2054 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("generated-prefix", s);
     ctx.leave();
 }
-#line 3334 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3313 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 586:
-#line 2033 "dhcp4_parser.yy" // lalr1.cc:907
+  case 598:
+#line 2060 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 3342 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3321 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 587:
-#line 2035 "dhcp4_parser.yy" // lalr1.cc:907
+  case 599:
+#line 2062 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("hostname-char-set", s);
     ctx.leave();
 }
-#line 3352 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3331 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 588:
-#line 2041 "dhcp4_parser.yy" // lalr1.cc:907
+  case 600:
+#line 2068 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 3360 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3339 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 589:
-#line 2043 "dhcp4_parser.yy" // lalr1.cc:907
+  case 601:
+#line 2070 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("hostname-char-replacement", s);
     ctx.leave();
 }
-#line 3370 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3349 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 590:
-#line 2052 "dhcp4_parser.yy" // lalr1.cc:907
+  case 602:
+#line 2079 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 3378 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3357 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 591:
-#line 2054 "dhcp4_parser.yy" // lalr1.cc:907
+  case 603:
+#line 2081 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.back()->set("Dhcp6", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 3387 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3366 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 592:
-#line 2059 "dhcp4_parser.yy" // lalr1.cc:907
+  case 604:
+#line 2086 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 3395 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3374 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 593:
-#line 2061 "dhcp4_parser.yy" // lalr1.cc:907
+  case 605:
+#line 2088 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.back()->set("DhcpDdns", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 3404 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3383 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 594:
-#line 2066 "dhcp4_parser.yy" // lalr1.cc:907
+  case 606:
+#line 2093 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 3412 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3391 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 595:
-#line 2068 "dhcp4_parser.yy" // lalr1.cc:907
+  case 607:
+#line 2095 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.back()->set("Control-agent", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 3421 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3400 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 596:
-#line 2073 "dhcp4_parser.yy" // lalr1.cc:907
+  case 608:
+#line 2100 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("config-control", i);
     ctx.stack_.push_back(i);
     ctx.enter(ctx.CONFIG_CONTROL);
 }
-#line 3432 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3411 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 597:
-#line 2078 "dhcp4_parser.yy" // lalr1.cc:907
+  case 609:
+#line 2105 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // No config control params are required
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 3442 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3421 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 598:
-#line 2084 "dhcp4_parser.yy" // lalr1.cc:907
+  case 610:
+#line 2111 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // Parse the config-control map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 3452 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3431 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 599:
-#line 2088 "dhcp4_parser.yy" // lalr1.cc:907
+  case 611:
+#line 2115 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // No config_control params are required
     // parsing completed
 }
-#line 3461 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3440 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 603:
-#line 2102 "dhcp4_parser.yy" // lalr1.cc:907
+  case 615:
+#line 2129 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("config-databases", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.CONFIG_DATABASE);
 }
-#line 3472 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3451 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 604:
-#line 2107 "dhcp4_parser.yy" // lalr1.cc:907
+  case 616:
+#line 2134 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 3481 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3460 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 605:
-#line 2117 "dhcp4_parser.yy" // lalr1.cc:907
+  case 617:
+#line 2144 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("Logging", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.LOGGING);
 }
-#line 3492 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3471 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 606:
-#line 2122 "dhcp4_parser.yy" // lalr1.cc:907
+  case 618:
+#line 2149 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 3501 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3480 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 607:
-#line 2127 "dhcp4_parser.yy" // lalr1.cc:907
+  case 619:
+#line 2154 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // Parse the Logging map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 3511 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3490 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 608:
-#line 2131 "dhcp4_parser.yy" // lalr1.cc:907
+  case 620:
+#line 2158 "dhcp4_parser.yy" // lalr1.cc:859
     {
     // parsing completed
 }
-#line 3519 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3498 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 612:
-#line 2147 "dhcp4_parser.yy" // lalr1.cc:907
+  case 624:
+#line 2174 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("loggers", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.LOGGERS);
 }
-#line 3530 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3509 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 613:
-#line 2152 "dhcp4_parser.yy" // lalr1.cc:907
+  case 625:
+#line 2179 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 3539 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3518 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 616:
-#line 2164 "dhcp4_parser.yy" // lalr1.cc:907
+  case 628:
+#line 2191 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(l);
     ctx.stack_.push_back(l);
 }
-#line 3549 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3528 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 617:
-#line 2168 "dhcp4_parser.yy" // lalr1.cc:907
+  case 629:
+#line 2195 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 3557 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3536 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 627:
-#line 2185 "dhcp4_parser.yy" // lalr1.cc:907
+  case 639:
+#line 2212 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr dl(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("debuglevel", dl);
 }
-#line 3566 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3545 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 628:
-#line 2190 "dhcp4_parser.yy" // lalr1.cc:907
+  case 640:
+#line 2217 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 3574 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3553 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 629:
-#line 2192 "dhcp4_parser.yy" // lalr1.cc:907
+  case 641:
+#line 2219 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("severity", sev);
     ctx.leave();
 }
-#line 3584 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3563 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 630:
-#line 2198 "dhcp4_parser.yy" // lalr1.cc:907
+  case 642:
+#line 2225 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("output_options", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.OUTPUT_OPTIONS);
 }
-#line 3595 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3574 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 631:
-#line 2203 "dhcp4_parser.yy" // lalr1.cc:907
+  case 643:
+#line 2230 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 3604 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3583 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 634:
-#line 2212 "dhcp4_parser.yy" // lalr1.cc:907
+  case 646:
+#line 2239 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 3614 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3593 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 635:
-#line 2216 "dhcp4_parser.yy" // lalr1.cc:907
+  case 647:
+#line 2243 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.stack_.pop_back();
 }
-#line 3622 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3601 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 642:
-#line 2230 "dhcp4_parser.yy" // lalr1.cc:907
+  case 654:
+#line 2257 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 3630 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3609 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 643:
-#line 2232 "dhcp4_parser.yy" // lalr1.cc:907
+  case 655:
+#line 2259 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("output", sev);
     ctx.leave();
 }
-#line 3640 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3619 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 644:
-#line 2238 "dhcp4_parser.yy" // lalr1.cc:907
+  case 656:
+#line 2265 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr flush(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("flush", flush);
 }
-#line 3649 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3628 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 645:
-#line 2243 "dhcp4_parser.yy" // lalr1.cc:907
+  case 657:
+#line 2270 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr maxsize(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("maxsize", maxsize);
 }
-#line 3658 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3637 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
-  case 646:
-#line 2248 "dhcp4_parser.yy" // lalr1.cc:907
+  case 658:
+#line 2275 "dhcp4_parser.yy" // lalr1.cc:859
     {
     ElementPtr maxver(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("maxver", maxver);
 }
-#line 3667 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3646 "dhcp4_parser.cc" // lalr1.cc:859
     break;
 
 
-#line 3671 "dhcp4_parser.cc" // lalr1.cc:907
+#line 3650 "dhcp4_parser.cc" // lalr1.cc:859
             default:
               break;
             }
         }
-#if YY_EXCEPTIONS
       catch (const syntax_error& yyexc)
         {
           error (yyexc);
           YYERROR;
         }
-#endif // YY_EXCEPTIONS
       YY_SYMBOL_PRINT ("-> $$ =", yylhs);
       yypop_ (yylen);
       yylen = 0;
       YY_STACK_PRINT ();
 
       // Shift the result of the reduction.
-      yypush_ (YY_NULLPTR, YY_MOVE (yylhs));
+      yypush_ (YY_NULLPTR, yylhs);
     }
     goto yynewstate;
 
@@ -3731,6 +3708,7 @@ namespace isc { namespace dhcp {
        code.  */
     if (false)
       goto yyerrorlab;
+    yyerror_range[1].location = yystack_[yylen - 1].location;
     /* Do not reclaim the symbols of the rule whose action triggered
        this YYERROR.  */
     yypop_ (yylen);
@@ -3773,7 +3751,7 @@ namespace isc { namespace dhcp {
 
       // Shift the error token.
       error_token.state = yyn;
-      yypush_ ("Shifting", YY_MOVE (error_token));
+      yypush_ ("Shifting", error_token);
     }
     goto yynewstate;
 
@@ -3802,12 +3780,12 @@ namespace isc { namespace dhcp {
 
     return yyresult;
   }
-#if YY_EXCEPTIONS
     catch (...)
       {
-        YYCDEBUG << "Exception caught: cleaning lookahead and stack\n";
+        YYCDEBUG << "Exception caught: cleaning lookahead and stack"
+                 << std::endl;
         // Do not try to display the values of the reclaimed symbols,
-        // as their printers might throw an exception.
+        // as their printer might throw an exception.
         if (!yyla.empty ())
           yy_destroy_ (YY_NULLPTR, yyla);
 
@@ -3818,13 +3796,12 @@ namespace isc { namespace dhcp {
           }
         throw;
       }
-#endif // YY_EXCEPTIONS
   }
 
   void
   Dhcp4Parser::error (const syntax_error& yyexc)
   {
-    error (yyexc.location, yyexc.what ());
+    error (yyexc.location, yyexc.what());
   }
 
   // Generate an error message.
@@ -3900,13 +3877,12 @@ namespace isc { namespace dhcp {
         case N:                               \
           yyformat = S;                       \
         break
-      default: // Avoid compiler warnings.
-        YYCASE_ (0, YY_("syntax error"));
-        YYCASE_ (1, YY_("syntax error, unexpected %s"));
-        YYCASE_ (2, YY_("syntax error, unexpected %s, expecting %s"));
-        YYCASE_ (3, YY_("syntax error, unexpected %s, expecting %s or %s"));
-        YYCASE_ (4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
-        YYCASE_ (5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
+        YYCASE_(0, YY_("syntax error"));
+        YYCASE_(1, YY_("syntax error, unexpected %s"));
+        YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
+        YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
+        YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
+        YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
 #undef YYCASE_
       }
 
@@ -3925,703 +3901,714 @@ namespace isc { namespace dhcp {
   }
 
 
-  const short Dhcp4Parser::yypact_ninf_ = -797;
+  const short int Dhcp4Parser::yypact_ninf_ = -812;
 
   const signed char Dhcp4Parser::yytable_ninf_ = -1;
 
-  const short
+  const short int
   Dhcp4Parser::yypact_[] =
   {
-     403,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,  -797,  -797,  -797,    43,    35,    38,    50,    58,
-      60,    64,   103,   110,   142,   148,   161,   163,   185,   189,
-    -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,    35,   -20,
-      17,    71,    32,   152,   -15,   239,   146,   242,    54,   -25,
-     361,    76,   206,  -797,   219,   224,   233,   237,   244,  -797,
-    -797,  -797,  -797,  -797,   287,  -797,    55,  -797,  -797,  -797,
-    -797,  -797,  -797,  -797,  -797,  -797,   295,   297,   299,  -797,
-    -797,  -797,  -797,  -797,  -797,   303,   326,   354,   364,  -797,
-    -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,   367,  -797,  -797,  -797,  -797,    61,  -797,  -797,
-    -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,  -797,  -797,  -797,   369,  -797,    72,  -797,  -797,
-    -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,   371,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,    86,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,  -797,  -797,  -797,  -797,   135,  -797,  -797,  -797,
-    -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,  -797,   273,   286,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,  -797,  -797,  -797,  -797,  -797,   342,  -797,  -797,
-     375,  -797,  -797,  -797,   382,  -797,  -797,   345,   362,  -797,
-    -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,   383,   385,  -797,  -797,  -797,  -797,   387,   388,
-    -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,   138,  -797,  -797,  -797,   386,  -797,  -797,   389,
-    -797,   392,   396,  -797,  -797,   397,   398,  -797,  -797,  -797,
-    -797,  -797,  -797,  -797,   166,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,   186,  -797,  -797,  -797,   187,  -797,  -797,  -797,
-      35,    35,  -797,    77,   405,   408,   409,   410,   411,  -797,
-      17,  -797,   415,   418,   422,   250,   259,   265,   430,   432,
-     435,   436,   437,   438,   278,   279,   280,   282,   439,   445,
-     446,   463,   464,   465,   466,   467,   468,   469,   470,   471,
-     472,   311,   488,   489,   490,    71,  -797,   491,   492,   493,
-     332,    32,  -797,   497,   498,   499,   500,   501,   504,   343,
-     506,   507,   509,   152,  -797,   510,   -15,  -797,   511,   512,
-     513,   514,   515,   516,   517,   518,  -797,   239,  -797,   519,
-     520,   365,   523,   524,   526,   366,  -797,   242,   528,   368,
-     373,  -797,    54,   529,   531,   -13,  -797,   374,   533,   535,
-     378,   541,   380,   381,   544,   545,   384,   400,   546,   566,
-     568,   569,   361,  -797,   570,    76,  -797,   571,   206,  -797,
-    -797,  -797,   572,   573,   574,    35,    35,    35,  -797,   575,
-     576,   577,  -797,  -797,  -797,   412,   413,   420,   579,   580,
-     583,  -797,  -797,  -797,  -797,   424,   585,   586,   587,   588,
-     589,   429,   172,   590,   592,   593,   594,   595,  -797,   596,
-     589,   597,  -797,   600,   304,   309,  -797,  -797,   441,   442,
-     443,   604,   447,   448,  -797,   600,   449,   603,  -797,   450,
-    -797,   600,   451,   452,   453,   454,   455,   456,   457,  -797,
-     458,   459,  -797,   460,   461,   462,  -797,  -797,   473,  -797,
-    -797,  -797,   474,    35,  -797,  -797,   475,   476,  -797,   477,
-    -797,  -797,    11,   479,  -797,  -797,   -29,   478,   480,   481,
-    -797,   623,  -797,   624,  -797,    35,    71,    76,  -797,  -797,
-    -797,   206,    32,   578,  -797,  -797,  -797,   414,   414,   625,
-    -797,   626,   627,   628,   629,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,  -797,    66,   630,   637,   640,     5,    95,  -797,
-     361,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,   641,  -797,  -797,  -797,  -797,   263,  -797,  -797,
-    -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,   642,   625,  -797,   190,   196,   231,   238,  -797,   261,
-    -797,  -797,  -797,  -797,  -797,  -797,   646,   647,   648,   649,
-     650,  -797,  -797,   651,   652,   653,   654,   655,  -797,   262,
-    -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,   270,  -797,
-     656,   657,  -797,  -797,   658,   660,  -797,  -797,   659,   663,
-    -797,  -797,   661,   665,  -797,  -797,   664,   666,  -797,  -797,
-    -797,  -797,  -797,  -797,   211,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,   232,  -797,  -797,   667,   668,  -797,  -797,   669,
-     671,  -797,   672,   673,   674,   675,   676,   677,   274,  -797,
-    -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,   276,  -797,  -797,  -797,   277,   496,  -797,   678,   679,
-    -797,  -797,  -797,  -797,   622,  -797,   335,  -797,   680,  -797,
-    -797,  -797,  -797,   681,   578,  -797,   683,   684,   685,   686,
-     434,   525,   530,   527,   532,   687,   688,   534,   536,   537,
-     538,   539,   414,  -797,  -797,   414,  -797,   625,   152,  -797,
-     626,   242,  -797,   627,    54,  -797,   628,   195,  -797,   629,
-      66,  -797,   234,   630,  -797,   239,  -797,   637,   -25,  -797,
-     640,   540,   542,   543,   547,   548,   549,     5,  -797,   690,
-     693,    95,  -797,  -797,  -797,   695,   696,   -15,  -797,   641,
-     701,  -797,    10,   642,  -797,  -797,   551,  -797,   347,   552,
-     553,   554,  -797,  -797,  -797,  -797,  -797,   555,   556,  -797,
-    -797,  -797,  -797,  -797,  -797,   284,  -797,   285,  -797,   702,
-    -797,   703,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,  -797,  -797,  -797,   292,  -797,  -797,  -797,  -797,
-    -797,  -797,  -797,  -797,  -797,  -797,  -797,   708,  -797,  -797,
-    -797,  -797,  -797,  -797,  -797,  -797,  -797,   714,   720,  -797,
-    -797,  -797,  -797,  -797,   716,  -797,   319,  -797,  -797,  -797,
-    -797,  -797,  -797,  -797,  -797,   560,   561,  -797,  -797,   562,
-     337,  -797,   600,  -797,   724,  -797,  -797,  -797,  -797,  -797,
-     339,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,   195,  -797,   725,   563,  -797,   234,  -797,  -797,  -797,
-    -797,  -797,  -797,  -797,   726,   567,   728,    10,  -797,  -797,
-     581,  -797,  -797,   729,  -797,   582,  -797,  -797,   730,  -797,
-    -797,   349,  -797,   -10,   730,  -797,  -797,   731,   732,   734,
-     346,  -797,  -797,  -797,  -797,  -797,  -797,   735,   584,   607,
-     610,   -10,  -797,   598,  -797,  -797,  -797,  -797,  -797
+     437,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,    28,    35,    58,    60,    62,
+      64,    75,    94,    96,   108,   110,   143,   160,   169,   177,
+    -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,    35,   -78,
+      17,    82,    43,   154,   181,   397,    32,    54,   399,   -27,
+     449,   -11,   152,  -812,   190,   196,   206,   204,   227,  -812,
+    -812,  -812,  -812,  -812,   228,  -812,    81,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,  -812,   247,   253,   263,  -812,
+    -812,  -812,  -812,  -812,  -812,   281,   282,   292,   337,  -812,
+    -812,  -812,  -812,   338,   344,   346,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,   347,  -812,  -812,  -812,  -812,
+      83,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,
+    -812,   348,  -812,   139,  -812,  -812,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,  -812,  -812,   349,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,
+     146,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,   157,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,
+    -812,  -812,   235,   323,  -812,  -812,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,  -812,   326,  -812,  -812,   350,
+    -812,  -812,  -812,   353,  -812,  -812,   328,   358,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,
+    -812,   360,   361,  -812,  -812,  -812,  -812,   354,   363,  -812,
+    -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,
+    -812,   170,  -812,  -812,  -812,   366,  -812,  -812,   368,  -812,
+     371,   372,  -812,  -812,   373,   376,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,   183,  -812,  -812,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,
+    -812,   192,  -812,  -812,  -812,   213,  -812,  -812,  -812,    35,
+      35,  -812,   199,   379,   381,   383,   387,   389,  -812,    17,
+    -812,   390,   391,   392,   230,   231,   232,   394,   395,   403,
+     404,   407,   408,   244,   245,   250,   252,   412,   423,   426,
+     427,   267,   264,   269,   441,   442,   445,   446,   451,   452,
+     453,   454,   455,   284,   457,   458,   465,    82,  -812,   467,
+     468,   469,   299,    43,  -812,   470,   471,   476,   477,   478,
+     479,   316,   480,   482,   484,   154,  -812,   485,   181,  -812,
+     486,   487,   488,   497,   498,   499,   515,   516,  -812,   397,
+    -812,   519,   520,   356,   522,   527,   528,   362,  -812,    54,
+     530,   364,   365,  -812,   399,   533,   534,    46,  -812,   370,
+     535,   538,   374,   541,   377,   378,   544,   545,   380,   385,
+     546,   548,   550,   553,   449,  -812,   555,   -11,  -812,   556,
+     152,  -812,  -812,  -812,   557,   562,   576,    35,    35,    35,
+    -812,   578,   580,   581,  -812,  -812,  -812,   396,   438,   439,
+     598,   601,   558,  -812,  -812,  -812,  -812,   443,   604,   605,
+     607,  -812,  -812,  -812,   608,   609,   447,   220,   613,   614,
+     615,   616,   617,  -812,   618,   609,   619,  -812,   622,   158,
+     173,  -812,  -812,   460,   461,   462,   626,   464,   472,  -812,
+     622,   473,   628,  -812,   474,  -812,   622,   475,   481,   483,
+     489,   490,   491,   492,  -812,   493,   494,  -812,   495,   496,
+     500,  -812,  -812,   501,  -812,  -812,  -812,   502,    35,  -812,
+    -812,   503,   504,  -812,   505,  -812,  -812,    29,   509,  -812,
+    -812,    87,   506,   507,   508,  -812,   631,  -812,   632,  -812,
+      35,    82,   -11,  -812,  -812,  -812,   152,    43,   539,  -812,
+    -812,  -812,   466,   466,   638,  -812,   639,   640,   641,   643,
+    -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,   -23,   645,
+     646,   647,   167,   -20,  -812,   449,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,  -812,  -812,   648,  -812,  -812,
+    -812,  -812,   136,  -812,  -812,  -812,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,  -812,   649,   638,  -812,   238,
+     239,   265,   266,  -812,   279,  -812,  -812,  -812,  -812,  -812,
+    -812,   610,   629,   634,   635,   661,  -812,  -812,   662,   663,
+     673,   674,   675,  -812,   285,  -812,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,   286,  -812,   676,   620,  -812,  -812,   677,
+     678,  -812,  -812,   679,   681,  -812,  -812,   680,   684,  -812,
+    -812,   682,   686,  -812,  -812,  -812,  -812,  -812,  -812,    99,
+    -812,  -812,  -812,  -812,  -812,  -812,  -812,   113,  -812,  -812,
+     685,   687,  -812,  -812,   688,   689,  -812,   691,   692,   693,
+     694,   695,   696,   294,  -812,  -812,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,  -812,   295,  -812,  -812,  -812,
+     301,   512,  -812,   697,   690,  -812,  -812,  -812,  -812,   698,
+    -812,   125,  -812,   699,  -812,  -812,  -812,  -812,   700,   539,
+    -812,   703,   704,   705,   706,   532,   531,   542,   543,   547,
+     708,   709,   549,   551,   552,   554,   559,   466,  -812,  -812,
+     466,  -812,   638,   154,  -812,   639,    54,  -812,   640,   399,
+    -812,   641,   237,  -812,   643,   -23,  -812,   191,   645,  -812,
+     397,  -812,   646,   -27,  -812,   647,   560,   563,   564,   565,
+     566,   567,   167,  -812,   711,   713,   -20,  -812,  -812,  -812,
+     716,   721,   181,  -812,   648,   715,  -812,   -17,   649,  -812,
+    -812,   569,  -812,   310,   570,   571,   572,  -812,  -812,  -812,
+    -812,  -812,   573,   574,  -812,  -812,  -812,  -812,  -812,  -812,
+     312,  -812,   315,  -812,   717,  -812,   718,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,   321,  -812,  -812,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,   723,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,   720,   728,  -812,  -812,  -812,
+    -812,  -812,   735,  -812,   322,  -812,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,   577,   579,  -812,  -812,   582,   324,  -812,
+     622,  -812,   740,  -812,  -812,  -812,  -812,  -812,   330,  -812,
+    -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,   237,
+    -812,   742,   583,  -812,   191,  -812,  -812,  -812,  -812,  -812,
+    -812,  -812,   744,   584,   745,   -17,  -812,  -812,   587,  -812,
+    -812,   746,  -812,   588,  -812,  -812,   750,  -812,  -812,   140,
+    -812,  -100,   750,  -812,  -812,   748,   754,   755,   332,  -812,
+    -812,  -812,  -812,  -812,  -812,   756,   590,   593,   595,  -100,
+    -812,   597,  -812,  -812,  -812,  -812,  -812
   };
 
-  const unsigned short
+  const unsigned short int
   Dhcp4Parser::yydefact_[] =
   {
        0,     2,     4,     6,     8,    10,    12,    14,    16,    18,
       20,    22,    24,    26,    28,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        1,    45,    38,    34,    33,    30,    31,    32,    37,     3,
-      35,    36,    58,     5,    70,     7,   128,     9,   265,    11,
-     420,    13,   445,    15,   345,    17,   353,    19,   390,    21,
-     230,    23,   537,    25,   607,    27,   598,    29,    47,    41,
-       0,     0,     0,     0,     0,   447,     0,   355,   392,     0,
+      35,    36,    58,     5,    70,     7,   134,     9,   271,    11,
+     432,    13,   457,    15,   357,    17,   365,    19,   402,    21,
+     236,    23,   549,    25,   619,    27,   610,    29,    47,    41,
+       0,     0,     0,     0,     0,   459,     0,   367,   404,     0,
        0,     0,     0,    49,     0,    48,     0,     0,    42,    68,
-     605,   590,   592,   594,     0,    67,     0,    60,    62,    64,
-      65,    66,    63,   596,   117,   143,     0,     0,     0,   466,
-     468,   470,   141,   150,   152,     0,     0,     0,     0,   112,
-     257,   343,   382,   314,   433,   435,   307,   208,   494,   437,
-     222,   241,     0,   520,   533,   535,   107,     0,    72,    74,
-      75,    76,    77,   105,    94,    95,    96,    80,    81,   102,
-      82,    83,    84,    88,    89,    78,   106,    79,    86,    87,
-     100,   101,   103,    97,    98,    99,    85,    90,    91,    92,
-      93,   104,   130,   132,   136,     0,   127,     0,   119,   121,
-     122,   123,   124,   125,   126,   295,   297,   299,   412,   293,
-     301,     0,   305,   303,   490,   292,   269,   270,   271,   282,
-     283,     0,   267,   274,   287,   288,   289,   275,   277,   278,
-     280,   276,   272,   273,   290,   291,   279,   284,   285,   286,
-     281,   431,   430,   426,   427,   425,     0,   422,   424,   428,
-     429,   488,   476,   478,   482,   480,   486,   484,   472,   465,
-     459,   463,   464,     0,   448,   449,   460,   461,   462,   456,
-     451,   457,   453,   454,   455,   458,   452,     0,   372,   193,
-       0,   376,   374,   379,     0,   368,   369,     0,   356,   357,
-     359,   371,   360,   361,   362,   378,   363,   364,   365,   366,
-     367,   406,     0,     0,   404,   405,   408,   409,     0,   393,
-     394,   396,   397,   398,   399,   400,   401,   402,   403,   237,
-     239,   234,     0,   232,   235,   236,     0,   560,   562,     0,
-     565,     0,     0,   569,   573,     0,     0,   577,   584,   586,
-     588,   558,   556,   557,     0,   539,   541,   542,   543,   544,
-     545,   546,   547,   548,   549,   550,   551,   552,   553,   554,
-     555,   612,     0,   609,   611,   603,     0,   600,   602,    46,
-       0,     0,    39,     0,     0,     0,     0,     0,     0,    57,
-       0,    59,     0,     0,     0,     0,     0,     0,     0,     0,
+     617,   602,   604,   606,     0,    67,     0,    60,    62,    64,
+      65,    66,    63,   608,   123,   149,     0,     0,     0,   478,
+     480,   482,   147,   156,   158,     0,     0,     0,     0,   118,
+     263,   355,   394,     0,     0,     0,   323,   445,   447,   316,
+     214,   506,   449,   228,   247,     0,   532,   545,   547,   110,
+       0,    72,    74,    75,    76,   107,   108,   109,    77,   105,
+      94,    95,    96,    80,    81,   102,    82,    83,    84,    88,
+      89,    78,   106,    79,    86,    87,   100,   101,   103,    97,
+      98,    99,    85,    90,    91,    92,    93,   104,   136,   138,
+     142,     0,   133,     0,   125,   127,   128,   129,   130,   131,
+     132,   304,   306,   308,   424,   302,   310,     0,   314,   312,
+     502,   301,   275,   276,   277,   298,   299,   300,   288,   289,
+       0,   273,   280,   293,   294,   295,   281,   283,   284,   286,
+     282,   278,   279,   296,   297,   285,   290,   291,   292,   287,
+     443,   442,   438,   439,   437,     0,   434,   436,   440,   441,
+     500,   488,   490,   494,   492,   498,   496,   484,   477,   471,
+     475,   476,     0,   460,   461,   472,   473,   474,   468,   463,
+     469,   465,   466,   467,   470,   464,     0,   384,   199,     0,
+     388,   386,   391,     0,   380,   381,     0,   368,   369,   371,
+     383,   372,   373,   374,   390,   375,   376,   377,   378,   379,
+     418,     0,     0,   416,   417,   420,   421,     0,   405,   406,
+     408,   409,   410,   411,   412,   413,   414,   415,   243,   245,
+     240,     0,   238,   241,   242,     0,   572,   574,     0,   577,
+       0,     0,   581,   585,     0,     0,   589,   596,   598,   600,
+     570,   568,   569,     0,   551,   553,   554,   555,   556,   557,
+     558,   559,   560,   561,   562,   563,   564,   565,   566,   567,
+     624,     0,   621,   623,   615,     0,   612,   614,    46,     0,
+       0,    39,     0,     0,     0,     0,     0,     0,    57,     0,
+      59,     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,    71,     0,     0,     0,
-       0,     0,   129,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   266,     0,     0,   421,     0,     0,
-       0,     0,     0,     0,     0,     0,   446,     0,   346,     0,
-       0,     0,     0,     0,     0,     0,   354,     0,     0,     0,
-       0,   391,     0,     0,     0,     0,   231,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    71,     0,
+       0,     0,     0,     0,   135,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   272,     0,     0,   433,
+       0,     0,     0,     0,     0,     0,     0,     0,   458,     0,
+     358,     0,     0,     0,     0,     0,     0,     0,   366,     0,
+       0,     0,     0,   403,     0,     0,     0,     0,   237,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   538,     0,     0,   608,     0,     0,   599,
-      50,    43,     0,     0,     0,     0,     0,     0,    61,     0,
-       0,     0,   114,   115,   116,     0,     0,     0,     0,     0,
-       0,   108,   109,   110,   111,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   519,     0,
-       0,     0,    73,     0,     0,     0,   140,   120,     0,     0,
-       0,     0,     0,     0,   313,     0,     0,     0,   268,     0,
-     423,     0,     0,     0,     0,     0,     0,     0,     0,   450,
-       0,     0,   370,     0,     0,     0,   381,   358,     0,   410,
-     411,   395,     0,     0,   233,   559,     0,     0,   564,     0,
-     567,   568,     0,     0,   575,   576,     0,     0,     0,     0,
-     540,     0,   610,     0,   601,     0,     0,     0,   591,   593,
-     595,     0,     0,     0,   467,   469,   471,     0,     0,   154,
-     113,   259,   347,   384,   316,    40,   434,   436,   309,   310,
-     311,   312,   308,     0,     0,   439,   224,     0,     0,   534,
-       0,    51,   131,   134,   135,   133,   138,   139,   137,   296,
-     298,   300,   414,   294,   302,   306,   304,     0,   432,   489,
-     477,   479,   483,   481,   487,   485,   473,   373,   194,   377,
-     375,   380,   407,   238,   240,   561,   563,   566,   571,   572,
-     570,   574,   579,   580,   581,   582,   583,   578,   585,   587,
-     589,     0,   154,    44,     0,     0,     0,     0,   148,     0,
-     145,   147,   180,   186,   188,   190,     0,     0,     0,     0,
-       0,   202,   204,     0,     0,     0,     0,     0,   179,     0,
-     160,   162,   163,   164,   165,   166,   167,   168,   169,   170,
-     171,   175,   176,   177,   172,   178,   173,   174,     0,   158,
-       0,   155,   156,   263,     0,   260,   261,   351,     0,   348,
-     349,   388,     0,   385,   386,   320,     0,   317,   318,   217,
-     218,   219,   220,   221,     0,   210,   212,   213,   214,   215,
-     216,   498,     0,   496,   443,     0,   440,   441,   228,     0,
-     225,   226,     0,     0,     0,     0,     0,     0,     0,   243,
-     245,   246,   247,   248,   249,   250,   529,   531,   528,   526,
-     527,     0,   522,   524,   525,     0,    53,   418,     0,   415,
-     416,   474,   492,   493,     0,   616,     0,   614,     0,    69,
-     606,   597,   118,     0,     0,   144,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   142,   151,     0,   153,     0,     0,   258,
-       0,   355,   344,     0,   392,   383,     0,     0,   315,     0,
-       0,   209,   500,     0,   495,   447,   438,     0,     0,   223,
-       0,     0,     0,     0,     0,     0,     0,     0,   242,     0,
-       0,     0,   521,   536,    55,     0,    54,     0,   413,     0,
-       0,   491,     0,     0,   613,   604,     0,   146,     0,     0,
-       0,     0,   192,   195,   196,   197,   198,     0,     0,   206,
-     207,   199,   200,   201,   161,     0,   157,     0,   262,     0,
-     350,     0,   387,   342,   339,   327,   328,   330,   331,   324,
-     325,   326,   337,   338,   336,     0,   322,   329,   340,   341,
-     332,   333,   334,   335,   319,   211,   516,     0,   514,   515,
-     507,   508,   512,   513,   509,   510,   511,     0,   501,   502,
-     504,   505,   506,   497,     0,   442,     0,   227,   251,   252,
-     253,   254,   255,   256,   244,     0,     0,   523,    52,     0,
-       0,   417,     0,   630,     0,   628,   626,   620,   624,   625,
-       0,   618,   622,   623,   621,   615,   149,   182,   183,   184,
-     185,   181,   187,   189,   191,   203,   205,   159,   264,   352,
-     389,     0,   321,     0,     0,   499,     0,   444,   229,   530,
-     532,    56,   419,   475,     0,     0,     0,     0,   617,   323,
-       0,   518,   503,     0,   627,     0,   619,   517,     0,   629,
-     634,     0,   632,     0,     0,   631,   642,     0,     0,     0,
-       0,   636,   638,   639,   640,   641,   633,     0,     0,     0,
-       0,     0,   635,     0,   644,   645,   646,   637,   643
+       0,     0,     0,     0,     0,   550,     0,     0,   620,     0,
+       0,   611,    50,    43,     0,     0,     0,     0,     0,     0,
+      61,     0,     0,     0,   120,   121,   122,     0,     0,     0,
+       0,     0,     0,   111,   112,   113,   117,     0,     0,     0,
+       0,   114,   115,   116,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   531,     0,     0,     0,    73,     0,     0,
+       0,   146,   126,     0,     0,     0,     0,     0,     0,   322,
+       0,     0,     0,   274,     0,   435,     0,     0,     0,     0,
+       0,     0,     0,     0,   462,     0,     0,   382,     0,     0,
+       0,   393,   370,     0,   422,   423,   407,     0,     0,   239,
+     571,     0,     0,   576,     0,   579,   580,     0,     0,   587,
+     588,     0,     0,     0,     0,   552,     0,   622,     0,   613,
+       0,     0,     0,   603,   605,   607,     0,     0,     0,   479,
+     481,   483,     0,     0,   160,   119,   265,   359,   396,   325,
+      40,   446,   448,   318,   319,   320,   321,   317,     0,     0,
+     451,   230,     0,     0,   546,     0,    51,   137,   140,   141,
+     139,   144,   145,   143,   305,   307,   309,   426,   303,   311,
+     315,   313,     0,   444,   501,   489,   491,   495,   493,   499,
+     497,   485,   385,   200,   389,   387,   392,   419,   244,   246,
+     573,   575,   578,   583,   584,   582,   586,   591,   592,   593,
+     594,   595,   590,   597,   599,   601,     0,   160,    44,     0,
+       0,     0,     0,   154,     0,   151,   153,   186,   192,   194,
+     196,     0,     0,     0,     0,     0,   208,   210,     0,     0,
+       0,     0,     0,   185,     0,   166,   168,   169,   170,   171,
+     172,   173,   174,   175,   176,   177,   181,   182,   183,   178,
+     184,   179,   180,     0,   164,     0,   161,   162,   269,     0,
+     266,   267,   363,     0,   360,   361,   400,     0,   397,   398,
+     329,     0,   326,   327,   223,   224,   225,   226,   227,     0,
+     216,   218,   219,   220,   221,   222,   510,     0,   508,   455,
+       0,   452,   453,   234,     0,   231,   232,     0,     0,     0,
+       0,     0,     0,     0,   249,   251,   252,   253,   254,   255,
+     256,   541,   543,   540,   538,   539,     0,   534,   536,   537,
+       0,    53,   430,     0,   427,   428,   486,   504,   505,     0,
+     628,     0,   626,     0,    69,   618,   609,   124,     0,     0,
+     150,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   148,   157,
+       0,   159,     0,     0,   264,     0,   367,   356,     0,   404,
+     395,     0,     0,   324,     0,     0,   215,   512,     0,   507,
+     459,   450,     0,     0,   229,     0,     0,     0,     0,     0,
+       0,     0,     0,   248,     0,     0,     0,   533,   548,    55,
+       0,    54,     0,   425,     0,     0,   503,     0,     0,   625,
+     616,     0,   152,     0,     0,     0,     0,   198,   201,   202,
+     203,   204,     0,     0,   212,   213,   205,   206,   207,   167,
+       0,   163,     0,   268,     0,   362,     0,   399,   354,   348,
+     336,   337,   351,   352,   353,   339,   340,   333,   334,   335,
+     346,   347,   345,     0,   331,   338,   349,   350,   341,   342,
+     343,   344,   328,   217,   528,     0,   526,   527,   519,   520,
+     524,   525,   521,   522,   523,     0,   513,   514,   516,   517,
+     518,   509,     0,   454,     0,   233,   257,   258,   259,   260,
+     261,   262,   250,     0,     0,   535,    52,     0,     0,   429,
+       0,   642,     0,   640,   638,   632,   636,   637,     0,   630,
+     634,   635,   633,   627,   155,   188,   189,   190,   191,   187,
+     193,   195,   197,   209,   211,   165,   270,   364,   401,     0,
+     330,     0,     0,   511,     0,   456,   235,   542,   544,    56,
+     431,   487,     0,     0,     0,     0,   629,   332,     0,   530,
+     515,     0,   639,     0,   631,   529,     0,   641,   646,     0,
+     644,     0,     0,   643,   654,     0,     0,     0,     0,   648,
+     650,   651,   652,   653,   645,     0,     0,     0,     0,     0,
+     647,     0,   656,   657,   658,   649,   655
   };
 
-  const short
+  const short int
   Dhcp4Parser::yypgoto_[] =
   {
-    -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,  -797,  -797,  -797,  -797,   -46,  -797,  -451,  -797,
-     121,  -797,  -797,  -797,  -797,  -797,  -797,  -501,  -797,  -797,
-    -797,   -70,  -797,  -797,  -797,   312,  -797,  -797,  -797,  -797,
-     107,   348,   -47,   -44,     4,  -797,  -797,  -797,  -797,    12,
-      15,  -797,  -797,   158,   340,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,   -52,  -797,  -797,  -797,  -797,  -797,  -797,    82,  -797,
-     -72,  -797,  -563,   -59,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,  -797,  -797,   -26,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,   -81,  -797,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,   -90,  -797,  -797,  -797,   -83,   321,  -797,  -797,
-    -797,  -797,  -797,  -797,  -797,   -61,  -797,  -797,  -797,  -797,
-    -797,  -797,  -796,  -797,  -797,  -797,   -43,  -797,  -797,  -797,
-     -34,   377,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,
-    -795,  -797,   -68,  -797,   -55,  -797,    19,  -797,  -797,  -797,
-    -797,  -797,  -797,  -797,   -38,  -797,  -797,  -184,   -63,  -797,
-    -797,  -797,  -797,  -797,   -16,  -797,  -797,  -797,   -18,  -797,
-     372,  -797,   -66,  -797,  -797,  -797,  -797,  -797,   -64,  -797,
-    -797,  -797,  -797,  -797,   -19,  -797,  -797,  -797,   -22,  -797,
-    -797,  -797,   -14,  -797,   379,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,  -797,  -797,  -797,  -797,   -45,  -797,  -797,  -797,
-     -40,   425,  -797,  -797,   -57,  -797,   -39,  -797,   -62,  -797,
-    -797,  -797,     7,  -797,  -797,  -797,    -8,  -797,   407,    -7,
-    -797,    -3,  -797,     8,  -797,   192,  -797,  -797,  -797,  -797,
-    -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,  -797,  -790,  -797,  -797,  -797,  -797,  -797,    14,
-    -797,  -797,  -797,  -141,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,    -2,  -797,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,  -797,   240,   390,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,  -797,
-    -797,   267,   391,  -797,  -797,  -797,  -797,  -797,  -797,   281,
-     395,  -797,  -797,  -797,   -12,  -797,  -797,  -144,  -797,  -797,
-    -797,  -797,  -797,  -797,  -160,  -797,  -797,  -176,  -797,  -797,
-    -797,  -797,  -797
+    -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,  -812,   -46,  -812,  -472,  -812,
+      97,  -812,  -812,  -812,  -812,  -812,  -812,  -516,  -812,  -812,
+    -812,   -70,  -812,  -812,  -812,   398,  -812,  -812,  -812,  -812,
+     179,   384,   -47,   -44,     4,    12,    15,    19,  -812,  -812,
+    -812,  -812,    23,    26,  -812,  -812,   171,   375,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,   -31,  -812,  -812,  -812,  -812,  -812,
+    -812,   104,  -812,   -40,  -812,  -578,   -28,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,  -812,  -812,   -26,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,   -33,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,   -54,  -812,  -812,  -812,   -48,
+     367,  -812,  -812,  -812,  -812,  -812,  -812,  -812,   -56,  -812,
+    -812,  -812,  -812,  -812,  -812,  -811,  -812,  -812,  -812,   -16,
+    -812,  -812,  -812,   -15,   400,  -812,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,  -810,  -812,   -68,  -812,   -55,  -812,    27,
+    -812,  -812,  -812,  -812,  -812,  -812,  -812,   -22,  -812,  -812,
+    -170,   -63,  -812,  -812,  -812,  -812,  -812,    -6,  -812,  -812,
+    -812,    -2,  -812,   393,  -812,   -66,  -812,  -812,  -812,  -812,
+    -812,   -64,  -812,  -812,  -812,  -812,  -812,   -19,  -812,  -812,
+    -812,    -5,  -812,  -812,  -812,    10,  -812,   409,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,   -12,
+    -812,  -812,  -812,    -8,   444,  -812,  -812,   -57,  -812,   -39,
+    -812,   -62,  -812,  -812,  -812,    14,  -812,  -812,  -812,    20,
+    -812,   428,    -7,  -812,    -3,  -812,     8,  -812,   229,  -812,
+    -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,  -812,  -805,  -812,  -812,  -812,
+    -812,  -812,    25,  -812,  -812,  -812,  -130,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,     9,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,  -812,   251,   405,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,  -812,
+    -812,  -812,  -812,  -812,   287,   401,  -812,  -812,  -812,  -812,
+    -812,  -812,   288,   410,  -812,  -812,  -812,    -1,  -812,  -812,
+    -137,  -812,  -812,  -812,  -812,  -812,  -812,  -150,  -812,  -812,
+    -165,  -812,  -812,  -812,  -812,  -812
   };
 
-  const short
+  const short int
   Dhcp4Parser::yydefgoto_[] =
   {
       -1,    15,    16,    17,    18,    19,    20,    21,    22,    23,
       24,    25,    26,    27,    28,    29,    38,    39,    40,    69,
-     596,    87,    88,    41,    68,    84,    85,   612,   776,   855,
-     856,   688,    43,    70,    96,    97,    98,   354,    45,    71,
-     137,   138,   139,   140,   141,   142,   143,   378,   144,   145,
-     146,   147,   363,   177,   178,    47,    72,   179,   397,   180,
-     398,   615,   181,   399,   618,   182,   148,   371,   149,   364,
-     669,   670,   671,   793,   150,   372,   151,   373,   710,   711,
-     712,   815,   689,   690,   691,   796,   971,   692,   797,   693,
-     798,   694,   799,   695,   696,   430,   697,   698,   699,   700,
-     701,   702,   703,   704,   805,   705,   806,   706,   707,   152,
-     386,   734,   735,   736,   737,   738,   739,   740,   153,   389,
-     749,   750,   751,   838,    61,    79,   302,   303,   304,   443,
-     305,   444,   154,   390,   758,   759,   760,   761,   762,   763,
-     764,   765,   155,   379,   714,   715,   716,   818,    49,    73,
-     201,   202,   203,   407,   204,   403,   205,   404,   206,   405,
-     207,   408,   208,   411,   209,   410,   156,   385,   602,   211,
-     157,   382,   726,   727,   728,   827,   905,   906,   158,   380,
-      55,    76,   718,   719,   720,   821,    57,    77,   267,   268,
-     269,   270,   271,   272,   273,   429,   274,   433,   275,   432,
-     276,   277,   434,   278,   159,   381,   722,   723,   724,   824,
-      59,    78,   288,   289,   290,   291,   292,   438,   293,   294,
-     295,   296,   213,   406,   778,   779,   780,   857,    51,    74,
-     226,   227,   228,   415,   160,   383,   161,   384,   162,   388,
-     745,   746,   747,   835,    53,    75,   243,   244,   245,   163,
-     368,   164,   369,   165,   370,   249,   425,   783,   860,   250,
-     419,   251,   420,   252,   422,   253,   421,   254,   424,   255,
-     423,   256,   418,   220,   412,   784,   166,   387,   742,   743,
-     832,   927,   928,   929,   930,   931,   983,   932,   167,   168,
-     392,   771,   772,   773,   849,   774,   850,   169,   393,   170,
-     394,    63,    80,   324,   325,   326,   327,   448,   328,   449,
-     329,   330,   451,   331,   332,   333,   454,   650,   334,   455,
-     335,   336,   337,   458,   657,   338,   459,   339,   460,   340,
-     461,    99,   356,   100,   357,   101,   358,   171,   362,    67,
-      82,   346,   347,   348,   467,   102,   355,    65,    81,   342,
-     343,   344,   464,   786,   787,   862,   960,   961,   962,   963,
-     996,   964,   994,  1011,  1012,  1013,  1020,  1021,  1022,  1027,
-    1023,  1024,  1025
+     611,    87,    88,    41,    68,    84,    85,   627,   791,   870,
+     871,   703,    43,    70,    96,    97,    98,   363,    45,    71,
+     140,   141,   142,   143,   144,   145,   146,   147,   148,   149,
+     387,   150,   151,   152,   153,   372,   183,   184,    47,    72,
+     185,   409,   186,   410,   630,   187,   411,   633,   188,   154,
+     380,   155,   373,   684,   685,   686,   808,   156,   381,   157,
+     382,   725,   726,   727,   830,   704,   705,   706,   811,   989,
+     707,   812,   708,   813,   709,   814,   710,   711,   442,   712,
+     713,   714,   715,   716,   717,   718,   719,   820,   720,   821,
+     721,   722,   158,   398,   749,   750,   751,   752,   753,   754,
+     755,   159,   401,   764,   765,   766,   853,    61,    79,   311,
+     312,   313,   455,   314,   456,   160,   402,   773,   774,   775,
+     776,   777,   778,   779,   780,   161,   388,   729,   730,   731,
+     833,    49,    73,   210,   211,   212,   419,   213,   415,   214,
+     416,   215,   417,   216,   420,   217,   423,   218,   422,   162,
+     397,   617,   220,   163,   394,   741,   742,   743,   842,   923,
+     924,   164,   389,    55,    76,   733,   734,   735,   836,    57,
+      77,   276,   277,   278,   279,   280,   281,   282,   441,   283,
+     445,   284,   444,   285,   286,   446,   287,   165,   390,   737,
+     738,   739,   839,    59,    78,   297,   298,   299,   300,   301,
+     450,   302,   303,   304,   305,   222,   418,   793,   794,   795,
+     872,    51,    74,   235,   236,   237,   427,   166,   395,   167,
+     396,   168,   400,   760,   761,   762,   850,    53,    75,   252,
+     253,   254,   169,   377,   170,   378,   171,   379,   258,   437,
+     798,   875,   259,   431,   260,   432,   261,   434,   262,   433,
+     263,   436,   264,   435,   265,   430,   229,   424,   799,   172,
+     399,   757,   758,   847,   945,   946,   947,   948,   949,  1001,
+     950,   173,   174,   404,   786,   787,   788,   864,   789,   865,
+     175,   405,   176,   406,    63,    80,   333,   334,   335,   336,
+     460,   337,   461,   338,   339,   463,   340,   341,   342,   466,
+     665,   343,   467,   344,   345,   346,   470,   672,   347,   471,
+     348,   472,   349,   473,    99,   365,   100,   366,   101,   367,
+     177,   371,    67,    82,   355,   356,   357,   479,   102,   364,
+      65,    81,   351,   352,   353,   476,   801,   802,   877,   978,
+     979,   980,   981,  1014,   982,  1012,  1029,  1030,  1031,  1038,
+    1039,  1040,  1045,  1041,  1042,  1043
   };
 
-  const unsigned short
+  const unsigned short int
   Dhcp4Parser::yytable_[] =
   {
-      95,   136,   176,   195,   222,   239,   223,   265,   284,   301,
-     321,   216,   286,   257,   287,   183,   214,   229,   241,   224,
-     279,   297,    83,   322,   625,   708,   196,    89,   648,   197,
-     629,   900,   901,   184,   215,   230,   242,   913,   280,   298,
-      31,   323,    32,    30,    33,    42,   172,   173,   122,   595,
-     174,   266,   285,   175,   212,   225,   240,    44,   360,   595,
-     221,   124,   125,   361,   395,    46,   217,    48,   246,   396,
-     218,    50,   247,   192,   259,   401,   193,   198,   299,   300,
-     402,   219,   103,   248,   104,   199,   124,   125,   200,   413,
-     299,   300,   210,   105,   414,   106,   107,   108,   109,   110,
-     111,   112,   113,   114,   652,   653,   654,   655,   124,   125,
-      52,   752,   753,   754,   755,   756,   757,    54,   259,   281,
-     260,   261,   282,   283,   115,   116,   117,   118,   119,   120,
-     124,   125,  1016,   121,   122,  1017,  1018,  1019,   416,   656,
-      94,   445,   649,   417,   123,    86,   446,   124,   125,    56,
-      94,   953,   126,   954,   955,    58,    90,   127,   128,   729,
-     730,   731,   732,   129,   733,    91,    92,    93,    60,   462,
-      62,   124,   125,   130,   463,    94,   131,   107,   108,   109,
-     110,   111,    94,   132,   133,   900,   901,   134,   135,   465,
-     468,   913,    64,   395,   466,   469,    66,    94,   789,   465,
-      34,    35,    36,    37,   790,   115,   116,   117,   121,   766,
-     767,   185,   186,   187,   830,   122,   341,   831,   345,    94,
-     107,   108,   109,   110,   111,   349,   188,   350,   124,   125,
-     189,   190,   191,   126,   468,   833,    94,   351,   834,   791,
-     192,   401,   472,   193,   129,   352,   792,   353,   115,   116,
-     117,   194,   885,   120,   598,   599,   600,   601,   122,   259,
-      94,   109,   110,   111,   794,   812,   109,   110,   111,   795,
-     813,   124,   125,   812,   190,   258,   126,   847,   814,   851,
-     462,   426,   848,   192,   852,   853,   193,   812,   413,   427,
-      95,   359,   977,   978,   194,   981,   121,   122,   259,   365,
-     982,   366,   122,   367,   470,   471,   259,   374,   260,   261,
-     124,   125,   262,   263,   264,   124,   125,    94,   124,   125,
-     613,   614,   445,   916,   917,   136,   231,   988,   616,   617,
-     375,   176,   232,   233,   234,   235,   236,   237,   863,   238,
-     416,   864,   997,   195,   183,   992,   222,   998,   223,  1031,
-     428,   216,  1014,   436,  1032,  1015,   214,   239,   376,   229,
-      94,   224,   184,   238,   781,   437,   196,   265,   377,   197,
-     241,   391,   284,   400,   215,   409,   286,   230,   287,   431,
-     279,   967,   968,   969,   970,   297,   435,   439,   242,   440,
-     447,   442,   321,   450,   212,   441,   452,   225,   280,    94,
-     453,   456,   457,   298,    94,   322,   217,    94,   240,   473,
-     218,   266,   474,   475,   476,   477,   285,   198,   482,   479,
-     246,   219,   480,   323,   247,   199,   481,   483,   200,   578,
-     579,   580,   210,   484,   485,   248,   486,   124,   125,   487,
-     488,   489,   490,   495,   491,   492,   493,   672,   494,   496,
-     497,   993,   673,   674,   675,   676,   677,   678,   679,   680,
-     681,   682,   683,   684,   685,   686,   687,   498,   499,   500,
-     501,   502,   503,   504,   505,   506,   507,   508,   259,   306,
-     307,   308,   309,   310,   311,   312,   313,   314,   315,   316,
-     317,   318,   509,   510,   511,   513,   514,   515,   319,   320,
-     516,   518,   519,   520,   521,   522,   136,   644,   523,   524,
-     525,   526,   176,   527,   529,   531,   532,   533,   534,   535,
-     536,   537,   538,   540,   541,   183,    94,   543,   544,   663,
-     545,   542,   548,   552,   546,   553,   549,   556,   768,   557,
-     321,   550,   555,   184,   558,   559,   560,   561,   562,   563,
-     566,   769,   564,   322,     1,     2,     3,     4,     5,     6,
-       7,     8,     9,    10,    11,    12,    13,    14,   565,   770,
-     567,   323,   568,   569,   571,   573,   575,   584,   585,    94,
-     576,   577,   581,   582,   583,   586,   587,   588,   589,   590,
-     591,   592,   593,   594,   597,   603,    32,   604,   605,   606,
-     872,   668,   607,   608,   610,   611,   619,   620,   621,   622,
-     627,   651,   623,   624,   626,   628,   630,   631,   632,   633,
-     634,   635,   636,   637,   638,   639,   640,   641,   661,   662,
-     861,   609,   709,   713,   717,   721,   725,   741,   642,   643,
-     645,   646,   647,   658,   744,   659,   660,   748,   777,   785,
-     800,   801,   802,   803,   804,   807,   808,   809,   810,   811,
-     817,   854,   816,   820,   819,   822,   823,   825,   826,   829,
-     828,   837,   478,   836,   840,   839,   841,   842,   843,   844,
-     845,   846,   859,   664,   858,   866,   865,   868,   869,   870,
-     871,   877,   878,   873,   945,   875,   874,   946,   876,   949,
-     879,   948,   880,   881,   882,   952,   938,   883,   939,   940,
-     979,   980,   984,   941,   942,   943,   966,   972,   973,   974,
-     975,   976,   985,   986,   987,   989,   990,   991,   995,  1000,
-    1003,  1001,  1005,  1004,  1008,  1028,  1029,  1010,  1030,  1033,
-     667,   517,   867,   512,   788,   886,  1007,  1009,   195,   915,
-     937,   265,  1034,   884,   284,   936,   216,   893,   286,   902,
-     287,   214,   918,  1038,   279,   239,   554,   297,   301,   920,
-     908,   196,   903,  1035,   197,   922,  1036,   888,   241,   215,
-     894,   768,   280,   895,   887,   298,   944,   222,   909,   223,
-     528,   914,   956,   923,   769,   266,   242,   999,   285,   212,
-     229,   899,   224,   889,   892,   958,   919,   890,   907,   547,
-     891,   217,   770,   921,   951,   218,   240,   950,   230,   782,
-     910,   551,   198,   959,   911,   924,   219,   934,   246,   925,
-     199,   896,   247,   200,   539,   912,   957,   210,   225,   897,
-     926,   530,   898,   248,   935,  1002,   904,   933,   666,   947,
-     775,   965,   570,  1006,  1026,  1037,     0,     0,   665,   574,
-     572,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+      95,   139,   182,   201,   231,   248,   232,   274,   293,   310,
+     330,   225,   295,   266,   296,   189,   223,   238,   250,   233,
+     288,   306,    83,   331,   640,   723,   202,    89,    30,   203,
+     644,   918,   919,   190,   224,   239,   251,   931,   289,   307,
+      31,   332,    32,   610,    33,  1034,   663,   268,  1035,  1036,
+    1037,   275,   294,   610,   221,   234,   249,   178,   179,   127,
+     128,   180,   127,   128,   181,    42,   226,    44,   255,    46,
+     227,    48,   256,   744,   745,   746,   747,   204,   748,   308,
+     309,   228,    50,   257,   369,   205,   407,   267,   206,   370,
+      86,   408,   207,   103,   121,   104,   208,   781,   782,   209,
+     219,    52,   845,    54,   105,   846,   106,   107,   108,   109,
+     110,   111,   112,   113,   114,    56,   848,    58,   268,   849,
+     269,   270,   127,   128,   271,   272,   273,   971,   878,   972,
+     973,   879,   350,   127,   128,   115,   116,   117,   118,   119,
+     120,    94,   413,  1032,   121,   122,  1033,   414,    94,   425,
+      60,    94,   308,   309,   426,   123,   124,   125,   126,    90,
+     428,   127,   128,   664,   354,   429,   129,    62,    91,    92,
+      93,   130,   131,   457,   628,   629,    64,   132,   458,   107,
+     108,   109,   110,   111,    66,    94,   474,   133,   918,   919,
+     134,   475,   631,   632,   931,   477,   358,   135,   136,   359,
+     478,   137,   138,    34,    35,    36,    37,   115,   116,   117,
+     360,    94,   361,   191,   192,   193,   480,   122,   109,   110,
+     111,   481,    94,   667,   668,   669,   670,   123,   124,   125,
+     362,   194,   368,   127,   128,   195,   196,   197,   129,   247,
+     796,   407,   477,   438,   122,   198,   804,   805,   199,   132,
+      94,   374,   900,   121,   122,   268,   200,   375,   671,   230,
+     127,   128,   107,   108,   109,   110,   111,   376,   480,   413,
+     127,   128,   198,   806,   807,   199,   767,   768,   769,   770,
+     771,   772,   809,   934,   935,   383,   384,   810,   827,   827,
+     115,   116,   117,   828,   829,   120,   385,   862,   866,    95,
+     122,   268,   863,   867,   474,   613,   614,   615,   616,   868,
+     123,   124,   125,   482,   483,   827,   127,   128,   425,   196,
+     995,   129,    94,   996,   999,   457,   439,   428,   198,  1000,
+    1006,   199,  1010,  1015,   440,  1049,   448,   139,  1016,   200,
+    1050,   386,   391,   182,   985,   986,   987,   988,   392,    94,
+     393,   403,   412,   421,   443,   201,   189,   447,   231,    94,
+     232,   449,   453,   225,   451,   452,   454,   484,   223,   248,
+     459,   238,   462,   233,   190,   464,   465,   468,   202,   274,
+     469,   203,   250,   485,   293,   486,   224,   487,   295,   239,
+     296,   488,   288,   489,   491,   492,   493,   306,   497,   498,
+     251,   494,   495,   496,   330,    94,   221,   499,   500,   234,
+     289,   501,   502,   503,   504,   307,   507,   331,   226,   505,
+     249,   506,   227,   275,   109,   110,   111,   508,   294,   204,
+     509,   510,   255,   228,   512,   332,   256,   205,   511,   513,
+     206,   593,   594,   595,   207,   514,   515,   257,   208,   516,
+     517,   209,   219,   523,  1011,   518,   519,   520,   521,   522,
+     122,   524,   525,   268,   290,   269,   270,   291,   292,   526,
+     531,   528,   529,   530,   533,   534,   127,   128,   127,   128,
+     535,   536,   537,   538,   540,   539,   541,   240,   542,   544,
+     546,   547,   548,   241,   242,   243,   244,   245,   246,   687,
+     247,   549,   550,   551,   688,   689,   690,   691,   692,   693,
+     694,   695,   696,   697,   698,   699,   700,   701,   702,   552,
+     553,   139,   659,   555,   556,   557,   558,   182,   127,   128,
+     268,   559,   560,   561,   563,   564,   565,   567,   568,   571,
+     189,   570,   572,   573,   678,   574,   575,   576,   577,   578,
+     581,   579,   582,   783,   583,   330,   580,   584,   190,   586,
+     588,   590,   683,   604,   599,    94,   784,    94,   331,   591,
+     315,   316,   317,   318,   319,   320,   321,   322,   323,   324,
+     325,   326,   327,   592,   785,   596,   332,   597,   598,   328,
+     329,     1,     2,     3,     4,     5,     6,     7,     8,     9,
+      10,    11,    12,    13,    14,   602,   600,   601,   603,   606,
+     607,   605,   608,   609,   815,   612,    32,    94,   618,   619,
+     620,   621,   624,   832,   622,   623,   625,   626,   634,   635,
+     636,   637,   638,   816,    94,   642,   676,   677,   817,   818,
+     639,   641,   643,   645,   666,   724,   728,   732,   736,   646,
+     740,   647,   756,   759,   763,   792,   800,   648,   649,   650,
+     651,   652,   653,   654,   655,   819,   822,   823,   656,   657,
+     658,   660,   661,   662,   673,   674,   675,   824,   825,   826,
+     869,   835,   831,   834,   838,   837,   840,   841,   843,   844,
+     852,   851,   855,   874,   854,   856,   857,   858,   859,   860,
+     861,   887,   888,   873,   881,   880,   876,   883,   884,   885,
+     886,   889,   892,   893,   890,   963,   891,   964,   894,   970,
+     895,   896,   966,   897,   967,   997,   998,  1002,  1003,   956,
+     898,  1004,   957,   958,   959,   960,   961,   984,   990,   991,
+     992,   993,   994,  1005,  1013,  1007,  1018,  1008,  1021,  1023,
+    1009,  1026,  1046,  1022,  1019,  1025,  1027,  1028,  1047,  1048,
+    1051,  1052,  1053,   201,  1054,  1056,   274,   490,   682,   293,
+     679,   225,   908,   295,   920,   296,   223,   936,   882,   288,
+     248,   803,   306,   310,   938,   926,   202,   921,   532,   203,
+     940,   527,   901,   250,   224,   909,   783,   289,   910,   899,
+     307,   955,   231,   927,   232,   954,   962,   974,   941,   784,
+     275,   251,   933,   294,   221,   238,   917,   233,   902,   903,
+     976,   937,   932,   925,   569,   543,   226,   785,   939,  1017,
+     227,   249,   905,   239,   904,   928,   907,   204,   977,   929,
+     942,   228,   562,   255,   943,   205,   911,   256,   206,   906,
+     930,   975,   207,   234,   912,   944,   208,   913,   257,   209,
+     219,   914,   969,   566,   968,   915,   953,   554,   916,   922,
+     952,   797,   545,   951,  1020,   965,   790,   983,  1024,   585,
+     680,   589,  1044,   681,  1055,     0,     0,   587,     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,   893,     0,   902,     0,     0,   918,     0,     0,     0,
-       0,     0,     0,   920,   908,     0,   903,   956,     0,   922,
-       0,     0,     0,     0,   894,     0,     0,   895,     0,     0,
-     958,     0,   909,     0,     0,     0,     0,   923,     0,     0,
-       0,     0,     0,     0,     0,   899,     0,     0,   959,     0,
-     919,     0,   907,     0,     0,     0,     0,   921,     0,     0,
-       0,   957,     0,     0,   910,     0,     0,     0,   911,   924,
-       0,     0,     0,   925,     0,   896,     0,     0,     0,   912,
-       0,     0,     0,   897,   926,     0,   898,     0,     0,     0,
-     904
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   908,
+       0,   920,     0,     0,   936,     0,     0,     0,     0,     0,
+       0,   938,   926,     0,   921,   974,     0,   940,     0,     0,
+       0,     0,   909,     0,     0,   910,     0,     0,   976,     0,
+     927,     0,     0,     0,     0,   941,     0,     0,     0,     0,
+       0,     0,     0,   917,     0,     0,   977,     0,   937,     0,
+     925,     0,     0,     0,     0,   939,     0,     0,     0,   975,
+       0,     0,   928,     0,     0,     0,   929,   942,     0,     0,
+       0,   943,     0,   911,     0,     0,     0,   930,     0,     0,
+       0,   912,   944,     0,   913,     0,     0,     0,   914,     0,
+       0,     0,   915,     0,     0,   916,   922
   };
 
-  const short
+  const short int
   Dhcp4Parser::yycheck_[] =
   {
       70,    71,    72,    73,    74,    75,    74,    77,    78,    79,
       80,    73,    78,    76,    78,    72,    73,    74,    75,    74,
-      77,    78,    68,    80,   525,   588,    73,    10,    17,    73,
-     531,   827,   827,    72,    73,    74,    75,   827,    77,    78,
-       5,    80,     7,     0,     9,     7,    14,    15,    63,   500,
-      18,    77,    78,    21,    73,    74,    75,     7,     3,   510,
-      75,    76,    77,     8,     3,     7,    73,     7,    75,     8,
-      73,     7,    75,    88,    64,     3,    91,    73,   103,   104,
-       8,    73,    11,    75,    13,    73,    76,    77,    73,     3,
-     103,   104,    73,    22,     8,    24,    25,    26,    27,    28,
-      29,    30,    31,    32,   133,   134,   135,   136,    76,    77,
-       7,   106,   107,   108,   109,   110,   111,     7,    64,    65,
-      66,    67,    68,    69,    53,    54,    55,    56,    57,    58,
-      76,    77,   142,    62,    63,   145,   146,   147,     3,   168,
-     165,     3,   131,     8,    73,   165,     8,    76,    77,     7,
-     165,   141,    81,   143,   144,     7,   139,    86,    87,    93,
-      94,    95,    96,    92,    98,   148,   149,   150,     7,     3,
-       7,    76,    77,   102,     8,   165,   105,    25,    26,    27,
-      28,    29,   165,   112,   113,   981,   981,   116,   117,     3,
-       3,   981,     7,     3,     8,     8,     7,   165,     8,     3,
-     165,   166,   167,   168,     8,    53,    54,    55,    62,   114,
-     115,    59,    60,    61,     3,    63,   140,     6,    12,   165,
-      25,    26,    27,    28,    29,     6,    74,     3,    76,    77,
-      78,    79,    80,    81,     3,     3,   165,     4,     6,     8,
-      88,     3,   165,    91,    92,     8,     8,     3,    53,    54,
-      55,    99,   815,    58,    82,    83,    84,    85,    63,    64,
-     165,    27,    28,    29,     3,     3,    27,    28,    29,     8,
-       8,    76,    77,     3,    79,    33,    81,     3,     8,     3,
-       3,     8,     8,    88,     8,     8,    91,     3,     3,     3,
-     360,     4,     8,     8,    99,     3,    62,    63,    64,     4,
-       8,     4,    63,     4,   350,   351,    64,     4,    66,    67,
-      76,    77,    70,    71,    72,    76,    77,   165,    76,    77,
-      16,    17,     3,    89,    90,   395,    87,     8,    19,    20,
-       4,   401,    93,    94,    95,    96,    97,    98,     3,   100,
-       3,     6,     3,   413,   401,     8,   416,     8,   416,     3,
-       8,   413,     3,     8,     8,     6,   413,   427,     4,   416,
-     165,   416,   401,   100,   101,     3,   413,   437,     4,   413,
-     427,     4,   442,     4,   413,     4,   442,   416,   442,     4,
-     437,    34,    35,    36,    37,   442,     4,     4,   427,     4,
-       4,     3,   462,     4,   413,     8,     4,   416,   437,   165,
-       4,     4,     4,   442,   165,   462,   413,   165,   427,     4,
-     413,   437,     4,     4,     4,     4,   442,   413,   168,     4,
-     427,   413,     4,   462,   427,   413,     4,   168,   413,   475,
-     476,   477,   413,   168,     4,   427,     4,    76,    77,     4,
-       4,     4,     4,     4,   166,   166,   166,    33,   166,     4,
-       4,   952,    38,    39,    40,    41,    42,    43,    44,    45,
-      46,    47,    48,    49,    50,    51,    52,     4,     4,     4,
-       4,     4,     4,     4,     4,     4,     4,   166,    64,   118,
-     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
-     129,   130,     4,     4,     4,     4,     4,     4,   137,   138,
-     168,     4,     4,     4,     4,     4,   576,   553,     4,   166,
-       4,     4,   582,     4,     4,     4,     4,     4,     4,     4,
-       4,     4,     4,     4,     4,   582,   165,     4,     4,   575,
-       4,   166,     4,     4,   168,     4,   168,     4,   608,     4,
-     610,   168,   168,   582,   166,     4,   166,   166,     4,     4,
-       4,   608,   168,   610,   151,   152,   153,   154,   155,   156,
-     157,   158,   159,   160,   161,   162,   163,   164,   168,   608,
-       4,   610,     4,     4,     4,     4,     4,   165,   165,   165,
-       7,     7,     7,     7,     7,   165,     7,     7,     5,   165,
-       5,     5,     5,     5,   165,     5,     7,     5,     5,     5,
-     166,    23,     7,     7,     7,     5,   165,   165,   165,     5,
-       7,   132,   165,   165,   165,   165,   165,   165,   165,   165,
-     165,   165,   165,   165,   165,   165,   165,   165,     5,     5,
-       8,   510,     7,     7,     7,     7,     7,     7,   165,   165,
-     165,   165,   165,   165,     7,   165,   165,     7,     7,     7,
-       4,     4,     4,     4,     4,     4,     4,     4,     4,     4,
-       3,   165,     6,     3,     6,     6,     3,     6,     3,     3,
-       6,     3,   360,     6,     3,     6,     4,     4,     4,     4,
-       4,     4,     3,   576,     6,     4,     6,     4,     4,     4,
-       4,     4,     4,   168,     4,   168,   166,     4,   166,     3,
-     166,     6,   166,   166,   166,     4,   166,   168,   166,   166,
-       8,     8,     4,   166,   166,   166,   165,   165,   165,   165,
-     165,   165,     8,     3,     8,   165,   165,   165,     4,     4,
-       4,   168,     4,   166,     5,     4,     4,     7,     4,     4,
-     582,   401,   794,   395,   662,   817,   165,   165,   818,   830,
-     840,   821,   168,   812,   824,   838,   818,   827,   824,   827,
-     824,   818,   832,   165,   821,   835,   445,   824,   838,   832,
-     827,   818,   827,   166,   818,   832,   166,   820,   835,   818,
-     827,   851,   821,   827,   818,   824,   847,   857,   827,   857,
-     413,   829,   862,   832,   851,   821,   835,   981,   824,   818,
-     857,   827,   857,   821,   826,   862,   832,   823,   827,   437,
-     824,   818,   851,   832,   859,   818,   835,   857,   857,   627,
-     827,   442,   818,   862,   827,   832,   818,   835,   835,   832,
-     818,   827,   835,   818,   427,   827,   862,   818,   857,   827,
-     832,   416,   827,   835,   837,   986,   827,   833,   581,   851,
-     610,   863,   462,   997,  1014,  1031,    -1,    -1,   577,   468,
-     465,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      77,    78,    68,    80,   540,   603,    73,    10,     0,    73,
+     546,   842,   842,    72,    73,    74,    75,   842,    77,    78,
+       5,    80,     7,   515,     9,   145,    17,    64,   148,   149,
+     150,    77,    78,   525,    73,    74,    75,    14,    15,    79,
+      80,    18,    79,    80,    21,     7,    73,     7,    75,     7,
+      73,     7,    75,    96,    97,    98,    99,    73,   101,   106,
+     107,    73,     7,    75,     3,    73,     3,    33,    73,     8,
+     168,     8,    73,    11,    62,    13,    73,   117,   118,    73,
+      73,     7,     3,     7,    22,     6,    24,    25,    26,    27,
+      28,    29,    30,    31,    32,     7,     3,     7,    64,     6,
+      66,    67,    79,    80,    70,    71,    72,   144,     3,   146,
+     147,     6,   143,    79,    80,    53,    54,    55,    56,    57,
+      58,   168,     3,     3,    62,    63,     6,     8,   168,     3,
+       7,   168,   106,   107,     8,    73,    74,    75,    76,   142,
+       3,    79,    80,   134,    12,     8,    84,     7,   151,   152,
+     153,    89,    90,     3,    16,    17,     7,    95,     8,    25,
+      26,    27,    28,    29,     7,   168,     3,   105,   999,   999,
+     108,     8,    19,    20,   999,     3,     6,   115,   116,     3,
+       8,   119,   120,   168,   169,   170,   171,    53,    54,    55,
+       4,   168,     8,    59,    60,    61,     3,    63,    27,    28,
+      29,     8,   168,   136,   137,   138,   139,    73,    74,    75,
+       3,    77,     4,    79,    80,    81,    82,    83,    84,   103,
+     104,     3,     3,     8,    63,    91,     8,     8,    94,    95,
+     168,     4,   830,    62,    63,    64,   102,     4,   171,    78,
+      79,    80,    25,    26,    27,    28,    29,     4,     3,     3,
+      79,    80,    91,     8,     8,    94,   109,   110,   111,   112,
+     113,   114,     3,    92,    93,     4,     4,     8,     3,     3,
+      53,    54,    55,     8,     8,    58,     4,     3,     3,   369,
+      63,    64,     8,     8,     3,    85,    86,    87,    88,     8,
+      73,    74,    75,   359,   360,     3,    79,    80,     3,    82,
+       8,    84,   168,     8,     3,     3,     3,     3,    91,     8,
+       8,    94,     8,     3,     8,     3,     8,   407,     8,   102,
+       8,     4,     4,   413,    34,    35,    36,    37,     4,   168,
+       4,     4,     4,     4,     4,   425,   413,     4,   428,   168,
+     428,     3,     8,   425,     4,     4,     3,   168,   425,   439,
+       4,   428,     4,   428,   413,     4,     4,     4,   425,   449,
+       4,   425,   439,     4,   454,     4,   425,     4,   454,   428,
+     454,     4,   449,     4,     4,     4,     4,   454,     4,     4,
+     439,   171,   171,   171,   474,   168,   425,     4,     4,   428,
+     449,     4,     4,   169,   169,   454,     4,   474,   425,   169,
+     439,   169,   425,   449,    27,    28,    29,     4,   454,   425,
+       4,     4,   439,   425,   170,   474,   439,   425,   171,   170,
+     425,   487,   488,   489,   425,     4,     4,   439,   425,     4,
+       4,   425,   425,   169,   970,     4,     4,     4,     4,     4,
+      63,     4,     4,    64,    65,    66,    67,    68,    69,     4,
+     171,     4,     4,     4,     4,     4,    79,    80,    79,    80,
+       4,     4,     4,     4,     4,   169,     4,    90,     4,     4,
+       4,     4,     4,    96,    97,    98,    99,   100,   101,    33,
+     103,     4,     4,     4,    38,    39,    40,    41,    42,    43,
+      44,    45,    46,    47,    48,    49,    50,    51,    52,     4,
+       4,   591,   568,     4,     4,   169,     4,   597,    79,    80,
+      64,     4,     4,   171,     4,   171,   171,     4,     4,     4,
+     597,   171,     4,   169,   590,     4,   169,   169,     4,     4,
+       4,   171,     4,   623,     4,   625,   171,     4,   597,     4,
+       4,     4,    23,     5,   168,   168,   623,   168,   625,     7,
+     121,   122,   123,   124,   125,   126,   127,   128,   129,   130,
+     131,   132,   133,     7,   623,     7,   625,     7,     7,   140,
+     141,   154,   155,   156,   157,   158,   159,   160,   161,   162,
+     163,   164,   165,   166,   167,     7,   168,   168,     7,     5,
+       5,   168,     5,     5,     4,   168,     7,   168,     5,     5,
+       5,     5,   525,     3,     7,     7,     7,     5,   168,   168,
+     168,     5,   168,     4,   168,     7,     5,     5,     4,     4,
+     168,   168,   168,   168,   135,     7,     7,     7,     7,   168,
+       7,   168,     7,     7,     7,     7,     7,   168,   168,   168,
+     168,   168,   168,   168,   168,     4,     4,     4,   168,   168,
+     168,   168,   168,   168,   168,   168,   168,     4,     4,     4,
+     168,     3,     6,     6,     3,     6,     6,     3,     6,     3,
+       3,     6,     3,     3,     6,     4,     4,     4,     4,     4,
+       4,   169,   171,     6,     4,     6,     8,     4,     4,     4,
+       4,   169,     4,     4,   171,     4,   169,     4,   169,     4,
+     169,   169,     6,   169,     3,     8,     8,     4,     8,   169,
+     171,     3,   169,   169,   169,   169,   169,   168,   168,   168,
+     168,   168,   168,     8,     4,   168,     4,   168,     4,     4,
+     168,     5,     4,   169,   171,   168,   168,     7,     4,     4,
+       4,   171,   169,   833,   169,   168,   836,   369,   597,   839,
+     591,   833,   842,   839,   842,   839,   833,   847,   809,   836,
+     850,   677,   839,   853,   847,   842,   833,   842,   413,   833,
+     847,   407,   832,   850,   833,   842,   866,   836,   842,   827,
+     839,   855,   872,   842,   872,   853,   862,   877,   847,   866,
+     836,   850,   845,   839,   833,   872,   842,   872,   833,   835,
+     877,   847,   844,   842,   457,   425,   833,   866,   847,   999,
+     833,   850,   838,   872,   836,   842,   841,   833,   877,   842,
+     847,   833,   449,   850,   847,   833,   842,   850,   833,   839,
+     842,   877,   833,   872,   842,   847,   833,   842,   850,   833,
+     833,   842,   874,   454,   872,   842,   852,   439,   842,   842,
+     850,   642,   428,   848,  1004,   866,   625,   878,  1015,   474,
+     592,   480,  1032,   596,  1049,    -1,    -1,   477,    -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,   981,    -1,   981,    -1,    -1,   986,    -1,    -1,    -1,
-      -1,    -1,    -1,   986,   981,    -1,   981,   997,    -1,   986,
-      -1,    -1,    -1,    -1,   981,    -1,    -1,   981,    -1,    -1,
-     997,    -1,   981,    -1,    -1,    -1,    -1,   986,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   981,    -1,    -1,   997,    -1,
-     986,    -1,   981,    -1,    -1,    -1,    -1,   986,    -1,    -1,
-      -1,   997,    -1,    -1,   981,    -1,    -1,    -1,   981,   986,
-      -1,    -1,    -1,   986,    -1,   981,    -1,    -1,    -1,   981,
-      -1,    -1,    -1,   981,   986,    -1,   981,    -1,    -1,    -1,
-     981
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   999,
+      -1,   999,    -1,    -1,  1004,    -1,    -1,    -1,    -1,    -1,
+      -1,  1004,   999,    -1,   999,  1015,    -1,  1004,    -1,    -1,
+      -1,    -1,   999,    -1,    -1,   999,    -1,    -1,  1015,    -1,
+     999,    -1,    -1,    -1,    -1,  1004,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   999,    -1,    -1,  1015,    -1,  1004,    -1,
+     999,    -1,    -1,    -1,    -1,  1004,    -1,    -1,    -1,  1015,
+      -1,    -1,   999,    -1,    -1,    -1,   999,  1004,    -1,    -1,
+      -1,  1004,    -1,   999,    -1,    -1,    -1,   999,    -1,    -1,
+      -1,   999,  1004,    -1,   999,    -1,    -1,    -1,   999,    -1,
+      -1,    -1,   999,    -1,    -1,   999,   999
   };
 
-  const unsigned short
+  const unsigned short int
   Dhcp4Parser::yystos_[] =
   {
-       0,   151,   152,   153,   154,   155,   156,   157,   158,   159,
-     160,   161,   162,   163,   164,   170,   171,   172,   173,   174,
-     175,   176,   177,   178,   179,   180,   181,   182,   183,   184,
-       0,     5,     7,     9,   165,   166,   167,   168,   185,   186,
-     187,   192,     7,   201,     7,   207,     7,   224,     7,   317,
-       7,   397,     7,   413,     7,   349,     7,   355,     7,   379,
-       7,   293,     7,   470,     7,   516,     7,   508,   193,   188,
-     202,   208,   225,   318,   398,   414,   350,   356,   380,   294,
-     471,   517,   509,   185,   194,   195,   165,   190,   191,    10,
-     139,   148,   149,   150,   165,   200,   203,   204,   205,   500,
-     502,   504,   514,    11,    13,    22,    24,    25,    26,    27,
+       0,   154,   155,   156,   157,   158,   159,   160,   161,   162,
+     163,   164,   165,   166,   167,   173,   174,   175,   176,   177,
+     178,   179,   180,   181,   182,   183,   184,   185,   186,   187,
+       0,     5,     7,     9,   168,   169,   170,   171,   188,   189,
+     190,   195,     7,   204,     7,   210,     7,   230,     7,   323,
+       7,   403,     7,   419,     7,   355,     7,   361,     7,   385,
+       7,   299,     7,   476,     7,   522,     7,   514,   196,   191,
+     205,   211,   231,   324,   404,   420,   356,   362,   386,   300,
+     477,   523,   515,   188,   197,   198,   168,   193,   194,    10,
+     142,   151,   152,   153,   168,   203,   206,   207,   208,   506,
+     508,   510,   520,    11,    13,    22,    24,    25,    26,    27,
       28,    29,    30,    31,    32,    53,    54,    55,    56,    57,
-      58,    62,    63,    73,    76,    77,    81,    86,    87,    92,
-     102,   105,   112,   113,   116,   117,   200,   209,   210,   211,
-     212,   213,   214,   215,   217,   218,   219,   220,   235,   237,
-     243,   245,   278,   287,   301,   311,   335,   339,   347,   373,
-     403,   405,   407,   418,   420,   422,   445,   457,   458,   466,
-     468,   506,    14,    15,    18,    21,   200,   222,   223,   226,
-     228,   231,   234,   403,   405,    59,    60,    61,    74,    78,
-      79,    80,    88,    91,    99,   200,   211,   212,   213,   218,
-     219,   319,   320,   321,   323,   325,   327,   329,   331,   333,
-     335,   338,   373,   391,   403,   405,   407,   418,   420,   422,
-     442,    75,   200,   331,   333,   373,   399,   400,   401,   403,
-     405,    87,    93,    94,    95,    96,    97,    98,   100,   200,
-     373,   403,   405,   415,   416,   417,   418,   420,   422,   424,
-     428,   430,   432,   434,   436,   438,   440,   347,    33,    64,
-      66,    67,    70,    71,    72,   200,   263,   357,   358,   359,
-     360,   361,   362,   363,   365,   367,   369,   370,   372,   403,
-     405,    65,    68,    69,   200,   263,   361,   367,   381,   382,
-     383,   384,   385,   387,   388,   389,   390,   403,   405,   103,
-     104,   200,   295,   296,   297,   299,   118,   119,   120,   121,
-     122,   123,   124,   125,   126,   127,   128,   129,   130,   137,
-     138,   200,   403,   405,   472,   473,   474,   475,   477,   479,
-     480,   482,   483,   484,   487,   489,   490,   491,   494,   496,
-     498,   140,   518,   519,   520,    12,   510,   511,   512,     6,
-       3,     4,     8,     3,   206,   515,   501,   503,   505,     4,
-       3,     8,   507,   221,   238,     4,     4,     4,   419,   421,
-     423,   236,   244,   246,     4,     4,     4,     4,   216,   312,
-     348,   374,   340,   404,   406,   336,   279,   446,   408,   288,
-     302,     4,   459,   467,   469,     3,     8,   227,   229,   232,
-       4,     3,     8,   324,   326,   328,   392,   322,   330,     4,
-     334,   332,   443,     3,     8,   402,     3,     8,   441,   429,
-     431,   435,   433,   439,   437,   425,     8,     3,     8,   364,
-     264,     4,   368,   366,   371,     4,     8,     3,   386,     4,
-       4,     8,     3,   298,   300,     3,     8,     4,   476,   478,
-       4,   481,     4,     4,   485,   488,     4,     4,   492,   495,
-     497,   499,     3,     8,   521,     3,     8,   513,     3,     8,
-     185,   185,   165,     4,     4,     4,     4,     4,   204,     4,
-       4,     4,   168,   168,   168,     4,     4,     4,     4,     4,
-       4,   166,   166,   166,   166,     4,     4,     4,     4,     4,
-       4,     4,     4,     4,     4,     4,     4,     4,   166,     4,
-       4,     4,   210,     4,     4,     4,   168,   223,     4,     4,
-       4,     4,     4,     4,   166,     4,     4,     4,   320,     4,
-     400,     4,     4,     4,     4,     4,     4,     4,     4,   417,
-       4,     4,   166,     4,     4,     4,   168,   359,     4,   168,
-     168,   383,     4,     4,   296,   168,     4,     4,   166,     4,
-     166,   166,     4,     4,   168,   168,     4,     4,     4,     4,
-     473,     4,   519,     4,   511,     4,     7,     7,   185,   185,
-     185,     7,     7,     7,   165,   165,   165,     7,     7,     5,
-     165,     5,     5,     5,     5,   187,   189,   165,    82,    83,
-      84,    85,   337,     5,     5,     5,     5,     7,     7,   189,
-       7,     5,   196,    16,    17,   230,    19,    20,   233,   165,
-     165,   165,     5,   165,   165,   196,   165,     7,   165,   196,
-     165,   165,   165,   165,   165,   165,   165,   165,   165,   165,
-     165,   165,   165,   165,   185,   165,   165,   165,    17,   131,
-     486,   132,   133,   134,   135,   136,   168,   493,   165,   165,
-     165,     5,     5,   185,   209,   518,   510,   222,    23,   239,
-     240,   241,    33,    38,    39,    40,    41,    42,    43,    44,
-      45,    46,    47,    48,    49,    50,    51,    52,   200,   251,
-     252,   253,   256,   258,   260,   262,   263,   265,   266,   267,
-     268,   269,   270,   271,   272,   274,   276,   277,   251,     7,
-     247,   248,   249,     7,   313,   314,   315,     7,   351,   352,
-     353,     7,   375,   376,   377,     7,   341,   342,   343,    93,
-      94,    95,    96,    98,   280,   281,   282,   283,   284,   285,
-     286,     7,   447,   448,     7,   409,   410,   411,     7,   289,
-     290,   291,   106,   107,   108,   109,   110,   111,   303,   304,
-     305,   306,   307,   308,   309,   310,   114,   115,   200,   403,
-     405,   460,   461,   462,   464,   472,   197,     7,   393,   394,
-     395,   101,   424,   426,   444,     7,   522,   523,   247,     8,
-       8,     8,     8,   242,     3,     8,   254,   257,   259,   261,
-       4,     4,     4,     4,     4,   273,   275,     4,     4,     4,
-       4,     4,     3,     8,     8,   250,     6,     3,   316,     6,
-       3,   354,     6,     3,   378,     6,     3,   344,     6,     3,
-       3,     6,   449,     3,     6,   412,     6,     3,   292,     6,
-       3,     4,     4,     4,     4,     4,     4,     3,     8,   463,
-     465,     3,     8,     8,   165,   198,   199,   396,     6,     3,
-     427,     8,   524,     3,     6,     6,     4,   240,     4,     4,
-       4,     4,   166,   168,   166,   168,   166,     4,     4,   166,
-     166,   166,   166,   168,   252,   251,   249,   319,   315,   357,
-     353,   381,   377,   200,   211,   212,   213,   218,   219,   263,
-     311,   329,   331,   333,   335,   345,   346,   373,   403,   405,
-     418,   420,   422,   442,   343,   281,    89,    90,   200,   263,
-     347,   373,   403,   405,   418,   420,   422,   450,   451,   452,
-     453,   454,   456,   448,   415,   411,   295,   291,   166,   166,
-     166,   166,   166,   166,   304,     4,     4,   461,     6,     3,
-     399,   395,     4,   141,   143,   144,   200,   263,   403,   405,
-     525,   526,   527,   528,   530,   523,   165,    34,    35,    36,
-      37,   255,   165,   165,   165,   165,   165,     8,     8,     8,
-       8,     3,     8,   455,     4,     8,     3,     8,     8,   165,
-     165,   165,     8,   196,   531,     4,   529,     3,     8,   346,
-       4,   168,   452,     4,   166,     4,   526,   165,     5,   165,
-       7,   532,   533,   534,     3,     6,   142,   145,   146,   147,
-     535,   536,   537,   539,   540,   541,   533,   538,     4,     4,
-       4,     3,     8,     4,   168,   166,   166,   536,   165
+      58,    62,    63,    73,    74,    75,    76,    79,    80,    84,
+      89,    90,    95,   105,   108,   115,   116,   119,   120,   203,
+     212,   213,   214,   215,   216,   217,   218,   219,   220,   221,
+     223,   224,   225,   226,   241,   243,   249,   251,   284,   293,
+     307,   317,   341,   345,   353,   379,   409,   411,   413,   424,
+     426,   428,   451,   463,   464,   472,   474,   512,    14,    15,
+      18,    21,   203,   228,   229,   232,   234,   237,   240,   409,
+     411,    59,    60,    61,    77,    81,    82,    83,    91,    94,
+     102,   203,   214,   215,   216,   217,   218,   219,   224,   225,
+     325,   326,   327,   329,   331,   333,   335,   337,   339,   341,
+     344,   379,   397,   409,   411,   413,   424,   426,   428,   448,
+      78,   203,   337,   339,   379,   405,   406,   407,   409,   411,
+      90,    96,    97,    98,    99,   100,   101,   103,   203,   379,
+     409,   411,   421,   422,   423,   424,   426,   428,   430,   434,
+     436,   438,   440,   442,   444,   446,   353,    33,    64,    66,
+      67,    70,    71,    72,   203,   269,   363,   364,   365,   366,
+     367,   368,   369,   371,   373,   375,   376,   378,   409,   411,
+      65,    68,    69,   203,   269,   367,   373,   387,   388,   389,
+     390,   391,   393,   394,   395,   396,   409,   411,   106,   107,
+     203,   301,   302,   303,   305,   121,   122,   123,   124,   125,
+     126,   127,   128,   129,   130,   131,   132,   133,   140,   141,
+     203,   409,   411,   478,   479,   480,   481,   483,   485,   486,
+     488,   489,   490,   493,   495,   496,   497,   500,   502,   504,
+     143,   524,   525,   526,    12,   516,   517,   518,     6,     3,
+       4,     8,     3,   209,   521,   507,   509,   511,     4,     3,
+       8,   513,   227,   244,     4,     4,     4,   425,   427,   429,
+     242,   250,   252,     4,     4,     4,     4,   222,   318,   354,
+     380,     4,     4,     4,   346,   410,   412,   342,   285,   452,
+     414,   294,   308,     4,   465,   473,   475,     3,     8,   233,
+     235,   238,     4,     3,     8,   330,   332,   334,   398,   328,
+     336,     4,   340,   338,   449,     3,     8,   408,     3,     8,
+     447,   435,   437,   441,   439,   445,   443,   431,     8,     3,
+       8,   370,   270,     4,   374,   372,   377,     4,     8,     3,
+     392,     4,     4,     8,     3,   304,   306,     3,     8,     4,
+     482,   484,     4,   487,     4,     4,   491,   494,     4,     4,
+     498,   501,   503,   505,     3,     8,   527,     3,     8,   519,
+       3,     8,   188,   188,   168,     4,     4,     4,     4,     4,
+     207,     4,     4,     4,   171,   171,   171,     4,     4,     4,
+       4,     4,     4,   169,   169,   169,   169,     4,     4,     4,
+       4,   171,   170,   170,     4,     4,     4,     4,     4,     4,
+       4,     4,     4,   169,     4,     4,     4,   213,     4,     4,
+       4,   171,   229,     4,     4,     4,     4,     4,     4,   169,
+       4,     4,     4,   326,     4,   406,     4,     4,     4,     4,
+       4,     4,     4,     4,   423,     4,     4,   169,     4,     4,
+       4,   171,   365,     4,   171,   171,   389,     4,     4,   302,
+     171,     4,     4,   169,     4,   169,   169,     4,     4,   171,
+     171,     4,     4,     4,     4,   479,     4,   525,     4,   517,
+       4,     7,     7,   188,   188,   188,     7,     7,     7,   168,
+     168,   168,     7,     7,     5,   168,     5,     5,     5,     5,
+     190,   192,   168,    85,    86,    87,    88,   343,     5,     5,
+       5,     5,     7,     7,   192,     7,     5,   199,    16,    17,
+     236,    19,    20,   239,   168,   168,   168,     5,   168,   168,
+     199,   168,     7,   168,   199,   168,   168,   168,   168,   168,
+     168,   168,   168,   168,   168,   168,   168,   168,   168,   188,
+     168,   168,   168,    17,   134,   492,   135,   136,   137,   138,
+     139,   171,   499,   168,   168,   168,     5,     5,   188,   212,
+     524,   516,   228,    23,   245,   246,   247,    33,    38,    39,
+      40,    41,    42,    43,    44,    45,    46,    47,    48,    49,
+      50,    51,    52,   203,   257,   258,   259,   262,   264,   266,
+     268,   269,   271,   272,   273,   274,   275,   276,   277,   278,
+     280,   282,   283,   257,     7,   253,   254,   255,     7,   319,
+     320,   321,     7,   357,   358,   359,     7,   381,   382,   383,
+       7,   347,   348,   349,    96,    97,    98,    99,   101,   286,
+     287,   288,   289,   290,   291,   292,     7,   453,   454,     7,
+     415,   416,   417,     7,   295,   296,   297,   109,   110,   111,
+     112,   113,   114,   309,   310,   311,   312,   313,   314,   315,
+     316,   117,   118,   203,   409,   411,   466,   467,   468,   470,
+     478,   200,     7,   399,   400,   401,   104,   430,   432,   450,
+       7,   528,   529,   253,     8,     8,     8,     8,   248,     3,
+       8,   260,   263,   265,   267,     4,     4,     4,     4,     4,
+     279,   281,     4,     4,     4,     4,     4,     3,     8,     8,
+     256,     6,     3,   322,     6,     3,   360,     6,     3,   384,
+       6,     3,   350,     6,     3,     3,     6,   455,     3,     6,
+     418,     6,     3,   298,     6,     3,     4,     4,     4,     4,
+       4,     4,     3,     8,   469,   471,     3,     8,     8,   168,
+     201,   202,   402,     6,     3,   433,     8,   530,     3,     6,
+       6,     4,   246,     4,     4,     4,     4,   169,   171,   169,
+     171,   169,     4,     4,   169,   169,   169,   169,   171,   258,
+     257,   255,   325,   321,   363,   359,   387,   383,   203,   214,
+     215,   216,   217,   218,   219,   224,   225,   269,   317,   335,
+     337,   339,   341,   351,   352,   379,   409,   411,   424,   426,
+     428,   448,   349,   287,    92,    93,   203,   269,   353,   379,
+     409,   411,   424,   426,   428,   456,   457,   458,   459,   460,
+     462,   454,   421,   417,   301,   297,   169,   169,   169,   169,
+     169,   169,   310,     4,     4,   467,     6,     3,   405,   401,
+       4,   144,   146,   147,   203,   269,   409,   411,   531,   532,
+     533,   534,   536,   529,   168,    34,    35,    36,    37,   261,
+     168,   168,   168,   168,   168,     8,     8,     8,     8,     3,
+       8,   461,     4,     8,     3,     8,     8,   168,   168,   168,
+       8,   199,   537,     4,   535,     3,     8,   352,     4,   171,
+     458,     4,   169,     4,   532,   168,     5,   168,     7,   538,
+     539,   540,     3,     6,   145,   148,   149,   150,   541,   542,
+     543,   545,   546,   547,   539,   544,     4,     4,     4,     3,
+       8,     4,   171,   169,   169,   542,   168
   };
 
-  const unsigned short
+  const unsigned short int
   Dhcp4Parser::yyr1_[] =
   {
-       0,   169,   171,   170,   172,   170,   173,   170,   174,   170,
-     175,   170,   176,   170,   177,   170,   178,   170,   179,   170,
-     180,   170,   181,   170,   182,   170,   183,   170,   184,   170,
-     185,   185,   185,   185,   185,   185,   185,   186,   188,   187,
-     189,   190,   190,   191,   191,   193,   192,   194,   194,   195,
-     195,   197,   196,   198,   198,   199,   199,   200,   202,   201,
-     203,   203,   204,   204,   204,   204,   204,   204,   206,   205,
-     208,   207,   209,   209,   210,   210,   210,   210,   210,   210,
-     210,   210,   210,   210,   210,   210,   210,   210,   210,   210,
-     210,   210,   210,   210,   210,   210,   210,   210,   210,   210,
-     210,   210,   210,   210,   210,   210,   210,   210,   211,   212,
-     213,   214,   216,   215,   217,   218,   219,   221,   220,   222,
-     222,   223,   223,   223,   223,   223,   223,   223,   225,   224,
-     227,   226,   229,   228,   230,   230,   232,   231,   233,   233,
-     234,   236,   235,   238,   237,   239,   239,   240,   242,   241,
-     244,   243,   246,   245,   247,   247,   248,   248,   250,   249,
-     251,   251,   252,   252,   252,   252,   252,   252,   252,   252,
-     252,   252,   252,   252,   252,   252,   252,   252,   252,   252,
-     254,   253,   255,   255,   255,   255,   257,   256,   259,   258,
-     261,   260,   262,   264,   263,   265,   266,   267,   268,   269,
-     270,   271,   273,   272,   275,   274,   276,   277,   279,   278,
-     280,   280,   281,   281,   281,   281,   281,   282,   283,   284,
-     285,   286,   288,   287,   289,   289,   290,   290,   292,   291,
-     294,   293,   295,   295,   295,   296,   296,   298,   297,   300,
-     299,   302,   301,   303,   303,   304,   304,   304,   304,   304,
-     304,   305,   306,   307,   308,   309,   310,   312,   311,   313,
-     313,   314,   314,   316,   315,   318,   317,   319,   319,   320,
-     320,   320,   320,   320,   320,   320,   320,   320,   320,   320,
-     320,   320,   320,   320,   320,   320,   320,   320,   320,   320,
-     320,   320,   320,   322,   321,   324,   323,   326,   325,   328,
-     327,   330,   329,   332,   331,   334,   333,   336,   335,   337,
-     337,   337,   337,   338,   340,   339,   341,   341,   342,   342,
-     344,   343,   345,   345,   346,   346,   346,   346,   346,   346,
-     346,   346,   346,   346,   346,   346,   346,   346,   346,   346,
-     346,   346,   346,   348,   347,   350,   349,   351,   351,   352,
-     352,   354,   353,   356,   355,   357,   357,   358,   358,   359,
-     359,   359,   359,   359,   359,   359,   359,   359,   359,   360,
-     361,   362,   364,   363,   366,   365,   368,   367,   369,   371,
-     370,   372,   374,   373,   375,   375,   376,   376,   378,   377,
-     380,   379,   381,   381,   382,   382,   383,   383,   383,   383,
-     383,   383,   383,   383,   383,   384,   386,   385,   387,   388,
-     389,   390,   392,   391,   393,   393,   394,   394,   396,   395,
-     398,   397,   399,   399,   400,   400,   400,   400,   400,   400,
-     400,   402,   401,   404,   403,   406,   405,   408,   407,   409,
-     409,   410,   410,   412,   411,   414,   413,   415,   415,   416,
-     416,   417,   417,   417,   417,   417,   417,   417,   417,   417,
-     417,   417,   417,   417,   417,   417,   419,   418,   421,   420,
-     423,   422,   425,   424,   427,   426,   429,   428,   431,   430,
-     433,   432,   435,   434,   437,   436,   439,   438,   441,   440,
-     443,   442,   444,   444,   446,   445,   447,   447,   449,   448,
-     450,   450,   451,   451,   452,   452,   452,   452,   452,   452,
-     452,   452,   452,   452,   452,   453,   455,   454,   456,   457,
-     459,   458,   460,   460,   461,   461,   461,   461,   461,   463,
-     462,   465,   464,   467,   466,   469,   468,   471,   470,   472,
-     472,   473,   473,   473,   473,   473,   473,   473,   473,   473,
-     473,   473,   473,   473,   473,   473,   473,   473,   473,   474,
-     476,   475,   478,   477,   479,   481,   480,   482,   483,   485,
-     484,   486,   486,   488,   487,   489,   490,   492,   491,   493,
-     493,   493,   493,   493,   495,   494,   497,   496,   499,   498,
-     501,   500,   503,   502,   505,   504,   507,   506,   509,   508,
-     510,   510,   511,   513,   512,   515,   514,   517,   516,   518,
-     518,   519,   521,   520,   522,   522,   524,   523,   525,   525,
-     526,   526,   526,   526,   526,   526,   526,   527,   529,   528,
-     531,   530,   532,   532,   534,   533,   535,   535,   536,   536,
-     536,   536,   538,   537,   539,   540,   541
+       0,   172,   174,   173,   175,   173,   176,   173,   177,   173,
+     178,   173,   179,   173,   180,   173,   181,   173,   182,   173,
+     183,   173,   184,   173,   185,   173,   186,   173,   187,   173,
+     188,   188,   188,   188,   188,   188,   188,   189,   191,   190,
+     192,   193,   193,   194,   194,   196,   195,   197,   197,   198,
+     198,   200,   199,   201,   201,   202,   202,   203,   205,   204,
+     206,   206,   207,   207,   207,   207,   207,   207,   209,   208,
+     211,   210,   212,   212,   213,   213,   213,   213,   213,   213,
+     213,   213,   213,   213,   213,   213,   213,   213,   213,   213,
+     213,   213,   213,   213,   213,   213,   213,   213,   213,   213,
+     213,   213,   213,   213,   213,   213,   213,   213,   213,   213,
+     213,   214,   215,   216,   217,   218,   219,   220,   222,   221,
+     223,   224,   225,   227,   226,   228,   228,   229,   229,   229,
+     229,   229,   229,   229,   231,   230,   233,   232,   235,   234,
+     236,   236,   238,   237,   239,   239,   240,   242,   241,   244,
+     243,   245,   245,   246,   248,   247,   250,   249,   252,   251,
+     253,   253,   254,   254,   256,   255,   257,   257,   258,   258,
+     258,   258,   258,   258,   258,   258,   258,   258,   258,   258,
+     258,   258,   258,   258,   258,   258,   260,   259,   261,   261,
+     261,   261,   263,   262,   265,   264,   267,   266,   268,   270,
+     269,   271,   272,   273,   274,   275,   276,   277,   279,   278,
+     281,   280,   282,   283,   285,   284,   286,   286,   287,   287,
+     287,   287,   287,   288,   289,   290,   291,   292,   294,   293,
+     295,   295,   296,   296,   298,   297,   300,   299,   301,   301,
+     301,   302,   302,   304,   303,   306,   305,   308,   307,   309,
+     309,   310,   310,   310,   310,   310,   310,   311,   312,   313,
+     314,   315,   316,   318,   317,   319,   319,   320,   320,   322,
+     321,   324,   323,   325,   325,   326,   326,   326,   326,   326,
+     326,   326,   326,   326,   326,   326,   326,   326,   326,   326,
+     326,   326,   326,   326,   326,   326,   326,   326,   326,   326,
+     326,   326,   328,   327,   330,   329,   332,   331,   334,   333,
+     336,   335,   338,   337,   340,   339,   342,   341,   343,   343,
+     343,   343,   344,   346,   345,   347,   347,   348,   348,   350,
+     349,   351,   351,   352,   352,   352,   352,   352,   352,   352,
+     352,   352,   352,   352,   352,   352,   352,   352,   352,   352,
+     352,   352,   352,   352,   352,   354,   353,   356,   355,   357,
+     357,   358,   358,   360,   359,   362,   361,   363,   363,   364,
+     364,   365,   365,   365,   365,   365,   365,   365,   365,   365,
+     365,   366,   367,   368,   370,   369,   372,   371,   374,   373,
+     375,   377,   376,   378,   380,   379,   381,   381,   382,   382,
+     384,   383,   386,   385,   387,   387,   388,   388,   389,   389,
+     389,   389,   389,   389,   389,   389,   389,   390,   392,   391,
+     393,   394,   395,   396,   398,   397,   399,   399,   400,   400,
+     402,   401,   404,   403,   405,   405,   406,   406,   406,   406,
+     406,   406,   406,   408,   407,   410,   409,   412,   411,   414,
+     413,   415,   415,   416,   416,   418,   417,   420,   419,   421,
+     421,   422,   422,   423,   423,   423,   423,   423,   423,   423,
+     423,   423,   423,   423,   423,   423,   423,   423,   425,   424,
+     427,   426,   429,   428,   431,   430,   433,   432,   435,   434,
+     437,   436,   439,   438,   441,   440,   443,   442,   445,   444,
+     447,   446,   449,   448,   450,   450,   452,   451,   453,   453,
+     455,   454,   456,   456,   457,   457,   458,   458,   458,   458,
+     458,   458,   458,   458,   458,   458,   458,   459,   461,   460,
+     462,   463,   465,   464,   466,   466,   467,   467,   467,   467,
+     467,   469,   468,   471,   470,   473,   472,   475,   474,   477,
+     476,   478,   478,   479,   479,   479,   479,   479,   479,   479,
+     479,   479,   479,   479,   479,   479,   479,   479,   479,   479,
+     479,   480,   482,   481,   484,   483,   485,   487,   486,   488,
+     489,   491,   490,   492,   492,   494,   493,   495,   496,   498,
+     497,   499,   499,   499,   499,   499,   501,   500,   503,   502,
+     505,   504,   507,   506,   509,   508,   511,   510,   513,   512,
+     515,   514,   516,   516,   517,   519,   518,   521,   520,   523,
+     522,   524,   524,   525,   527,   526,   528,   528,   530,   529,
+     531,   531,   532,   532,   532,   532,   532,   532,   532,   533,
+     535,   534,   537,   536,   538,   538,   540,   539,   541,   541,
+     542,   542,   542,   542,   544,   543,   545,   546,   547
   };
 
   const unsigned char
@@ -4637,61 +4624,62 @@ namespace isc { namespace dhcp {
        0,     4,     1,     3,     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,     3,     3,
-       3,     3,     0,     4,     3,     3,     3,     0,     6,     1,
-       3,     1,     1,     1,     1,     1,     1,     1,     0,     4,
-       0,     4,     0,     4,     1,     1,     0,     4,     1,     1,
-       3,     0,     6,     0,     6,     1,     3,     1,     0,     4,
-       0,     6,     0,     6,     0,     1,     1,     3,     0,     4,
-       1,     3,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       0,     4,     1,     1,     1,     1,     0,     4,     0,     4,
-       0,     4,     3,     0,     4,     3,     3,     3,     3,     3,
-       3,     3,     0,     4,     0,     4,     3,     3,     0,     6,
-       1,     3,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     0,     6,     0,     1,     1,     3,     0,     4,
-       0,     4,     1,     3,     1,     1,     1,     0,     4,     0,
-       4,     0,     6,     1,     3,     1,     1,     1,     1,     1,
-       1,     3,     3,     3,     3,     3,     3,     0,     6,     0,
-       1,     1,     3,     0,     4,     0,     4,     1,     3,     1,
+       1,     3,     3,     3,     3,     3,     3,     3,     0,     4,
+       3,     3,     3,     0,     6,     1,     3,     1,     1,     1,
+       1,     1,     1,     1,     0,     4,     0,     4,     0,     4,
+       1,     1,     0,     4,     1,     1,     3,     0,     6,     0,
+       6,     1,     3,     1,     0,     4,     0,     6,     0,     6,
+       0,     1,     1,     3,     0,     4,     1,     3,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     0,     4,     1,     1,
+       1,     1,     0,     4,     0,     4,     0,     4,     3,     0,
+       4,     3,     3,     3,     3,     3,     3,     3,     0,     4,
+       0,     4,     3,     3,     0,     6,     1,     3,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     0,     6,
+       0,     1,     1,     3,     0,     4,     0,     4,     1,     3,
+       1,     1,     1,     0,     4,     0,     4,     0,     6,     1,
+       3,     1,     1,     1,     1,     1,     1,     3,     3,     3,
+       3,     3,     3,     0,     6,     0,     1,     1,     3,     0,
+       4,     0,     4,     1,     3,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     0,     4,     0,     4,     0,     4,     0,
-       4,     0,     4,     0,     4,     0,     4,     0,     4,     1,
-       1,     1,     1,     3,     0,     6,     0,     1,     1,     3,
-       0,     4,     1,     3,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     0,     6,     0,     4,     0,     1,     1,
-       3,     0,     4,     0,     4,     0,     1,     1,     3,     1,
+       1,     1,     0,     4,     0,     4,     0,     4,     0,     4,
+       0,     4,     0,     4,     0,     4,     0,     4,     1,     1,
+       1,     1,     3,     0,     6,     0,     1,     1,     3,     0,
+       4,     1,     3,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       3,     1,     0,     4,     0,     4,     0,     4,     1,     0,
-       4,     3,     0,     6,     0,     1,     1,     3,     0,     4,
-       0,     4,     0,     1,     1,     3,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     1,     0,     4,     1,     1,
-       3,     3,     0,     6,     0,     1,     1,     3,     0,     4,
-       0,     4,     1,     3,     1,     1,     1,     1,     1,     1,
-       1,     0,     4,     0,     4,     0,     4,     0,     6,     0,
+       1,     1,     1,     1,     1,     0,     6,     0,     4,     0,
        1,     1,     3,     0,     4,     0,     4,     0,     1,     1,
        3,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     1,     0,     4,     0,     4,
+       1,     1,     3,     1,     0,     4,     0,     4,     0,     4,
+       1,     0,     4,     3,     0,     6,     0,     1,     1,     3,
+       0,     4,     0,     4,     0,     1,     1,     3,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     0,     4,
+       1,     1,     3,     3,     0,     6,     0,     1,     1,     3,
+       0,     4,     0,     4,     1,     3,     1,     1,     1,     1,
+       1,     1,     1,     0,     4,     0,     4,     0,     4,     0,
+       6,     0,     1,     1,     3,     0,     4,     0,     4,     0,
+       1,     1,     3,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     0,     4,
        0,     4,     0,     4,     0,     4,     0,     4,     0,     4,
        0,     4,     0,     4,     0,     4,     0,     4,     0,     4,
-       0,     6,     1,     1,     0,     6,     1,     3,     0,     4,
-       0,     1,     1,     3,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     1,     0,     4,     3,     3,
-       0,     6,     1,     3,     1,     1,     1,     1,     1,     0,
-       4,     0,     4,     0,     4,     0,     6,     0,     4,     1,
-       3,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     1,     1,     1,     1,     3,
-       0,     4,     0,     4,     3,     0,     4,     3,     3,     0,
-       4,     1,     1,     0,     4,     3,     3,     0,     4,     1,
-       1,     1,     1,     1,     0,     4,     0,     4,     0,     4,
-       0,     4,     0,     4,     0,     4,     0,     6,     0,     4,
-       1,     3,     1,     0,     6,     0,     6,     0,     4,     1,
-       3,     1,     0,     6,     1,     3,     0,     4,     1,     3,
-       1,     1,     1,     1,     1,     1,     1,     3,     0,     4,
-       0,     6,     1,     3,     0,     4,     1,     3,     1,     1,
-       1,     1,     0,     4,     3,     3,     3
+       0,     4,     0,     6,     1,     1,     0,     6,     1,     3,
+       0,     4,     0,     1,     1,     3,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     0,     4,
+       3,     3,     0,     6,     1,     3,     1,     1,     1,     1,
+       1,     0,     4,     0,     4,     0,     4,     0,     6,     0,
+       4,     1,     3,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     3,     0,     4,     0,     4,     3,     0,     4,     3,
+       3,     0,     4,     1,     1,     0,     4,     3,     3,     0,
+       4,     1,     1,     1,     1,     1,     0,     4,     0,     4,
+       0,     4,     0,     4,     0,     4,     0,     4,     0,     6,
+       0,     4,     1,     3,     1,     0,     6,     0,     6,     0,
+       4,     1,     3,     1,     0,     6,     1,     3,     0,     4,
+       1,     3,     1,     1,     1,     1,     1,     1,     1,     3,
+       0,     4,     0,     6,     1,     3,     0,     4,     1,     3,
+       1,     1,     1,     1,     0,     4,     3,     3,     3
   };
 
 
@@ -4720,7 +4708,8 @@ namespace isc { namespace dhcp {
   "\"4o6-interface\"", "\"4o6-interface-id\"", "\"4o6-subnet\"",
   "\"option-def\"", "\"option-data\"", "\"name\"", "\"data\"", "\"code\"",
   "\"space\"", "\"csv-format\"", "\"always-send\"", "\"record-types\"",
-  "\"encapsulate\"", "\"array\"", "\"shared-networks\"", "\"pools\"",
+  "\"encapsulate\"", "\"array\"", "\"calculate-tee-times\"",
+  "\"t1-percent\"", "\"t2-percent\"", "\"shared-networks\"", "\"pools\"",
   "\"pool\"", "\"user-context\"", "\"comment\"", "\"subnet\"",
   "\"interface\"", "\"id\"", "\"reservation-mode\"", "\"disabled\"",
   "\"out-of-pool\"", "\"global\"", "\"all\"",
@@ -4757,21 +4746,21 @@ namespace isc { namespace dhcp {
   "not_empty_list_strings", "unknown_map_entry", "syntax_map", "$@18",
   "global_objects", "global_object", "dhcp4_object", "$@19", "sub_dhcp4",
   "$@20", "global_params", "global_param", "valid_lifetime", "renew_timer",
-  "rebind_timer", "decline_probation_period", "server_tag", "$@21",
-  "echo_client_id", "match_client_id", "authoritative",
-  "interfaces_config", "$@22", "interfaces_config_params",
-  "interfaces_config_param", "sub_interfaces4", "$@23", "interfaces_list",
-  "$@24", "dhcp_socket_type", "$@25", "socket_type", "outbound_interface",
-  "$@26", "outbound_interface_value", "re_detect", "lease_database",
-  "$@27", "sanity_checks", "$@28", "sanity_checks_params",
-  "sanity_checks_param", "lease_checks", "$@29", "hosts_database", "$@30",
-  "hosts_databases", "$@31", "database_list", "not_empty_database_list",
-  "database", "$@32", "database_map_params", "database_map_param",
-  "database_type", "$@33", "db_type", "user", "$@34", "password", "$@35",
-  "host", "$@36", "port", "name", "$@37", "persist", "lfc_interval",
-  "readonly", "connect_timeout", "request_timeout", "tcp_keepalive",
-  "tcp_nodelay", "contact_points", "$@38", "keyspace", "$@39",
-  "max_reconnect_tries", "reconnect_wait_time",
+  "rebind_timer", "calculate_tee_times", "t1_percent", "t2_percent",
+  "decline_probation_period", "server_tag", "$@21", "echo_client_id",
+  "match_client_id", "authoritative", "interfaces_config", "$@22",
+  "interfaces_config_params", "interfaces_config_param", "sub_interfaces4",
+  "$@23", "interfaces_list", "$@24", "dhcp_socket_type", "$@25",
+  "socket_type", "outbound_interface", "$@26", "outbound_interface_value",
+  "re_detect", "lease_database", "$@27", "sanity_checks", "$@28",
+  "sanity_checks_params", "sanity_checks_param", "lease_checks", "$@29",
+  "hosts_database", "$@30", "hosts_databases", "$@31", "database_list",
+  "not_empty_database_list", "database", "$@32", "database_map_params",
+  "database_map_param", "database_type", "$@33", "db_type", "user", "$@34",
+  "password", "$@35", "host", "$@36", "port", "name", "$@37", "persist",
+  "lfc_interval", "readonly", "connect_timeout", "request_timeout",
+  "tcp_keepalive", "tcp_nodelay", "contact_points", "$@38", "keyspace",
+  "$@39", "max_reconnect_tries", "reconnect_wait_time",
   "host_reservation_identifiers", "$@40",
   "host_reservation_identifiers_list", "host_reservation_identifier",
   "duid_id", "hw_address_id", "circuit_id", "client_id", "flex_id",
@@ -4841,74 +4830,75 @@ namespace isc { namespace dhcp {
   };
 
 #if PARSER4_DEBUG
-  const unsigned short
+  const unsigned short int
   Dhcp4Parser::yyrline_[] =
   {
-       0,   254,   254,   254,   255,   255,   256,   256,   257,   257,
-     258,   258,   259,   259,   260,   260,   261,   261,   262,   262,
-     263,   263,   264,   264,   265,   265,   266,   266,   267,   267,
-     275,   276,   277,   278,   279,   280,   281,   284,   289,   289,
-     300,   303,   304,   307,   311,   318,   318,   325,   326,   329,
-     333,   340,   340,   347,   348,   351,   355,   366,   376,   376,
-     392,   393,   397,   398,   399,   400,   401,   402,   405,   405,
-     420,   420,   429,   430,   435,   436,   437,   438,   439,   440,
-     441,   442,   443,   444,   445,   446,   447,   448,   449,   450,
-     451,   452,   453,   454,   455,   456,   457,   458,   459,   460,
-     461,   462,   463,   464,   465,   466,   467,   468,   471,   476,
-     481,   486,   491,   491,   499,   504,   509,   515,   515,   526,
-     527,   530,   531,   532,   533,   534,   535,   536,   539,   539,
-     548,   548,   558,   558,   565,   566,   569,   569,   576,   578,
-     582,   588,   588,   600,   600,   610,   611,   613,   615,   615,
-     633,   633,   645,   645,   655,   656,   659,   660,   663,   663,
-     673,   674,   677,   678,   679,   680,   681,   682,   683,   684,
-     685,   686,   687,   688,   689,   690,   691,   692,   693,   694,
-     697,   697,   704,   705,   706,   707,   710,   710,   718,   718,
-     726,   726,   734,   739,   739,   747,   752,   757,   762,   767,
-     772,   777,   782,   782,   790,   790,   798,   803,   808,   808,
-     818,   819,   822,   823,   824,   825,   826,   829,   834,   839,
-     844,   849,   854,   854,   864,   865,   868,   869,   872,   872,
-     882,   882,   892,   893,   894,   897,   898,   901,   901,   909,
-     909,   917,   917,   928,   929,   932,   933,   934,   935,   936,
-     937,   940,   945,   950,   955,   960,   965,   973,   973,   986,
-     987,   990,   991,   998,   998,  1024,  1024,  1035,  1036,  1040,
-    1041,  1042,  1043,  1044,  1045,  1046,  1047,  1048,  1049,  1050,
-    1051,  1052,  1053,  1054,  1055,  1056,  1057,  1058,  1059,  1060,
-    1061,  1062,  1063,  1066,  1066,  1074,  1074,  1082,  1082,  1090,
-    1090,  1098,  1098,  1106,  1106,  1114,  1114,  1124,  1124,  1131,
-    1132,  1133,  1134,  1137,  1144,  1144,  1155,  1156,  1160,  1161,
-    1164,  1164,  1172,  1173,  1176,  1177,  1178,  1179,  1180,  1181,
-    1182,  1183,  1184,  1185,  1186,  1187,  1188,  1189,  1190,  1191,
-    1192,  1193,  1194,  1201,  1201,  1214,  1214,  1223,  1224,  1227,
-    1228,  1233,  1233,  1248,  1248,  1262,  1263,  1266,  1267,  1270,
-    1271,  1272,  1273,  1274,  1275,  1276,  1277,  1278,  1279,  1282,
-    1284,  1289,  1291,  1291,  1299,  1299,  1307,  1307,  1315,  1317,
-    1317,  1325,  1334,  1334,  1346,  1347,  1352,  1353,  1358,  1358,
-    1370,  1370,  1382,  1383,  1388,  1389,  1394,  1395,  1396,  1397,
-    1398,  1399,  1400,  1401,  1402,  1405,  1407,  1407,  1415,  1417,
-    1419,  1424,  1432,  1432,  1444,  1445,  1448,  1449,  1452,  1452,
-    1462,  1462,  1472,  1473,  1476,  1477,  1478,  1479,  1480,  1481,
-    1482,  1485,  1485,  1493,  1493,  1518,  1518,  1548,  1548,  1558,
-    1559,  1562,  1563,  1566,  1566,  1575,  1575,  1584,  1585,  1588,
-    1589,  1593,  1594,  1595,  1596,  1597,  1598,  1599,  1600,  1601,
-    1602,  1603,  1604,  1605,  1606,  1607,  1610,  1610,  1618,  1618,
-    1626,  1626,  1634,  1634,  1642,  1642,  1652,  1652,  1660,  1660,
-    1668,  1668,  1676,  1676,  1684,  1684,  1692,  1692,  1700,  1700,
-    1713,  1713,  1723,  1724,  1730,  1730,  1740,  1741,  1744,  1744,
-    1754,  1755,  1758,  1759,  1762,  1763,  1764,  1765,  1766,  1767,
-    1768,  1769,  1770,  1771,  1772,  1775,  1777,  1777,  1785,  1794,
-    1801,  1801,  1811,  1812,  1815,  1816,  1817,  1818,  1819,  1822,
-    1822,  1830,  1830,  1841,  1841,  1879,  1879,  1891,  1891,  1901,
-    1902,  1905,  1906,  1907,  1908,  1909,  1910,  1911,  1912,  1913,
-    1914,  1915,  1916,  1917,  1918,  1919,  1920,  1921,  1922,  1925,
-    1930,  1930,  1938,  1938,  1946,  1951,  1951,  1959,  1964,  1969,
-    1969,  1977,  1978,  1981,  1981,  1989,  1994,  1999,  1999,  2007,
-    2010,  2013,  2016,  2019,  2025,  2025,  2033,  2033,  2041,  2041,
-    2052,  2052,  2059,  2059,  2066,  2066,  2073,  2073,  2084,  2084,
-    2094,  2095,  2099,  2102,  2102,  2117,  2117,  2127,  2127,  2138,
-    2139,  2143,  2147,  2147,  2159,  2160,  2164,  2164,  2172,  2173,
-    2176,  2177,  2178,  2179,  2180,  2181,  2182,  2185,  2190,  2190,
-    2198,  2198,  2208,  2209,  2212,  2212,  2220,  2221,  2224,  2225,
-    2226,  2227,  2230,  2230,  2238,  2243,  2248
+       0,   257,   257,   257,   258,   258,   259,   259,   260,   260,
+     261,   261,   262,   262,   263,   263,   264,   264,   265,   265,
+     266,   266,   267,   267,   268,   268,   269,   269,   270,   270,
+     278,   279,   280,   281,   282,   283,   284,   287,   292,   292,
+     303,   306,   307,   310,   314,   321,   321,   328,   329,   332,
+     336,   343,   343,   350,   351,   354,   358,   369,   379,   379,
+     395,   396,   400,   401,   402,   403,   404,   405,   408,   408,
+     423,   423,   432,   433,   438,   439,   440,   441,   442,   443,
+     444,   445,   446,   447,   448,   449,   450,   451,   452,   453,
+     454,   455,   456,   457,   458,   459,   460,   461,   462,   463,
+     464,   465,   466,   467,   468,   469,   470,   471,   472,   473,
+     474,   477,   482,   487,   492,   497,   502,   507,   512,   512,
+     520,   525,   530,   536,   536,   547,   548,   551,   552,   553,
+     554,   555,   556,   557,   560,   560,   569,   569,   579,   579,
+     586,   587,   590,   590,   597,   599,   603,   609,   609,   621,
+     621,   631,   632,   634,   636,   636,   654,   654,   666,   666,
+     676,   677,   680,   681,   684,   684,   694,   695,   698,   699,
+     700,   701,   702,   703,   704,   705,   706,   707,   708,   709,
+     710,   711,   712,   713,   714,   715,   718,   718,   725,   726,
+     727,   728,   731,   731,   739,   739,   747,   747,   755,   760,
+     760,   768,   773,   778,   783,   788,   793,   798,   803,   803,
+     811,   811,   819,   824,   829,   829,   839,   840,   843,   844,
+     845,   846,   847,   850,   855,   860,   865,   870,   875,   875,
+     885,   886,   889,   890,   893,   893,   903,   903,   913,   914,
+     915,   918,   919,   922,   922,   930,   930,   938,   938,   949,
+     950,   953,   954,   955,   956,   957,   958,   961,   966,   971,
+     976,   981,   986,   994,   994,  1007,  1008,  1011,  1012,  1019,
+    1019,  1045,  1045,  1056,  1057,  1061,  1062,  1063,  1064,  1065,
+    1066,  1067,  1068,  1069,  1070,  1071,  1072,  1073,  1074,  1075,
+    1076,  1077,  1078,  1079,  1080,  1081,  1082,  1083,  1084,  1085,
+    1086,  1087,  1090,  1090,  1098,  1098,  1106,  1106,  1114,  1114,
+    1122,  1122,  1130,  1130,  1138,  1138,  1148,  1148,  1155,  1156,
+    1157,  1158,  1161,  1168,  1168,  1179,  1180,  1184,  1185,  1188,
+    1188,  1196,  1197,  1200,  1201,  1202,  1203,  1204,  1205,  1206,
+    1207,  1208,  1209,  1210,  1211,  1212,  1213,  1214,  1215,  1216,
+    1217,  1218,  1219,  1220,  1221,  1228,  1228,  1241,  1241,  1250,
+    1251,  1254,  1255,  1260,  1260,  1275,  1275,  1289,  1290,  1293,
+    1294,  1297,  1298,  1299,  1300,  1301,  1302,  1303,  1304,  1305,
+    1306,  1309,  1311,  1316,  1318,  1318,  1326,  1326,  1334,  1334,
+    1342,  1344,  1344,  1352,  1361,  1361,  1373,  1374,  1379,  1380,
+    1385,  1385,  1397,  1397,  1409,  1410,  1415,  1416,  1421,  1422,
+    1423,  1424,  1425,  1426,  1427,  1428,  1429,  1432,  1434,  1434,
+    1442,  1444,  1446,  1451,  1459,  1459,  1471,  1472,  1475,  1476,
+    1479,  1479,  1489,  1489,  1499,  1500,  1503,  1504,  1505,  1506,
+    1507,  1508,  1509,  1512,  1512,  1520,  1520,  1545,  1545,  1575,
+    1575,  1585,  1586,  1589,  1590,  1593,  1593,  1602,  1602,  1611,
+    1612,  1615,  1616,  1620,  1621,  1622,  1623,  1624,  1625,  1626,
+    1627,  1628,  1629,  1630,  1631,  1632,  1633,  1634,  1637,  1637,
+    1645,  1645,  1653,  1653,  1661,  1661,  1669,  1669,  1679,  1679,
+    1687,  1687,  1695,  1695,  1703,  1703,  1711,  1711,  1719,  1719,
+    1727,  1727,  1740,  1740,  1750,  1751,  1757,  1757,  1767,  1768,
+    1771,  1771,  1781,  1782,  1785,  1786,  1789,  1790,  1791,  1792,
+    1793,  1794,  1795,  1796,  1797,  1798,  1799,  1802,  1804,  1804,
+    1812,  1821,  1828,  1828,  1838,  1839,  1842,  1843,  1844,  1845,
+    1846,  1849,  1849,  1857,  1857,  1868,  1868,  1906,  1906,  1918,
+    1918,  1928,  1929,  1932,  1933,  1934,  1935,  1936,  1937,  1938,
+    1939,  1940,  1941,  1942,  1943,  1944,  1945,  1946,  1947,  1948,
+    1949,  1952,  1957,  1957,  1965,  1965,  1973,  1978,  1978,  1986,
+    1991,  1996,  1996,  2004,  2005,  2008,  2008,  2016,  2021,  2026,
+    2026,  2034,  2037,  2040,  2043,  2046,  2052,  2052,  2060,  2060,
+    2068,  2068,  2079,  2079,  2086,  2086,  2093,  2093,  2100,  2100,
+    2111,  2111,  2121,  2122,  2126,  2129,  2129,  2144,  2144,  2154,
+    2154,  2165,  2166,  2170,  2174,  2174,  2186,  2187,  2191,  2191,
+    2199,  2200,  2203,  2204,  2205,  2206,  2207,  2208,  2209,  2212,
+    2217,  2217,  2225,  2225,  2235,  2236,  2239,  2239,  2247,  2248,
+    2251,  2252,  2253,  2254,  2257,  2257,  2265,  2270,  2275
   };
 
   // Print the state stack on the debug stream.
@@ -4921,18 +4911,18 @@ namespace isc { namespace dhcp {
            i_end = yystack_.end ();
          i != i_end; ++i)
       *yycdebug_ << ' ' << i->state;
-    *yycdebug_ << '\n';
+    *yycdebug_ << std::endl;
   }
 
   // Report on the debug stream that the rule \a yyrule is going to be reduced.
   void
   Dhcp4Parser::yy_reduce_print_ (int yyrule)
   {
-    unsigned yylno = yyrline_[yyrule];
+    unsigned int yylno = yyrline_[yyrule];
     int yynrhs = yyr2_[yyrule];
     // Print the symbols being reduced, and their result.
     *yycdebug_ << "Reducing stack by rule " << yyrule - 1
-               << " (line " << yylno << "):\n";
+               << " (line " << yylno << "):" << std::endl;
     // The symbols being reduced.
     for (int yyi = 0; yyi < yynrhs; yyi++)
       YY_SYMBOL_PRINT ("   $" << yyi + 1 << " =",
@@ -4941,10 +4931,10 @@ namespace isc { namespace dhcp {
 #endif // PARSER4_DEBUG
 
 
-#line 14 "dhcp4_parser.yy" // lalr1.cc:1218
+#line 14 "dhcp4_parser.yy" // lalr1.cc:1167
 } } // isc::dhcp
-#line 4947 "dhcp4_parser.cc" // lalr1.cc:1218
-#line 2253 "dhcp4_parser.yy" // lalr1.cc:1219
+#line 4937 "dhcp4_parser.cc" // lalr1.cc:1167
+#line 2280 "dhcp4_parser.yy" // lalr1.cc:1168
 
 
 void
index 22a0e1fea9181be94e9b68386dcf343418dc2c0a..146a9cdeed6ba75772d89516a3376a990df4051b 100644 (file)
@@ -1,8 +1,8 @@
-// A Bison parser, made by GNU Bison 3.2.1.
+// A Bison parser, made by GNU Bison 3.0.4.
 
 // Skeleton interface for Bison LALR(1) parsers in C++
 
-// Copyright (C) 2002-2015, 2018 Free Software Foundation, Inc.
+// Copyright (C) 2002-2015 Free Software Foundation, Inc.
 
 // This program is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -30,7 +30,6 @@
 // This special exception was added by the Free Software Foundation in
 // version 2.2 of Bison.
 
-
 /**
  ** \file dhcp4_parser.h
  ** Define the isc::dhcp::parser class.
 
 // C++ LALR(1) parser skeleton written by Akim Demaille.
 
-// Undocumented macros, especially those whose name start with YY_,
-// are private implementation details.  Do not rely on them.
-
 #ifndef YY_PARSER4_DHCP4_PARSER_H_INCLUDED
 # define YY_PARSER4_DHCP4_PARSER_H_INCLUDED
 // //                    "%code requires" blocks.
-#line 17 "dhcp4_parser.yy" // lalr1.cc:404
+#line 17 "dhcp4_parser.yy" // lalr1.cc:377
 
 #include <string>
 #include <cc/data.h>
@@ -56,7 +52,7 @@ using namespace isc::dhcp;
 using namespace isc::data;
 using namespace std;
 
-#line 60 "dhcp4_parser.h" // lalr1.cc:404
+#line 56 "dhcp4_parser.h" // lalr1.cc:377
 
 # include <cassert>
 # include <cstdlib> // std::abort
@@ -64,27 +60,7 @@ using namespace std;
 # include <stdexcept>
 # include <string>
 # include <vector>
-
-#if defined __cplusplus
-# define YY_CPLUSPLUS __cplusplus
-#else
-# define YY_CPLUSPLUS 199711L
-#endif
-
-// Support move semantics when possible.
-#if 201103L <= YY_CPLUSPLUS
-# define YY_MOVE           std::move
-# define YY_MOVE_OR_COPY   move
-# define YY_MOVE_REF(Type) Type&&
-# define YY_RVREF(Type)    Type&&
-# define YY_COPY(Type)     Type
-#else
-# define YY_MOVE
-# define YY_MOVE_OR_COPY   copy
-# define YY_MOVE_REF(Type) Type&
-# define YY_RVREF(Type)    const Type&
-# define YY_COPY(Type)     const Type&
-#endif
+# include "stack.hh"
 # include "location.hh"
 #include <typeinfo>
 #ifndef YYASSERT
@@ -111,6 +87,15 @@ using namespace std;
 # define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__))
 #endif
 
+#if !defined _Noreturn \
+     && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112)
+# if defined _MSC_VER && 1200 <= _MSC_VER
+#  define _Noreturn __declspec (noreturn)
+# else
+#  define _Noreturn YY_ATTRIBUTE ((__noreturn__))
+# endif
+#endif
+
 /* Suppress unused-variable warnings by "using" E.  */
 #if ! defined lint || defined __GNUC__
 # define YYUSE(E) ((void) (E))
@@ -118,7 +103,7 @@ using namespace std;
 # define YYUSE(E) /* empty */
 #endif
 
-#if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
+#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
 /* Suppress an incorrect diagnostic about yylval being uninitialized.  */
 # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
     _Pragma ("GCC diagnostic push") \
@@ -137,18 +122,6 @@ using namespace std;
 # define YY_INITIAL_VALUE(Value) /* Nothing. */
 #endif
 
-# ifndef YY_NULLPTR
-#  if defined __cplusplus
-#   if 201103L <= __cplusplus
-#    define YY_NULLPTR nullptr
-#   else
-#    define YY_NULLPTR 0
-#   endif
-#  else
-#   define YY_NULLPTR ((void*)0)
-#  endif
-# endif
-
 /* Debug traces.  */
 #ifndef PARSER4_DEBUG
 # if defined YYDEBUG
@@ -162,128 +135,9 @@ using namespace std;
 # endif /* ! defined YYDEBUG */
 #endif  /* ! defined PARSER4_DEBUG */
 
-#line 14 "dhcp4_parser.yy" // lalr1.cc:404
+#line 14 "dhcp4_parser.yy" // lalr1.cc:377
 namespace isc { namespace dhcp {
-#line 168 "dhcp4_parser.h" // lalr1.cc:404
-
-  /// A stack with random access from its top.
-  template <typename T, typename S = std::vector<T> >
-  class stack
-  {
-  public:
-    // Hide our reversed order.
-    typedef typename S::reverse_iterator iterator;
-    typedef typename S::const_reverse_iterator const_iterator;
-    typedef typename S::size_type size_type;
-
-    stack (size_type n = 200)
-      : seq_ (n)
-    {}
-
-    /// Random access.
-    ///
-    /// Index 0 returns the topmost element.
-    T&
-    operator[] (size_type i)
-    {
-      return seq_[size () - 1 - i];
-    }
-
-    /// Random access.
-    ///
-    /// Index 0 returns the topmost element.
-    T&
-    operator[] (int i)
-    {
-      return operator[] (size_type (i));
-    }
-
-    /// Random access.
-    ///
-    /// Index 0 returns the topmost element.
-    const T&
-    operator[] (size_type i) const
-    {
-      return seq_[size () - 1 - i];
-    }
-
-    /// Random access.
-    ///
-    /// Index 0 returns the topmost element.
-    const T&
-    operator[] (int i) const
-    {
-      return operator[] (size_type (i));
-    }
-
-    /// Steal the contents of \a t.
-    ///
-    /// Close to move-semantics.
-    void
-    push (YY_MOVE_REF (T) t)
-    {
-      seq_.push_back (T ());
-      operator[](0).move (t);
-    }
-
-    void
-    pop (int n = 1)
-    {
-      for (; 0 < n; --n)
-        seq_.pop_back ();
-    }
-
-    void
-    clear ()
-    {
-      seq_.clear ();
-    }
-
-    size_type
-    size () const
-    {
-      return seq_.size ();
-    }
-
-    const_iterator
-    begin () const
-    {
-      return seq_.rbegin ();
-    }
-
-    const_iterator
-    end () const
-    {
-      return seq_.rend ();
-    }
-
-  private:
-    stack (const stack&);
-    stack& operator= (const stack&);
-    /// The wrapped container.
-    S seq_;
-  };
-
-  /// Present a slice of the top of a stack.
-  template <typename T, typename S = stack<T> >
-  class slice
-  {
-  public:
-    slice (const S& stack, int range)
-      : stack_ (stack)
-      , range_ (range)
-    {}
-
-    const T&
-    operator[] (int i) const
-    {
-      return stack_[range_ - i];
-    }
-
-  private:
-    const S& stack_;
-    int range_;
-  };
+#line 141 "dhcp4_parser.h" // lalr1.cc:377
 
 
 
@@ -300,17 +154,16 @@ namespace isc { namespace dhcp {
 
     /// Empty construction.
     variant ()
-      : yybuffer_ ()
-      , yytypeid_ (YY_NULLPTR)
+      : yytypeid_ (YY_NULLPTR)
     {}
 
     /// Construct and fill.
     template <typename T>
-    variant (YY_RVREF (T) t)
+    variant (const T& t)
       : yytypeid_ (&typeid (T))
     {
       YYASSERT (sizeof (T) <= S);
-      new (yyas_<T> ()) T (YY_MOVE (t));
+      new (yyas_<T> ()) T (t);
     }
 
     /// Destruction, allowed only if empty.
@@ -322,62 +175,30 @@ namespace isc { namespace dhcp {
     /// Instantiate an empty \a T in here.
     template <typename T>
     T&
-    emplace ()
+    build ()
     {
       YYASSERT (!yytypeid_);
       YYASSERT (sizeof (T) <= S);
       yytypeid_ = & typeid (T);
-      return *new (yyas_<T> ()) T ();
+      return *new (yyas_<T> ()) T;
     }
 
-# if 201103L <= YY_CPLUSPLUS
-    /// Instantiate a \a T in here from \a t.
-    template <typename T, typename U>
-    T&
-    emplace (U&& u)
-    {
-      YYASSERT (!yytypeid_);
-      YYASSERT (sizeof (T) <= S);
-      yytypeid_ = & typeid (T);
-      return *new (yyas_<T> ()) T (std::forward <U>(u));
-    }
-# else
     /// Instantiate a \a T in here from \a t.
     template <typename T>
     T&
-    emplace (const T& t)
+    build (const T& t)
     {
       YYASSERT (!yytypeid_);
       YYASSERT (sizeof (T) <= S);
       yytypeid_ = & typeid (T);
       return *new (yyas_<T> ()) T (t);
     }
-# endif
-
-    /// Instantiate an empty \a T in here.
-    /// Obsolete, use emplace.
-    template <typename T>
-    T&
-    build ()
-    {
-      return emplace<T> ();
-    }
-
-    /// Instantiate a \a T in here from \a t.
-    /// Obsolete, use emplace.
-    template <typename T>
-    T&
-    build (const T& t)
-    {
-      return emplace<T> (t);
-    }
 
     /// Accessor to a built \a T.
     template <typename T>
     T&
     as ()
     {
-      YYASSERT (yytypeid_);
       YYASSERT (*yytypeid_ == typeid (T));
       YYASSERT (sizeof (T) <= S);
       return *yyas_<T> ();
@@ -388,7 +209,6 @@ namespace isc { namespace dhcp {
     const T&
     as () const
     {
-      YYASSERT (yytypeid_);
       YYASSERT (*yytypeid_ == typeid (T));
       YYASSERT (sizeof (T) <= S);
       return *yyas_<T> ();
@@ -399,7 +219,7 @@ namespace isc { namespace dhcp {
     /// Both variants must be built beforehand, because swapping the actual
     /// data requires reading it (with as()), and this is not possible on
     /// unconstructed variants: it would require some dynamic testing, which
-    /// should not be the variant's responsibility.
+    /// should not be the variant's responsability.
     /// Swapping between built and (possibly) non-built is done with
     /// variant::move ().
     template <typename T>
@@ -418,32 +238,17 @@ namespace isc { namespace dhcp {
     void
     move (self_type& other)
     {
-# if 201103L <= YY_CPLUSPLUS
-      emplace<T> (std::move (other.as<T> ()));
-# else
-      emplace<T> ();
+      build<T> ();
       swap<T> (other);
-# endif
       other.destroy<T> ();
     }
 
-# if 201103L <= YY_CPLUSPLUS
-    /// Move the content of \a other to this.
-    template <typename T>
-    void
-    move (self_type&& other)
-    {
-      emplace<T> (std::move (other.as<T> ()));
-      other.destroy<T> ();
-    }
-#endif
-
     /// Copy the content of \a other to this.
     template <typename T>
     void
     copy (const self_type& other)
     {
-      emplace<T> (other.as<T> ());
+      build<T> (other.as<T> ());
     }
 
     /// Destroy the stored \a T.
@@ -457,7 +262,7 @@ namespace isc { namespace dhcp {
 
   private:
     /// Prohibit blind copies.
-    self_type& operator= (const self_type&);
+    self_type& operator=(const self_type&);
     variant (const self_type&);
 
     /// Accessor to raw memory as \a T.
@@ -507,23 +312,23 @@ namespace isc { namespace dhcp {
       // hr_mode
       // ncr_protocol_value
       // replace_client_name_value
-      char dummy1[sizeof (ElementPtr)];
+      char dummy1[sizeof(ElementPtr)];
 
       // "boolean"
-      char dummy2[sizeof (bool)];
+      char dummy2[sizeof(bool)];
 
       // "floating point"
-      char dummy3[sizeof (double)];
+      char dummy3[sizeof(double)];
 
       // "integer"
-      char dummy4[sizeof (int64_t)];
+      char dummy4[sizeof(int64_t)];
 
       // "constant string"
-      char dummy5[sizeof (std::string)];
+      char dummy5[sizeof(std::string)];
 };
 
     /// Symbol semantic values.
-    typedef variant<sizeof (union_type)> semantic_type;
+    typedef variant<sizeof(union_type)> semantic_type;
 #else
     typedef PARSER4_STYPE semantic_type;
 #endif
@@ -613,102 +418,105 @@ namespace isc { namespace dhcp {
         TOKEN_RECORD_TYPES = 325,
         TOKEN_ENCAPSULATE = 326,
         TOKEN_ARRAY = 327,
-        TOKEN_SHARED_NETWORKS = 328,
-        TOKEN_POOLS = 329,
-        TOKEN_POOL = 330,
-        TOKEN_USER_CONTEXT = 331,
-        TOKEN_COMMENT = 332,
-        TOKEN_SUBNET = 333,
-        TOKEN_INTERFACE = 334,
-        TOKEN_ID = 335,
-        TOKEN_RESERVATION_MODE = 336,
-        TOKEN_DISABLED = 337,
-        TOKEN_OUT_OF_POOL = 338,
-        TOKEN_GLOBAL = 339,
-        TOKEN_ALL = 340,
-        TOKEN_HOST_RESERVATION_IDENTIFIERS = 341,
-        TOKEN_CLIENT_CLASSES = 342,
-        TOKEN_REQUIRE_CLIENT_CLASSES = 343,
-        TOKEN_TEST = 344,
-        TOKEN_ONLY_IF_REQUIRED = 345,
-        TOKEN_CLIENT_CLASS = 346,
-        TOKEN_RESERVATIONS = 347,
-        TOKEN_DUID = 348,
-        TOKEN_HW_ADDRESS = 349,
-        TOKEN_CIRCUIT_ID = 350,
-        TOKEN_CLIENT_ID = 351,
-        TOKEN_HOSTNAME = 352,
-        TOKEN_FLEX_ID = 353,
-        TOKEN_RELAY = 354,
-        TOKEN_IP_ADDRESS = 355,
-        TOKEN_IP_ADDRESSES = 356,
-        TOKEN_HOOKS_LIBRARIES = 357,
-        TOKEN_LIBRARY = 358,
-        TOKEN_PARAMETERS = 359,
-        TOKEN_EXPIRED_LEASES_PROCESSING = 360,
-        TOKEN_RECLAIM_TIMER_WAIT_TIME = 361,
-        TOKEN_FLUSH_RECLAIMED_TIMER_WAIT_TIME = 362,
-        TOKEN_HOLD_RECLAIMED_TIME = 363,
-        TOKEN_MAX_RECLAIM_LEASES = 364,
-        TOKEN_MAX_RECLAIM_TIME = 365,
-        TOKEN_UNWARNED_RECLAIM_CYCLES = 366,
-        TOKEN_DHCP4O6_PORT = 367,
-        TOKEN_CONTROL_SOCKET = 368,
-        TOKEN_SOCKET_TYPE = 369,
-        TOKEN_SOCKET_NAME = 370,
-        TOKEN_DHCP_QUEUE_CONTROL = 371,
-        TOKEN_DHCP_DDNS = 372,
-        TOKEN_ENABLE_UPDATES = 373,
-        TOKEN_QUALIFYING_SUFFIX = 374,
-        TOKEN_SERVER_IP = 375,
-        TOKEN_SERVER_PORT = 376,
-        TOKEN_SENDER_IP = 377,
-        TOKEN_SENDER_PORT = 378,
-        TOKEN_MAX_QUEUE_SIZE = 379,
-        TOKEN_NCR_PROTOCOL = 380,
-        TOKEN_NCR_FORMAT = 381,
-        TOKEN_OVERRIDE_NO_UPDATE = 382,
-        TOKEN_OVERRIDE_CLIENT_UPDATE = 383,
-        TOKEN_REPLACE_CLIENT_NAME = 384,
-        TOKEN_GENERATED_PREFIX = 385,
-        TOKEN_TCP = 386,
-        TOKEN_JSON = 387,
-        TOKEN_WHEN_PRESENT = 388,
-        TOKEN_NEVER = 389,
-        TOKEN_ALWAYS = 390,
-        TOKEN_WHEN_NOT_PRESENT = 391,
-        TOKEN_HOSTNAME_CHAR_SET = 392,
-        TOKEN_HOSTNAME_CHAR_REPLACEMENT = 393,
-        TOKEN_LOGGING = 394,
-        TOKEN_LOGGERS = 395,
-        TOKEN_OUTPUT_OPTIONS = 396,
-        TOKEN_OUTPUT = 397,
-        TOKEN_DEBUGLEVEL = 398,
-        TOKEN_SEVERITY = 399,
-        TOKEN_FLUSH = 400,
-        TOKEN_MAXSIZE = 401,
-        TOKEN_MAXVER = 402,
-        TOKEN_DHCP6 = 403,
-        TOKEN_DHCPDDNS = 404,
-        TOKEN_CONTROL_AGENT = 405,
-        TOKEN_TOPLEVEL_JSON = 406,
-        TOKEN_TOPLEVEL_DHCP4 = 407,
-        TOKEN_SUB_DHCP4 = 408,
-        TOKEN_SUB_INTERFACES4 = 409,
-        TOKEN_SUB_SUBNET4 = 410,
-        TOKEN_SUB_POOL4 = 411,
-        TOKEN_SUB_RESERVATION = 412,
-        TOKEN_SUB_OPTION_DEFS = 413,
-        TOKEN_SUB_OPTION_DEF = 414,
-        TOKEN_SUB_OPTION_DATA = 415,
-        TOKEN_SUB_HOOKS_LIBRARY = 416,
-        TOKEN_SUB_DHCP_DDNS = 417,
-        TOKEN_SUB_LOGGING = 418,
-        TOKEN_SUB_CONFIG_CONTROL = 419,
-        TOKEN_STRING = 420,
-        TOKEN_INTEGER = 421,
-        TOKEN_FLOAT = 422,
-        TOKEN_BOOLEAN = 423
+        TOKEN_CALCULATE_TEE_TIMES = 328,
+        TOKEN_T1_PERCENT = 329,
+        TOKEN_T2_PERCENT = 330,
+        TOKEN_SHARED_NETWORKS = 331,
+        TOKEN_POOLS = 332,
+        TOKEN_POOL = 333,
+        TOKEN_USER_CONTEXT = 334,
+        TOKEN_COMMENT = 335,
+        TOKEN_SUBNET = 336,
+        TOKEN_INTERFACE = 337,
+        TOKEN_ID = 338,
+        TOKEN_RESERVATION_MODE = 339,
+        TOKEN_DISABLED = 340,
+        TOKEN_OUT_OF_POOL = 341,
+        TOKEN_GLOBAL = 342,
+        TOKEN_ALL = 343,
+        TOKEN_HOST_RESERVATION_IDENTIFIERS = 344,
+        TOKEN_CLIENT_CLASSES = 345,
+        TOKEN_REQUIRE_CLIENT_CLASSES = 346,
+        TOKEN_TEST = 347,
+        TOKEN_ONLY_IF_REQUIRED = 348,
+        TOKEN_CLIENT_CLASS = 349,
+        TOKEN_RESERVATIONS = 350,
+        TOKEN_DUID = 351,
+        TOKEN_HW_ADDRESS = 352,
+        TOKEN_CIRCUIT_ID = 353,
+        TOKEN_CLIENT_ID = 354,
+        TOKEN_HOSTNAME = 355,
+        TOKEN_FLEX_ID = 356,
+        TOKEN_RELAY = 357,
+        TOKEN_IP_ADDRESS = 358,
+        TOKEN_IP_ADDRESSES = 359,
+        TOKEN_HOOKS_LIBRARIES = 360,
+        TOKEN_LIBRARY = 361,
+        TOKEN_PARAMETERS = 362,
+        TOKEN_EXPIRED_LEASES_PROCESSING = 363,
+        TOKEN_RECLAIM_TIMER_WAIT_TIME = 364,
+        TOKEN_FLUSH_RECLAIMED_TIMER_WAIT_TIME = 365,
+        TOKEN_HOLD_RECLAIMED_TIME = 366,
+        TOKEN_MAX_RECLAIM_LEASES = 367,
+        TOKEN_MAX_RECLAIM_TIME = 368,
+        TOKEN_UNWARNED_RECLAIM_CYCLES = 369,
+        TOKEN_DHCP4O6_PORT = 370,
+        TOKEN_CONTROL_SOCKET = 371,
+        TOKEN_SOCKET_TYPE = 372,
+        TOKEN_SOCKET_NAME = 373,
+        TOKEN_DHCP_QUEUE_CONTROL = 374,
+        TOKEN_DHCP_DDNS = 375,
+        TOKEN_ENABLE_UPDATES = 376,
+        TOKEN_QUALIFYING_SUFFIX = 377,
+        TOKEN_SERVER_IP = 378,
+        TOKEN_SERVER_PORT = 379,
+        TOKEN_SENDER_IP = 380,
+        TOKEN_SENDER_PORT = 381,
+        TOKEN_MAX_QUEUE_SIZE = 382,
+        TOKEN_NCR_PROTOCOL = 383,
+        TOKEN_NCR_FORMAT = 384,
+        TOKEN_OVERRIDE_NO_UPDATE = 385,
+        TOKEN_OVERRIDE_CLIENT_UPDATE = 386,
+        TOKEN_REPLACE_CLIENT_NAME = 387,
+        TOKEN_GENERATED_PREFIX = 388,
+        TOKEN_TCP = 389,
+        TOKEN_JSON = 390,
+        TOKEN_WHEN_PRESENT = 391,
+        TOKEN_NEVER = 392,
+        TOKEN_ALWAYS = 393,
+        TOKEN_WHEN_NOT_PRESENT = 394,
+        TOKEN_HOSTNAME_CHAR_SET = 395,
+        TOKEN_HOSTNAME_CHAR_REPLACEMENT = 396,
+        TOKEN_LOGGING = 397,
+        TOKEN_LOGGERS = 398,
+        TOKEN_OUTPUT_OPTIONS = 399,
+        TOKEN_OUTPUT = 400,
+        TOKEN_DEBUGLEVEL = 401,
+        TOKEN_SEVERITY = 402,
+        TOKEN_FLUSH = 403,
+        TOKEN_MAXSIZE = 404,
+        TOKEN_MAXVER = 405,
+        TOKEN_DHCP6 = 406,
+        TOKEN_DHCPDDNS = 407,
+        TOKEN_CONTROL_AGENT = 408,
+        TOKEN_TOPLEVEL_JSON = 409,
+        TOKEN_TOPLEVEL_DHCP4 = 410,
+        TOKEN_SUB_DHCP4 = 411,
+        TOKEN_SUB_INTERFACES4 = 412,
+        TOKEN_SUB_SUBNET4 = 413,
+        TOKEN_SUB_POOL4 = 414,
+        TOKEN_SUB_RESERVATION = 415,
+        TOKEN_SUB_OPTION_DEFS = 416,
+        TOKEN_SUB_OPTION_DEF = 417,
+        TOKEN_SUB_OPTION_DATA = 418,
+        TOKEN_SUB_HOOKS_LIBRARY = 419,
+        TOKEN_SUB_DHCP_DDNS = 420,
+        TOKEN_SUB_LOGGING = 421,
+        TOKEN_SUB_CONFIG_CONTROL = 422,
+        TOKEN_STRING = 423,
+        TOKEN_INTEGER = 424,
+        TOKEN_FLOAT = 425,
+        TOKEN_BOOLEAN = 426
       };
     };
 
@@ -727,7 +535,7 @@ namespace isc { namespace dhcp {
     /// A complete symbol.
     ///
     /// Expects its Base type to provide access to the symbol type
-    /// via type_get ().
+    /// via type_get().
     ///
     /// Provide access to semantic value and location.
     template <typename Base>
@@ -739,43 +547,29 @@ namespace isc { namespace dhcp {
       /// Default constructor.
       basic_symbol ();
 
-      /// Move or copy constructor.
-      basic_symbol (YY_RVREF (basic_symbol) other);
-
+      /// Copy constructor.
+      basic_symbol (const basic_symbol& other);
 
       /// Constructor for valueless symbols, and symbols from each type.
-# if 201103L <= YY_CPLUSPLUS
-      basic_symbol (typename Base::kind_type t, location_type&& l);
-#else
-      basic_symbol (typename Base::kind_type t, const location_type& l);
-#endif
-# if 201103L <= YY_CPLUSPLUS
-      basic_symbol (typename Base::kind_type t, ElementPtr&& v, location_type&& l);
-#else
-      basic_symbol (typename Base::kind_type t, const ElementPtr& v, const location_type& l);
-#endif
-# if 201103L <= YY_CPLUSPLUS
-      basic_symbol (typename Base::kind_type t, bool&& v, location_type&& l);
-#else
-      basic_symbol (typename Base::kind_type t, const bool& v, const location_type& l);
-#endif
-# if 201103L <= YY_CPLUSPLUS
-      basic_symbol (typename Base::kind_type t, double&& v, location_type&& l);
-#else
-      basic_symbol (typename Base::kind_type t, const double& v, const location_type& l);
-#endif
-# if 201103L <= YY_CPLUSPLUS
-      basic_symbol (typename Base::kind_type t, int64_t&& v, location_type&& l);
-#else
-      basic_symbol (typename Base::kind_type t, const int64_t& v, const location_type& l);
-#endif
-# if 201103L <= YY_CPLUSPLUS
-      basic_symbol (typename Base::kind_type t, std::string&& v, location_type&& l);
-#else
-      basic_symbol (typename Base::kind_type t, const std::string& v, const location_type& l);
-#endif
+
+  basic_symbol (typename Base::kind_type t, const location_type& l);
+
+  basic_symbol (typename Base::kind_type t, const ElementPtr v, const location_type& l);
+
+  basic_symbol (typename Base::kind_type t, const bool v, const location_type& l);
+
+  basic_symbol (typename Base::kind_type t, const double v, const location_type& l);
+
+  basic_symbol (typename Base::kind_type t, const int64_t v, const location_type& l);
+
+  basic_symbol (typename Base::kind_type t, const std::string v, const location_type& l);
 
 
+      /// Constructor for symbols with semantic value.
+      basic_symbol (typename Base::kind_type t,
+                    const semantic_type& v,
+                    const location_type& l);
+
       /// Destroy the symbol.
       ~basic_symbol ();
 
@@ -795,10 +589,8 @@ namespace isc { namespace dhcp {
       location_type location;
 
     private:
-#if YY_CPLUSPLUS < 201103L
       /// Assignment operator.
       basic_symbol& operator= (const basic_symbol& other);
-#endif
     };
 
     /// Type access provider for token (enum) based symbols.
@@ -838,710 +630,717 @@ namespace isc { namespace dhcp {
     /// "External" symbols: returned by the scanner.
     typedef basic_symbol<by_type> symbol_type;
 
-    /// Build a parser object.
-    Dhcp4Parser (isc::dhcp::Parser4Context& ctx_yyarg);
-    virtual ~Dhcp4Parser ();
-
-    /// Parse.  An alias for parse ().
-    /// \returns  0 iff parsing succeeded.
-    int operator() ();
-
-    /// Parse.
-    /// \returns  0 iff parsing succeeded.
-    virtual int parse ();
-
-#if PARSER4_DEBUG
-    /// The current debugging stream.
-    std::ostream& debug_stream () const YY_ATTRIBUTE_PURE;
-    /// Set the current debugging stream.
-    void set_debug_stream (std::ostream &);
-
-    /// Type for debugging levels.
-    typedef int debug_level_type;
-    /// The current debugging level.
-    debug_level_type debug_level () const YY_ATTRIBUTE_PURE;
-    /// Set the current debugging level.
-    void set_debug_level (debug_level_type l);
-#endif
+    // Symbol constructors declarations.
+    static inline
+    symbol_type
+    make_END (const location_type& l);
 
-    /// Report a syntax error.
-    /// \param loc    where the syntax error is found.
-    /// \param msg    a description of the syntax error.
-    virtual void error (const location_type& loc, const std::string& msg);
+    static inline
+    symbol_type
+    make_COMMA (const location_type& l);
 
-    /// Report a syntax error.
-    void error (const syntax_error& err);
+    static inline
+    symbol_type
+    make_COLON (const location_type& l);
 
-    // Symbol constructors declarations.
-    static
+    static inline
     symbol_type
-    make_END (YY_COPY (location_type) l);
+    make_LSQUARE_BRACKET (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_COMMA (YY_COPY (location_type) l);
+    make_RSQUARE_BRACKET (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_COLON (YY_COPY (location_type) l);
+    make_LCURLY_BRACKET (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_LSQUARE_BRACKET (YY_COPY (location_type) l);
+    make_RCURLY_BRACKET (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_RSQUARE_BRACKET (YY_COPY (location_type) l);
+    make_NULL_TYPE (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_LCURLY_BRACKET (YY_COPY (location_type) l);
+    make_DHCP4 (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_RCURLY_BRACKET (YY_COPY (location_type) l);
+    make_CONFIG_CONTROL (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_NULL_TYPE (YY_COPY (location_type) l);
+    make_CONFIG_DATABASES (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_DHCP4 (YY_COPY (location_type) l);
+    make_INTERFACES_CONFIG (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_CONFIG_CONTROL (YY_COPY (location_type) l);
+    make_INTERFACES (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_CONFIG_DATABASES (YY_COPY (location_type) l);
+    make_DHCP_SOCKET_TYPE (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_INTERFACES_CONFIG (YY_COPY (location_type) l);
+    make_RAW (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_INTERFACES (YY_COPY (location_type) l);
+    make_UDP (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_DHCP_SOCKET_TYPE (YY_COPY (location_type) l);
+    make_OUTBOUND_INTERFACE (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_RAW (YY_COPY (location_type) l);
+    make_SAME_AS_INBOUND (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_UDP (YY_COPY (location_type) l);
+    make_USE_ROUTING (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_OUTBOUND_INTERFACE (YY_COPY (location_type) l);
+    make_RE_DETECT (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_SAME_AS_INBOUND (YY_COPY (location_type) l);
+    make_SANITY_CHECKS (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_USE_ROUTING (YY_COPY (location_type) l);
+    make_LEASE_CHECKS (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_RE_DETECT (YY_COPY (location_type) l);
+    make_ECHO_CLIENT_ID (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_SANITY_CHECKS (YY_COPY (location_type) l);
+    make_MATCH_CLIENT_ID (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_LEASE_CHECKS (YY_COPY (location_type) l);
+    make_AUTHORITATIVE (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_ECHO_CLIENT_ID (YY_COPY (location_type) l);
+    make_NEXT_SERVER (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_MATCH_CLIENT_ID (YY_COPY (location_type) l);
+    make_SERVER_HOSTNAME (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_AUTHORITATIVE (YY_COPY (location_type) l);
+    make_BOOT_FILE_NAME (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_NEXT_SERVER (YY_COPY (location_type) l);
+    make_LEASE_DATABASE (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_SERVER_HOSTNAME (YY_COPY (location_type) l);
+    make_HOSTS_DATABASE (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_BOOT_FILE_NAME (YY_COPY (location_type) l);
+    make_HOSTS_DATABASES (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_LEASE_DATABASE (YY_COPY (location_type) l);
+    make_TYPE (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_HOSTS_DATABASE (YY_COPY (location_type) l);
+    make_MEMFILE (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_HOSTS_DATABASES (YY_COPY (location_type) l);
+    make_MYSQL (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_TYPE (YY_COPY (location_type) l);
+    make_POSTGRESQL (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_MEMFILE (YY_COPY (location_type) l);
+    make_CQL (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_MYSQL (YY_COPY (location_type) l);
+    make_USER (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_POSTGRESQL (YY_COPY (location_type) l);
+    make_PASSWORD (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_CQL (YY_COPY (location_type) l);
+    make_HOST (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_USER (YY_COPY (location_type) l);
+    make_PORT (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_PASSWORD (YY_COPY (location_type) l);
+    make_PERSIST (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_HOST (YY_COPY (location_type) l);
+    make_LFC_INTERVAL (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_PORT (YY_COPY (location_type) l);
+    make_READONLY (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_PERSIST (YY_COPY (location_type) l);
+    make_CONNECT_TIMEOUT (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_LFC_INTERVAL (YY_COPY (location_type) l);
+    make_CONTACT_POINTS (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_READONLY (YY_COPY (location_type) l);
+    make_KEYSPACE (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_CONNECT_TIMEOUT (YY_COPY (location_type) l);
+    make_MAX_RECONNECT_TRIES (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_CONTACT_POINTS (YY_COPY (location_type) l);
+    make_RECONNECT_WAIT_TIME (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_KEYSPACE (YY_COPY (location_type) l);
+    make_REQUEST_TIMEOUT (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_MAX_RECONNECT_TRIES (YY_COPY (location_type) l);
+    make_TCP_KEEPALIVE (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_RECONNECT_WAIT_TIME (YY_COPY (location_type) l);
+    make_TCP_NODELAY (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_REQUEST_TIMEOUT (YY_COPY (location_type) l);
+    make_VALID_LIFETIME (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_TCP_KEEPALIVE (YY_COPY (location_type) l);
+    make_RENEW_TIMER (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_TCP_NODELAY (YY_COPY (location_type) l);
+    make_REBIND_TIMER (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_VALID_LIFETIME (YY_COPY (location_type) l);
+    make_DECLINE_PROBATION_PERIOD (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_RENEW_TIMER (YY_COPY (location_type) l);
+    make_SERVER_TAG (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_REBIND_TIMER (YY_COPY (location_type) l);
+    make_SUBNET4 (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_DECLINE_PROBATION_PERIOD (YY_COPY (location_type) l);
+    make_SUBNET_4O6_INTERFACE (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_SERVER_TAG (YY_COPY (location_type) l);
+    make_SUBNET_4O6_INTERFACE_ID (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_SUBNET4 (YY_COPY (location_type) l);
+    make_SUBNET_4O6_SUBNET (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_SUBNET_4O6_INTERFACE (YY_COPY (location_type) l);
+    make_OPTION_DEF (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_SUBNET_4O6_INTERFACE_ID (YY_COPY (location_type) l);
+    make_OPTION_DATA (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_SUBNET_4O6_SUBNET (YY_COPY (location_type) l);
+    make_NAME (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_OPTION_DEF (YY_COPY (location_type) l);
+    make_DATA (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_OPTION_DATA (YY_COPY (location_type) l);
+    make_CODE (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_NAME (YY_COPY (location_type) l);
+    make_SPACE (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_DATA (YY_COPY (location_type) l);
+    make_CSV_FORMAT (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_CODE (YY_COPY (location_type) l);
+    make_ALWAYS_SEND (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_SPACE (YY_COPY (location_type) l);
+    make_RECORD_TYPES (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_CSV_FORMAT (YY_COPY (location_type) l);
+    make_ENCAPSULATE (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_ALWAYS_SEND (YY_COPY (location_type) l);
+    make_ARRAY (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_RECORD_TYPES (YY_COPY (location_type) l);
+    make_CALCULATE_TEE_TIMES (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_ENCAPSULATE (YY_COPY (location_type) l);
+    make_T1_PERCENT (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_ARRAY (YY_COPY (location_type) l);
+    make_T2_PERCENT (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_SHARED_NETWORKS (YY_COPY (location_type) l);
+    make_SHARED_NETWORKS (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_POOLS (YY_COPY (location_type) l);
+    make_POOLS (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_POOL (YY_COPY (location_type) l);
+    make_POOL (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_USER_CONTEXT (YY_COPY (location_type) l);
+    make_USER_CONTEXT (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_COMMENT (YY_COPY (location_type) l);
+    make_COMMENT (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_SUBNET (YY_COPY (location_type) l);
+    make_SUBNET (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_INTERFACE (YY_COPY (location_type) l);
+    make_INTERFACE (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_ID (YY_COPY (location_type) l);
+    make_ID (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_RESERVATION_MODE (YY_COPY (location_type) l);
+    make_RESERVATION_MODE (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_DISABLED (YY_COPY (location_type) l);
+    make_DISABLED (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_OUT_OF_POOL (YY_COPY (location_type) l);
+    make_OUT_OF_POOL (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_GLOBAL (YY_COPY (location_type) l);
+    make_GLOBAL (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_ALL (YY_COPY (location_type) l);
+    make_ALL (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_HOST_RESERVATION_IDENTIFIERS (YY_COPY (location_type) l);
+    make_HOST_RESERVATION_IDENTIFIERS (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_CLIENT_CLASSES (YY_COPY (location_type) l);
+    make_CLIENT_CLASSES (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_REQUIRE_CLIENT_CLASSES (YY_COPY (location_type) l);
+    make_REQUIRE_CLIENT_CLASSES (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_TEST (YY_COPY (location_type) l);
+    make_TEST (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_ONLY_IF_REQUIRED (YY_COPY (location_type) l);
+    make_ONLY_IF_REQUIRED (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_CLIENT_CLASS (YY_COPY (location_type) l);
+    make_CLIENT_CLASS (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_RESERVATIONS (YY_COPY (location_type) l);
+    make_RESERVATIONS (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_DUID (YY_COPY (location_type) l);
+    make_DUID (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_HW_ADDRESS (YY_COPY (location_type) l);
+    make_HW_ADDRESS (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_CIRCUIT_ID (YY_COPY (location_type) l);
+    make_CIRCUIT_ID (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_CLIENT_ID (YY_COPY (location_type) l);
+    make_CLIENT_ID (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_HOSTNAME (YY_COPY (location_type) l);
+    make_HOSTNAME (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_FLEX_ID (YY_COPY (location_type) l);
+    make_FLEX_ID (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_RELAY (YY_COPY (location_type) l);
+    make_RELAY (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_IP_ADDRESS (YY_COPY (location_type) l);
+    make_IP_ADDRESS (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_IP_ADDRESSES (YY_COPY (location_type) l);
+    make_IP_ADDRESSES (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_HOOKS_LIBRARIES (YY_COPY (location_type) l);
+    make_HOOKS_LIBRARIES (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_LIBRARY (YY_COPY (location_type) l);
+    make_LIBRARY (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_PARAMETERS (YY_COPY (location_type) l);
+    make_PARAMETERS (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_EXPIRED_LEASES_PROCESSING (YY_COPY (location_type) l);
+    make_EXPIRED_LEASES_PROCESSING (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_RECLAIM_TIMER_WAIT_TIME (YY_COPY (location_type) l);
+    make_RECLAIM_TIMER_WAIT_TIME (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_FLUSH_RECLAIMED_TIMER_WAIT_TIME (YY_COPY (location_type) l);
+    make_FLUSH_RECLAIMED_TIMER_WAIT_TIME (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_HOLD_RECLAIMED_TIME (YY_COPY (location_type) l);
+    make_HOLD_RECLAIMED_TIME (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_MAX_RECLAIM_LEASES (YY_COPY (location_type) l);
+    make_MAX_RECLAIM_LEASES (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_MAX_RECLAIM_TIME (YY_COPY (location_type) l);
+    make_MAX_RECLAIM_TIME (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_UNWARNED_RECLAIM_CYCLES (YY_COPY (location_type) l);
+    make_UNWARNED_RECLAIM_CYCLES (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_DHCP4O6_PORT (YY_COPY (location_type) l);
+    make_DHCP4O6_PORT (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_CONTROL_SOCKET (YY_COPY (location_type) l);
+    make_CONTROL_SOCKET (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_SOCKET_TYPE (YY_COPY (location_type) l);
+    make_SOCKET_TYPE (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_SOCKET_NAME (YY_COPY (location_type) l);
+    make_SOCKET_NAME (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_DHCP_QUEUE_CONTROL (YY_COPY (location_type) l);
+    make_DHCP_QUEUE_CONTROL (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_DHCP_DDNS (YY_COPY (location_type) l);
+    make_DHCP_DDNS (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_ENABLE_UPDATES (YY_COPY (location_type) l);
+    make_ENABLE_UPDATES (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_QUALIFYING_SUFFIX (YY_COPY (location_type) l);
+    make_QUALIFYING_SUFFIX (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_SERVER_IP (YY_COPY (location_type) l);
+    make_SERVER_IP (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_SERVER_PORT (YY_COPY (location_type) l);
+    make_SERVER_PORT (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_SENDER_IP (YY_COPY (location_type) l);
+    make_SENDER_IP (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_SENDER_PORT (YY_COPY (location_type) l);
+    make_SENDER_PORT (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_MAX_QUEUE_SIZE (YY_COPY (location_type) l);
+    make_MAX_QUEUE_SIZE (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_NCR_PROTOCOL (YY_COPY (location_type) l);
+    make_NCR_PROTOCOL (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_NCR_FORMAT (YY_COPY (location_type) l);
+    make_NCR_FORMAT (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_OVERRIDE_NO_UPDATE (YY_COPY (location_type) l);
+    make_OVERRIDE_NO_UPDATE (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_OVERRIDE_CLIENT_UPDATE (YY_COPY (location_type) l);
+    make_OVERRIDE_CLIENT_UPDATE (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_REPLACE_CLIENT_NAME (YY_COPY (location_type) l);
+    make_REPLACE_CLIENT_NAME (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_GENERATED_PREFIX (YY_COPY (location_type) l);
+    make_GENERATED_PREFIX (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_TCP (YY_COPY (location_type) l);
+    make_TCP (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_JSON (YY_COPY (location_type) l);
+    make_JSON (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_WHEN_PRESENT (YY_COPY (location_type) l);
+    make_WHEN_PRESENT (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_NEVER (YY_COPY (location_type) l);
+    make_NEVER (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_ALWAYS (YY_COPY (location_type) l);
+    make_ALWAYS (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_WHEN_NOT_PRESENT (YY_COPY (location_type) l);
+    make_WHEN_NOT_PRESENT (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_HOSTNAME_CHAR_SET (YY_COPY (location_type) l);
+    make_HOSTNAME_CHAR_SET (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_HOSTNAME_CHAR_REPLACEMENT (YY_COPY (location_type) l);
+    make_HOSTNAME_CHAR_REPLACEMENT (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_LOGGING (YY_COPY (location_type) l);
+    make_LOGGING (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_LOGGERS (YY_COPY (location_type) l);
+    make_LOGGERS (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_OUTPUT_OPTIONS (YY_COPY (location_type) l);
+    make_OUTPUT_OPTIONS (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_OUTPUT (YY_COPY (location_type) l);
+    make_OUTPUT (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_DEBUGLEVEL (YY_COPY (location_type) l);
+    make_DEBUGLEVEL (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_SEVERITY (YY_COPY (location_type) l);
+    make_SEVERITY (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_FLUSH (YY_COPY (location_type) l);
+    make_FLUSH (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_MAXSIZE (YY_COPY (location_type) l);
+    make_MAXSIZE (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_MAXVER (YY_COPY (location_type) l);
+    make_MAXVER (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_DHCP6 (YY_COPY (location_type) l);
+    make_DHCP6 (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_DHCPDDNS (YY_COPY (location_type) l);
+    make_DHCPDDNS (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_CONTROL_AGENT (YY_COPY (location_type) l);
+    make_CONTROL_AGENT (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_TOPLEVEL_JSON (YY_COPY (location_type) l);
+    make_TOPLEVEL_JSON (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_TOPLEVEL_DHCP4 (YY_COPY (location_type) l);
+    make_TOPLEVEL_DHCP4 (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_SUB_DHCP4 (YY_COPY (location_type) l);
+    make_SUB_DHCP4 (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_SUB_INTERFACES4 (YY_COPY (location_type) l);
+    make_SUB_INTERFACES4 (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_SUB_SUBNET4 (YY_COPY (location_type) l);
+    make_SUB_SUBNET4 (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_SUB_POOL4 (YY_COPY (location_type) l);
+    make_SUB_POOL4 (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_SUB_RESERVATION (YY_COPY (location_type) l);
+    make_SUB_RESERVATION (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_SUB_OPTION_DEFS (YY_COPY (location_type) l);
+    make_SUB_OPTION_DEFS (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_SUB_OPTION_DEF (YY_COPY (location_type) l);
+    make_SUB_OPTION_DEF (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_SUB_OPTION_DATA (YY_COPY (location_type) l);
+    make_SUB_OPTION_DATA (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_SUB_HOOKS_LIBRARY (YY_COPY (location_type) l);
+    make_SUB_HOOKS_LIBRARY (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_SUB_DHCP_DDNS (YY_COPY (location_type) l);
+    make_SUB_DHCP_DDNS (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_SUB_LOGGING (YY_COPY (location_type) l);
+    make_SUB_LOGGING (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_SUB_CONFIG_CONTROL (YY_COPY (location_type) l);
+    make_SUB_CONFIG_CONTROL (const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_STRING (YY_COPY (std::string) v, YY_COPY (location_type) l);
+    make_STRING (const std::string& v, const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_INTEGER (YY_COPY (int64_t) v, YY_COPY (location_type) l);
+    make_INTEGER (const int64_t& v, const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_FLOAT (YY_COPY (double) v, YY_COPY (location_type) l);
+    make_FLOAT (const double& v, const location_type& l);
 
-    static
+    static inline
     symbol_type
-    make_BOOLEAN (YY_COPY (bool) v, YY_COPY (location_type) l);
+    make_BOOLEAN (const bool& v, const location_type& l);
+
+
+    /// Build a parser object.
+    Dhcp4Parser (isc::dhcp::Parser4Context& ctx_yyarg);
+    virtual ~Dhcp4Parser ();
+
+    /// Parse.
+    /// \returns  0 iff parsing succeeded.
+    virtual int parse ();
+
+#if PARSER4_DEBUG
+    /// The current debugging stream.
+    std::ostream& debug_stream () const YY_ATTRIBUTE_PURE;
+    /// Set the current debugging stream.
+    void set_debug_stream (std::ostream &);
+
+    /// Type for debugging levels.
+    typedef int debug_level_type;
+    /// The current debugging level.
+    debug_level_type debug_level () const YY_ATTRIBUTE_PURE;
+    /// Set the current debugging level.
+    void set_debug_level (debug_level_type l);
+#endif
 
+    /// Report a syntax error.
+    /// \param loc    where the syntax error is found.
+    /// \param msg    a description of the syntax error.
+    virtual void error (const location_type& loc, const std::string& msg);
 
+    /// Report a syntax error.
+    void error (const syntax_error& err);
 
   private:
     /// This class is not copyable.
@@ -1570,7 +1369,7 @@ namespace isc { namespace dhcp {
     /// \param yyvalue   the value to check
     static bool yy_table_value_is_error_ (int yyvalue);
 
-    static const short yypact_ninf_;
+    static const short int yypact_ninf_;
     static const signed char yytable_ninf_;
 
     /// Convert a scanner token number \a t to a symbol number.
@@ -1579,32 +1378,32 @@ namespace isc { namespace dhcp {
     // Tables.
   // YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
   // STATE-NUM.
-  static const short yypact_[];
+  static const short int yypact_[];
 
   // YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
   // Performed when YYTABLE does not specify something else to do.  Zero
   // means the default is an error.
-  static const unsigned short yydefact_[];
+  static const unsigned short int yydefact_[];
 
   // YYPGOTO[NTERM-NUM].
-  static const short yypgoto_[];
+  static const short int yypgoto_[];
 
   // YYDEFGOTO[NTERM-NUM].
-  static const short yydefgoto_[];
+  static const short int yydefgoto_[];
 
   // YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
   // positive, shift that token.  If negative, reduce the rule whose
   // number is the opposite.  If YYTABLE_NINF, syntax error.
-  static const unsigned short yytable_[];
+  static const unsigned short int yytable_[];
 
-  static const short yycheck_[];
+  static const short int yycheck_[];
 
   // YYSTOS[STATE-NUM] -- The (internal number of the) accessing
   // symbol of state STATE-NUM.
-  static const unsigned short yystos_[];
+  static const unsigned short int yystos_[];
 
   // YYR1[YYN] -- Symbol number of symbol that rule YYN derives.
-  static const unsigned short yyr1_[];
+  static const unsigned short int yyr1_[];
 
   // YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.
   static const unsigned char yyr2_[];
@@ -1618,15 +1417,14 @@ namespace isc { namespace dhcp {
     static const char* const yytname_[];
 #if PARSER4_DEBUG
   // YYRLINE[YYN] -- Source line where rule number YYN was defined.
-  static const unsigned short yyrline_[];
+  static const unsigned short int yyrline_[];
     /// Report on the debug stream that the rule \a r is going to be reduced.
     virtual void yy_reduce_print_ (int r);
     /// Print the state stack on the debug stream.
     virtual void yystack_print_ ();
 
-    /// Debugging level.
+    // Debugging.
     int yydebug_;
-    /// Debug stream.
     std::ostream* yycdebug_;
 
     /// \brief Display a symbol type, value and location.
@@ -1684,15 +1482,10 @@ namespace isc { namespace dhcp {
       typedef basic_symbol<by_state> super_type;
       /// Construct an empty symbol.
       stack_symbol_type ();
-      /// Move or copy construction.
-      stack_symbol_type (YY_RVREF (stack_symbol_type) that);
       /// Steal the contents from \a sym to build this.
-      stack_symbol_type (state_type s, YY_MOVE_REF (symbol_type) sym);
-#if YY_CPLUSPLUS < 201103L
-      /// Assignment, needed by push_back by some old implementations.
-      /// Moves the contents of that.
-      stack_symbol_type& operator= (stack_symbol_type& that);
-#endif
+      stack_symbol_type (state_type s, symbol_type& sym);
+      /// Assignment, needed by push_back.
+      stack_symbol_type& operator= (const stack_symbol_type& that);
     };
 
     /// Stack type.
@@ -1704,31 +1497,31 @@ namespace isc { namespace dhcp {
     /// Push a new state on the stack.
     /// \param m    a debug message to display
     ///             if null, no trace is output.
-    /// \param sym  the symbol
+    /// \param s    the symbol
     /// \warning the contents of \a s.value is stolen.
-    void yypush_ (const char* m, YY_MOVE_REF (stack_symbol_type) sym);
+    void yypush_ (const char* m, stack_symbol_type& s);
 
     /// Push a new look ahead token on the state on the stack.
     /// \param m    a debug message to display
     ///             if null, no trace is output.
     /// \param s    the state
     /// \param sym  the symbol (for its value and location).
-    /// \warning the contents of \a sym.value is stolen.
-    void yypush_ (const char* m, state_type s, YY_MOVE_REF (symbol_type) sym);
+    /// \warning the contents of \a s.value is stolen.
+    void yypush_ (const char* m, state_type s, symbol_type& sym);
 
-    /// Pop \a n symbols from the stack.
-    void yypop_ (int n = 1);
+    /// Pop \a n symbols the three stacks.
+    void yypop_ (unsigned int n = 1);
 
     /// Constants.
     enum
     {
       yyeof_ = 0,
-      yylast_ = 1000,     ///< Last index in yytable_.
-      yynnts_ = 373,  ///< Number of nonterminal symbols.
+      yylast_ = 1026,     ///< Last index in yytable_.
+      yynnts_ = 376,  ///< Number of nonterminal symbols.
       yyfinal_ = 30, ///< Termination state number.
       yyterror_ = 1,
       yyerrcode_ = 256,
-      yyntokens_ = 169  ///< Number of tokens.
+      yyntokens_ = 172  ///< Number of tokens.
     };
 
 
@@ -1787,14 +1580,14 @@ namespace isc { namespace dhcp {
      135,   136,   137,   138,   139,   140,   141,   142,   143,   144,
      145,   146,   147,   148,   149,   150,   151,   152,   153,   154,
      155,   156,   157,   158,   159,   160,   161,   162,   163,   164,
-     165,   166,   167,   168
+     165,   166,   167,   168,   169,   170,   171
     };
-    const unsigned user_token_number_max_ = 423;
+    const unsigned int user_token_number_max_ = 426;
     const token_number_type undef_token_ = 2;
 
-    if (static_cast<int> (t) <= yyeof_)
+    if (static_cast<int>(t) <= yyeof_)
       return yyeof_;
-    else if (static_cast<unsigned> (t) <= user_token_number_max_)
+    else if (static_cast<unsigned int> (t) <= user_token_number_max_)
       return translate_table[t];
     else
       return undef_token_;
@@ -1808,44 +1601,45 @@ namespace isc { namespace dhcp {
 
   // basic_symbol.
   template <typename Base>
+  inline
   Dhcp4Parser::basic_symbol<Base>::basic_symbol ()
     : value ()
-    , location ()
   {}
 
   template <typename Base>
-  Dhcp4Parser::basic_symbol<Base>::basic_symbol (YY_RVREF (basic_symbol) other)
-    : Base (YY_MOVE (other))
+  inline
+  Dhcp4Parser::basic_symbol<Base>::basic_symbol (const basic_symbol& other)
+    : Base (other)
     , value ()
-    , location (YY_MOVE (other.location))
+    , location (other.location)
   {
-    switch (other.type_get ())
+      switch (other.type_get ())
     {
-      case 185: // value
-      case 189: // map_value
-      case 230: // socket_type
-      case 233: // outbound_interface_value
-      case 255: // db_type
-      case 337: // hr_mode
-      case 486: // ncr_protocol_value
-      case 493: // replace_client_name_value
-        value.YY_MOVE_OR_COPY< ElementPtr > (YY_MOVE (other.value));
+      case 188: // value
+      case 192: // map_value
+      case 236: // socket_type
+      case 239: // outbound_interface_value
+      case 261: // db_type
+      case 343: // hr_mode
+      case 492: // ncr_protocol_value
+      case 499: // replace_client_name_value
+        value.copy< ElementPtr > (other.value);
         break;
 
-      case 168: // "boolean"
-        value.YY_MOVE_OR_COPY< bool > (YY_MOVE (other.value));
+      case 171: // "boolean"
+        value.copy< bool > (other.value);
         break;
 
-      case 167: // "floating point"
-        value.YY_MOVE_OR_COPY< double > (YY_MOVE (other.value));
+      case 170: // "floating point"
+        value.copy< double > (other.value);
         break;
 
-      case 166: // "integer"
-        value.YY_MOVE_OR_COPY< int64_t > (YY_MOVE (other.value));
+      case 169: // "integer"
+        value.copy< int64_t > (other.value);
         break;
 
-      case 165: // "constant string"
-        value.YY_MOVE_OR_COPY< std::string > (YY_MOVE (other.value));
+      case 168: // "constant string"
+        value.copy< std::string > (other.value);
         break;
 
       default:
@@ -1855,104 +1649,103 @@ namespace isc { namespace dhcp {
   }
 
 
-  // Implementation of basic_symbol constructor for each type.
-# if 201103L <= YY_CPLUSPLUS
   template <typename Base>
-  Dhcp4Parser::basic_symbol<Base>::basic_symbol (typename Base::kind_type t, location_type&& l)
+  inline
+  Dhcp4Parser::basic_symbol<Base>::basic_symbol (typename Base::kind_type t, const semantic_type& v, const location_type& l)
     : Base (t)
-    , location (std::move (l))
-  {}
-#else
+    , value ()
+    , location (l)
+  {
+    (void) v;
+      switch (this->type_get ())
+    {
+      case 188: // value
+      case 192: // map_value
+      case 236: // socket_type
+      case 239: // outbound_interface_value
+      case 261: // db_type
+      case 343: // hr_mode
+      case 492: // ncr_protocol_value
+      case 499: // replace_client_name_value
+        value.copy< ElementPtr > (v);
+        break;
+
+      case 171: // "boolean"
+        value.copy< bool > (v);
+        break;
+
+      case 170: // "floating point"
+        value.copy< double > (v);
+        break;
+
+      case 169: // "integer"
+        value.copy< int64_t > (v);
+        break;
+
+      case 168: // "constant string"
+        value.copy< std::string > (v);
+        break;
+
+      default:
+        break;
+    }
+}
+
+
+  // Implementation of basic_symbol constructor for each type.
+
   template <typename Base>
   Dhcp4Parser::basic_symbol<Base>::basic_symbol (typename Base::kind_type t, const location_type& l)
     : Base (t)
+    , value ()
     , location (l)
   {}
-#endif
-# if 201103L <= YY_CPLUSPLUS
-  template <typename Base>
-  Dhcp4Parser::basic_symbol<Base>::basic_symbol (typename Base::kind_type t, ElementPtr&& v, location_type&& l)
-    : Base (t)
-    , value (std::move (v))
-    , location (std::move (l))
-  {}
-#else
+
   template <typename Base>
-  Dhcp4Parser::basic_symbol<Base>::basic_symbol (typename Base::kind_type t, const ElementPtr& v, const location_type& l)
+  Dhcp4Parser::basic_symbol<Base>::basic_symbol (typename Base::kind_type t, const ElementPtr v, const location_type& l)
     : Base (t)
     , value (v)
     , location (l)
   {}
-#endif
-# if 201103L <= YY_CPLUSPLUS
-  template <typename Base>
-  Dhcp4Parser::basic_symbol<Base>::basic_symbol (typename Base::kind_type t, bool&& v, location_type&& l)
-    : Base (t)
-    , value (std::move (v))
-    , location (std::move (l))
-  {}
-#else
+
   template <typename Base>
-  Dhcp4Parser::basic_symbol<Base>::basic_symbol (typename Base::kind_type t, const bool& v, const location_type& l)
+  Dhcp4Parser::basic_symbol<Base>::basic_symbol (typename Base::kind_type t, const bool v, const location_type& l)
     : Base (t)
     , value (v)
     , location (l)
   {}
-#endif
-# if 201103L <= YY_CPLUSPLUS
-  template <typename Base>
-  Dhcp4Parser::basic_symbol<Base>::basic_symbol (typename Base::kind_type t, double&& v, location_type&& l)
-    : Base (t)
-    , value (std::move (v))
-    , location (std::move (l))
-  {}
-#else
+
   template <typename Base>
-  Dhcp4Parser::basic_symbol<Base>::basic_symbol (typename Base::kind_type t, const double& v, const location_type& l)
+  Dhcp4Parser::basic_symbol<Base>::basic_symbol (typename Base::kind_type t, const double v, const location_type& l)
     : Base (t)
     , value (v)
     , location (l)
   {}
-#endif
-# if 201103L <= YY_CPLUSPLUS
-  template <typename Base>
-  Dhcp4Parser::basic_symbol<Base>::basic_symbol (typename Base::kind_type t, int64_t&& v, location_type&& l)
-    : Base (t)
-    , value (std::move (v))
-    , location (std::move (l))
-  {}
-#else
+
   template <typename Base>
-  Dhcp4Parser::basic_symbol<Base>::basic_symbol (typename Base::kind_type t, const int64_t& v, const location_type& l)
+  Dhcp4Parser::basic_symbol<Base>::basic_symbol (typename Base::kind_type t, const int64_t v, const location_type& l)
     : Base (t)
     , value (v)
     , location (l)
   {}
-#endif
-# if 201103L <= YY_CPLUSPLUS
-  template <typename Base>
-  Dhcp4Parser::basic_symbol<Base>::basic_symbol (typename Base::kind_type t, std::string&& v, location_type&& l)
-    : Base (t)
-    , value (std::move (v))
-    , location (std::move (l))
-  {}
-#else
+
   template <typename Base>
-  Dhcp4Parser::basic_symbol<Base>::basic_symbol (typename Base::kind_type t, const std::string& v, const location_type& l)
+  Dhcp4Parser::basic_symbol<Base>::basic_symbol (typename Base::kind_type t, const std::string v, const location_type& l)
     : Base (t)
     , value (v)
     , location (l)
   {}
-#endif
 
 
   template <typename Base>
+  inline
   Dhcp4Parser::basic_symbol<Base>::~basic_symbol ()
   {
     clear ();
   }
 
   template <typename Base>
+  inline
   void
   Dhcp4Parser::basic_symbol<Base>::clear ()
   {
@@ -1967,32 +1760,32 @@ namespace isc { namespace dhcp {
     }
 
     // Type destructor.
-  switch (yytype)
+    switch (yytype)
     {
-      case 185: // value
-      case 189: // map_value
-      case 230: // socket_type
-      case 233: // outbound_interface_value
-      case 255: // db_type
-      case 337: // hr_mode
-      case 486: // ncr_protocol_value
-      case 493: // replace_client_name_value
+      case 188: // value
+      case 192: // map_value
+      case 236: // socket_type
+      case 239: // outbound_interface_value
+      case 261: // db_type
+      case 343: // hr_mode
+      case 492: // ncr_protocol_value
+      case 499: // replace_client_name_value
         value.template destroy< ElementPtr > ();
         break;
 
-      case 168: // "boolean"
+      case 171: // "boolean"
         value.template destroy< bool > ();
         break;
 
-      case 167: // "floating point"
+      case 170: // "floating point"
         value.template destroy< double > ();
         break;
 
-      case 166: // "integer"
+      case 169: // "integer"
         value.template destroy< int64_t > ();
         break;
 
-      case 165: // "constant string"
+      case 168: // "constant string"
         value.template destroy< std::string > ();
         break;
 
@@ -2004,6 +1797,7 @@ namespace isc { namespace dhcp {
   }
 
   template <typename Base>
+  inline
   bool
   Dhcp4Parser::basic_symbol<Base>::empty () const
   {
@@ -2011,44 +1805,45 @@ namespace isc { namespace dhcp {
   }
 
   template <typename Base>
+  inline
   void
   Dhcp4Parser::basic_symbol<Base>::move (basic_symbol& s)
   {
-    super_type::move (s);
-    switch (this->type_get ())
+    super_type::move(s);
+      switch (this->type_get ())
     {
-      case 185: // value
-      case 189: // map_value
-      case 230: // socket_type
-      case 233: // outbound_interface_value
-      case 255: // db_type
-      case 337: // hr_mode
-      case 486: // ncr_protocol_value
-      case 493: // replace_client_name_value
-        value.move< ElementPtr > (YY_MOVE (s.value));
+      case 188: // value
+      case 192: // map_value
+      case 236: // socket_type
+      case 239: // outbound_interface_value
+      case 261: // db_type
+      case 343: // hr_mode
+      case 492: // ncr_protocol_value
+      case 499: // replace_client_name_value
+        value.move< ElementPtr > (s.value);
         break;
 
-      case 168: // "boolean"
-        value.move< bool > (YY_MOVE (s.value));
+      case 171: // "boolean"
+        value.move< bool > (s.value);
         break;
 
-      case 167: // "floating point"
-        value.move< double > (YY_MOVE (s.value));
+      case 170: // "floating point"
+        value.move< double > (s.value);
         break;
 
-      case 166: // "integer"
-        value.move< int64_t > (YY_MOVE (s.value));
+      case 169: // "integer"
+        value.move< int64_t > (s.value);
         break;
 
-      case 165: // "constant string"
-        value.move< std::string > (YY_MOVE (s.value));
+      case 168: // "constant string"
+        value.move< std::string > (s.value);
         break;
 
       default:
         break;
     }
 
-    location = YY_MOVE (s.location);
+    location = s.location;
   }
 
   // by_type.
@@ -2096,7 +1891,7 @@ namespace isc { namespace dhcp {
     // YYTOKNUM[NUM] -- (External) token number corresponding to the
     // (internal) symbol number NUM (which must be that of a token).  */
     static
-    const unsigned short
+    const unsigned short int
     yytoken_number_[] =
     {
        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
@@ -2115,1185 +1910,1036 @@ namespace isc { namespace dhcp {
      385,   386,   387,   388,   389,   390,   391,   392,   393,   394,
      395,   396,   397,   398,   399,   400,   401,   402,   403,   404,
      405,   406,   407,   408,   409,   410,   411,   412,   413,   414,
-     415,   416,   417,   418,   419,   420,   421,   422,   423
+     415,   416,   417,   418,   419,   420,   421,   422,   423,   424,
+     425,   426
     };
     return static_cast<token_type> (yytoken_number_[type]);
   }
-
   // Implementation of make_symbol for each symbol type.
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_END (YY_COPY (location_type) l)
+  Dhcp4Parser::make_END (const location_type& l)
   {
-    return symbol_type (token::TOKEN_END, YY_MOVE (l));
+    return symbol_type (token::TOKEN_END, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_COMMA (YY_COPY (location_type) l)
+  Dhcp4Parser::make_COMMA (const location_type& l)
   {
-    return symbol_type (token::TOKEN_COMMA, YY_MOVE (l));
+    return symbol_type (token::TOKEN_COMMA, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_COLON (YY_COPY (location_type) l)
+  Dhcp4Parser::make_COLON (const location_type& l)
   {
-    return symbol_type (token::TOKEN_COLON, YY_MOVE (l));
+    return symbol_type (token::TOKEN_COLON, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_LSQUARE_BRACKET (YY_COPY (location_type) l)
+  Dhcp4Parser::make_LSQUARE_BRACKET (const location_type& l)
   {
-    return symbol_type (token::TOKEN_LSQUARE_BRACKET, YY_MOVE (l));
+    return symbol_type (token::TOKEN_LSQUARE_BRACKET, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_RSQUARE_BRACKET (YY_COPY (location_type) l)
+  Dhcp4Parser::make_RSQUARE_BRACKET (const location_type& l)
   {
-    return symbol_type (token::TOKEN_RSQUARE_BRACKET, YY_MOVE (l));
+    return symbol_type (token::TOKEN_RSQUARE_BRACKET, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_LCURLY_BRACKET (YY_COPY (location_type) l)
+  Dhcp4Parser::make_LCURLY_BRACKET (const location_type& l)
   {
-    return symbol_type (token::TOKEN_LCURLY_BRACKET, YY_MOVE (l));
+    return symbol_type (token::TOKEN_LCURLY_BRACKET, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_RCURLY_BRACKET (YY_COPY (location_type) l)
+  Dhcp4Parser::make_RCURLY_BRACKET (const location_type& l)
   {
-    return symbol_type (token::TOKEN_RCURLY_BRACKET, YY_MOVE (l));
+    return symbol_type (token::TOKEN_RCURLY_BRACKET, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_NULL_TYPE (YY_COPY (location_type) l)
+  Dhcp4Parser::make_NULL_TYPE (const location_type& l)
   {
-    return symbol_type (token::TOKEN_NULL_TYPE, YY_MOVE (l));
+    return symbol_type (token::TOKEN_NULL_TYPE, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_DHCP4 (YY_COPY (location_type) l)
+  Dhcp4Parser::make_DHCP4 (const location_type& l)
   {
-    return symbol_type (token::TOKEN_DHCP4, YY_MOVE (l));
+    return symbol_type (token::TOKEN_DHCP4, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_CONFIG_CONTROL (YY_COPY (location_type) l)
+  Dhcp4Parser::make_CONFIG_CONTROL (const location_type& l)
   {
-    return symbol_type (token::TOKEN_CONFIG_CONTROL, YY_MOVE (l));
+    return symbol_type (token::TOKEN_CONFIG_CONTROL, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_CONFIG_DATABASES (YY_COPY (location_type) l)
+  Dhcp4Parser::make_CONFIG_DATABASES (const location_type& l)
   {
-    return symbol_type (token::TOKEN_CONFIG_DATABASES, YY_MOVE (l));
+    return symbol_type (token::TOKEN_CONFIG_DATABASES, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_INTERFACES_CONFIG (YY_COPY (location_type) l)
+  Dhcp4Parser::make_INTERFACES_CONFIG (const location_type& l)
   {
-    return symbol_type (token::TOKEN_INTERFACES_CONFIG, YY_MOVE (l));
+    return symbol_type (token::TOKEN_INTERFACES_CONFIG, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_INTERFACES (YY_COPY (location_type) l)
+  Dhcp4Parser::make_INTERFACES (const location_type& l)
   {
-    return symbol_type (token::TOKEN_INTERFACES, YY_MOVE (l));
+    return symbol_type (token::TOKEN_INTERFACES, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_DHCP_SOCKET_TYPE (YY_COPY (location_type) l)
+  Dhcp4Parser::make_DHCP_SOCKET_TYPE (const location_type& l)
   {
-    return symbol_type (token::TOKEN_DHCP_SOCKET_TYPE, YY_MOVE (l));
+    return symbol_type (token::TOKEN_DHCP_SOCKET_TYPE, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_RAW (YY_COPY (location_type) l)
+  Dhcp4Parser::make_RAW (const location_type& l)
   {
-    return symbol_type (token::TOKEN_RAW, YY_MOVE (l));
+    return symbol_type (token::TOKEN_RAW, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_UDP (YY_COPY (location_type) l)
+  Dhcp4Parser::make_UDP (const location_type& l)
   {
-    return symbol_type (token::TOKEN_UDP, YY_MOVE (l));
+    return symbol_type (token::TOKEN_UDP, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_OUTBOUND_INTERFACE (YY_COPY (location_type) l)
+  Dhcp4Parser::make_OUTBOUND_INTERFACE (const location_type& l)
   {
-    return symbol_type (token::TOKEN_OUTBOUND_INTERFACE, YY_MOVE (l));
+    return symbol_type (token::TOKEN_OUTBOUND_INTERFACE, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_SAME_AS_INBOUND (YY_COPY (location_type) l)
+  Dhcp4Parser::make_SAME_AS_INBOUND (const location_type& l)
   {
-    return symbol_type (token::TOKEN_SAME_AS_INBOUND, YY_MOVE (l));
+    return symbol_type (token::TOKEN_SAME_AS_INBOUND, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_USE_ROUTING (YY_COPY (location_type) l)
+  Dhcp4Parser::make_USE_ROUTING (const location_type& l)
   {
-    return symbol_type (token::TOKEN_USE_ROUTING, YY_MOVE (l));
+    return symbol_type (token::TOKEN_USE_ROUTING, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_RE_DETECT (YY_COPY (location_type) l)
+  Dhcp4Parser::make_RE_DETECT (const location_type& l)
   {
-    return symbol_type (token::TOKEN_RE_DETECT, YY_MOVE (l));
+    return symbol_type (token::TOKEN_RE_DETECT, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_SANITY_CHECKS (YY_COPY (location_type) l)
+  Dhcp4Parser::make_SANITY_CHECKS (const location_type& l)
   {
-    return symbol_type (token::TOKEN_SANITY_CHECKS, YY_MOVE (l));
+    return symbol_type (token::TOKEN_SANITY_CHECKS, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_LEASE_CHECKS (YY_COPY (location_type) l)
+  Dhcp4Parser::make_LEASE_CHECKS (const location_type& l)
   {
-    return symbol_type (token::TOKEN_LEASE_CHECKS, YY_MOVE (l));
+    return symbol_type (token::TOKEN_LEASE_CHECKS, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_ECHO_CLIENT_ID (YY_COPY (location_type) l)
+  Dhcp4Parser::make_ECHO_CLIENT_ID (const location_type& l)
   {
-    return symbol_type (token::TOKEN_ECHO_CLIENT_ID, YY_MOVE (l));
+    return symbol_type (token::TOKEN_ECHO_CLIENT_ID, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_MATCH_CLIENT_ID (YY_COPY (location_type) l)
+  Dhcp4Parser::make_MATCH_CLIENT_ID (const location_type& l)
   {
-    return symbol_type (token::TOKEN_MATCH_CLIENT_ID, YY_MOVE (l));
+    return symbol_type (token::TOKEN_MATCH_CLIENT_ID, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_AUTHORITATIVE (YY_COPY (location_type) l)
+  Dhcp4Parser::make_AUTHORITATIVE (const location_type& l)
   {
-    return symbol_type (token::TOKEN_AUTHORITATIVE, YY_MOVE (l));
+    return symbol_type (token::TOKEN_AUTHORITATIVE, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_NEXT_SERVER (YY_COPY (location_type) l)
+  Dhcp4Parser::make_NEXT_SERVER (const location_type& l)
   {
-    return symbol_type (token::TOKEN_NEXT_SERVER, YY_MOVE (l));
+    return symbol_type (token::TOKEN_NEXT_SERVER, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_SERVER_HOSTNAME (YY_COPY (location_type) l)
+  Dhcp4Parser::make_SERVER_HOSTNAME (const location_type& l)
   {
-    return symbol_type (token::TOKEN_SERVER_HOSTNAME, YY_MOVE (l));
+    return symbol_type (token::TOKEN_SERVER_HOSTNAME, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_BOOT_FILE_NAME (YY_COPY (location_type) l)
+  Dhcp4Parser::make_BOOT_FILE_NAME (const location_type& l)
   {
-    return symbol_type (token::TOKEN_BOOT_FILE_NAME, YY_MOVE (l));
+    return symbol_type (token::TOKEN_BOOT_FILE_NAME, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_LEASE_DATABASE (YY_COPY (location_type) l)
+  Dhcp4Parser::make_LEASE_DATABASE (const location_type& l)
   {
-    return symbol_type (token::TOKEN_LEASE_DATABASE, YY_MOVE (l));
+    return symbol_type (token::TOKEN_LEASE_DATABASE, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_HOSTS_DATABASE (YY_COPY (location_type) l)
+  Dhcp4Parser::make_HOSTS_DATABASE (const location_type& l)
   {
-    return symbol_type (token::TOKEN_HOSTS_DATABASE, YY_MOVE (l));
+    return symbol_type (token::TOKEN_HOSTS_DATABASE, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_HOSTS_DATABASES (YY_COPY (location_type) l)
+  Dhcp4Parser::make_HOSTS_DATABASES (const location_type& l)
   {
-    return symbol_type (token::TOKEN_HOSTS_DATABASES, YY_MOVE (l));
+    return symbol_type (token::TOKEN_HOSTS_DATABASES, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_TYPE (YY_COPY (location_type) l)
+  Dhcp4Parser::make_TYPE (const location_type& l)
   {
-    return symbol_type (token::TOKEN_TYPE, YY_MOVE (l));
+    return symbol_type (token::TOKEN_TYPE, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_MEMFILE (YY_COPY (location_type) l)
+  Dhcp4Parser::make_MEMFILE (const location_type& l)
   {
-    return symbol_type (token::TOKEN_MEMFILE, YY_MOVE (l));
+    return symbol_type (token::TOKEN_MEMFILE, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_MYSQL (YY_COPY (location_type) l)
+  Dhcp4Parser::make_MYSQL (const location_type& l)
   {
-    return symbol_type (token::TOKEN_MYSQL, YY_MOVE (l));
+    return symbol_type (token::TOKEN_MYSQL, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_POSTGRESQL (YY_COPY (location_type) l)
+  Dhcp4Parser::make_POSTGRESQL (const location_type& l)
   {
-    return symbol_type (token::TOKEN_POSTGRESQL, YY_MOVE (l));
+    return symbol_type (token::TOKEN_POSTGRESQL, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_CQL (YY_COPY (location_type) l)
+  Dhcp4Parser::make_CQL (const location_type& l)
   {
-    return symbol_type (token::TOKEN_CQL, YY_MOVE (l));
+    return symbol_type (token::TOKEN_CQL, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_USER (YY_COPY (location_type) l)
+  Dhcp4Parser::make_USER (const location_type& l)
   {
-    return symbol_type (token::TOKEN_USER, YY_MOVE (l));
+    return symbol_type (token::TOKEN_USER, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_PASSWORD (YY_COPY (location_type) l)
+  Dhcp4Parser::make_PASSWORD (const location_type& l)
   {
-    return symbol_type (token::TOKEN_PASSWORD, YY_MOVE (l));
+    return symbol_type (token::TOKEN_PASSWORD, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_HOST (YY_COPY (location_type) l)
+  Dhcp4Parser::make_HOST (const location_type& l)
   {
-    return symbol_type (token::TOKEN_HOST, YY_MOVE (l));
+    return symbol_type (token::TOKEN_HOST, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_PORT (YY_COPY (location_type) l)
+  Dhcp4Parser::make_PORT (const location_type& l)
   {
-    return symbol_type (token::TOKEN_PORT, YY_MOVE (l));
+    return symbol_type (token::TOKEN_PORT, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_PERSIST (YY_COPY (location_type) l)
+  Dhcp4Parser::make_PERSIST (const location_type& l)
   {
-    return symbol_type (token::TOKEN_PERSIST, YY_MOVE (l));
+    return symbol_type (token::TOKEN_PERSIST, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_LFC_INTERVAL (YY_COPY (location_type) l)
+  Dhcp4Parser::make_LFC_INTERVAL (const location_type& l)
   {
-    return symbol_type (token::TOKEN_LFC_INTERVAL, YY_MOVE (l));
+    return symbol_type (token::TOKEN_LFC_INTERVAL, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_READONLY (YY_COPY (location_type) l)
+  Dhcp4Parser::make_READONLY (const location_type& l)
   {
-    return symbol_type (token::TOKEN_READONLY, YY_MOVE (l));
+    return symbol_type (token::TOKEN_READONLY, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_CONNECT_TIMEOUT (YY_COPY (location_type) l)
+  Dhcp4Parser::make_CONNECT_TIMEOUT (const location_type& l)
   {
-    return symbol_type (token::TOKEN_CONNECT_TIMEOUT, YY_MOVE (l));
+    return symbol_type (token::TOKEN_CONNECT_TIMEOUT, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_CONTACT_POINTS (YY_COPY (location_type) l)
+  Dhcp4Parser::make_CONTACT_POINTS (const location_type& l)
   {
-    return symbol_type (token::TOKEN_CONTACT_POINTS, YY_MOVE (l));
+    return symbol_type (token::TOKEN_CONTACT_POINTS, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_KEYSPACE (YY_COPY (location_type) l)
+  Dhcp4Parser::make_KEYSPACE (const location_type& l)
   {
-    return symbol_type (token::TOKEN_KEYSPACE, YY_MOVE (l));
+    return symbol_type (token::TOKEN_KEYSPACE, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_MAX_RECONNECT_TRIES (YY_COPY (location_type) l)
+  Dhcp4Parser::make_MAX_RECONNECT_TRIES (const location_type& l)
   {
-    return symbol_type (token::TOKEN_MAX_RECONNECT_TRIES, YY_MOVE (l));
+    return symbol_type (token::TOKEN_MAX_RECONNECT_TRIES, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_RECONNECT_WAIT_TIME (YY_COPY (location_type) l)
+  Dhcp4Parser::make_RECONNECT_WAIT_TIME (const location_type& l)
   {
-    return symbol_type (token::TOKEN_RECONNECT_WAIT_TIME, YY_MOVE (l));
+    return symbol_type (token::TOKEN_RECONNECT_WAIT_TIME, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_REQUEST_TIMEOUT (YY_COPY (location_type) l)
+  Dhcp4Parser::make_REQUEST_TIMEOUT (const location_type& l)
   {
-    return symbol_type (token::TOKEN_REQUEST_TIMEOUT, YY_MOVE (l));
+    return symbol_type (token::TOKEN_REQUEST_TIMEOUT, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_TCP_KEEPALIVE (YY_COPY (location_type) l)
+  Dhcp4Parser::make_TCP_KEEPALIVE (const location_type& l)
   {
-    return symbol_type (token::TOKEN_TCP_KEEPALIVE, YY_MOVE (l));
+    return symbol_type (token::TOKEN_TCP_KEEPALIVE, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_TCP_NODELAY (YY_COPY (location_type) l)
+  Dhcp4Parser::make_TCP_NODELAY (const location_type& l)
   {
-    return symbol_type (token::TOKEN_TCP_NODELAY, YY_MOVE (l));
+    return symbol_type (token::TOKEN_TCP_NODELAY, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_VALID_LIFETIME (YY_COPY (location_type) l)
+  Dhcp4Parser::make_VALID_LIFETIME (const location_type& l)
   {
-    return symbol_type (token::TOKEN_VALID_LIFETIME, YY_MOVE (l));
+    return symbol_type (token::TOKEN_VALID_LIFETIME, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_RENEW_TIMER (YY_COPY (location_type) l)
+  Dhcp4Parser::make_RENEW_TIMER (const location_type& l)
   {
-    return symbol_type (token::TOKEN_RENEW_TIMER, YY_MOVE (l));
+    return symbol_type (token::TOKEN_RENEW_TIMER, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_REBIND_TIMER (YY_COPY (location_type) l)
+  Dhcp4Parser::make_REBIND_TIMER (const location_type& l)
   {
-    return symbol_type (token::TOKEN_REBIND_TIMER, YY_MOVE (l));
+    return symbol_type (token::TOKEN_REBIND_TIMER, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_DECLINE_PROBATION_PERIOD (YY_COPY (location_type) l)
+  Dhcp4Parser::make_DECLINE_PROBATION_PERIOD (const location_type& l)
   {
-    return symbol_type (token::TOKEN_DECLINE_PROBATION_PERIOD, YY_MOVE (l));
+    return symbol_type (token::TOKEN_DECLINE_PROBATION_PERIOD, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_SERVER_TAG (YY_COPY (location_type) l)
+  Dhcp4Parser::make_SERVER_TAG (const location_type& l)
   {
-    return symbol_type (token::TOKEN_SERVER_TAG, YY_MOVE (l));
+    return symbol_type (token::TOKEN_SERVER_TAG, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_SUBNET4 (YY_COPY (location_type) l)
+  Dhcp4Parser::make_SUBNET4 (const location_type& l)
   {
-    return symbol_type (token::TOKEN_SUBNET4, YY_MOVE (l));
+    return symbol_type (token::TOKEN_SUBNET4, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_SUBNET_4O6_INTERFACE (YY_COPY (location_type) l)
+  Dhcp4Parser::make_SUBNET_4O6_INTERFACE (const location_type& l)
   {
-    return symbol_type (token::TOKEN_SUBNET_4O6_INTERFACE, YY_MOVE (l));
+    return symbol_type (token::TOKEN_SUBNET_4O6_INTERFACE, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_SUBNET_4O6_INTERFACE_ID (YY_COPY (location_type) l)
+  Dhcp4Parser::make_SUBNET_4O6_INTERFACE_ID (const location_type& l)
   {
-    return symbol_type (token::TOKEN_SUBNET_4O6_INTERFACE_ID, YY_MOVE (l));
+    return symbol_type (token::TOKEN_SUBNET_4O6_INTERFACE_ID, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_SUBNET_4O6_SUBNET (YY_COPY (location_type) l)
+  Dhcp4Parser::make_SUBNET_4O6_SUBNET (const location_type& l)
   {
-    return symbol_type (token::TOKEN_SUBNET_4O6_SUBNET, YY_MOVE (l));
+    return symbol_type (token::TOKEN_SUBNET_4O6_SUBNET, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_OPTION_DEF (YY_COPY (location_type) l)
+  Dhcp4Parser::make_OPTION_DEF (const location_type& l)
   {
-    return symbol_type (token::TOKEN_OPTION_DEF, YY_MOVE (l));
+    return symbol_type (token::TOKEN_OPTION_DEF, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_OPTION_DATA (YY_COPY (location_type) l)
+  Dhcp4Parser::make_OPTION_DATA (const location_type& l)
   {
-    return symbol_type (token::TOKEN_OPTION_DATA, YY_MOVE (l));
+    return symbol_type (token::TOKEN_OPTION_DATA, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_NAME (YY_COPY (location_type) l)
+  Dhcp4Parser::make_NAME (const location_type& l)
   {
-    return symbol_type (token::TOKEN_NAME, YY_MOVE (l));
+    return symbol_type (token::TOKEN_NAME, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_DATA (YY_COPY (location_type) l)
+  Dhcp4Parser::make_DATA (const location_type& l)
   {
-    return symbol_type (token::TOKEN_DATA, YY_MOVE (l));
+    return symbol_type (token::TOKEN_DATA, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_CODE (YY_COPY (location_type) l)
+  Dhcp4Parser::make_CODE (const location_type& l)
   {
-    return symbol_type (token::TOKEN_CODE, YY_MOVE (l));
+    return symbol_type (token::TOKEN_CODE, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_SPACE (YY_COPY (location_type) l)
+  Dhcp4Parser::make_SPACE (const location_type& l)
   {
-    return symbol_type (token::TOKEN_SPACE, YY_MOVE (l));
+    return symbol_type (token::TOKEN_SPACE, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_CSV_FORMAT (YY_COPY (location_type) l)
+  Dhcp4Parser::make_CSV_FORMAT (const location_type& l)
   {
-    return symbol_type (token::TOKEN_CSV_FORMAT, YY_MOVE (l));
+    return symbol_type (token::TOKEN_CSV_FORMAT, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_ALWAYS_SEND (YY_COPY (location_type) l)
+  Dhcp4Parser::make_ALWAYS_SEND (const location_type& l)
   {
-    return symbol_type (token::TOKEN_ALWAYS_SEND, YY_MOVE (l));
+    return symbol_type (token::TOKEN_ALWAYS_SEND, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_RECORD_TYPES (YY_COPY (location_type) l)
+  Dhcp4Parser::make_RECORD_TYPES (const location_type& l)
   {
-    return symbol_type (token::TOKEN_RECORD_TYPES, YY_MOVE (l));
+    return symbol_type (token::TOKEN_RECORD_TYPES, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_ENCAPSULATE (YY_COPY (location_type) l)
+  Dhcp4Parser::make_ENCAPSULATE (const location_type& l)
   {
-    return symbol_type (token::TOKEN_ENCAPSULATE, YY_MOVE (l));
+    return symbol_type (token::TOKEN_ENCAPSULATE, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_ARRAY (YY_COPY (location_type) l)
+  Dhcp4Parser::make_ARRAY (const location_type& l)
   {
-    return symbol_type (token::TOKEN_ARRAY, YY_MOVE (l));
+    return symbol_type (token::TOKEN_ARRAY, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_SHARED_NETWORKS (YY_COPY (location_type) l)
+  Dhcp4Parser::make_CALCULATE_TEE_TIMES (const location_type& l)
   {
-    return symbol_type (token::TOKEN_SHARED_NETWORKS, YY_MOVE (l));
+    return symbol_type (token::TOKEN_CALCULATE_TEE_TIMES, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_POOLS (YY_COPY (location_type) l)
+  Dhcp4Parser::make_T1_PERCENT (const location_type& l)
   {
-    return symbol_type (token::TOKEN_POOLS, YY_MOVE (l));
+    return symbol_type (token::TOKEN_T1_PERCENT, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_POOL (YY_COPY (location_type) l)
+  Dhcp4Parser::make_T2_PERCENT (const location_type& l)
   {
-    return symbol_type (token::TOKEN_POOL, YY_MOVE (l));
+    return symbol_type (token::TOKEN_T2_PERCENT, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_USER_CONTEXT (YY_COPY (location_type) l)
+  Dhcp4Parser::make_SHARED_NETWORKS (const location_type& l)
   {
-    return symbol_type (token::TOKEN_USER_CONTEXT, YY_MOVE (l));
+    return symbol_type (token::TOKEN_SHARED_NETWORKS, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_COMMENT (YY_COPY (location_type) l)
+  Dhcp4Parser::make_POOLS (const location_type& l)
   {
-    return symbol_type (token::TOKEN_COMMENT, YY_MOVE (l));
+    return symbol_type (token::TOKEN_POOLS, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_SUBNET (YY_COPY (location_type) l)
+  Dhcp4Parser::make_POOL (const location_type& l)
   {
-    return symbol_type (token::TOKEN_SUBNET, YY_MOVE (l));
+    return symbol_type (token::TOKEN_POOL, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_INTERFACE (YY_COPY (location_type) l)
+  Dhcp4Parser::make_USER_CONTEXT (const location_type& l)
   {
-    return symbol_type (token::TOKEN_INTERFACE, YY_MOVE (l));
+    return symbol_type (token::TOKEN_USER_CONTEXT, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_ID (YY_COPY (location_type) l)
+  Dhcp4Parser::make_COMMENT (const location_type& l)
   {
-    return symbol_type (token::TOKEN_ID, YY_MOVE (l));
+    return symbol_type (token::TOKEN_COMMENT, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_RESERVATION_MODE (YY_COPY (location_type) l)
+  Dhcp4Parser::make_SUBNET (const location_type& l)
   {
-    return symbol_type (token::TOKEN_RESERVATION_MODE, YY_MOVE (l));
+    return symbol_type (token::TOKEN_SUBNET, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_DISABLED (YY_COPY (location_type) l)
+  Dhcp4Parser::make_INTERFACE (const location_type& l)
   {
-    return symbol_type (token::TOKEN_DISABLED, YY_MOVE (l));
+    return symbol_type (token::TOKEN_INTERFACE, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_OUT_OF_POOL (YY_COPY (location_type) l)
+  Dhcp4Parser::make_ID (const location_type& l)
   {
-    return symbol_type (token::TOKEN_OUT_OF_POOL, YY_MOVE (l));
+    return symbol_type (token::TOKEN_ID, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_GLOBAL (YY_COPY (location_type) l)
+  Dhcp4Parser::make_RESERVATION_MODE (const location_type& l)
   {
-    return symbol_type (token::TOKEN_GLOBAL, YY_MOVE (l));
+    return symbol_type (token::TOKEN_RESERVATION_MODE, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_ALL (YY_COPY (location_type) l)
+  Dhcp4Parser::make_DISABLED (const location_type& l)
   {
-    return symbol_type (token::TOKEN_ALL, YY_MOVE (l));
+    return symbol_type (token::TOKEN_DISABLED, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_HOST_RESERVATION_IDENTIFIERS (YY_COPY (location_type) l)
+  Dhcp4Parser::make_OUT_OF_POOL (const location_type& l)
   {
-    return symbol_type (token::TOKEN_HOST_RESERVATION_IDENTIFIERS, YY_MOVE (l));
+    return symbol_type (token::TOKEN_OUT_OF_POOL, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_CLIENT_CLASSES (YY_COPY (location_type) l)
+  Dhcp4Parser::make_GLOBAL (const location_type& l)
   {
-    return symbol_type (token::TOKEN_CLIENT_CLASSES, YY_MOVE (l));
+    return symbol_type (token::TOKEN_GLOBAL, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_REQUIRE_CLIENT_CLASSES (YY_COPY (location_type) l)
+  Dhcp4Parser::make_ALL (const location_type& l)
   {
-    return symbol_type (token::TOKEN_REQUIRE_CLIENT_CLASSES, YY_MOVE (l));
+    return symbol_type (token::TOKEN_ALL, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_TEST (YY_COPY (location_type) l)
+  Dhcp4Parser::make_HOST_RESERVATION_IDENTIFIERS (const location_type& l)
   {
-    return symbol_type (token::TOKEN_TEST, YY_MOVE (l));
+    return symbol_type (token::TOKEN_HOST_RESERVATION_IDENTIFIERS, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_ONLY_IF_REQUIRED (YY_COPY (location_type) l)
+  Dhcp4Parser::make_CLIENT_CLASSES (const location_type& l)
   {
-    return symbol_type (token::TOKEN_ONLY_IF_REQUIRED, YY_MOVE (l));
+    return symbol_type (token::TOKEN_CLIENT_CLASSES, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_CLIENT_CLASS (YY_COPY (location_type) l)
+  Dhcp4Parser::make_REQUIRE_CLIENT_CLASSES (const location_type& l)
   {
-    return symbol_type (token::TOKEN_CLIENT_CLASS, YY_MOVE (l));
+    return symbol_type (token::TOKEN_REQUIRE_CLIENT_CLASSES, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_RESERVATIONS (YY_COPY (location_type) l)
+  Dhcp4Parser::make_TEST (const location_type& l)
   {
-    return symbol_type (token::TOKEN_RESERVATIONS, YY_MOVE (l));
+    return symbol_type (token::TOKEN_TEST, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_DUID (YY_COPY (location_type) l)
+  Dhcp4Parser::make_ONLY_IF_REQUIRED (const location_type& l)
   {
-    return symbol_type (token::TOKEN_DUID, YY_MOVE (l));
+    return symbol_type (token::TOKEN_ONLY_IF_REQUIRED, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_HW_ADDRESS (YY_COPY (location_type) l)
+  Dhcp4Parser::make_CLIENT_CLASS (const location_type& l)
   {
-    return symbol_type (token::TOKEN_HW_ADDRESS, YY_MOVE (l));
+    return symbol_type (token::TOKEN_CLIENT_CLASS, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_CIRCUIT_ID (YY_COPY (location_type) l)
+  Dhcp4Parser::make_RESERVATIONS (const location_type& l)
   {
-    return symbol_type (token::TOKEN_CIRCUIT_ID, YY_MOVE (l));
+    return symbol_type (token::TOKEN_RESERVATIONS, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_CLIENT_ID (YY_COPY (location_type) l)
+  Dhcp4Parser::make_DUID (const location_type& l)
   {
-    return symbol_type (token::TOKEN_CLIENT_ID, YY_MOVE (l));
+    return symbol_type (token::TOKEN_DUID, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_HOSTNAME (YY_COPY (location_type) l)
+  Dhcp4Parser::make_HW_ADDRESS (const location_type& l)
   {
-    return symbol_type (token::TOKEN_HOSTNAME, YY_MOVE (l));
+    return symbol_type (token::TOKEN_HW_ADDRESS, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_FLEX_ID (YY_COPY (location_type) l)
+  Dhcp4Parser::make_CIRCUIT_ID (const location_type& l)
   {
-    return symbol_type (token::TOKEN_FLEX_ID, YY_MOVE (l));
+    return symbol_type (token::TOKEN_CIRCUIT_ID, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_RELAY (YY_COPY (location_type) l)
+  Dhcp4Parser::make_CLIENT_ID (const location_type& l)
   {
-    return symbol_type (token::TOKEN_RELAY, YY_MOVE (l));
+    return symbol_type (token::TOKEN_CLIENT_ID, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_IP_ADDRESS (YY_COPY (location_type) l)
+  Dhcp4Parser::make_HOSTNAME (const location_type& l)
   {
-    return symbol_type (token::TOKEN_IP_ADDRESS, YY_MOVE (l));
+    return symbol_type (token::TOKEN_HOSTNAME, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_IP_ADDRESSES (YY_COPY (location_type) l)
+  Dhcp4Parser::make_FLEX_ID (const location_type& l)
   {
-    return symbol_type (token::TOKEN_IP_ADDRESSES, YY_MOVE (l));
+    return symbol_type (token::TOKEN_FLEX_ID, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_HOOKS_LIBRARIES (YY_COPY (location_type) l)
+  Dhcp4Parser::make_RELAY (const location_type& l)
   {
-    return symbol_type (token::TOKEN_HOOKS_LIBRARIES, YY_MOVE (l));
+    return symbol_type (token::TOKEN_RELAY, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_LIBRARY (YY_COPY (location_type) l)
+  Dhcp4Parser::make_IP_ADDRESS (const location_type& l)
   {
-    return symbol_type (token::TOKEN_LIBRARY, YY_MOVE (l));
+    return symbol_type (token::TOKEN_IP_ADDRESS, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_PARAMETERS (YY_COPY (location_type) l)
+  Dhcp4Parser::make_IP_ADDRESSES (const location_type& l)
   {
-    return symbol_type (token::TOKEN_PARAMETERS, YY_MOVE (l));
+    return symbol_type (token::TOKEN_IP_ADDRESSES, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_EXPIRED_LEASES_PROCESSING (YY_COPY (location_type) l)
+  Dhcp4Parser::make_HOOKS_LIBRARIES (const location_type& l)
   {
-    return symbol_type (token::TOKEN_EXPIRED_LEASES_PROCESSING, YY_MOVE (l));
+    return symbol_type (token::TOKEN_HOOKS_LIBRARIES, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_RECLAIM_TIMER_WAIT_TIME (YY_COPY (location_type) l)
+  Dhcp4Parser::make_LIBRARY (const location_type& l)
   {
-    return symbol_type (token::TOKEN_RECLAIM_TIMER_WAIT_TIME, YY_MOVE (l));
+    return symbol_type (token::TOKEN_LIBRARY, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_FLUSH_RECLAIMED_TIMER_WAIT_TIME (YY_COPY (location_type) l)
+  Dhcp4Parser::make_PARAMETERS (const location_type& l)
   {
-    return symbol_type (token::TOKEN_FLUSH_RECLAIMED_TIMER_WAIT_TIME, YY_MOVE (l));
+    return symbol_type (token::TOKEN_PARAMETERS, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_HOLD_RECLAIMED_TIME (YY_COPY (location_type) l)
+  Dhcp4Parser::make_EXPIRED_LEASES_PROCESSING (const location_type& l)
   {
-    return symbol_type (token::TOKEN_HOLD_RECLAIMED_TIME, YY_MOVE (l));
+    return symbol_type (token::TOKEN_EXPIRED_LEASES_PROCESSING, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_MAX_RECLAIM_LEASES (YY_COPY (location_type) l)
+  Dhcp4Parser::make_RECLAIM_TIMER_WAIT_TIME (const location_type& l)
   {
-    return symbol_type (token::TOKEN_MAX_RECLAIM_LEASES, YY_MOVE (l));
+    return symbol_type (token::TOKEN_RECLAIM_TIMER_WAIT_TIME, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_MAX_RECLAIM_TIME (YY_COPY (location_type) l)
+  Dhcp4Parser::make_FLUSH_RECLAIMED_TIMER_WAIT_TIME (const location_type& l)
   {
-    return symbol_type (token::TOKEN_MAX_RECLAIM_TIME, YY_MOVE (l));
+    return symbol_type (token::TOKEN_FLUSH_RECLAIMED_TIMER_WAIT_TIME, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_UNWARNED_RECLAIM_CYCLES (YY_COPY (location_type) l)
+  Dhcp4Parser::make_HOLD_RECLAIMED_TIME (const location_type& l)
   {
-    return symbol_type (token::TOKEN_UNWARNED_RECLAIM_CYCLES, YY_MOVE (l));
+    return symbol_type (token::TOKEN_HOLD_RECLAIMED_TIME, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_DHCP4O6_PORT (YY_COPY (location_type) l)
+  Dhcp4Parser::make_MAX_RECLAIM_LEASES (const location_type& l)
   {
-    return symbol_type (token::TOKEN_DHCP4O6_PORT, YY_MOVE (l));
+    return symbol_type (token::TOKEN_MAX_RECLAIM_LEASES, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_CONTROL_SOCKET (YY_COPY (location_type) l)
+  Dhcp4Parser::make_MAX_RECLAIM_TIME (const location_type& l)
   {
-    return symbol_type (token::TOKEN_CONTROL_SOCKET, YY_MOVE (l));
+    return symbol_type (token::TOKEN_MAX_RECLAIM_TIME, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_SOCKET_TYPE (YY_COPY (location_type) l)
+  Dhcp4Parser::make_UNWARNED_RECLAIM_CYCLES (const location_type& l)
   {
-    return symbol_type (token::TOKEN_SOCKET_TYPE, YY_MOVE (l));
+    return symbol_type (token::TOKEN_UNWARNED_RECLAIM_CYCLES, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_SOCKET_NAME (YY_COPY (location_type) l)
+  Dhcp4Parser::make_DHCP4O6_PORT (const location_type& l)
   {
-    return symbol_type (token::TOKEN_SOCKET_NAME, YY_MOVE (l));
+    return symbol_type (token::TOKEN_DHCP4O6_PORT, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_DHCP_QUEUE_CONTROL (YY_COPY (location_type) l)
+  Dhcp4Parser::make_CONTROL_SOCKET (const location_type& l)
   {
-    return symbol_type (token::TOKEN_DHCP_QUEUE_CONTROL, YY_MOVE (l));
+    return symbol_type (token::TOKEN_CONTROL_SOCKET, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_DHCP_DDNS (YY_COPY (location_type) l)
+  Dhcp4Parser::make_SOCKET_TYPE (const location_type& l)
   {
-    return symbol_type (token::TOKEN_DHCP_DDNS, YY_MOVE (l));
+    return symbol_type (token::TOKEN_SOCKET_TYPE, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_ENABLE_UPDATES (YY_COPY (location_type) l)
+  Dhcp4Parser::make_SOCKET_NAME (const location_type& l)
   {
-    return symbol_type (token::TOKEN_ENABLE_UPDATES, YY_MOVE (l));
+    return symbol_type (token::TOKEN_SOCKET_NAME, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_QUALIFYING_SUFFIX (YY_COPY (location_type) l)
+  Dhcp4Parser::make_DHCP_QUEUE_CONTROL (const location_type& l)
   {
-    return symbol_type (token::TOKEN_QUALIFYING_SUFFIX, YY_MOVE (l));
+    return symbol_type (token::TOKEN_DHCP_QUEUE_CONTROL, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_SERVER_IP (YY_COPY (location_type) l)
+  Dhcp4Parser::make_DHCP_DDNS (const location_type& l)
   {
-    return symbol_type (token::TOKEN_SERVER_IP, YY_MOVE (l));
+    return symbol_type (token::TOKEN_DHCP_DDNS, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_SERVER_PORT (YY_COPY (location_type) l)
+  Dhcp4Parser::make_ENABLE_UPDATES (const location_type& l)
   {
-    return symbol_type (token::TOKEN_SERVER_PORT, YY_MOVE (l));
+    return symbol_type (token::TOKEN_ENABLE_UPDATES, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_SENDER_IP (YY_COPY (location_type) l)
+  Dhcp4Parser::make_QUALIFYING_SUFFIX (const location_type& l)
   {
-    return symbol_type (token::TOKEN_SENDER_IP, YY_MOVE (l));
+    return symbol_type (token::TOKEN_QUALIFYING_SUFFIX, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_SENDER_PORT (YY_COPY (location_type) l)
+  Dhcp4Parser::make_SERVER_IP (const location_type& l)
   {
-    return symbol_type (token::TOKEN_SENDER_PORT, YY_MOVE (l));
+    return symbol_type (token::TOKEN_SERVER_IP, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_MAX_QUEUE_SIZE (YY_COPY (location_type) l)
+  Dhcp4Parser::make_SERVER_PORT (const location_type& l)
   {
-    return symbol_type (token::TOKEN_MAX_QUEUE_SIZE, YY_MOVE (l));
+    return symbol_type (token::TOKEN_SERVER_PORT, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_NCR_PROTOCOL (YY_COPY (location_type) l)
+  Dhcp4Parser::make_SENDER_IP (const location_type& l)
   {
-    return symbol_type (token::TOKEN_NCR_PROTOCOL, YY_MOVE (l));
+    return symbol_type (token::TOKEN_SENDER_IP, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_NCR_FORMAT (YY_COPY (location_type) l)
+  Dhcp4Parser::make_SENDER_PORT (const location_type& l)
   {
-    return symbol_type (token::TOKEN_NCR_FORMAT, YY_MOVE (l));
+    return symbol_type (token::TOKEN_SENDER_PORT, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_OVERRIDE_NO_UPDATE (YY_COPY (location_type) l)
+  Dhcp4Parser::make_MAX_QUEUE_SIZE (const location_type& l)
   {
-    return symbol_type (token::TOKEN_OVERRIDE_NO_UPDATE, YY_MOVE (l));
+    return symbol_type (token::TOKEN_MAX_QUEUE_SIZE, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_OVERRIDE_CLIENT_UPDATE (YY_COPY (location_type) l)
+  Dhcp4Parser::make_NCR_PROTOCOL (const location_type& l)
   {
-    return symbol_type (token::TOKEN_OVERRIDE_CLIENT_UPDATE, YY_MOVE (l));
+    return symbol_type (token::TOKEN_NCR_PROTOCOL, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_REPLACE_CLIENT_NAME (YY_COPY (location_type) l)
+  Dhcp4Parser::make_NCR_FORMAT (const location_type& l)
   {
-    return symbol_type (token::TOKEN_REPLACE_CLIENT_NAME, YY_MOVE (l));
+    return symbol_type (token::TOKEN_NCR_FORMAT, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_GENERATED_PREFIX (YY_COPY (location_type) l)
+  Dhcp4Parser::make_OVERRIDE_NO_UPDATE (const location_type& l)
   {
-    return symbol_type (token::TOKEN_GENERATED_PREFIX, YY_MOVE (l));
+    return symbol_type (token::TOKEN_OVERRIDE_NO_UPDATE, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_TCP (YY_COPY (location_type) l)
+  Dhcp4Parser::make_OVERRIDE_CLIENT_UPDATE (const location_type& l)
   {
-    return symbol_type (token::TOKEN_TCP, YY_MOVE (l));
+    return symbol_type (token::TOKEN_OVERRIDE_CLIENT_UPDATE, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_JSON (YY_COPY (location_type) l)
+  Dhcp4Parser::make_REPLACE_CLIENT_NAME (const location_type& l)
   {
-    return symbol_type (token::TOKEN_JSON, YY_MOVE (l));
+    return symbol_type (token::TOKEN_REPLACE_CLIENT_NAME, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_WHEN_PRESENT (YY_COPY (location_type) l)
+  Dhcp4Parser::make_GENERATED_PREFIX (const location_type& l)
   {
-    return symbol_type (token::TOKEN_WHEN_PRESENT, YY_MOVE (l));
+    return symbol_type (token::TOKEN_GENERATED_PREFIX, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_NEVER (YY_COPY (location_type) l)
+  Dhcp4Parser::make_TCP (const location_type& l)
   {
-    return symbol_type (token::TOKEN_NEVER, YY_MOVE (l));
+    return symbol_type (token::TOKEN_TCP, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_ALWAYS (YY_COPY (location_type) l)
+  Dhcp4Parser::make_JSON (const location_type& l)
   {
-    return symbol_type (token::TOKEN_ALWAYS, YY_MOVE (l));
+    return symbol_type (token::TOKEN_JSON, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_WHEN_NOT_PRESENT (YY_COPY (location_type) l)
+  Dhcp4Parser::make_WHEN_PRESENT (const location_type& l)
   {
-    return symbol_type (token::TOKEN_WHEN_NOT_PRESENT, YY_MOVE (l));
+    return symbol_type (token::TOKEN_WHEN_PRESENT, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_HOSTNAME_CHAR_SET (YY_COPY (location_type) l)
+  Dhcp4Parser::make_NEVER (const location_type& l)
   {
-    return symbol_type (token::TOKEN_HOSTNAME_CHAR_SET, YY_MOVE (l));
+    return symbol_type (token::TOKEN_NEVER, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_HOSTNAME_CHAR_REPLACEMENT (YY_COPY (location_type) l)
+  Dhcp4Parser::make_ALWAYS (const location_type& l)
   {
-    return symbol_type (token::TOKEN_HOSTNAME_CHAR_REPLACEMENT, YY_MOVE (l));
+    return symbol_type (token::TOKEN_ALWAYS, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_LOGGING (YY_COPY (location_type) l)
+  Dhcp4Parser::make_WHEN_NOT_PRESENT (const location_type& l)
   {
-    return symbol_type (token::TOKEN_LOGGING, YY_MOVE (l));
+    return symbol_type (token::TOKEN_WHEN_NOT_PRESENT, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_LOGGERS (YY_COPY (location_type) l)
+  Dhcp4Parser::make_HOSTNAME_CHAR_SET (const location_type& l)
   {
-    return symbol_type (token::TOKEN_LOGGERS, YY_MOVE (l));
+    return symbol_type (token::TOKEN_HOSTNAME_CHAR_SET, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_OUTPUT_OPTIONS (YY_COPY (location_type) l)
+  Dhcp4Parser::make_HOSTNAME_CHAR_REPLACEMENT (const location_type& l)
   {
-    return symbol_type (token::TOKEN_OUTPUT_OPTIONS, YY_MOVE (l));
+    return symbol_type (token::TOKEN_HOSTNAME_CHAR_REPLACEMENT, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_OUTPUT (YY_COPY (location_type) l)
+  Dhcp4Parser::make_LOGGING (const location_type& l)
   {
-    return symbol_type (token::TOKEN_OUTPUT, YY_MOVE (l));
+    return symbol_type (token::TOKEN_LOGGING, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_DEBUGLEVEL (YY_COPY (location_type) l)
+  Dhcp4Parser::make_LOGGERS (const location_type& l)
   {
-    return symbol_type (token::TOKEN_DEBUGLEVEL, YY_MOVE (l));
+    return symbol_type (token::TOKEN_LOGGERS, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_SEVERITY (YY_COPY (location_type) l)
+  Dhcp4Parser::make_OUTPUT_OPTIONS (const location_type& l)
   {
-    return symbol_type (token::TOKEN_SEVERITY, YY_MOVE (l));
+    return symbol_type (token::TOKEN_OUTPUT_OPTIONS, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_FLUSH (YY_COPY (location_type) l)
+  Dhcp4Parser::make_OUTPUT (const location_type& l)
   {
-    return symbol_type (token::TOKEN_FLUSH, YY_MOVE (l));
+    return symbol_type (token::TOKEN_OUTPUT, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_MAXSIZE (YY_COPY (location_type) l)
+  Dhcp4Parser::make_DEBUGLEVEL (const location_type& l)
   {
-    return symbol_type (token::TOKEN_MAXSIZE, YY_MOVE (l));
+    return symbol_type (token::TOKEN_DEBUGLEVEL, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_MAXVER (YY_COPY (location_type) l)
+  Dhcp4Parser::make_SEVERITY (const location_type& l)
   {
-    return symbol_type (token::TOKEN_MAXVER, YY_MOVE (l));
+    return symbol_type (token::TOKEN_SEVERITY, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_DHCP6 (YY_COPY (location_type) l)
+  Dhcp4Parser::make_FLUSH (const location_type& l)
   {
-    return symbol_type (token::TOKEN_DHCP6, YY_MOVE (l));
+    return symbol_type (token::TOKEN_FLUSH, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_DHCPDDNS (YY_COPY (location_type) l)
+  Dhcp4Parser::make_MAXSIZE (const location_type& l)
   {
-    return symbol_type (token::TOKEN_DHCPDDNS, YY_MOVE (l));
+    return symbol_type (token::TOKEN_MAXSIZE, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_CONTROL_AGENT (YY_COPY (location_type) l)
+  Dhcp4Parser::make_MAXVER (const location_type& l)
   {
-    return symbol_type (token::TOKEN_CONTROL_AGENT, YY_MOVE (l));
+    return symbol_type (token::TOKEN_MAXVER, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_TOPLEVEL_JSON (YY_COPY (location_type) l)
+  Dhcp4Parser::make_DHCP6 (const location_type& l)
   {
-    return symbol_type (token::TOKEN_TOPLEVEL_JSON, YY_MOVE (l));
+    return symbol_type (token::TOKEN_DHCP6, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_TOPLEVEL_DHCP4 (YY_COPY (location_type) l)
+  Dhcp4Parser::make_DHCPDDNS (const location_type& l)
   {
-    return symbol_type (token::TOKEN_TOPLEVEL_DHCP4, YY_MOVE (l));
+    return symbol_type (token::TOKEN_DHCPDDNS, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_SUB_DHCP4 (YY_COPY (location_type) l)
+  Dhcp4Parser::make_CONTROL_AGENT (const location_type& l)
   {
-    return symbol_type (token::TOKEN_SUB_DHCP4, YY_MOVE (l));
+    return symbol_type (token::TOKEN_CONTROL_AGENT, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_SUB_INTERFACES4 (YY_COPY (location_type) l)
+  Dhcp4Parser::make_TOPLEVEL_JSON (const location_type& l)
   {
-    return symbol_type (token::TOKEN_SUB_INTERFACES4, YY_MOVE (l));
+    return symbol_type (token::TOKEN_TOPLEVEL_JSON, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_SUB_SUBNET4 (YY_COPY (location_type) l)
+  Dhcp4Parser::make_TOPLEVEL_DHCP4 (const location_type& l)
   {
-    return symbol_type (token::TOKEN_SUB_SUBNET4, YY_MOVE (l));
+    return symbol_type (token::TOKEN_TOPLEVEL_DHCP4, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_SUB_POOL4 (YY_COPY (location_type) l)
+  Dhcp4Parser::make_SUB_DHCP4 (const location_type& l)
   {
-    return symbol_type (token::TOKEN_SUB_POOL4, YY_MOVE (l));
+    return symbol_type (token::TOKEN_SUB_DHCP4, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_SUB_RESERVATION (YY_COPY (location_type) l)
+  Dhcp4Parser::make_SUB_INTERFACES4 (const location_type& l)
   {
-    return symbol_type (token::TOKEN_SUB_RESERVATION, YY_MOVE (l));
+    return symbol_type (token::TOKEN_SUB_INTERFACES4, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_SUB_OPTION_DEFS (YY_COPY (location_type) l)
+  Dhcp4Parser::make_SUB_SUBNET4 (const location_type& l)
   {
-    return symbol_type (token::TOKEN_SUB_OPTION_DEFS, YY_MOVE (l));
+    return symbol_type (token::TOKEN_SUB_SUBNET4, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_SUB_OPTION_DEF (YY_COPY (location_type) l)
+  Dhcp4Parser::make_SUB_POOL4 (const location_type& l)
   {
-    return symbol_type (token::TOKEN_SUB_OPTION_DEF, YY_MOVE (l));
+    return symbol_type (token::TOKEN_SUB_POOL4, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_SUB_OPTION_DATA (YY_COPY (location_type) l)
+  Dhcp4Parser::make_SUB_RESERVATION (const location_type& l)
   {
-    return symbol_type (token::TOKEN_SUB_OPTION_DATA, YY_MOVE (l));
+    return symbol_type (token::TOKEN_SUB_RESERVATION, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_SUB_HOOKS_LIBRARY (YY_COPY (location_type) l)
+  Dhcp4Parser::make_SUB_OPTION_DEFS (const location_type& l)
   {
-    return symbol_type (token::TOKEN_SUB_HOOKS_LIBRARY, YY_MOVE (l));
+    return symbol_type (token::TOKEN_SUB_OPTION_DEFS, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_SUB_DHCP_DDNS (YY_COPY (location_type) l)
+  Dhcp4Parser::make_SUB_OPTION_DEF (const location_type& l)
   {
-    return symbol_type (token::TOKEN_SUB_DHCP_DDNS, YY_MOVE (l));
+    return symbol_type (token::TOKEN_SUB_OPTION_DEF, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_SUB_LOGGING (YY_COPY (location_type) l)
+  Dhcp4Parser::make_SUB_OPTION_DATA (const location_type& l)
   {
-    return symbol_type (token::TOKEN_SUB_LOGGING, YY_MOVE (l));
+    return symbol_type (token::TOKEN_SUB_OPTION_DATA, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_SUB_CONFIG_CONTROL (YY_COPY (location_type) l)
+  Dhcp4Parser::make_SUB_HOOKS_LIBRARY (const location_type& l)
   {
-    return symbol_type (token::TOKEN_SUB_CONFIG_CONTROL, YY_MOVE (l));
+    return symbol_type (token::TOKEN_SUB_HOOKS_LIBRARY, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_STRING (YY_COPY (std::string) v, YY_COPY (location_type) l)
+  Dhcp4Parser::make_SUB_DHCP_DDNS (const location_type& l)
   {
-    return symbol_type (token::TOKEN_STRING, YY_MOVE (v), YY_MOVE (l));
+    return symbol_type (token::TOKEN_SUB_DHCP_DDNS, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_INTEGER (YY_COPY (int64_t) v, YY_COPY (location_type) l)
+  Dhcp4Parser::make_SUB_LOGGING (const location_type& l)
   {
-    return symbol_type (token::TOKEN_INTEGER, YY_MOVE (v), YY_MOVE (l));
+    return symbol_type (token::TOKEN_SUB_LOGGING, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_FLOAT (YY_COPY (double) v, YY_COPY (location_type) l)
+  Dhcp4Parser::make_SUB_CONFIG_CONTROL (const location_type& l)
   {
-    return symbol_type (token::TOKEN_FLOAT, YY_MOVE (v), YY_MOVE (l));
+    return symbol_type (token::TOKEN_SUB_CONFIG_CONTROL, l);
+  }
+
+  Dhcp4Parser::symbol_type
+  Dhcp4Parser::make_STRING (const std::string& v, const location_type& l)
+  {
+    return symbol_type (token::TOKEN_STRING, v, l);
+  }
+
+  Dhcp4Parser::symbol_type
+  Dhcp4Parser::make_INTEGER (const int64_t& v, const location_type& l)
+  {
+    return symbol_type (token::TOKEN_INTEGER, v, l);
+  }
+
+  Dhcp4Parser::symbol_type
+  Dhcp4Parser::make_FLOAT (const double& v, const location_type& l)
+  {
+    return symbol_type (token::TOKEN_FLOAT, v, l);
   }
 
-  inline
   Dhcp4Parser::symbol_type
-  Dhcp4Parser::make_BOOLEAN (YY_COPY (bool) v, YY_COPY (location_type) l)
+  Dhcp4Parser::make_BOOLEAN (const bool& v, const location_type& l)
   {
-    return symbol_type (token::TOKEN_BOOLEAN, YY_MOVE (v), YY_MOVE (l));
+    return symbol_type (token::TOKEN_BOOLEAN, v, l);
   }
 
 
-#line 14 "dhcp4_parser.yy" // lalr1.cc:404
+#line 14 "dhcp4_parser.yy" // lalr1.cc:377
 } } // isc::dhcp
-#line 3297 "dhcp4_parser.h" // lalr1.cc:404
+#line 2943 "dhcp4_parser.h" // lalr1.cc:377
 
 
 
index 084182e71daf7ce09343bb9b3e76d431fe88bfe1..793e2b8feb7b3f0bc5467f8d7b973623ddb46a22 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2016-2018 Internet Systems Consortium, Inc. ("ISC")
+/* Copyright (C) 2016-2019 Internet Systems Consortium, Inc. ("ISC")
 
    This Source Code Form is subject to the terms of the Mozilla Public
    License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -116,6 +116,9 @@ using namespace std;
   RECORD_TYPES "record-types"
   ENCAPSULATE "encapsulate"
   ARRAY "array"
+  CALCULATE_TEE_TIMES "calculate-tee-times"
+  T1_PERCENT "t1-percent"
+  T2_PERCENT "t2-percent"
 
   SHARED_NETWORKS "shared-networks"
 
@@ -465,6 +468,9 @@ global_param: valid_lifetime
             | config_control
             | server_tag
             | reservation_mode
+            | calculate_tee_times 
+            | t1_percent 
+            | t2_percent 
             | unknown_map_entry
             ;
 
@@ -483,6 +489,21 @@ rebind_timer: REBIND_TIMER COLON INTEGER {
     ctx.stack_.back()->set("rebind-timer", prf);
 };
 
+calculate_tee_times: CALCULATE_TEE_TIMES COLON BOOLEAN {
+    ElementPtr ctt(new BoolElement($3, ctx.loc2pos(@3)));
+    ctx.stack_.back()->set("calculate-tee-times", ctt);
+};
+
+t1_percent: T1_PERCENT COLON FLOAT {
+    ElementPtr t1(new DoubleElement($3, ctx.loc2pos(@3)));
+    ctx.stack_.back()->set("t1-percent", t1);
+};
+
+t2_percent: T2_PERCENT COLON FLOAT {
+    ElementPtr t2(new DoubleElement($3, ctx.loc2pos(@3)));
+    ctx.stack_.back()->set("t2-percent", t2);
+};
+
 decline_probation_period: DECLINE_PROBATION_PERIOD COLON INTEGER {
     ElementPtr dpp(new IntElement($3, ctx.loc2pos(@3)));
     ctx.stack_.back()->set("decline-probation-period", dpp);
@@ -1060,6 +1081,9 @@ subnet4_param: valid_lifetime
              | subnet_4o6_subnet
              | user_context
              | comment
+             | calculate_tee_times 
+             | t1_percent 
+             | t2_percent 
              | unknown_map_entry
              ;
 
@@ -1191,6 +1215,9 @@ shared_network_param: name
                     | valid_lifetime
                     | user_context
                     | comment
+                    | calculate_tee_times 
+                    | t1_percent 
+                    | t2_percent 
                     | unknown_map_entry
                     ;
 
index d619f7c95c4a99cc3234dbdf75a26c68899bfdd6..a33fccc19b2cbcf06ccd4574c1b424dafb267dfd 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2011-2018 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2011-2019 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -2190,32 +2190,8 @@ Dhcpv4Srv::assignLease(Dhcpv4Exchange& ex) {
         // Subnet mask (type 1)
         resp->addOption(getNetmaskOption(subnet));
 
-        // rebind timer (type 59) - if specified then send it only it if
-        // it is less than lease lifetime.  Note we "sanity" check T1
-        // and T2 against lease lifetime here in event the lifetime has
-        // been altered somewhere along the line.
-        uint32_t timer_ceiling = lease->valid_lft_;
-        if ((!subnet->getT2().unspecified()) &&
-            (subnet->getT2() <  timer_ceiling)) {
-            OptionUint32Ptr t2(new OptionUint32(Option::V4,
-                                                DHO_DHCP_REBINDING_TIME,
-                                                subnet->getT2()));
-            resp->addOption(t2);
-
-            // If T2 is specified, then it becomes the ceiling for T1
-            timer_ceiling = subnet->getT2();
-        }
-
-        // renewal-timer (type 58) - if specified then send it only if
-        // it is less than the ceiling (T2 if given, lease life time if not)
-        if ((!subnet->getT1().unspecified()) &&
-            (subnet->getT1() <  timer_ceiling)) {
-            OptionUint32Ptr t1(new OptionUint32(Option::V4,
-                                                DHO_DHCP_RENEWAL_TIME,
-                                                subnet->getT1()));
-            resp->addOption(t1);
-        }
-
+        // Set T1 and T2 per configuration.
+        setTeeTimes(lease, subnet, resp);
 
         // Create NameChangeRequests if DDNS is enabled and this is a
         // real allocation.
@@ -2250,6 +2226,46 @@ Dhcpv4Srv::assignLease(Dhcpv4Exchange& ex) {
     }
 }
 
+void 
+Dhcpv4Srv::setTeeTimes(const Lease4Ptr& lease, const Subnet4Ptr& subnet, Pkt4Ptr resp) {
+
+    uint32_t t2_time = 0;
+    // If T2 is explicitly configured we'll use try value.
+    if (!subnet->getT2().unspecified()) { 
+        t2_time = subnet->getT2(); 
+    } else if (subnet->getCalculateTeeTimes()) { 
+        // Calculating tee times is enabled, so calculated it. 
+        t2_time = static_cast<uint32_t>(subnet->getT2Percent() * (lease->valid_lft_));
+    }
+
+    // Send the T2 candidate value only if it's sane: to be sane it must be less than
+    // the valid life time.
+    uint32_t timer_ceiling = lease->valid_lft_;
+    if (t2_time > 0 && t2_time < timer_ceiling) {
+        OptionUint32Ptr t2(new OptionUint32(Option::V4, DHO_DHCP_REBINDING_TIME, t2_time));
+        resp->addOption(t2);
+        // When we send T2, timer ceiling for T1 becomes T2.
+        timer_ceiling = t2_time;
+    }
+
+    uint32_t t1_time = 0;
+    // If T1 is explicitly configured we'll use try value.
+    if (!subnet->getT1().unspecified()) { 
+        t1_time = subnet->getT1(); 
+    } else if (subnet->getCalculateTeeTimes()) { 
+        // Calculating tee times is enabled, so calculate it.
+        t1_time = static_cast<uint32_t>(subnet->getT1Percent() * (lease->valid_lft_));
+    }
+
+    // Send T1 if it's sane: If we sent T2, T1 must be less than that.  If not it must be
+    // less than the valid life time.
+    if (t1_time > 0 && t1_time < timer_ceiling) {
+        OptionUint32Ptr t1(new OptionUint32(Option::V4, DHO_DHCP_RENEWAL_TIME, t1_time));
+        resp->addOption(t1);
+    }
+}
+
+
 uint16_t
 Dhcpv4Srv::checkRelayPort(const Dhcpv4Exchange& ex) {
 
index c11c33305e4068e68288f7aeb6b87b825db48ec1..30e6c9a0e4a151cb2e5541fb1d1afb4b1e7f4227 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2011-2018 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2011-2019 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -539,6 +539,33 @@ protected:
     /// @param ex DHCPv4 exchange holding the client's message to be checked.
     void assignLease(Dhcpv4Exchange& ex);
 
+    /// @brief Adds the T1 and T2 timers to the outbound response as appropriate
+    ///
+    /// This method determines if either of the timers T1 (option 58) and T2
+    /// (option 59) should be sent to the client.  It is influenced by the
+    /// lease's subnet's values for renew-timer, rebind-timer,
+    /// calculate-tee-times, t1-perecnt, and t2-percent as follows:
+    ///
+    /// By default neither T1 nor T2 will be sent.
+    ///
+    /// T2:
+    ///
+    /// If rebind-timer is set use its value, otherwise if calculate-tee-times
+    /// is true use the value given by valid lease time * t2-percent.  Either
+    /// way the value will only be sent if it is less than the valid lease time.
+    ///
+    /// T1:
+    ///
+    /// If renew-timer is set use its value, otherwise if calculate-tee-times
+    /// is true use the value given by valid lease time * t1-percent.  Either
+    /// way the value will only be sent if it is less than T2 when T2 is being
+    /// sent, or less than the valid lease time if T2 is not being sent.
+    ///
+    /// @param lease lease being assigned to the client
+    /// @param subnet the subnet to which the lease belongs
+    /// @param resp outbound response for the client to which timers are added.
+    void setTeeTimes(const Lease4Ptr& lease, const Subnet4Ptr& subnet, Pkt4Ptr resp);
+
     /// @brief Append basic options if they are not present.
     ///
     /// This function adds the following basic options if they
index c62678b5c4604a95f16a8f0465c2e83cc1458312..56c1f04df96e3231c258a0258c7e86db6dd1cec9 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2012-2018 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2012-2019 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -546,7 +546,10 @@ configureDhcp4Server(Dhcpv4Srv& server, isc::data::ConstElementPtr config_set,
                  (config_pair.first == "server-hostname") ||
                  (config_pair.first == "boot-file-name") ||
                  (config_pair.first == "server-tag") ||
-                 (config_pair.first == "reservation-mode")) {
+                 (config_pair.first == "reservation-mode") ||
+                 (config_pair.first == "calculate-tee-times") || 
+                 (config_pair.first == "t1-percent") || 
+                 (config_pair.first == "t2-percent")) {
                 continue;
             }
 
index e5854ce4d95474c723b83e92ccc364b4f18fabc0..7e23a2ccac4e6235bff281bd9ffdb2365482b554 100644 (file)
@@ -1,9 +1,8 @@
-// Generated 201811271343
-// A Bison parser, made by GNU Bison 3.2.1.
+// A Bison parser, made by GNU Bison 3.0.4.
 
 // Locations for Bison parsers in C++
 
-// Copyright (C) 2002-2015, 2018 Free Software Foundation, Inc.
+// Copyright (C) 2002-2015 Free Software Foundation, Inc.
 
 // This program is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
 #ifndef YY_PARSER4_LOCATION_HH_INCLUDED
 # define YY_PARSER4_LOCATION_HH_INCLUDED
 
-# include <algorithm> // std::max
-# include <iostream>
-# include <string>
+# include "position.hh"
 
-# ifndef YY_NULLPTR
-#  if defined __cplusplus
-#   if 201103L <= __cplusplus
-#    define YY_NULLPTR nullptr
-#   else
-#    define YY_NULLPTR 0
-#   endif
-#  else
-#   define YY_NULLPTR ((void*)0)
-#  endif
-# endif
-
-#line 14 "dhcp4_parser.yy" // location.cc:339
+#line 14 "dhcp4_parser.yy" // location.cc:296
 namespace isc { namespace dhcp {
-#line 60 "location.hh" // location.cc:339
-  /// A point in a source file.
-  class position
-  {
-  public:
-    /// Construct a position.
-    explicit position (std::string* f = YY_NULLPTR,
-                       unsigned l = 1u,
-                       unsigned c = 1u)
-      : filename (f)
-      , line (l)
-      , column (c)
-    {}
-
-
-    /// Initialization.
-    void initialize (std::string* fn = YY_NULLPTR,
-                     unsigned l = 1u,
-                     unsigned c = 1u)
-    {
-      filename = fn;
-      line = l;
-      column = c;
-    }
-
-    /** \name Line and Column related manipulators
-     ** \{ */
-    /// (line related) Advance to the COUNT next lines.
-    void lines (int count = 1)
-    {
-      if (count)
-        {
-          column = 1u;
-          line = add_ (line, count, 1);
-        }
-    }
-
-    /// (column related) Advance to the COUNT next columns.
-    void columns (int count = 1)
-    {
-      column = add_ (column, count, 1);
-    }
-    /** \} */
-
-    /// File name to which this position refers.
-    std::string* filename;
-    /// Current line number.
-    unsigned line;
-    /// Current column number.
-    unsigned column;
-
-  private:
-    /// Compute max (min, lhs+rhs).
-    static unsigned add_ (unsigned lhs, int rhs, int min)
-    {
-      return static_cast<unsigned> (std::max (min,
-                                              static_cast<int> (lhs) + rhs));
-    }
-  };
-
-  /// Add \a width columns, in place.
-  inline position&
-  operator+= (position& res, int width)
-  {
-    res.columns (width);
-    return res;
-  }
-
-  /// Add \a width columns.
-  inline position
-  operator+ (position res, int width)
-  {
-    return res += width;
-  }
-
-  /// Subtract \a width columns, in place.
-  inline position&
-  operator-= (position& res, int width)
-  {
-    return res += -width;
-  }
-
-  /// Subtract \a width columns.
-  inline position
-  operator- (position res, int width)
-  {
-    return res -= width;
-  }
-
-  /// Compare two position objects.
-  inline bool
-  operator== (const position& pos1, const position& pos2)
-  {
-    return (pos1.line == pos2.line
-            && pos1.column == pos2.column
-            && (pos1.filename == pos2.filename
-                || (pos1.filename && pos2.filename
-                    && *pos1.filename == *pos2.filename)));
-  }
-
-  /// Compare two position objects.
-  inline bool
-  operator!= (const position& pos1, const position& pos2)
-  {
-    return !(pos1 == pos2);
-  }
-
-  /** \brief Intercept output stream redirection.
-   ** \param ostr the destination output stream
-   ** \param pos a reference to the position to redirect
-   */
-  template <typename YYChar>
-  std::basic_ostream<YYChar>&
-  operator<< (std::basic_ostream<YYChar>& ostr, const position& pos)
-  {
-    if (pos.filename)
-      ostr << *pos.filename << ':';
-    return ostr << pos.line << '.' << pos.column;
-  }
-
-  /// Two points in a source file.
+#line 46 "location.hh" // location.cc:296
+  /// Abstract a location.
   class location
   {
   public:
@@ -186,27 +52,30 @@ namespace isc { namespace dhcp {
     location (const position& b, const position& e)
       : begin (b)
       , end (e)
-    {}
+    {
+    }
 
     /// Construct a 0-width location in \a p.
     explicit location (const position& p = position ())
       : begin (p)
       , end (p)
-    {}
+    {
+    }
 
     /// Construct a 0-width location in \a f, \a l, \a c.
     explicit location (std::string* f,
-                       unsigned l = 1u,
-                       unsigned c = 1u)
+                       unsigned int l = 1u,
+                       unsigned int c = 1u)
       : begin (f, l, c)
       , end (f, l, c)
-    {}
+    {
+    }
 
 
     /// Initialization.
     void initialize (std::string* f = YY_NULLPTR,
-                     unsigned l = 1u,
-                     unsigned c = 1u)
+                     unsigned int l = 1u,
+                     unsigned int c = 1u)
     {
       begin.initialize (f, l, c);
       end = begin;
@@ -301,10 +170,10 @@ namespace isc { namespace dhcp {
    ** Avoid duplicate information.
    */
   template <typename YYChar>
-  std::basic_ostream<YYChar>&
+  inline std::basic_ostream<YYChar>&
   operator<< (std::basic_ostream<YYChar>& ostr, const location& loc)
   {
-    unsigned end_col = 0 < loc.end.column ? loc.end.column - 1 : 0;
+    unsigned int end_col = 0 < loc.end.column ? loc.end.column - 1 : 0;
     ostr << loc.begin;
     if (loc.end.filename
         && (!loc.begin.filename
@@ -317,7 +186,7 @@ namespace isc { namespace dhcp {
     return ostr;
   }
 
-#line 14 "dhcp4_parser.yy" // location.cc:339
+#line 14 "dhcp4_parser.yy" // location.cc:296
 } } // isc::dhcp
-#line 322 "location.hh" // location.cc:339
+#line 192 "location.hh" // location.cc:296
 #endif // !YY_PARSER4_LOCATION_HH_INCLUDED
index 86db4af678c46222c27c1ccda32f6bd1c6bae5cb..c60fabbdf87798eaaf77c5d851308166f1c29ecc 100644 (file)
-// Generated 201811271343
-// A Bison parser, made by GNU Bison 3.2.1.
-
-// Starting with Bison 3.2, this file is useless: the structure it
-// used to define is now defined in "location.hh".
-//
-// To get rid of this file:
-// 1. add 'require "3.2"' (or newer) to your grammar file
-// 2. remove references to this file from your build system
-// 3. if you used to include it, include "location.hh" instead.
-
-#include "location.hh"
+// A Bison parser, made by GNU Bison 3.0.4.
+
+// Positions for Bison parsers in C++
+
+// Copyright (C) 2002-2015 Free Software Foundation, Inc.
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+// As a special exception, you may create a larger work that contains
+// part or all of the Bison parser skeleton and distribute that work
+// under terms of your choice, so long as that work isn't itself a
+// parser generator using the skeleton or a modified version thereof
+// as a parser skeleton.  Alternatively, if you modify or redistribute
+// the parser skeleton itself, you may (at your option) remove this
+// special exception, which will cause the skeleton and the resulting
+// Bison output files to be licensed under the GNU General Public
+// License without this special exception.
+
+// This special exception was added by the Free Software Foundation in
+// version 2.2 of Bison.
+
+/**
+ ** \file position.hh
+ ** Define the isc::dhcp::position class.
+ */
+
+#ifndef YY_PARSER4_POSITION_HH_INCLUDED
+# define YY_PARSER4_POSITION_HH_INCLUDED
+
+# include <algorithm> // std::max
+# include <iostream>
+# include <string>
+
+# ifndef YY_NULLPTR
+#  if defined __cplusplus && 201103L <= __cplusplus
+#   define YY_NULLPTR nullptr
+#  else
+#   define YY_NULLPTR 0
+#  endif
+# endif
+
+#line 14 "dhcp4_parser.yy" // location.cc:296
+namespace isc { namespace dhcp {
+#line 56 "position.hh" // location.cc:296
+  /// Abstract a position.
+  class position
+  {
+  public:
+    /// Construct a position.
+    explicit position (std::string* f = YY_NULLPTR,
+                       unsigned int l = 1u,
+                       unsigned int c = 1u)
+      : filename (f)
+      , line (l)
+      , column (c)
+    {
+    }
+
+
+    /// Initialization.
+    void initialize (std::string* fn = YY_NULLPTR,
+                     unsigned int l = 1u,
+                     unsigned int c = 1u)
+    {
+      filename = fn;
+      line = l;
+      column = c;
+    }
+
+    /** \name Line and Column related manipulators
+     ** \{ */
+    /// (line related) Advance to the COUNT next lines.
+    void lines (int count = 1)
+    {
+      if (count)
+        {
+          column = 1u;
+          line = add_ (line, count, 1);
+        }
+    }
+
+    /// (column related) Advance to the COUNT next columns.
+    void columns (int count = 1)
+    {
+      column = add_ (column, count, 1);
+    }
+    /** \} */
+
+    /// File name to which this position refers.
+    std::string* filename;
+    /// Current line number.
+    unsigned int line;
+    /// Current column number.
+    unsigned int column;
+
+  private:
+    /// Compute max(min, lhs+rhs) (provided min <= lhs).
+    static unsigned int add_ (unsigned int lhs, int rhs, unsigned int min)
+    {
+      return (0 < rhs || -static_cast<unsigned int>(rhs) < lhs
+              ? rhs + lhs
+              : min);
+    }
+  };
+
+  /// Add \a width columns, in place.
+  inline position&
+  operator+= (position& res, int width)
+  {
+    res.columns (width);
+    return res;
+  }
+
+  /// Add \a width columns.
+  inline position
+  operator+ (position res, int width)
+  {
+    return res += width;
+  }
+
+  /// Subtract \a width columns, in place.
+  inline position&
+  operator-= (position& res, int width)
+  {
+    return res += -width;
+  }
+
+  /// Subtract \a width columns.
+  inline position
+  operator- (position res, int width)
+  {
+    return res -= width;
+  }
+
+  /// Compare two position objects.
+  inline bool
+  operator== (const position& pos1, const position& pos2)
+  {
+    return (pos1.line == pos2.line
+            && pos1.column == pos2.column
+            && (pos1.filename == pos2.filename
+                || (pos1.filename && pos2.filename
+                    && *pos1.filename == *pos2.filename)));
+  }
+
+  /// Compare two position objects.
+  inline bool
+  operator!= (const position& pos1, const position& pos2)
+  {
+    return !(pos1 == pos2);
+  }
+
+  /** \brief Intercept output stream redirection.
+   ** \param ostr the destination output stream
+   ** \param pos a reference to the position to redirect
+   */
+  template <typename YYChar>
+  inline std::basic_ostream<YYChar>&
+  operator<< (std::basic_ostream<YYChar>& ostr, const position& pos)
+  {
+    if (pos.filename)
+      ostr << *pos.filename << ':';
+    return ostr << pos.line << '.' << pos.column;
+  }
+
+#line 14 "dhcp4_parser.yy" // location.cc:296
+} } // isc::dhcp
+#line 180 "position.hh" // location.cc:296
+#endif // !YY_PARSER4_POSITION_HH_INCLUDED
index 64a6403bcecbc741761ab6f0b569a922b45acd2b..3dd2a2a3934851424d45b935573ab2e9e83f07a8 100644 (file)
@@ -1,9 +1,157 @@
-// Generated 201811271343
-// A Bison parser, made by GNU Bison 3.2.1.
-
-// Starting with Bison 3.2, this file is useless: the structure it
-// used to define is now defined with the parser itself.
-//
-// To get rid of this file:
-// 1. add 'require "3.2"' (or newer) to your grammar file
-// 2. remove references to this file from your build system.
+// A Bison parser, made by GNU Bison 3.0.4.
+
+// Stack handling for Bison parsers in C++
+
+// Copyright (C) 2002-2015 Free Software Foundation, Inc.
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+// As a special exception, you may create a larger work that contains
+// part or all of the Bison parser skeleton and distribute that work
+// under terms of your choice, so long as that work isn't itself a
+// parser generator using the skeleton or a modified version thereof
+// as a parser skeleton.  Alternatively, if you modify or redistribute
+// the parser skeleton itself, you may (at your option) remove this
+// special exception, which will cause the skeleton and the resulting
+// Bison output files to be licensed under the GNU General Public
+// License without this special exception.
+
+// This special exception was added by the Free Software Foundation in
+// version 2.2 of Bison.
+
+/**
+ ** \file stack.hh
+ ** Define the isc::dhcp::stack class.
+ */
+
+#ifndef YY_PARSER4_STACK_HH_INCLUDED
+# define YY_PARSER4_STACK_HH_INCLUDED
+
+# include <vector>
+
+#line 14 "dhcp4_parser.yy" // stack.hh:132
+namespace isc { namespace dhcp {
+#line 46 "stack.hh" // stack.hh:132
+  template <class T, class S = std::vector<T> >
+  class stack
+  {
+  public:
+    // Hide our reversed order.
+    typedef typename S::reverse_iterator iterator;
+    typedef typename S::const_reverse_iterator const_iterator;
+
+    stack ()
+      : seq_ ()
+    {
+      seq_.reserve (200);
+    }
+
+    stack (unsigned int n)
+      : seq_ (n)
+    {}
+
+    inline
+    T&
+    operator[] (unsigned int i)
+    {
+      return seq_[seq_.size () - 1 - i];
+    }
+
+    inline
+    const T&
+    operator[] (unsigned int i) const
+    {
+      return seq_[seq_.size () - 1 - i];
+    }
+
+    /// Steal the contents of \a t.
+    ///
+    /// Close to move-semantics.
+    inline
+    void
+    push (T& t)
+    {
+      seq_.push_back (T());
+      operator[](0).move (t);
+    }
+
+    inline
+    void
+    pop (unsigned int n = 1)
+    {
+      for (; n; --n)
+        seq_.pop_back ();
+    }
+
+    void
+    clear ()
+    {
+      seq_.clear ();
+    }
+
+    inline
+    typename S::size_type
+    size () const
+    {
+      return seq_.size ();
+    }
+
+    inline
+    const_iterator
+    begin () const
+    {
+      return seq_.rbegin ();
+    }
+
+    inline
+    const_iterator
+    end () const
+    {
+      return seq_.rend ();
+    }
+
+  private:
+    stack (const stack&);
+    stack& operator= (const stack&);
+    /// The wrapped container.
+    S seq_;
+  };
+
+  /// Present a slice of the top of a stack.
+  template <class T, class S = stack<T> >
+  class slice
+  {
+  public:
+    slice (const S& stack, unsigned int range)
+      : stack_ (stack)
+      , range_ (range)
+    {}
+
+    inline
+    const T&
+    operator [] (unsigned int i) const
+    {
+      return stack_[range_ - i];
+    }
+
+  private:
+    const S& stack_;
+    unsigned int range_;
+  };
+
+#line 14 "dhcp4_parser.yy" // stack.hh:132
+} } // isc::dhcp
+#line 156 "stack.hh" // stack.hh:132
+
+#endif // !YY_PARSER4_STACK_HH_INCLUDED
index 95ed45555158dcc03d2945927e2f9be67a53c858..a620fd1c8b2ab0552a33b0d2a2b6b1e6cd902345 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2012-2018 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2012-2019 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -29,6 +29,7 @@
 #include <dhcpsrv/testutils/test_config_backend_dhcp4.h>
 #include <process/config_ctl_info.h>
 #include <hooks/hooks_manager.h>
+#include <util/doubles.h>
 
 #include "marker_file.h"
 #include "test_libraries.h"
@@ -254,7 +255,8 @@ const char* PARSER_CONFIGS[] = {
     "           } \n"
     "       ] \n"
     "   } \n"
-    "} \n"
+    "} \n",
+
 };
 
 class Dhcp4ParserTest : public ::testing::Test {
@@ -6633,4 +6635,69 @@ TEST_F(Dhcp4ParserTest, dhcpQueueControlInvalid) {
     }
 }
 
+// Checks inheritence of calculate-tee-times, t1-perecent, t2-percent
+TEST_F(Dhcp4ParserTest, calculatTeeTimesInheritence) {
+    // Configure the server. This should succeed.
+    string config =
+        "{ \n"
+        "    \"interfaces-config\": { \n"
+        "        \"interfaces\": [\"*\" ] \n"
+        "    }, \n"
+        "    \"valid-lifetime\": 4000, \n"
+        "    \"shared-networks\": [ { \n"
+        "        \"name\": \"foo\", \n"
+        "       \"calculate-tee-times\": true, \n"
+        "       \"t1-percent\": .4, \n"
+        "       \"t2-percent\": .75,\n"
+        "        \"subnet4\": ["
+        "        { "
+        "            \"id\": 100,"
+        "            \"subnet\": \"192.0.1.0/24\", \n"
+        "            \"pools\": [ { \"pool\": \"192.0.1.1-192.0.1.10\" } ], \n"
+        "            \"calculate-tee-times\": false,\n"
+        "            \"t1-percent\": .45, \n"
+        "            \"t2-percent\": .65 \n"
+        "        }, \n"
+        "        {  \n"
+        "            \"id\": 200, \n"
+        "            \"subnet\": \"192.0.2.0/24\", \n"
+        "            \"pools\": [ { \"pool\": \"192.0.2.1-192.0.2.10\"} ] \n"
+        "        } \n"
+        "        ] \n"
+        "     } ], \n"
+        "    \"subnet4\": [ { \n"
+        "        \"id\": 300, \n"
+        "        \"subnet\": \"192.0.3.0/24\", \n"
+        "        \"pools\": [ { \"pool\":  \"192.0.3.0 - 192.0.3.15\" } ]\n"
+        "     } ] \n"
+        "} \n";
+
+    extractConfig(config);
+    configure(config, CONTROL_RESULT_SUCCESS, "");
+
+    CfgSubnets4Ptr subnets4 = CfgMgr::instance().getStagingCfg()->getCfgSubnets4();
+
+    // Subnet 100 should use it's own explicit values.
+    ConstSubnet4Ptr subnet4 = subnets4->getBySubnetId(100);
+    ASSERT_TRUE(subnet4);
+    EXPECT_EQ(false, subnet4->getCalculateTeeTimes());
+    EXPECT_TRUE(util::areDoublesEquivalent(0.45, subnet4->getT1Percent()));
+    EXPECT_TRUE(util::areDoublesEquivalent(0.65, subnet4->getT2Percent()));
+
+    // Subnet 200 should use the shared-network values.
+    subnet4 = subnets4->getBySubnetId(200);
+    ASSERT_TRUE(subnet4);
+    EXPECT_EQ(true, subnet4->getCalculateTeeTimes());
+    EXPECT_TRUE(util::areDoublesEquivalent(0.4, subnet4->getT1Percent()));
+    EXPECT_TRUE(util::areDoublesEquivalent(0.75, subnet4->getT2Percent()));
+
+    // Subnet 300 should use the global values.
+    subnet4 = subnets4->getBySubnetId(300);
+    ASSERT_TRUE(subnet4);
+    EXPECT_EQ(false, subnet4->getCalculateTeeTimes());
+    EXPECT_TRUE(util::areDoublesEquivalent(0.5, subnet4->getT1Percent()));
+    EXPECT_TRUE(util::areDoublesEquivalent(0.875, subnet4->getT2Percent()));
+}
+
+
 }
index 0859cac68d1fa6e6e23031785d7ec7fab7e27a6b..f06dbb949b3b749cdcdd9abd2735cfefaf03b077 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2011-2018 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2011-2019 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -761,7 +761,8 @@ TEST_F(Dhcpv4SrvTest, DiscoverBasic) {
 }
 
 // Check that option 58 and 59 are only included if they were specified
-// and T2 is less than valid lft;  T1 is less than T2 (if given) or valid
+// (and calculate-tee-times = false) and the values are sane:
+//  T2 is less than valid lft;  T1 is less than T2 (if given) or valid
 // lft if T2 is not given.
 TEST_F(Dhcpv4SrvTest, DiscoverTimers) {
     IfaceMgrTestConfig test_config(true);
@@ -909,6 +910,144 @@ TEST_F(Dhcpv4SrvTest, DiscoverTimers) {
 
 }
 
+// Check that option 58 and 59 are included when calculate-tee-times
+// is enabled, but only when they are not explicitly specified via
+// renew-timer and rebinding-timer.  This test does not check whether
+// the subnet's for t1-percent and t2-percent are valid, as this is
+// enforced by parsing and tested elsewhere.
+TEST_F(Dhcpv4SrvTest, calculateTeeTimers) {
+    IfaceMgrTestConfig test_config(true);
+    IfaceMgr::instance().openSockets4();
+
+    boost::scoped_ptr<NakedDhcpv4Srv> srv;
+    ASSERT_NO_THROW(srv.reset(new NakedDhcpv4Srv(0)));
+
+    // Recreate subnet
+    Triplet<uint32_t> unspecified;
+    Triplet<uint32_t> valid_lft(1000);
+    subnet_.reset(new Subnet4(IOAddress("192.0.2.0"), 24,
+                              unspecified,
+                              unspecified,
+                              valid_lft));
+
+    pool_ = Pool4Ptr(new Pool4(IOAddress("192.0.2.100"),
+                               IOAddress("192.0.2.110")));
+    subnet_->addPool(pool_);
+    CfgMgr::instance().clear();
+    CfgMgr::instance().getStagingCfg()->getCfgSubnets4()->add(subnet_);
+    CfgMgr::instance().commit();
+
+    // Struct for describing an individual timer test scenario
+    struct TimerTest {
+        // logged test description
+        std::string description_;
+        // configured value for subnet's T1
+        Triplet<uint32_t> cfg_t1_;
+        // configured value for subnet's T1
+        Triplet<uint32_t> cfg_t2_;
+        // configured value for sunbet's t1_percent.
+        double t1_percent_;
+        // configured value for sunbet's t2_percent.
+        double t2_percent_;
+        // expected value for T1 in server response.
+        // A value of 0 means server should not have sent T1.
+        uint32_t t1_exp_value_;
+        // expected value for T2 in server response.
+        // A value of 0 means server should not have sent T2.
+        uint32_t t2_exp_value_;
+    };
+
+    // Convenience constant
+    uint32_t not_expected = 0;
+
+    // Test scenarios
+    std::vector<TimerTest> tests = {
+    {
+        "T1 and T2 calculated",
+        unspecified, unspecified,
+        0.4, 0.8,
+        400, 800
+    },
+    {
+        "T1 and T2 specified insane",
+        valid_lft + 1,  valid_lft + 2,
+        0.4, 0.8,
+        not_expected, not_expected
+    },
+    {
+        "T1 should be calculated, T2 specified",
+        unspecified, valid_lft - 1,
+        0.4, 0.8,
+        400, valid_lft - 1
+    },
+    {
+        "T1 specified, T2 should be calculated",
+        299, unspecified,
+        0.4, 0.8,
+        299, 800
+    },
+    {
+        "T1 specified > T2, T2 should be calculated",
+        valid_lft - 1, unspecified,
+        0.4, 0.8,
+        not_expected, 800
+    }
+    };
+
+    // Calculation is enabled for all the scenarios.
+    subnet_->setCalculateTeeTimes(true);
+
+    // Create a discover packet to use
+    Pkt4Ptr dis = Pkt4Ptr(new Pkt4(DHCPDISCOVER, 1234));
+    dis->setRemoteAddr(IOAddress("192.0.2.1"));
+    OptionPtr clientid = generateClientId();
+    dis->addOption(clientid);
+    dis->setIface("eth1");
+
+    // Iterate over the test scenarios.
+    for (auto test = tests.begin(); test != tests.end(); ++test) {
+        {
+            SCOPED_TRACE((*test).description_);
+            // Configure sunbet's timer values
+            subnet_->setT1((*test).cfg_t1_);
+            subnet_->setT2((*test).cfg_t2_);
+
+            subnet_->setT1Percent((*test).t1_percent_);
+            subnet_->setT2Percent((*test).t2_percent_);
+
+            // Discover/Offer exchange with the server
+            Pkt4Ptr offer = srv->processDiscover(dis);
+
+            // Verify we have an offer
+            checkResponse(offer, DHCPOFFER, 1234);
+
+            // Check T1 timer
+            OptionUint32Ptr opt = boost::dynamic_pointer_cast
+                                  <OptionUint32> (offer->getOption(DHO_DHCP_RENEWAL_TIME));
+
+            if ((*test).t1_exp_value_ == not_expected) {
+                EXPECT_FALSE(opt) << "T1 present and shouldn't be";
+            } else {
+                ASSERT_TRUE(opt) << "Required T1 option missing or it has"
+                                    " an unexpected type";
+                EXPECT_EQ(opt->getValue(), (*test).t1_exp_value_);
+            }
+
+            // Check T2 timer
+             opt = boost::dynamic_pointer_cast
+                   <OptionUint32>(offer->getOption(DHO_DHCP_REBINDING_TIME));
+
+            if ((*test).t2_exp_value_ == not_expected) {
+                EXPECT_FALSE(opt) << "T2 present and shouldn't be";
+            } else {
+                ASSERT_TRUE(opt) << "Required T2 option missing or it has"
+                                    " an unexpected type";
+                EXPECT_EQ(opt->getValue(), (*test).t2_exp_value_);
+            }
+        }
+    }
+}
+
 
 // This test verifies that incoming DISCOVER can be handled properly, that an
 // OFFER is generated, that the response has an address and that address
index 79b25034e35bed25367dca9cf53e27aaf8e90cce..e9a00da49a507a49ee166a1cc01bfcfc93bff925 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2010-2018 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2010-2019 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -791,7 +791,18 @@ IntElement::toJSON(std::ostream& ss) const {
 
 void
 DoubleElement::toJSON(std::ostream& ss) const {
-    ss << doubleValue();
+    // The default output for doubles nicely drops off trailing
+    // zeros, however this produces strings without decimal points
+    // for whole number values.  When reparsed this will create
+    // IntElements not DoubleElements.  Rather than used a fixed
+    // precision, we'll just tack on an ".0" when the decimal point
+    // is missing.
+    ostringstream val_ss;
+    val_ss << doubleValue();
+    ss << val_ss.str();
+    if (val_ss.str().find_first_of('.') == string::npos) {
+        ss << ".0";
+    }
 }
 
 void
index feb417d63c307f4bd55edd9f31ba3921680b3659..742db7940182d6fe3f7dc5dbe5f602a2111d2b1b 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2016-2018 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2016-2019 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -84,6 +84,26 @@ SimpleParser::getAddress(const ConstElementPtr& scope,
     }
 }
 
+double
+SimpleParser::getDouble(const isc::data::ConstElementPtr& scope,
+                        const std::string& name) {
+    ConstElementPtr x = scope->get(name);
+    if (!x) {
+        isc_throw(DhcpConfigError,
+                  "missing parameter '" << name << "' ("
+                  << scope->getPosition() << ")");
+    }
+
+    if (x->getType() != Element::real) {
+        isc_throw(DhcpConfigError,
+                  "invalid type specified for parameter '" << name
+                  << "' (" << x->getPosition() << ")");
+    }
+
+    return (x->doubleValue());
+}
+
+
 const data::Element::Position&
 SimpleParser::getPosition(const std::string& name, const data::ConstElementPtr parent) {
     if (!parent) {
index a825d769af6f0f5d103e8424b148a6411f9481ac..c469839e59532f0011fb35c23a514da90af8df91 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2016-2017 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2016-2019 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -165,6 +165,18 @@ class SimpleParser {
     static isc::asiolink::IOAddress
     getAddress(const ConstElementPtr& scope, const std::string& name);
 
+    /// @brief Returns a floating point parameter from a scope
+    ///
+    /// Unconditionally returns a parameter.
+    ///
+    /// @param scope specified parameter will be extracted from this scope
+    /// @param name name of the parameter
+    /// @return a double value of the parameter
+    /// @throw DhcpConfigError if the parameter is not there or is not 
+    /// an Element::real
+    static double getDouble(const ConstElementPtr& scope, 
+                            const std::string& name);
+
 protected:
 
     /// @brief Returns an integer value with range checking from a scope
index 5c60e61d2b1c69fb8997fc6af1ba66a06afee6c0..a347a2469ff93b5dd473358f5e55c877af52e813 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2009-2018 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2009-2019 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -164,9 +164,9 @@ TEST(Element, from_and_to_json) {
     // some json specific format tests, here the str() output is
     // different from the string input
     EXPECT_EQ("100", Element::fromJSON("+100")->str());
-    EXPECT_EQ("100", Element::fromJSON("1e2")->str());
-    EXPECT_EQ("100", Element::fromJSON("+1e2")->str());
-    EXPECT_EQ("-100", Element::fromJSON("-1e2")->str());
+    EXPECT_EQ("100.0", Element::fromJSON("1e2")->str());
+    EXPECT_EQ("100.0", Element::fromJSON("+1e2")->str());
+    EXPECT_EQ("-100.0", Element::fromJSON("-1e2")->str());
 
     EXPECT_NO_THROW({
        EXPECT_EQ("9223372036854775807", Element::fromJSON("9223372036854775807")->str());
@@ -182,10 +182,10 @@ TEST(Element, from_and_to_json) {
     EXPECT_EQ("0.01", Element::fromJSON(".01")->str());
     EXPECT_EQ("-0.01", Element::fromJSON("-1e-2")->str());
     EXPECT_EQ("1.2", Element::fromJSON("1.2")->str());
-    EXPECT_EQ("1", Element::fromJSON("1.0")->str());
-    EXPECT_EQ("120", Element::fromJSON("1.2e2")->str());
-    EXPECT_EQ("100", Element::fromJSON("1.0e2")->str());
-    EXPECT_EQ("100", Element::fromJSON("1.0E2")->str());
+    EXPECT_EQ("1.0", Element::fromJSON("1.0")->str());
+    EXPECT_EQ("120.0", Element::fromJSON("1.2e2")->str());
+    EXPECT_EQ("100.0", Element::fromJSON("1.0e2")->str());
+    EXPECT_EQ("100.0", Element::fromJSON("1.0E2")->str());
     EXPECT_EQ("0.01", Element::fromJSON("1.0e-2")->str());
     EXPECT_EQ("0.012", Element::fromJSON("1.2e-2")->str());
     EXPECT_EQ("0.012", Element::fromJSON("1.2E-2")->str());
@@ -776,7 +776,6 @@ TEST(Element, equals) {
     EXPECT_NE(*efs("1"), *efs("[]"));
     EXPECT_NE(*efs("1"), *efs("true"));
     EXPECT_NE(*efs("1"), *efs("{}"));
-
     EXPECT_EQ(*efs("1.1"), *efs("1.1"));
     EXPECT_NE(*efs("1.0"), *efs("1"));
     EXPECT_NE(*efs("1.1"), *efs("\"1\""));
index b64f6a1d702ae9e39da1c6914d41a267158c3473..f9bb2f9b6e61e40054deb6d739b5f0d44c26acb6 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2016-2018 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2016-2019 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -237,3 +237,50 @@ TEST_F(SimpleParserTest, getIOAddress) {
     EXPECT_NO_THROW(val = parser.getAddress(v6, "foo"));
     EXPECT_EQ("2001:db8::1" , val.toText());
 }
+
+// This test exercises getDouble()
+TEST_F(SimpleParserTest, getDouble) {
+
+    SimpleParserClassTest parser;
+    std::string  json = 
+    "{\n"
+    "  \"string\" : \"12.3\",\n"
+    "  \"bool\" : true, \n"
+    "  \"int\" : 777, \n"
+    "  \"map\" : {}, \n"
+    "  \"list\" : [], \n"
+    "  \"zero\" : 0.0, \n"
+    "  \"fraction\" : .75, \n"
+    "  \"negative\" : -1.45, \n"
+    "  \"positive\" : 346.7 \n"
+    "}\n";
+
+    // Create our test set of parameters.
+    ElementPtr elems;
+    ASSERT_NO_THROW(elems = Element::fromJSON(json)) << " invalid JSON, test is broken";
+
+    // Verify that a non-existant element is caught.
+    EXPECT_THROW(parser.getDouble(elems, "not-there"), DhcpConfigError);
+
+    // Verify that wrong element types are caught.
+    EXPECT_THROW(parser.getDouble(elems, "string"), DhcpConfigError);
+    EXPECT_THROW(parser.getDouble(elems, "int"), DhcpConfigError);
+    EXPECT_THROW(parser.getDouble(elems, "bool"), DhcpConfigError);
+    EXPECT_THROW(parser.getDouble(elems, "map"), DhcpConfigError);
+    EXPECT_THROW(parser.getDouble(elems, "list"), DhcpConfigError);
+
+    // Verify valid values are correct.
+    double value;
+
+    EXPECT_NO_THROW(value = parser.getDouble(elems, "zero"));
+    EXPECT_EQ(0.0, value);
+
+    EXPECT_NO_THROW(value = parser.getDouble(elems, "fraction"));
+    EXPECT_EQ(.75, value);
+
+    EXPECT_NO_THROW(value = parser.getDouble(elems, "negative"));
+    EXPECT_EQ(-1.45, value);
+
+    EXPECT_NO_THROW(value = parser.getDouble(elems, "positive"));
+    EXPECT_EQ(346.7, value);
+}
index f07725be66679d3a85dbf0c20f0062fd03b562db..23201229266ca9114c0699eacd694b03515df748 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2017-2018 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2017-2019 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -185,6 +185,14 @@ Network::toElement() const {
     ConstCfgOptionPtr opts = getCfgOption();
     map->set("option-data", opts->toElement());
 
+    // Output calcualte-tee-times and percentages if calculation is enabled.
+    bool calc_tee_times = getCalculateTeeTimes();
+    if (calc_tee_times) {
+        map->set("calculate-tee-times", Element::create(calc_tee_times));
+        map->set("t1-percent", Element::create(getT1Percent()));
+        map->set("t2-percent", Element::create(getT2Percent()));
+    }
+
     return (map);
 }
 
index bbb108d7376548af76bb11c5631b61f597706f1b..9aecb63220260ed7cb2d85dd08cd35b2dd188fa5 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2017-2018 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2017-2019 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -118,7 +118,8 @@ public:
     /// @brief Constructor.
     Network()
         : iface_name_(), client_class_(""), t1_(), t2_(), valid_(),
-          host_reservation_mode_(HR_ALL), cfg_option_(new CfgOption()) {
+          host_reservation_mode_(HR_ALL), cfg_option_(new CfgOption()),
+          calculate_tee_times_(false), t1_percent_(0.0), t2_percent_(0.0) {
     }
 
     /// @brief Virtual destructor.
@@ -299,17 +300,53 @@ public:
         host_reservation_mode_ = mode;
     }
 
-    /// @brief Returns pointer to the option data configuration for this subnet.
+    /// @brief Returns pointer to the option data configuration for this network.
     CfgOptionPtr getCfgOption() {
         return (cfg_option_);
     }
 
     /// @brief Returns const pointer to the option data configuration for this
-    /// subnet.
+    /// network.
     ConstCfgOptionPtr getCfgOption() const {
         return (cfg_option_);
     }
 
+    /// @brief Returns whether or not T1/T2 calculation is enabled.
+    bool getCalculateTeeTimes() const {
+        return (calculate_tee_times_);
+    }
+
+    /// @brief Sets whether or not T1/T2 calculation is enabled.
+    ///
+    /// @param calculate_tee_times new value of enabled/disabled 
+    void setCalculateTeeTimes(const bool& calculate_tee_times) {
+        calculate_tee_times_ = calculate_tee_times;
+    }
+
+    /// @brief Returns percentage to use when calculating the T1 (renew timer).
+    double getT1Percent() const {
+        return (t1_percent_);
+    }
+
+    /// @brief Sets new precentage for calculating T1 (renew timer).
+    ///
+    /// @param t1_percent New percentage to use.
+    void setT1Percent(const double& t1_percent) {
+        t1_percent_ = t1_percent;
+    }
+
+    /// @brief Returns percentage to use when calculating the T2 (rebind timer).
+    double getT2Percent() const {
+        return (t2_percent_);
+    }
+
+    /// @brief Sets new precentage for calculating T2 (rebind timer).
+    ///
+    /// @param t2_percent New percentage to use. 
+    void setT2Percent(const double& t2_percent) {
+        t2_percent_ = t2_percent;
+    }
+
     /// @brief Unparses network object.
     ///
     /// @return A pointer to unparsed network configuration.
@@ -354,6 +391,15 @@ protected:
 
     /// @brief Pointer to the option data configuration for this subnet.
     CfgOptionPtr cfg_option_;
+
+    /// @brief Enables calculation of T1 and T2 timers
+    bool calculate_tee_times_;
+
+    /// @brief Percentage of the lease lifetime to use when calculating T1 timer
+    double t1_percent_;
+
+    /// @brief Percentage of the lease lifetime to use when calculating T2 timer
+    double t2_percent_;
 };
 
 /// @brief Pointer to the @ref Network object.
index 28f8c57958426a6042ea25be02b92aa54dc6a410..ad0cfe43dac89b71aa42ea9b07701c447f52bd20 100644 (file)
@@ -1,7 +1,10 @@
-// Copyright (C) 2013-2018 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2013-2019 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
-// License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/.  #include <config.h> 
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#include <config.h>
 #include <dhcp/iface_mgr.h>
 #include <dhcp/libdhcp++.h>
 #include <dhcpsrv/cfgmgr.h>
@@ -861,6 +864,31 @@ Subnet4ConfigParser::initSubnet(data::ConstElementPtr params,
 
     // Copy options to the subnet configuration.
     options_->copyTo(*subnet4->getCfgOption());
+
+    bool calculate_tee_times = getBoolean(params, "calculate-tee-times");
+    subnet4->setCalculateTeeTimes(calculate_tee_times);
+    float t2_percent = getDouble(params, "t2-percent");
+    float t1_percent = getDouble(params, "t1-percent");
+    if (calculate_tee_times) {
+        if (t2_percent <= 0.0 || t2_percent >= 1.0) {
+            isc_throw(DhcpConfigError, "t2-percent:  " << t2_percent
+                      << " is invalid, it must be greater than 0.0 and less than 1.0");
+        }
+
+        if (t1_percent <= 0.0 || t1_percent >= 1.0) {
+            isc_throw(DhcpConfigError, "t1-percent:  " << t1_percent
+                      << " is invalid it must be greater than 0.0 and less than 1.0");
+        }
+
+        if (t1_percent >= t2_percent) {
+            isc_throw(DhcpConfigError, "t1-percent:  " << t1_percent
+                      << " is invalid, it must be less than t2-percent: " << t2_percent);
+        }
+
+    }
+
+    subnet4->setT2Percent(t2_percent);
+    subnet4->setT1Percent(t1_percent);
 }
 
 //**************************** Subnets4ListConfigParser **********************
index 4f90553af39253592c1c8c4f42a8b837ae206885..d73bb9a006fc15af5672dbb6e559aecfa56ad9a1 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2016-2018 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2016-2019 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -68,7 +68,10 @@ const SimpleDefaults SimpleParser4::GLOBAL4_DEFAULTS = {
     { "server-hostname",          Element::string,  "" },
     { "boot-file-name",           Element::string,  "" },
     { "server-tag",               Element::string,  "" },
-    { "reservation-mode",         Element::string,  "all" }
+    { "reservation-mode",         Element::string,  "all" },
+    { "calculate-tee-times",      Element::boolean, "false" },
+    { "t1-percent",               Element::real,    ".50" },
+    { "t2-percent",               Element::real,    ".875" }
 };
 
 /// @brief This table defines default values for each IPv4 subnet.
@@ -132,7 +135,10 @@ const ParamsList SimpleParser4::INHERIT_TO_SUBNET4 = {
     "renew-timer",
     "reservation-mode",
     "server-hostname",
-    "valid-lifetime"
+    "valid-lifetime",
+    "calculate-tee-times",
+    "t1-percent",
+    "t2-percent"
 };
 
 /// @brief This table defines default values for dhcp-queue-control in DHCPv4.
index 13deb658c2cf5bee7dcefc2052d56dc359809429..dadf6b34ac4d7db286877daf1de8298ecd4b0d9a 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2017-2018 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2017-2019 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -112,6 +112,9 @@ TEST(CfgSharedNetworks4Test, unparse) {
     network1->setIface("eth0");
     network1->addRelayAddress(IOAddress("198.16.1.1"));
     network1->addRelayAddress(IOAddress("198.16.1.2"));
+    network1->setCalculateTeeTimes(true);
+    network1->setT1Percent(.35);
+    network1->setT2Percent(.655);
 
     network2->setIface("eth1");
     network2->setT1(Triplet<uint32_t>(100));
@@ -139,13 +142,16 @@ TEST(CfgSharedNetworks4Test, unparse) {
         "  },\n"
         "  {\n"
         "    \"authoritative\": false,\n"
+        "    \"calculate-tee-times\": true,\n"
         "    \"interface\": \"eth0\",\n"
         "    \"match-client-id\": true,\n"
         "    \"name\": \"frog\",\n"
         "    \"option-data\": [ ],\n"
         "    \"relay\": { \"ip-addresses\": [ \"198.16.1.1\", \"198.16.1.2\" ] },\n"
         "    \"reservation-mode\": \"all\","
-        "    \"subnet4\": [ ]\n"
+        "    \"subnet4\": [ ],\n"
+        "    \"t1-percent\": .35,\n"
+        "    \"t2-percent\": .655\n"
         "  }\n"
         "]\n";
 
index f622d441d50ebb754b0149079a7bec59ae5a900b..d0dba11845bcfa63f9f36fb01f04d89063ae9497 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2014-2018 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2014-2019 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
 #include <dhcp/option_definition.h>
 #include <dhcp/option_space.h>
 #include <dhcp/tests/iface_mgr_test_config.h>
+#include <dhcpsrv/parsers/dhcp_parsers.h>
 #include <dhcpsrv/shared_network.h>
 #include <dhcpsrv/cfg_subnets4.h>
 #include <dhcpsrv/subnet.h>
 #include <dhcpsrv/subnet_id.h>
 #include <dhcpsrv/subnet_selector.h>
 #include <testutils/test_to_element.h>
+#include <util/doubles.h>
+
 #include <gtest/gtest.h>
 #include <vector>
 
@@ -735,12 +738,21 @@ TEST(CfgSubnets4Test, unparseSubnet) {
     Subnet4Ptr subnet1(new Subnet4(IOAddress("192.0.2.0"), 26, 1, 2, 3, 123));
     Subnet4Ptr subnet2(new Subnet4(IOAddress("192.0.2.64"), 26, 1, 2, 3, 124));
     Subnet4Ptr subnet3(new Subnet4(IOAddress("192.0.2.128"), 26, 1, 2, 3, 125));
+
     subnet1->allowClientClass("foo");
+    // These two should not appear, as calculateTeeTimes should be false.
+    subnet1->setT1Percent(0.45);
+    subnet1->setT2Percent(0.70);
+
     subnet2->setIface("lo");
     subnet2->addRelayAddress(IOAddress("10.0.0.1"));
+
     subnet3->setIface("eth1");
     subnet3->requireClientClass("foo");
     subnet3->requireClientClass("bar");
+    subnet3->setCalculateTeeTimes(true);
+    subnet3->setT1Percent(0.50);
+    subnet3->setT2Percent(0.65);
 
     data::ElementPtr ctx1 = data::Element::fromJSON("{ \"comment\": \"foo\" }");
     subnet1->setContext(ctx1);
@@ -812,7 +824,10 @@ TEST(CfgSubnets4Test, unparseSubnet) {
         "    \"reservation-mode\": \"all\",\n"
         "    \"option-data\": [ ],\n"
         "    \"pools\": [ ]\n,"
-        "    \"require-client-classes\": [ \"foo\", \"bar\" ]\n"
+        "    \"require-client-classes\": [ \"foo\", \"bar\" ],\n"
+        "    \"calculate-tee-times\": true,\n"
+        "    \"t1-percent\": 0.50,\n"
+        "    \"t2-percent\": 0.65\n"
         "} ]\n";
     runToElementTest<CfgSubnets4>(expected, cfg);
 }
@@ -914,4 +929,110 @@ TEST(CfgSubnets4Test, hasSubnetWithServerId) {
     EXPECT_FALSE(cfg.hasSubnetWithServerId(IOAddress("2.3.4.5")));
 }
 
+// This test verifies the Subnet4 parser's validation logic for
+// t1-percent and t2-percent parameters.
+TEST(CfgSubnets4Test, teeTimePercentValidation) {
+
+    // Describes a single test scenario.
+    struct Scenario {
+        std::string label;         // label used for logging test failures
+        bool calculate_tee_times;  // value of calculate-tee-times parameter
+        double t1_percent;         // value of t1-percent parameter
+        double t2_percent;         // value of t2-percent parameter
+        std::string error_message; // expected error message is parsing should fail
+    };
+
+    // Test Scenarios.
+    std::vector<Scenario> tests = {
+        {"off and valid", false, .5, .95, ""},
+        {"on and valid", true, .5, .95, ""},
+        {"t2_negative", true, .5, -.95,
+         "subnet configuration failed: t2-percent:"
+         "  -0.95 is invalid, it must be greater than 0.0 and less than 1.0"
+        },
+        {"t2_too_big", true, .5, 1.95,
+         "subnet configuration failed: t2-percent:"
+         "  1.95 is invalid, it must be greater than 0.0 and less than 1.0"
+        },
+        {"t1_negative", true, -.5, .95,
+         "subnet configuration failed: t1-percent:"
+         "  -0.5 is invalid it must be greater than 0.0 and less than 1.0"
+        },
+        {"t1_too_big", true, 1.5, .95,
+         "subnet configuration failed: t1-percent:"
+         "  1.5 is invalid it must be greater than 0.0 and less than 1.0"
+        },
+        {"t1_bigger_than_t2", true, .85, .45,
+         "subnet configuration failed: t1-percent:"
+         "  0.85 is invalid, it must be less than t2-percent: 0.45"
+        }
+    };
+
+    // First we create a set of elements that provides all
+    // required for a Subnet4.
+    std::string json =
+        "        {"
+        "            \"id\": 1,\n"
+        "            \"subnet\": \"10.1.2.0/24\", \n"
+        "            \"interface\": \"\", \n"
+        "            \"renew-timer\": 100, \n"
+        "            \"rebind-timer\": 200, \n"
+        "            \"valid-lifetime\": 300, \n"
+        "            \"match-client-id\": false, \n"
+        "            \"authoritative\": false, \n"
+        "            \"next-server\": \"\", \n"
+        "            \"server-hostname\": \"\", \n"
+        "            \"boot-file-name\": \"\", \n"
+        "            \"client-class\": \"\", \n"
+        "            \"require-client-classes\": [] \n,"
+        "            \"reservation-mode\": \"all\", \n"
+        "            \"4o6-interface\": \"\", \n"
+        "            \"4o6-interface-id\": \"\", \n"
+        "            \"4o6-subnet\": \"\", \n"
+        "            \"dhcp4o6-port\": 0, \n"
+        "            \"decline-probation-period\": 86400 \n"
+        "        }";
+
+
+    data::ElementPtr elems;
+    ASSERT_NO_THROW(elems = data::Element::fromJSON(json))
+                    << "invalid JSON:" << json << "\n est is broken";
+
+    // Iterate over the test scenarios, verifying each prescribed
+    // outcome.
+    for (auto test = tests.begin(); test != tests.end(); ++test) {
+        {
+            SCOPED_TRACE("test: " + (*test).label);
+
+            // Set this scenario's configuration parameters
+            elems->set("calculate-tee-times", data::Element::create((*test).calculate_tee_times));
+            elems->set("t1-percent", data::Element::create((*test).t1_percent));
+            elems->set("t2-percent", data::Element::create((*test).t2_percent));
+
+            Subnet4Ptr subnet;
+            try {
+                // Attempt to parse the configuration.
+                Subnet4ConfigParser parser;
+                subnet = parser.parse(elems);
+            } catch (const std::exception& ex) {
+                if (!(*test).error_message.empty()) {
+                    // We expected a failure, did we fail the correct way?
+                    EXPECT_EQ((*test).error_message, ex.what());
+                } else {
+                    // Should not have failed.
+                    ADD_FAILURE() << "Scenario should not have failed: " << ex.what();
+                }
+
+                // Either way we're done with this scenario.
+                continue;
+            }
+
+            // We parsed correctly, make sure the values are right.
+            EXPECT_EQ((*test).calculate_tee_times, subnet->getCalculateTeeTimes());
+            EXPECT_TRUE(util::areDoublesEquivalent((*test).t1_percent, subnet->getT1Percent()));
+            EXPECT_TRUE(util::areDoublesEquivalent((*test).t2_percent, subnet->getT2Percent()));
+        }
+    }
+}
+
 } // end of anonymous namespace
index 857e9163f6dda89f83a6f3129d135247880c5e00..d0599a5f35c701f7dd47da06ac0a24dc1de009c4 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2017-2018 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2017-2019 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -143,7 +143,10 @@ public:
                 "            \"4o6-subnet\": \"\","
                 "            \"dhcp4o6-port\": 0,"
                 "            \"decline-probation-period\": 86400,"
-                "            \"reservation-mode\": \"all\""
+                "            \"reservation-mode\": \"all\","
+                "            \"calculate-tee-times\": true,"
+                "            \"t1-percent\": .45,"
+                "            \"t2-percent\": .65"
                 "        },"
                 "        {"
                 "            \"id\": 2,"
@@ -165,7 +168,10 @@ public:
                 "            \"4o6-subnet\": \"\","
                 "            \"dhcp4o6-port\": 0,"
                 "            \"decline-probation-period\": 86400,"
-                "            \"reservation-mode\": \"all\""
+                "            \"reservation-mode\": \"all\","
+                "            \"calculate-tee-times\": false,"
+                "            \"t1-percent\": .40,"
+                "            \"t2-percent\": .80"
                 "        }"
                 "    ]"
                 "}";
@@ -196,6 +202,13 @@ TEST_F(SharedNetwork4ParserTest, parse) {
     // Parse configuration specified above.
     SharedNetwork4Parser parser;
     SharedNetwork4Ptr network;
+
+    try { 
+        network = parser.parse(config_element);
+    } catch (const std::exception& ex) {
+        std::cout << "kabook: " << ex.what() << std::endl;
+    }
+
     ASSERT_NO_THROW(network = parser.parse(config_element));
     ASSERT_TRUE(network);
 
index 7cbde941804e5a9dd73c392169961202c2fe09d4..e045e81de9f54f8eeed2d0e0ae4dfd506aea8ec3 100644 (file)
@@ -10,6 +10,7 @@ lib_LTLIBRARIES = libkea-util.la
 libkea_util_la_SOURCES  = boost_time_utils.h boost_time_utils.cc
 libkea_util_la_SOURCES += buffer.h io_utilities.h
 libkea_util_la_SOURCES += csv_file.h csv_file.cc
+libkea_util_la_SOURCES += doubles.h
 libkea_util_la_SOURCES += filename.h filename.cc
 libkea_util_la_SOURCES += hash.h
 libkea_util_la_SOURCES += labeled_value.h labeled_value.cc
@@ -50,6 +51,7 @@ libkea_util_include_HEADERS = \
        boost_time_utils.h \
        buffer.h \
        csv_file.h \
+       doubles.h \
        filename.h \
        hash.h \
        io_utilities.h \
diff --git a/src/lib/util/doubles.h b/src/lib/util/doubles.h
new file mode 100644 (file)
index 0000000..a481f72
--- /dev/null
@@ -0,0 +1,29 @@
+// Copyright (C) 2019 Internet Systems Consortium, Inc. ("ISC")
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef DOUBLES_H
+#define DOUBLES_H
+
+#include <complex>
+
+namespace isc {
+namespace util {
+
+/// @brief Tests two doubles for equivalance within a given tolerance
+///
+/// @param a comparison operand one
+/// @param b  comparison operand two
+/// @param tolerance the amount by which the two values may differ and
+/// still be considered "equal".
+/// @return True if the two values differ by less than the tolerance.
+inline bool areDoublesEquivalent(double a, double b, double tolerance=0.000001) {
+    return(std::abs(a - b) < tolerance);
+}
+
+} // namespace util
+} // namespace isc
+
+#endif // DOUBLES_H
index c6b7173bfa38bf57e4603203bd72b90eb84dba66..71d28c495f24bbe0e17dd0e37bf32809e14ed2ea 100644 (file)
@@ -33,6 +33,7 @@ run_unittests_SOURCES += base64_unittest.cc
 run_unittests_SOURCES += boost_time_utils_unittest.cc
 run_unittests_SOURCES += buffer_unittest.cc
 run_unittests_SOURCES += csv_file_unittest.cc
+run_unittests_SOURCES += doubles_unittest.cc
 run_unittests_SOURCES += fd_share_tests.cc
 run_unittests_SOURCES += fd_tests.cc
 run_unittests_SOURCES += filename_unittest.cc
diff --git a/src/lib/util/tests/doubles_unittest.cc b/src/lib/util/tests/doubles_unittest.cc
new file mode 100644 (file)
index 0000000..e268e2c
--- /dev/null
@@ -0,0 +1,32 @@
+// Copyright (C) 2019 Internet Systems Consortium, Inc. ("ISC")
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#include <config.h>
+
+#include <util/doubles.h>
+
+#include <gtest/gtest.h>
+
+using namespace std;
+using namespace isc;
+using namespace isc::util;
+
+namespace {
+
+// Excerises isc::util::areDoublesEquivalent().
+TEST(Doubles, areDoublesEquivalent) {
+    std::vector<uint8_t> data;
+
+    // Default tolerance is 0.000001
+    EXPECT_TRUE(areDoublesEquivalent( 1.0000000, 1.0000005));
+    EXPECT_FALSE(areDoublesEquivalent(1.0000000, 1.000005));
+
+    // Check custome tolerance.
+    EXPECT_TRUE(areDoublesEquivalent( 1.000, 1.005, 0.01));
+    EXPECT_FALSE(areDoublesEquivalent(1.000, 1.005, 0.001));
+}
+
+}