]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
- IXFR/AXFR support for RPZ
authorRalph Dolmans <ralph@nlnetlabs.nl>
Thu, 25 Apr 2019 12:46:45 +0000 (14:46 +0200)
committerRalph Dolmans <ralph@nlnetlabs.nl>
Thu, 25 Apr 2019 12:46:45 +0000 (14:46 +0200)
services/authzone.c
services/localzone.c
services/localzone.h
services/rpz.c
util/configparser.c
util/configparser.y
util/data/packed_rrset.c
util/data/packed_rrset.h
util/iana_ports.inc

index aad6028e6ace123cc9aa488c02199de51b5b7632..ae21f3f72ff418e11f0341e0e0da717c2100b411 100644 (file)
@@ -674,23 +674,6 @@ domain_remove_rrset(struct auth_data* node, uint16_t rr_type)
        }
 }
 
-/** find an rr index in the rrset.  returns true if found */
-static int
-az_rrset_find_rr(struct packed_rrset_data* d, uint8_t* rdata, size_t len,
-       size_t* index)
-{
-       size_t i;
-       for(i=0; i<d->count; i++) {
-               if(d->rr_len[i] != len)
-                       continue;
-               if(memcmp(d->rr_data[i], rdata, len) == 0) {
-                       *index = i;
-                       return 1;
-               }
-       }
-       return 0;
-}
-
 /** find an rrsig index in the rrset.  returns true if found */
 static int
 az_rrset_find_rrsig(struct packed_rrset_data* d, uint8_t* rdata, size_t len,
@@ -740,58 +723,10 @@ rrsig_rdata_get_type_covered(uint8_t* rdata, size_t rdatalen)
 static int
 rrset_remove_rr(struct auth_rrset* rrset, size_t index)
 {
-       struct packed_rrset_data* d, *old = rrset->data;
-       size_t i;
-       if(index >= old->count + old->rrsig_count)
-               return 0; /* index out of bounds */
-       d = (struct packed_rrset_data*)calloc(1, packed_rrset_sizeof(old) - (
-               sizeof(size_t) + sizeof(uint8_t*) + sizeof(time_t) +
-               old->rr_len[index]));
-       if(!d) {
-               log_err("malloc failure");
+       struct packed_rrset_data* d =
+               packed_rrset_remove_rr(rrset->data, index, NULL);
+       if(!d)
                return 0;
-       }
-       d->ttl = old->ttl;
-       d->count = old->count;
-       d->rrsig_count = old->rrsig_count;
-       if(index < d->count) d->count--;
-       else d->rrsig_count--;
-       d->trust = old->trust;
-       d->security = old->security;
-
-       /* set rr_len, needed for ptr_fixup */
-       d->rr_len = (size_t*)((uint8_t*)d +
-               sizeof(struct packed_rrset_data));
-       if(index > 0)
-               memmove(d->rr_len, old->rr_len, (index)*sizeof(size_t));
-       if(index+1 < old->count+old->rrsig_count)
-               memmove(&d->rr_len[index], &old->rr_len[index+1],
-               (old->count+old->rrsig_count - (index+1))*sizeof(size_t));
-       packed_rrset_ptr_fixup(d);
-
-       /* move over ttls */
-       if(index > 0)
-               memmove(d->rr_ttl, old->rr_ttl, (index)*sizeof(time_t));
-       if(index+1 < old->count+old->rrsig_count)
-               memmove(&d->rr_ttl[index], &old->rr_ttl[index+1],
-               (old->count+old->rrsig_count - (index+1))*sizeof(time_t));
-       
-       /* move over rr_data */
-       for(i=0; i<d->count+d->rrsig_count; i++) {
-               size_t oldi;
-               if(i < index) oldi = i;
-               else oldi = i+1;
-               memmove(d->rr_data[i], old->rr_data[oldi], d->rr_len[i]);
-       }
-
-       /* recalc ttl (lowest of remaining RR ttls) */
-       if(d->count + d->rrsig_count > 0)
-               d->ttl = d->rr_ttl[0];
-       for(i=0; i<d->count+d->rrsig_count; i++) {
-               if(d->rr_ttl[i] < d->ttl)
-                       d->ttl = d->rr_ttl[i];
-       }
-
        free(rrset->data);
        rrset->data = d;
        return 1;
@@ -1210,7 +1145,7 @@ az_domain_remove_rr(struct auth_data* node, uint16_t rr_type,
 
        /* find the plain RR of the given type */
        if((rrset=az_domain_rrset(node, rr_type))!= NULL) {
-               if(az_rrset_find_rr(rrset->data, rdata, rdatalen, &index)) {
+               if(packed_rrset_find_rr(rrset->data, rdata, rdatalen, &index)) {
                        if(rrset->data->count == 1 &&
                                rrset->data->rrsig_count == 0) {
                                /* last RR, delete the rrset */
index 337dcb4d69aa73e198142c3b718be91e4a46608b..fda2b31eb8e9495fd473897a87a97f1097e03085 100644 (file)
@@ -394,9 +394,8 @@ rrset_insert_rr(struct regional* region, struct packed_rrset_data* pd,
        return 1;
 }
 
-/** find a data node by exact name */
-static struct local_data* 
-lz_find_node(struct local_zone* z, uint8_t* nm, size_t nmlen, int nmlabs)
+struct local_data* 
+local_zone_find_data(struct local_zone* z, uint8_t* nm, size_t nmlen, int nmlabs)
 {
        struct local_data key;
        key.node.key = &key;
@@ -411,7 +410,7 @@ static int
 lz_find_create_node(struct local_zone* z, uint8_t* nm, size_t nmlen, 
        int nmlabs, struct local_data** res)
 {
-       struct local_data* ld = lz_find_node(z, nm, nmlen, nmlabs);
+       struct local_data* ld = local_zone_find_data(z, nm, nmlen, nmlabs);
        if(!ld) {
                /* create a domain name to store rr. */
                ld = (struct local_data*)regional_alloc_zero(z->region,
@@ -1395,6 +1394,7 @@ local_data_answer(struct local_zone* z, struct module_env* env,
                        regional_alloc_init(temp, lr->rrset, sizeof(*lr->rrset));
                if(!qinfo->local_alias->rrset)
                        return 0; /* out of memory */
+               /* TODO local_alias->rrset change cnam etarget */
                qinfo->local_alias->rrset->rk.dname = qinfo->qname;
                qinfo->local_alias->rrset->rk.dname_len = qinfo->qname_len;
                return 1;
@@ -1861,7 +1861,7 @@ del_empty_term(struct local_zone* z, struct local_data* d,
                        return;
                dname_remove_label(&name, &len);
                labs--;
-               d = lz_find_node(z, name, len, labs);
+               d = local_zone_find_data(z, name, len, labs);
        }
 }
 
@@ -1894,7 +1894,7 @@ void local_zones_del_data(struct local_zones* zones,
        z = local_zones_lookup(zones, name, len, labs, dclass, LDNS_RR_TYPE_DS);
        if(z) {
                lock_rw_wrlock(&z->lock);
-               d = lz_find_node(z, name, len, labs);
+               d = local_zone_find_data(z, name, len, labs);
                if(d) {
                        del_local_rrset(d, LDNS_RR_TYPE_DS);
                        del_empty_term(z, d, name, len, labs);
@@ -1915,7 +1915,7 @@ void local_zones_del_data(struct local_zones* zones,
        lock_rw_unlock(&zones->lock);
 
        /* find the domain */
-       d = lz_find_node(z, name, len, labs);
+       d = local_zone_find_data(z, name, len, labs);
        if(d) {
                /* no memory recycling for zone deletions ... */
                d->rrsets = NULL;
index 96d67dbf3aed86c570b92ef094f2c6103eb8ba08..d8dfa014570ee899a50c00d403f4555c4e05c41f 100644 (file)
@@ -567,4 +567,15 @@ int
 local_zone_enter_rr(struct local_zone* z, uint8_t* nm, size_t nmlen,
        int nmlabs, uint16_t rrtype, uint16_t rrclass, time_t ttl,
        uint8_t* rdata, size_t rdata_len, const char* rrstr);
+
+/**
+ * Find a data node by exact name for a local zone
+ * @param z: local_zone containing data tree
+ * @param nm: name of local-data element to find
+ * @param nmlen: length of nm
+ * @param nmlabs: labs of nm
+ * @return local_data on exact match, NULL otherwise.
+ */
+struct local_data* 
+local_zone_find_data(struct local_zone* z, uint8_t* nm, size_t nmlen, int nmlabs);
 #endif /* SERVICES_LOCALZONE_H */
index 0b6c8df0d3466e08b8c826e45c3e08f4ddb0a927..ff9cf7e41c051f13ede306a41a20d1feac9018e7 100644 (file)
@@ -295,6 +295,8 @@ rpz_insert_qname_trigger(struct rpz* r, uint8_t* dname, size_t dnamelen,
                /* insert data. TODO synth wildcard cname target on
                 * lookup */
                rrstr = sldns_wire2str_rr(rr, rr_len);
+               /* TODO non region alloc so rrs can be free after IXFR deletion?
+                * */
                local_zone_enter_rr(z, dname, dnamelen, dnamelabs,
                        rrtype, rrclass, ttl, rdata, rdata_len, rrstr);
                free(rrstr);
@@ -333,33 +335,17 @@ rpz_insert_rr(struct rpz* r, size_t aznamelen, uint8_t* dname,
        }
 }
 
-void
-rpz_remove_rr(struct rpz* r, size_t aznamelen, uint8_t* dname,
-       size_t dnamelen, uint16_t rr_type, uint16_t rr_class, uint8_t* rdatawl,
-       size_t rdatalen, uint8_t* rr, size_t rr_len)
-{
-       /* TODO: remove RR, used for IXFR */
-       /* void cast all to prevent compiler warning */
-       (void)r;
-       (void)aznamelen;
-       (void)dname;
-       (void)dnamelen;
-       (void)rr_type;
-       (void)rr_class;
-       (void)rdatawl;
-       (void)rdatalen;
-       (void)rr;
-       (void)rr_len;
-}
-
 /**
  * Find RPZ local-zone by qname.
  * @param r: rpz containing local-zone tree
  * @param qinfo: qinfo struct
- * @return: NULL or local-zone holding rd lock
+ * @param only_exact: if 1 only excact (non wildcard) matches are returned
+ * @param wr: get write lock for local-zone if 1, read lock if 0
+ * @return: NULL or local-zone holding rd or wr lock
  */
 static struct local_zone*
-rpz_find_zone(struct rpz* r, struct query_info* qinfo)
+rpz_find_zone(struct rpz* r, uint8_t* qname, size_t qname_len, uint16_t qclass,
+       int only_exact, int wr)
 {
        uint8_t* ce;
        size_t ce_len, ce_labs;
@@ -367,14 +353,17 @@ rpz_find_zone(struct rpz* r, struct query_info* qinfo)
        int exact;
        struct local_zone* z = NULL;
        lock_rw_rdlock(&r->local_zones->lock);
-       z = local_zones_find_le(r->local_zones, qinfo->qname,
-               qinfo->qname_len, dname_count_labels(qinfo->qname),
+       z = local_zones_find_le(r->local_zones, qname, qname_len,
+               dname_count_labels(qname),
                LDNS_RR_CLASS_IN, &exact);
-       if(!z) {
+       if(!z || (only_exact && !exact)) {
                lock_rw_unlock(&r->local_zones->lock);
                return NULL;
        }
-       lock_rw_rdlock(&z->lock);
+       if(wr)
+               lock_rw_wrlock(&z->lock);
+       else
+               lock_rw_rdlock(&z->lock);
        lock_rw_unlock(&r->local_zones->lock);
 
        if(exact)
@@ -384,7 +373,7 @@ rpz_find_zone(struct rpz* r, struct query_info* qinfo)
         * be the shared parent between the qname and the best local
         * zone match, append '*' to that and do another lookup. */
 
-       ce = dname_get_shared_topdomain(z->name, qinfo->qname);
+       ce = dname_get_shared_topdomain(z->name, qname);
        if(!ce /* should not happen */ || !*ce /* root */) {
                lock_rw_unlock(&z->lock);
                return NULL;
@@ -401,16 +390,117 @@ rpz_find_zone(struct rpz* r, struct query_info* qinfo)
 
        lock_rw_rdlock(&r->local_zones->lock);
        z = local_zones_find_le(r->local_zones, wc,
-               ce_len+2, ce_labs+1, qinfo->qclass, &exact);
+               ce_len+2, ce_labs+1, qclass, &exact);
        if(!z || !exact) {
                lock_rw_unlock(&r->local_zones->lock);
                return NULL;
        }
-       lock_rw_rdlock(&z->lock);
+       if(wr)
+               lock_rw_wrlock(&z->lock);
+       else
+               lock_rw_rdlock(&z->lock);
        lock_rw_unlock(&r->local_zones->lock);
        return z;
 }
 
+/**
+ * Remove RR from RPZ's local-data
+ * @param z: local-zone for RPZ, holding write lock
+ * @param policydname: dname of RR to remove
+ * @param policydnamelen: lenth of policydname
+ * @param rr_type: RR type of RR to remove
+ * @param rdata: rdata of RR to remove
+ * @param rdatalen: length of rdata
+ * @return: 1 if zone must be removed after RR deletion
+ */
+static int
+rpz_data_delete_rr(struct local_zone* z, uint8_t* policydname,
+       size_t policydnamelen, uint16_t rr_type, uint8_t* rdata,
+       size_t rdatalen)
+{
+       struct local_data* ld;
+       struct packed_rrset_data* d;
+       size_t index;
+       ld = local_zone_find_data(z, policydname, policydnamelen,
+               dname_count_labels(policydname));
+       if(ld) {
+               struct local_rrset* prev=NULL, *p=ld->rrsets;
+               while(p && ntohs(p->rrset->rk.type) != rr_type) {
+                       prev = p;
+                       p = p->next;
+               }
+               if(!p)
+                       return 0;
+               d = (struct packed_rrset_data*)p->rrset->entry.data;
+               if(packed_rrset_find_rr(d, rdata, rdatalen, &index)) {
+                       if(d->count == 1) {
+                               /* no memory recycling for zone deletions ... */
+                               if(prev) prev->next = p->next;
+                               else ld->rrsets = p->next;
+
+                       }
+                       if(d->count > 1) {
+                               struct packed_rrset_data* new;
+                               new = packed_rrset_remove_rr(d, index, z->region);
+                               if(!new)
+                                       return 0;
+                               p->rrset->entry.data = new;     
+                       }
+               }
+       }
+       if(ld && ld->rrsets)
+               return 0;
+       return 1;
+}
+
+void
+rpz_remove_rr(struct rpz* r, size_t aznamelen, uint8_t* dname,
+       size_t dnamelen, uint16_t rr_type, uint16_t rr_class, uint8_t* rdatawl,
+       size_t rdatalen, uint8_t* rr, size_t rr_len)
+{
+       struct local_zone* z;
+       size_t policydnamelen;
+       /* name is free'd in local_zone delete */
+       uint8_t* policydname = calloc(1, LDNS_MAX_DOMAINLEN + 1);
+       enum rpz_trigger t;
+       enum rpz_action a;
+       int delete_zone = 1;
+
+       (void)rr;
+       (void)rr_len;
+       
+       a = rpz_rr_to_action(rr_type, rdatawl, rdatalen);
+       if(!(policydnamelen = strip_dname_origin(dname, dnamelen, aznamelen,
+               policydname))) {
+               free(policydname);
+               return;
+       }
+       t = rpz_dname_to_trigger(policydname);
+       if(t == RPZ_QNAME_TRIGGER) {
+               z = rpz_find_zone(r, policydname, policydnamelen, rr_class,
+                       1 /* only exact */, 1 /* wr lock */);
+               if(!z) {
+                       verbose(VERB_ALGO, "RPZ: cannot remove RR from IXFR, "
+                               "RPZ domain not found");
+                       free(policydname);
+                       return;
+               }
+               if(a == RPZ_LOCAL_DATA_ACTION)
+                       delete_zone = rpz_data_delete_rr(z, policydname,
+                               policydnamelen, rr_type, rdatawl, rdatalen);
+               lock_rw_unlock(&z->lock); 
+               if(delete_zone) {
+                       local_zones_del_zone(r->local_zones, z);
+               }
+       }
+       else {
+               verbose(VERB_ALGO, "RPZ: skipping unusupported trigger: %s "
+                               "while removing RPZ RRs",
+                       rpz_trigger_to_string(t));
+       }
+       free(policydname);
+}
+
 /** print log information for an applied RPZ policy. Based on local-zone's
  * lz_inform_print().
  */
@@ -442,7 +532,8 @@ rpz_apply_qname_trigger(struct auth_zones* az, struct module_env* env,
        for(r = az->rpz_first; r && !z; r = r->next) {
                if(!r->taglist || taglist_intersect(r->taglist, 
                        r->taglistlen, taglist, taglen))
-                       z = rpz_find_zone(r, qinfo);
+                       z = rpz_find_zone(r, qinfo->qname, qinfo->qname_len,
+                               qinfo->qclass, 0, 0);
        }
        lock_rw_unlock(&az->rpz_lock);
        if(!z)
@@ -457,9 +548,8 @@ rpz_apply_qname_trigger(struct auth_zones* az, struct module_env* env,
 
        ret = local_zones_zone_answer(z, env, qinfo, edns, repinfo, buf, temp,
                0 /* no local data used */, z->type);
+       rpz_inform_print(z, qinfo, repinfo);
        lock_rw_unlock(&z->lock);
-       if(ret)
-               rpz_inform_print(z, qinfo, repinfo);
 
        return ret;
 }
index e19e3f8e8e76dc5ca3c1bde64fa0d34501ed7fd0..e380c9639cb9e53b5e8b50dc007ff2809d2f9f4c 100644 (file)
@@ -930,16 +930,16 @@ union yyalloc
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  2
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   565
+#define YYLAST   571
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  269
 /* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  290
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  557
+#define YYNRULES  560
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  832
+#define YYNSTATES  835
 
 /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
    by yylex, with out-of-bounds checking.  */
@@ -1037,37 +1037,38 @@ static const yytype_uint16 yyrline[] =
      303,   303,   303,   303,   304,   304,   306,   320,   321,   322,
      322,   322,   322,   323,   323,   323,   325,   342,   343,   344,
      344,   344,   344,   345,   345,   345,   346,   349,   368,   385,
-     386,   387,   387,   387,   389,   398,   407,   418,   427,   436,
-     445,   456,   465,   476,   489,   504,   515,   532,   549,   566,
-     583,   598,   613,   626,   641,   650,   659,   668,   677,   686,
-     695,   704,   713,   722,   731,   740,   749,   758,   771,   780,
-     793,   802,   811,   820,   827,   834,   843,   850,   859,   867,
-     874,   881,   889,   898,   907,   921,   930,   939,   948,   957,
-     966,   975,   982,   989,  1015,  1023,  1030,  1037,  1044,  1051,
-    1059,  1067,  1075,  1082,  1093,  1104,  1111,  1120,  1129,  1138,
-    1145,  1152,  1160,  1168,  1178,  1188,  1198,  1206,  1219,  1230,
-    1238,  1251,  1260,  1269,  1278,  1288,  1298,  1306,  1319,  1328,
-    1336,  1345,  1353,  1366,  1375,  1382,  1392,  1402,  1412,  1422,
-    1432,  1442,  1452,  1462,  1469,  1476,  1483,  1492,  1501,  1510,
-    1519,  1526,  1536,  1556,  1563,  1581,  1594,  1607,  1616,  1625,
-    1634,  1643,  1653,  1663,  1674,  1683,  1692,  1701,  1710,  1723,
-    1736,  1745,  1752,  1761,  1770,  1779,  1788,  1796,  1809,  1817,
-    1850,  1857,  1872,  1882,  1892,  1899,  1906,  1913,  1922,  1930,
-    1944,  1965,  1986,  1998,  2010,  2022,  2031,  2052,  2062,  2071,
-    2079,  2087,  2100,  2113,  2128,  2143,  2152,  2161,  2167,  2176,
-    2185,  2195,  2205,  2218,  2231,  2243,  2257,  2269,  2283,  2293,
-    2300,  2307,  2316,  2325,  2335,  2345,  2355,  2362,  2369,  2378,
-    2387,  2397,  2407,  2414,  2421,  2428,  2436,  2446,  2456,  2466,
-    2476,  2508,  2518,  2526,  2534,  2549,  2558,  2563,  2564,  2565,
-    2565,  2565,  2566,  2566,  2566,  2567,  2567,  2569,  2579,  2588,
-    2595,  2602,  2609,  2616,  2623,  2630,  2635,  2636,  2637,  2637,
-    2638,  2638,  2639,  2639,  2640,  2641,  2642,  2643,  2644,  2645,
-    2647,  2656,  2663,  2672,  2681,  2688,  2695,  2705,  2715,  2725,
-    2735,  2745,  2755,  2760,  2761,  2762,  2764,  2770,  2780,  2787,
-    2796,  2804,  2809,  2810,  2812,  2812,  2812,  2813,  2813,  2814,
-    2815,  2816,  2817,  2818,  2820,  2830,  2839,  2846,  2855,  2862,
-    2871,  2879,  2892,  2900,  2913,  2918,  2919,  2920,  2920,  2921,
-    2921,  2921,  2923,  2938,  2953,  2965,  2980,  2993
+     386,   387,   387,   387,   387,   387,   388,   390,   399,   408,
+     419,   428,   437,   446,   457,   466,   477,   490,   505,   516,
+     533,   550,   567,   584,   599,   614,   627,   642,   651,   660,
+     669,   678,   687,   696,   705,   714,   723,   732,   741,   750,
+     759,   772,   781,   794,   803,   812,   821,   828,   835,   844,
+     851,   860,   868,   875,   882,   890,   899,   908,   922,   931,
+     940,   949,   958,   967,   976,   983,   990,  1016,  1024,  1031,
+    1038,  1045,  1052,  1060,  1068,  1076,  1083,  1094,  1105,  1112,
+    1121,  1130,  1139,  1146,  1153,  1161,  1169,  1179,  1189,  1199,
+    1207,  1220,  1231,  1239,  1252,  1261,  1270,  1279,  1289,  1299,
+    1307,  1320,  1329,  1337,  1346,  1354,  1367,  1376,  1383,  1393,
+    1403,  1413,  1423,  1433,  1443,  1453,  1463,  1470,  1477,  1484,
+    1493,  1502,  1511,  1520,  1527,  1537,  1557,  1564,  1582,  1595,
+    1608,  1617,  1626,  1635,  1644,  1654,  1664,  1675,  1684,  1693,
+    1702,  1711,  1724,  1737,  1746,  1753,  1762,  1771,  1780,  1789,
+    1797,  1810,  1818,  1851,  1858,  1873,  1883,  1893,  1900,  1907,
+    1914,  1923,  1931,  1945,  1966,  1987,  1999,  2011,  2023,  2032,
+    2053,  2063,  2072,  2080,  2088,  2101,  2114,  2129,  2144,  2153,
+    2162,  2168,  2177,  2186,  2196,  2206,  2219,  2232,  2244,  2258,
+    2270,  2284,  2294,  2301,  2308,  2317,  2326,  2336,  2346,  2356,
+    2363,  2370,  2379,  2388,  2398,  2408,  2415,  2422,  2429,  2437,
+    2447,  2457,  2467,  2477,  2509,  2519,  2527,  2535,  2550,  2559,
+    2564,  2565,  2566,  2566,  2566,  2567,  2567,  2567,  2568,  2568,
+    2570,  2580,  2589,  2596,  2603,  2610,  2617,  2624,  2631,  2636,
+    2637,  2638,  2638,  2639,  2639,  2640,  2640,  2641,  2642,  2643,
+    2644,  2645,  2646,  2648,  2657,  2664,  2673,  2682,  2689,  2696,
+    2706,  2716,  2726,  2736,  2746,  2756,  2761,  2762,  2763,  2765,
+    2771,  2781,  2788,  2797,  2805,  2810,  2811,  2813,  2813,  2813,
+    2814,  2814,  2815,  2816,  2817,  2818,  2819,  2821,  2831,  2840,
+    2847,  2856,  2863,  2872,  2880,  2893,  2901,  2914,  2919,  2920,
+    2921,  2921,  2922,  2922,  2922,  2924,  2939,  2954,  2966,  2981,
+    2994
 };
 #endif
 
@@ -1347,8 +1348,8 @@ static const yytype_int16 yypact[] =
     -192,     0,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
     -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
     -192,  -192,  -192,  -192,  -192,  -192,   256,   -42,   -37,   -38,
-     -35,   -41,   -44,  -136,  -104,  -191,  -177,    -1,     2,     3,
-      28,    29,    30,    33,    35,    36,    37,    38,    39,    55,
+     -23,   -41,   -62,  -131,  -104,  -168,  -191,    -2,    -1,     2,
+       3,     6,     7,     8,     9,    33,    51,    52,    53,    55,
       57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
       67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
       77,    78,    79,    80,    81,    82,    83,    86,    87,    90,
@@ -1361,12 +1362,12 @@ static const yytype_int16 yypact[] =
      157,   158,   159,   160,   161,   162,   163,   164,   165,   166,
      167,   168,   169,   170,   171,   172,   173,   174,   175,   176,
      177,   178,   179,   180,   181,   182,   183,   184,   185,   186,
-     187,   188,   189,   190,   191,   194,   195,   196,   198,   204,
-     205,   207,   211,   212,   213,   214,   215,   216,   218,   219,
-     220,   221,   222,   223,   224,   226,   227,   228,   229,   230,
-     231,   232,   234,   235,   236,   237,   238,   239,   240,   241,
-     242,   243,   244,   245,   246,   247,   248,   249,   250,   251,
-     252,   253,   254,   255,   289,   290,  -192,  -192,  -192,  -192,
+     187,   188,   189,   190,   191,   196,   197,   198,   199,   200,
+     201,   202,   204,   205,   207,   216,   218,   219,   220,   222,
+     223,   224,   226,   227,   228,   229,   230,   231,   232,   234,
+     235,   236,   237,   238,   239,   240,   241,   242,   243,   244,
+     245,   246,   247,   248,   249,   250,   251,   252,   253,   254,
+     255,   289,   290,   291,   292,   296,  -192,  -192,  -192,  -192,
     -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
     -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
     -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
@@ -1385,49 +1386,49 @@ static const yytype_int16 yypact[] =
     -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
     -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
     -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
-    -192,  -192,  -192,  -192,  -192,  -192,   291,   292,   296,   297,
-     298,   340,   341,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
-    -192,   342,   343,   344,   345,   346,   347,  -192,  -192,  -192,
-    -192,  -192,  -192,  -192,   348,   352,   356,   357,   382,   383,
-     384,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,   386,
-     397,   398,   399,   400,   401,   402,   403,  -192,  -192,  -192,
-    -192,  -192,  -192,  -192,  -192,  -192,   404,  -192,  -192,  -192,
-    -192,   405,   406,   407,   408,   409,   448,   450,   464,  -192,
-    -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,   465,   466,
-     467,   468,   469,   470,   471,   472,   473,   474,   481,   482,
+    -192,  -192,  -192,  -192,  -192,  -192,   297,   298,   340,   341,
+     342,   343,   344,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
+    -192,   345,   346,   347,   348,   352,   356,  -192,  -192,  -192,
+    -192,  -192,  -192,  -192,   357,   382,   383,   384,   386,   397,
+     398,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,   399,
+     400,   401,   402,   403,   404,   405,   406,  -192,  -192,  -192,
+    -192,  -192,  -192,  -192,  -192,  -192,   407,  -192,  -192,  -192,
+    -192,  -192,  -192,  -192,   408,   409,   448,   450,   464,   465,
+     466,   467,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
+    -192,   468,   469,   470,   471,   472,   473,   474,   481,   482,
+     483,   484,   485,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
+    -192,  -192,  -192,  -192,  -192,  -192,   486,  -192,  -192,   488,
+     489,   490,   491,   492,   493,   494,   497,   500,   503,  -192,
     -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
-    -192,  -192,  -192,   483,  -192,  -192,   484,   485,   486,   488,
-     489,   490,   491,   492,   493,   494,  -192,  -192,  -192,  -192,
-    -192,  -192,  -192,  -192,  -192,  -192,  -192,   497,   500,   503,
-     504,   513,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
+     504,   513,   514,   515,   516,  -192,  -192,  -192,  -192,  -192,
     -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
     -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
     -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
     -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
     -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
-    -192,  -192,  -192,  -192,  -192,  -192,  -192,   514,   515,  -192,
     -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
+     517,   518,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
     -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
     -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
     -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
     -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
-    -192,  -192,  -192,  -192,   516,   517,   518,  -192,  -192,  -192,
-    -192,  -192,  -192,  -192,  -192,  -192,   519,   520,  -192,  -192,
+    -192,  -192,  -192,  -192,  -192,  -192,  -192,   519,   520,   521,
+    -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,   522,
+     523,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
     -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
-    -192,  -192,  -192,  -192,  -192,  -192,  -192,   521,   522,   523,
-     524,   525,   526,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
+     524,   525,   526,   527,   528,   529,  -192,  -192,  -192,  -192,
     -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
-    -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,   527,  -192,
     -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
+    -192,   530,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
     -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
-    -192,   528,  -192,  -192,   529,   530,  -192,  -192,  -192,  -192,
+    -192,  -192,  -192,  -192,   531,  -192,  -192,   532,   533,  -192,
     -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
     -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
     -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
     -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
     -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
-    -192,   531,   532,   533,  -192,  -192,  -192,  -192,  -192,  -192,
-    -192,  -192
+    -192,  -192,  -192,  -192,   534,   535,   536,  -192,  -192,  -192,
+    -192,  -192,  -192,  -192,  -192
 };
 
   /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -1435,9 +1436,9 @@ static const yytype_int16 yypact[] =
      means the default is an error.  */
 static const yytype_uint16 yydefact[] =
 {
-       2,     0,     1,    15,   207,   217,   466,   512,   485,   226,
-     521,   544,   236,   248,     3,    17,   209,   219,   228,   238,
-     250,   468,   487,   514,   523,   546,     4,     5,     6,    10,
+       2,     0,     1,    15,   207,   217,   469,   515,   488,   226,
+     524,   547,   236,   248,     3,    17,   209,   219,   228,   238,
+     250,   471,   490,   517,   526,   549,     4,     5,     6,    10,
       13,    14,     8,     9,     7,    11,    12,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
@@ -1483,42 +1484,42 @@ static const yytype_uint16 yydefact[] =
        0,   227,   229,   230,   233,   234,   231,   235,   232,     0,
        0,     0,     0,     0,     0,     0,     0,   237,   239,   240,
      241,   242,   246,   243,   244,   245,     0,   253,   249,   251,
-     252,     0,     0,     0,     0,     0,     0,     0,     0,   467,
-     469,   471,   470,   476,   472,   473,   474,   475,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     486,   488,   489,   490,   491,   492,   493,   494,   495,   496,
-     497,   498,   499,     0,   513,   515,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   522,   524,   525,   526,
-     528,   529,   527,   530,   531,   532,   533,     0,     0,     0,
-       0,     0,   545,   547,   548,   549,   550,   551,   255,   254,
-     261,   274,   272,   280,   281,   284,   282,   283,   285,   286,
-     287,   288,   289,   311,   312,   313,   314,   315,   339,   340,
-     341,   346,   347,   277,   348,   349,   352,   350,   351,   354,
-     355,   356,   370,   326,   327,   329,   330,   357,   373,   320,
-     322,   374,   380,   381,   382,   278,   338,   396,   397,   321,
-     391,   304,   273,   316,   371,   377,   358,     0,     0,   400,
-     279,   256,   303,   362,   257,   275,   276,   317,   318,   398,
-     360,   364,   365,   258,   401,   342,   369,   305,   325,   375,
-     376,   379,   390,   319,   394,   392,   393,   331,   337,   366,
-     367,   332,   333,   359,   384,   306,   307,   310,   290,   292,
-     293,   294,   295,   296,   402,   403,   405,   343,   344,   345,
-     353,   406,   407,   408,     0,     0,     0,   361,   334,   517,
-     417,   421,   419,   418,   422,   420,     0,     0,   425,   426,
-     262,   263,   264,   265,   266,   267,   268,   269,   270,   271,
-     363,   378,   395,   430,   431,   335,   409,     0,     0,     0,
-       0,     0,     0,   385,   386,   387,   388,   389,   518,   328,
-     323,   383,   302,   259,   260,   324,   432,   434,   433,   435,
-     436,   437,   291,   298,   427,   429,   428,   297,     0,   309,
-     368,   404,   308,   336,   299,   300,   301,   438,   439,   440,
-     444,   443,   441,   442,   445,   446,   447,   448,   450,   449,
-     459,     0,   463,   464,     0,     0,   465,   451,   457,   452,
-     453,   454,   456,   458,   455,   247,   477,   479,   478,   481,
-     482,   483,   484,   480,   500,   501,   502,   503,   504,   505,
-     506,   507,   508,   509,   510,   511,   516,   534,   535,   536,
-     539,   537,   538,   540,   541,   542,   543,   552,   553,   554,
-     555,   556,   372,   399,   416,   519,   520,   423,   424,   410,
-     411,     0,     0,     0,   415,   557,   460,   461,   462,   414,
-     412,   413
+     252,   254,   255,   256,     0,     0,     0,     0,     0,     0,
+       0,     0,   470,   472,   474,   473,   479,   475,   476,   477,
+     478,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   489,   491,   492,   493,   494,   495,   496,
+     497,   498,   499,   500,   501,   502,     0,   516,   518,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   525,
+     527,   528,   529,   531,   532,   530,   533,   534,   535,   536,
+       0,     0,     0,     0,     0,   548,   550,   551,   552,   553,
+     554,   258,   257,   264,   277,   275,   283,   284,   287,   285,
+     286,   288,   289,   290,   291,   292,   314,   315,   316,   317,
+     318,   342,   343,   344,   349,   350,   280,   351,   352,   355,
+     353,   354,   357,   358,   359,   373,   329,   330,   332,   333,
+     360,   376,   323,   325,   377,   383,   384,   385,   281,   341,
+     399,   400,   324,   394,   307,   276,   319,   374,   380,   361,
+       0,     0,   403,   282,   259,   306,   365,   260,   278,   279,
+     320,   321,   401,   363,   367,   368,   261,   404,   345,   372,
+     308,   328,   378,   379,   382,   393,   322,   397,   395,   396,
+     334,   340,   369,   370,   335,   336,   362,   387,   309,   310,
+     313,   293,   295,   296,   297,   298,   299,   405,   406,   408,
+     346,   347,   348,   356,   409,   410,   411,     0,     0,     0,
+     364,   337,   520,   420,   424,   422,   421,   425,   423,     0,
+       0,   428,   429,   265,   266,   267,   268,   269,   270,   271,
+     272,   273,   274,   366,   381,   398,   433,   434,   338,   412,
+       0,     0,     0,     0,     0,     0,   388,   389,   390,   391,
+     392,   521,   331,   326,   386,   305,   262,   263,   327,   435,
+     437,   436,   438,   439,   440,   294,   301,   430,   432,   431,
+     300,     0,   312,   371,   407,   311,   339,   302,   303,   304,
+     441,   442,   443,   447,   446,   444,   445,   448,   449,   450,
+     451,   453,   452,   462,     0,   466,   467,     0,     0,   468,
+     454,   460,   455,   456,   457,   459,   461,   458,   247,   480,
+     482,   481,   484,   485,   486,   487,   483,   503,   504,   505,
+     506,   507,   508,   509,   510,   511,   512,   513,   514,   519,
+     537,   538,   539,   542,   540,   541,   543,   544,   545,   546,
+     555,   556,   557,   558,   559,   375,   402,   419,   522,   523,
+     426,   427,   413,   414,     0,     0,     0,   418,   560,   463,
+     464,   465,   417,   415,   416
 };
 
   /* YYPGOTO[NTERM-NUM].  */
@@ -1546,7 +1547,7 @@ static const yytype_int16 yypgoto[] =
     -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
     -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
     -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,   -21,
-     534,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
+     537,   538,   539,   540,  -192,  -192,  -192,  -192,  -192,  -192,
     -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
     -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
     -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,  -192,
@@ -1581,12 +1582,12 @@ static const yytype_int16 yydefgoto[] =
      405,   406,   407,   408,   409,   410,   424,   425,   426,   427,
      428,   429,   430,   438,   439,   440,   441,   442,   443,   468,
      469,   470,   471,   472,   473,   474,   475,   452,   453,   454,
-     455,   456,   457,   458,    21,    32,   489,   490,   491,   492,
-     493,   494,   495,   496,   497,    22,    33,   510,   511,   512,
-     513,   514,   515,   516,   517,   518,   519,   520,   521,   522,
-      23,    34,   524,   525,   411,   412,   413,   414,    24,    35,
-     536,   537,   538,   539,   540,   541,   542,   543,   544,   545,
-     546,    25,    36,   552,   553,   554,   555,   556,   557,   415
+     455,   456,   457,   458,    21,    32,   492,   493,   494,   495,
+     496,   497,   498,   499,   500,    22,    33,   513,   514,   515,
+     516,   517,   518,   519,   520,   521,   522,   523,   524,   525,
+      23,    34,   527,   528,   411,   412,   413,   414,    24,    35,
+     539,   540,   541,   542,   543,   544,   545,   546,   547,   548,
+     549,    25,    36,   555,   556,   557,   558,   559,   560,   415
 };
 
   /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
@@ -1594,30 +1595,30 @@ static const yytype_int16 yydefgoto[] =
      number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_uint16 yytable[] =
 {
-       2,   416,   459,   417,   418,   444,   431,   523,   459,   558,
-     479,     3,   559,   560,   432,   433,   498,   499,   500,   501,
-     502,   503,   504,   505,   506,   507,   508,   509,   526,   527,
-     528,   529,   530,   531,   532,   533,   534,   535,   561,   562,
-     563,   445,   446,   564,     4,   565,   566,   567,   568,   569,
-       5,   481,   482,   483,   484,   485,   486,   487,   488,   547,
-     548,   549,   550,   551,   419,   570,   447,   571,   572,   573,
-     574,   575,   576,   577,   578,   579,   580,   581,   582,   583,
-     584,   585,   586,   587,   588,   589,   590,   591,   592,   593,
-     594,   595,   596,   597,     6,   420,   598,   599,   421,   434,
-     600,   435,   601,   602,   603,   604,   605,   606,   607,   608,
-       7,   609,   610,   611,   612,   613,   614,   615,   616,   617,
-     618,   619,   620,   621,   622,   623,   624,   448,   449,   625,
-     626,   627,   628,   629,   630,   631,   632,   633,   634,   635,
-     636,   637,   638,   639,   640,   641,   642,   643,   644,   645,
-     646,     8,   647,   648,   649,   650,   651,   652,   653,   654,
-     655,   656,   657,   658,   659,   660,   450,   661,   662,   663,
-     664,   665,   666,   667,   668,   669,   670,   671,   672,   673,
-     674,   675,   676,   677,   678,   679,   680,   681,   682,   683,
-     684,   685,   686,   687,   688,   689,   690,   691,   692,   693,
-     694,   695,     9,   461,   696,   697,   698,   460,   699,   461,
-     462,   463,   464,   465,   700,   701,   422,   702,    10,   466,
-     436,   703,   704,   705,   706,   707,   708,   476,   709,   710,
-     711,   712,   713,   714,   715,    11,   716,   717,   718,   719,
+       2,   416,   459,   417,   418,   444,   431,   526,   561,   562,
+     479,     3,   563,   564,   432,   433,   565,   566,   567,   568,
+     459,   501,   502,   503,   504,   505,   506,   507,   508,   509,
+     510,   511,   512,   484,   485,   486,   487,   488,   489,   490,
+     491,   445,   446,   569,     4,   550,   551,   552,   553,   554,
+       5,   529,   530,   531,   532,   533,   534,   535,   536,   537,
+     538,   570,   571,   572,   419,   573,   447,   574,   575,   576,
+     577,   578,   579,   580,   581,   582,   583,   584,   585,   586,
+     587,   588,   589,   590,   591,   592,   593,   594,   595,   596,
+     597,   598,   599,   600,     6,   420,   601,   602,   421,   434,
+     603,   435,   604,   605,   606,   607,   608,   609,   610,   611,
+       7,   612,   613,   614,   615,   616,   617,   618,   619,   620,
+     621,   622,   623,   624,   625,   626,   627,   448,   449,   628,
+     629,   630,   631,   632,   633,   634,   635,   636,   637,   638,
+     639,   640,   641,   642,   643,   644,   645,   646,   647,   648,
+     649,     8,   650,   651,   652,   653,   654,   655,   656,   657,
+     658,   659,   660,   661,   662,   663,   450,   664,   665,   666,
+     667,   668,   669,   670,   671,   672,   673,   674,   675,   676,
+     677,   678,   679,   680,   681,   682,   683,   684,   685,   686,
+     687,   688,   689,   690,   691,   692,   693,   694,   695,   696,
+     697,   698,     9,   461,   462,   463,   699,   700,   701,   702,
+     703,   704,   705,   466,   706,   707,   422,   708,    10,   460,
+     436,   461,   462,   463,   464,   465,   709,   476,   710,   711,
+     712,   466,   713,   714,   715,    11,   716,   717,   718,   719,
      720,   721,   722,    12,   723,   724,   725,   726,   727,   728,
      729,   730,   731,   732,   733,   734,   735,   736,   737,   738,
      739,   740,   741,   742,   743,   744,     0,    13,    37,    38,
@@ -1648,20 +1649,21 @@ static const yytype_uint16 yytable[] =
      808,   216,   217,   809,   810,   218,   219,   220,   221,   222,
      223,   224,   225,   811,   812,   813,   814,   815,   816,   817,
      818,   819,   820,   821,   822,   823,   824,   825,   826,   827,
-     828,   829,   830,   831,     0,     0,     0,     0,     0,     0,
+     828,   829,   830,   831,   832,   833,   834,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   480
+       0,     0,     0,     0,     0,     0,     0,     0,   480,   481,
+     482,   483
 };
 
 static const yytype_int16 yycheck[] =
 {
-       0,    43,    43,    45,    46,    43,    43,   111,    43,    10,
-      31,    11,    10,    10,    51,    52,   152,   153,   154,   155,
-     156,   157,   158,   159,   160,   161,   162,   163,   219,   220,
-     221,   222,   223,   224,   225,   226,   227,   228,    10,    10,
-      10,    79,    80,    10,    44,    10,    10,    10,    10,    10,
-      50,    95,    96,    97,    98,    99,   100,   101,   102,   236,
-     237,   238,   239,   240,   106,    10,   104,    10,    10,    10,
+       0,    43,    43,    45,    46,    43,    43,   111,    10,    10,
+      31,    11,    10,    10,    51,    52,    10,    10,    10,    10,
+      43,   152,   153,   154,   155,   156,   157,   158,   159,   160,
+     161,   162,   163,    95,    96,    97,    98,    99,   100,   101,
+     102,    79,    80,    10,    44,   236,   237,   238,   239,   240,
+      50,   219,   220,   221,   222,   223,   224,   225,   226,   227,
+     228,    10,    10,    10,   106,    10,   104,    10,    10,    10,
       10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
       10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
       10,    10,    10,    10,    94,   137,    10,    10,   140,   136,
@@ -1675,10 +1677,10 @@ static const yytype_int16 yycheck[] =
       10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
       10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
       10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
-      10,    10,   202,   244,    10,    10,    10,   242,    10,   244,
-     245,   246,   247,   248,    10,    10,   258,    10,   218,   254,
-     257,    10,    10,    10,    10,    10,    10,   268,    10,    10,
-      10,    10,    10,    10,    10,   235,    10,    10,    10,    10,
+      10,    10,   202,   244,   245,   246,    10,    10,    10,    10,
+      10,    10,    10,   254,    10,    10,   258,    10,   218,   242,
+     257,   244,   245,   246,   247,   248,    10,   268,    10,    10,
+      10,   254,    10,    10,    10,   235,    10,    10,    10,    10,
       10,    10,    10,   243,    10,    10,    10,    10,    10,    10,
       10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
       10,    10,    10,    10,    10,    10,    -1,   267,    12,    13,
@@ -1709,9 +1711,10 @@ static const yytype_int16 yycheck[] =
       10,   255,   256,    10,    10,   259,   260,   261,   262,   263,
      264,   265,   266,    10,    10,    10,    10,    10,    10,    10,
       10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
-      10,    10,    10,    10,    -1,    -1,    -1,    -1,    -1,    -1,
+      10,    10,    10,    10,    10,    10,    10,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    31
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    31,    31,
+      31,    31
 };
 
   /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@@ -1766,15 +1769,15 @@ static const yytype_uint16 yystos[] =
      204,   283,   496,   497,   498,   499,   500,   501,   502,    43,
      242,   244,   245,   246,   247,   248,   254,   286,   488,   489,
      490,   491,   492,   493,   494,   495,   268,   287,   290,   488,
-     489,    95,    96,    97,    98,    99,   100,   101,   102,   505,
-     506,   507,   508,   509,   510,   511,   512,   513,   152,   153,
-     154,   155,   156,   157,   158,   159,   160,   161,   162,   163,
-     516,   517,   518,   519,   520,   521,   522,   523,   524,   525,
-     526,   527,   528,   111,   531,   532,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   539,   540,   541,   542,
-     543,   544,   545,   546,   547,   548,   549,   236,   237,   238,
-     239,   240,   552,   553,   554,   555,   556,   557,    10,    10,
-      10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
+     489,   490,   491,   492,    95,    96,    97,    98,    99,   100,
+     101,   102,   505,   506,   507,   508,   509,   510,   511,   512,
+     513,   152,   153,   154,   155,   156,   157,   158,   159,   160,
+     161,   162,   163,   516,   517,   518,   519,   520,   521,   522,
+     523,   524,   525,   526,   527,   528,   111,   531,   532,   219,
+     220,   221,   222,   223,   224,   225,   226,   227,   228,   539,
+     540,   541,   542,   543,   544,   545,   546,   547,   548,   549,
+     236,   237,   238,   239,   240,   552,   553,   554,   555,   556,
+     557,    10,    10,    10,    10,    10,    10,    10,    10,    10,
       10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
       10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
       10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
@@ -1801,7 +1804,7 @@ static const yytype_uint16 yystos[] =
       10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
       10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
       10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
-      10,    10
+      10,    10,    10,    10,    10
 };
 
   /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
@@ -1832,37 +1835,38 @@ static const yytype_uint16 yyr1[] =
      280,   280,   280,   280,   280,   280,   281,   282,   282,   283,
      283,   283,   283,   283,   283,   283,   284,   285,   285,   286,
      286,   286,   286,   286,   286,   286,   286,   287,   288,   289,
-     289,   290,   290,   290,   291,   292,   293,   294,   295,   296,
-     297,   298,   299,   300,   301,   302,   303,   304,   305,   306,
-     307,   308,   309,   310,   311,   312,   313,   314,   315,   316,
-     317,   318,   319,   320,   321,   322,   323,   324,   325,   326,
-     327,   328,   329,   330,   331,   332,   333,   334,   335,   336,
-     337,   338,   339,   340,   341,   342,   343,   344,   345,   346,
-     347,   348,   349,   350,   351,   352,   353,   354,   355,   356,
-     357,   358,   359,   360,   361,   362,   363,   364,   365,   366,
-     367,   368,   369,   370,   371,   372,   373,   374,   375,   376,
-     377,   378,   379,   380,   381,   382,   383,   384,   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,   424,   425,   426,
-     427,   428,   429,   430,   431,   432,   433,   434,   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,   469,   470,   471,   472,   473,   474,   475,   476,
-     477,   478,   479,   480,   481,   482,   483,   484,   485,   486,
-     487,   488,   489,   490,   491,   492,   493,   494,   495,   496,
-     497,   498,   499,   500,   501,   502,   503,   504,   504,   505,
-     505,   505,   505,   505,   505,   505,   505,   506,   507,   508,
-     509,   510,   511,   512,   513,   514,   515,   515,   516,   516,
-     516,   516,   516,   516,   516,   516,   516,   516,   516,   516,
-     517,   518,   519,   520,   521,   522,   523,   524,   525,   526,
-     527,   528,   529,   530,   530,   531,   532,   533,   534,   535,
-     536,   537,   538,   538,   539,   539,   539,   539,   539,   539,
-     539,   539,   539,   539,   540,   541,   542,   543,   544,   545,
-     546,   547,   548,   549,   550,   551,   551,   552,   552,   552,
-     552,   552,   553,   554,   555,   556,   557,   558
+     289,   290,   290,   290,   290,   290,   290,   291,   292,   293,
+     294,   295,   296,   297,   298,   299,   300,   301,   302,   303,
+     304,   305,   306,   307,   308,   309,   310,   311,   312,   313,
+     314,   315,   316,   317,   318,   319,   320,   321,   322,   323,
+     324,   325,   326,   327,   328,   329,   330,   331,   332,   333,
+     334,   335,   336,   337,   338,   339,   340,   341,   342,   343,
+     344,   345,   346,   347,   348,   349,   350,   351,   352,   353,
+     354,   355,   356,   357,   358,   359,   360,   361,   362,   363,
+     364,   365,   366,   367,   368,   369,   370,   371,   372,   373,
+     374,   375,   376,   377,   378,   379,   380,   381,   382,   383,
+     384,   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,
+     424,   425,   426,   427,   428,   429,   430,   431,   432,   433,
+     434,   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,   469,   470,   471,   472,   473,
+     474,   475,   476,   477,   478,   479,   480,   481,   482,   483,
+     484,   485,   486,   487,   488,   489,   490,   491,   492,   493,
+     494,   495,   496,   497,   498,   499,   500,   501,   502,   503,
+     504,   504,   505,   505,   505,   505,   505,   505,   505,   505,
+     506,   507,   508,   509,   510,   511,   512,   513,   514,   515,
+     515,   516,   516,   516,   516,   516,   516,   516,   516,   516,
+     516,   516,   516,   517,   518,   519,   520,   521,   522,   523,
+     524,   525,   526,   527,   528,   529,   530,   530,   531,   532,
+     533,   534,   535,   536,   537,   538,   538,   539,   539,   539,
+     539,   539,   539,   539,   539,   539,   539,   540,   541,   542,
+     543,   544,   545,   546,   547,   548,   549,   550,   551,   551,
+     552,   552,   552,   552,   552,   553,   554,   555,   556,   557,
+     558
 };
 
   /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
@@ -1893,7 +1897,7 @@ static const yytype_uint8 yyr2[] =
        1,     1,     1,     1,     1,     1,     1,     2,     0,     1,
        1,     1,     1,     1,     1,     1,     1,     2,     0,     1,
        1,     1,     1,     1,     1,     1,     1,     2,     1,     2,
-       0,     1,     1,     1,     2,     2,     2,     2,     2,     2,
+       0,     1,     1,     1,     1,     1,     1,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -1905,25 +1909,26 @@ static const yytype_uint8 yyr2[] =
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     3,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     3,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     3,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       3,     3,     4,     4,     4,     3,     3,     2,     2,     2,
-       2,     2,     2,     3,     3,     2,     2,     2,     2,     2,
+       2,     2,     3,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     3,     3,     4,     4,     4,     3,     3,
+       2,     2,     2,     2,     2,     2,     3,     3,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       3,     3,     3,     2,     2,     2,     1,     2,     0,     1,
+       2,     2,     2,     3,     3,     3,     2,     2,     2,     1,
+       2,     0,     1,     1,     1,     1,     1,     1,     1,     1,
+       2,     2,     2,     2,     2,     2,     2,     2,     1,     2,
+       0,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     1,     2,     0,     1,     2,
+       2,     2,     3,     3,     1,     2,     0,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     2,     2,     2,
-       2,     2,     2,     2,     2,     1,     2,     0,     1,     1,
-       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     1,     2,     0,     1,     2,     2,     2,     3,
-       3,     1,     2,     0,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     1,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     1,     2,     0,     1,     1,     1,
-       1,     1,     2,     2,     2,     2,     2,     3
+       2,     2,     2,     2,     2,     2,     2,     1,     2,     0,
+       1,     1,     1,     1,     1,     2,     2,     2,     2,     2,
+       3
 };
 
 
@@ -2604,7 +2609,7 @@ yyreduce:
     { 
                OUTYY(("\nP(server:)\n")); 
        }
-#line 2608 "util/configparser.c" /* yacc.c:1646  */
+#line 2613 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 207:
@@ -2619,7 +2624,7 @@ yyreduce:
                } else 
                        yyerror("out of memory");
        }
-#line 2623 "util/configparser.c" /* yacc.c:1646  */
+#line 2628 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 217:
@@ -2634,7 +2639,7 @@ yyreduce:
                } else 
                        yyerror("out of memory");
        }
-#line 2638 "util/configparser.c" /* yacc.c:1646  */
+#line 2643 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 226:
@@ -2651,7 +2656,7 @@ yyreduce:
                } else 
                        yyerror("out of memory");
        }
-#line 2655 "util/configparser.c" /* yacc.c:1646  */
+#line 2660 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 236:
@@ -2671,7 +2676,7 @@ yyreduce:
                } else 
                        yyerror("out of memory");
        }
-#line 2675 "util/configparser.c" /* yacc.c:1646  */
+#line 2680 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 247:
@@ -2693,7 +2698,7 @@ yyreduce:
 
                }
        }
-#line 2697 "util/configparser.c" /* yacc.c:1646  */
+#line 2702 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 248:
@@ -2713,11 +2718,11 @@ yyreduce:
                } else 
                        yyerror("out of memory");
        }
-#line 2717 "util/configparser.c" /* yacc.c:1646  */
+#line 2722 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 254:
-#line 390 "./util/configparser.y" /* yacc.c:1646  */
+  case 257:
+#line 391 "./util/configparser.y" /* yacc.c:1646  */
     { 
                OUTYY(("P(server_num_threads:%s)\n", (yyvsp[0].str))); 
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -2725,11 +2730,11 @@ yyreduce:
                else cfg_parser->cfg->num_threads = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 2729 "util/configparser.c" /* yacc.c:1646  */
+#line 2734 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 255:
-#line 399 "./util/configparser.y" /* yacc.c:1646  */
+  case 258:
+#line 400 "./util/configparser.y" /* yacc.c:1646  */
     { 
                OUTYY(("P(server_verbosity:%s)\n", (yyvsp[0].str))); 
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -2737,11 +2742,11 @@ yyreduce:
                else cfg_parser->cfg->verbosity = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 2741 "util/configparser.c" /* yacc.c:1646  */
+#line 2746 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 256:
-#line 408 "./util/configparser.y" /* yacc.c:1646  */
+  case 259:
+#line 409 "./util/configparser.y" /* yacc.c:1646  */
     { 
                OUTYY(("P(server_statistics_interval:%s)\n", (yyvsp[0].str))); 
                if(strcmp((yyvsp[0].str), "") == 0 || strcmp((yyvsp[0].str), "0") == 0)
@@ -2751,11 +2756,11 @@ yyreduce:
                else cfg_parser->cfg->stat_interval = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 2755 "util/configparser.c" /* yacc.c:1646  */
+#line 2760 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 257:
-#line 419 "./util/configparser.y" /* yacc.c:1646  */
+  case 260:
+#line 420 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_statistics_cumulative:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -2763,11 +2768,11 @@ yyreduce:
                else cfg_parser->cfg->stat_cumulative = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 2767 "util/configparser.c" /* yacc.c:1646  */
+#line 2772 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 258:
-#line 428 "./util/configparser.y" /* yacc.c:1646  */
+  case 261:
+#line 429 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_extended_statistics:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -2775,11 +2780,11 @@ yyreduce:
                else cfg_parser->cfg->stat_extended = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 2779 "util/configparser.c" /* yacc.c:1646  */
+#line 2784 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 259:
-#line 437 "./util/configparser.y" /* yacc.c:1646  */
+  case 262:
+#line 438 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_shm_enable:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -2787,11 +2792,11 @@ yyreduce:
                else cfg_parser->cfg->shm_enable = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 2791 "util/configparser.c" /* yacc.c:1646  */
+#line 2796 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 260:
-#line 446 "./util/configparser.y" /* yacc.c:1646  */
+  case 263:
+#line 447 "./util/configparser.y" /* yacc.c:1646  */
     { 
                OUTYY(("P(server_shm_key:%s)\n", (yyvsp[0].str))); 
                if(strcmp((yyvsp[0].str), "") == 0 || strcmp((yyvsp[0].str), "0") == 0)
@@ -2801,11 +2806,11 @@ yyreduce:
                else cfg_parser->cfg->shm_key = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 2805 "util/configparser.c" /* yacc.c:1646  */
+#line 2810 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 261:
-#line 457 "./util/configparser.y" /* yacc.c:1646  */
+  case 264:
+#line 458 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_port:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0)
@@ -2813,11 +2818,11 @@ yyreduce:
                else cfg_parser->cfg->port = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 2817 "util/configparser.c" /* yacc.c:1646  */
+#line 2822 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 262:
-#line 466 "./util/configparser.y" /* yacc.c:1646  */
+  case 265:
+#line 467 "./util/configparser.y" /* yacc.c:1646  */
     {
        #ifdef CLIENT_SUBNET
                OUTYY(("P(server_send_client_subnet:%s)\n", (yyvsp[0].str)));
@@ -2827,11 +2832,11 @@ yyreduce:
                OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
        #endif
        }
-#line 2831 "util/configparser.c" /* yacc.c:1646  */
+#line 2836 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 263:
-#line 477 "./util/configparser.y" /* yacc.c:1646  */
+  case 266:
+#line 478 "./util/configparser.y" /* yacc.c:1646  */
     {
        #ifdef CLIENT_SUBNET
                OUTYY(("P(server_client_subnet_zone:%s)\n", (yyvsp[0].str)));
@@ -2842,11 +2847,11 @@ yyreduce:
                OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
        #endif
        }
-#line 2846 "util/configparser.c" /* yacc.c:1646  */
+#line 2851 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 264:
-#line 490 "./util/configparser.y" /* yacc.c:1646  */
+  case 267:
+#line 491 "./util/configparser.y" /* yacc.c:1646  */
     {
        #ifdef CLIENT_SUBNET
                OUTYY(("P(server_client_subnet_always_forward:%s)\n", (yyvsp[0].str)));
@@ -2860,11 +2865,11 @@ yyreduce:
        #endif
                free((yyvsp[0].str));
        }
-#line 2864 "util/configparser.c" /* yacc.c:1646  */
+#line 2869 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 265:
-#line 505 "./util/configparser.y" /* yacc.c:1646  */
+  case 268:
+#line 506 "./util/configparser.y" /* yacc.c:1646  */
     {
        #ifdef CLIENT_SUBNET
                OUTYY(("P(client_subnet_opcode:%s)\n", (yyvsp[0].str)));
@@ -2874,11 +2879,11 @@ yyreduce:
        #endif
                free((yyvsp[0].str));
        }
-#line 2878 "util/configparser.c" /* yacc.c:1646  */
+#line 2883 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 266:
-#line 516 "./util/configparser.y" /* yacc.c:1646  */
+  case 269:
+#line 517 "./util/configparser.y" /* yacc.c:1646  */
     {
        #ifdef CLIENT_SUBNET
                OUTYY(("P(max_client_subnet_ipv4:%s)\n", (yyvsp[0].str)));
@@ -2894,11 +2899,11 @@ yyreduce:
        #endif
                free((yyvsp[0].str));
        }
-#line 2898 "util/configparser.c" /* yacc.c:1646  */
+#line 2903 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 267:
-#line 533 "./util/configparser.y" /* yacc.c:1646  */
+  case 270:
+#line 534 "./util/configparser.y" /* yacc.c:1646  */
     {
        #ifdef CLIENT_SUBNET
                OUTYY(("P(max_client_subnet_ipv6:%s)\n", (yyvsp[0].str)));
@@ -2914,11 +2919,11 @@ yyreduce:
        #endif
                free((yyvsp[0].str));
        }
-#line 2918 "util/configparser.c" /* yacc.c:1646  */
+#line 2923 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 268:
-#line 550 "./util/configparser.y" /* yacc.c:1646  */
+  case 271:
+#line 551 "./util/configparser.y" /* yacc.c:1646  */
     {
        #ifdef CLIENT_SUBNET
                OUTYY(("P(min_client_subnet_ipv4:%s)\n", (yyvsp[0].str)));
@@ -2934,11 +2939,11 @@ yyreduce:
        #endif
                free((yyvsp[0].str));
        }
-#line 2938 "util/configparser.c" /* yacc.c:1646  */
+#line 2943 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 269:
-#line 567 "./util/configparser.y" /* yacc.c:1646  */
+  case 272:
+#line 568 "./util/configparser.y" /* yacc.c:1646  */
     {
        #ifdef CLIENT_SUBNET
                OUTYY(("P(min_client_subnet_ipv6:%s)\n", (yyvsp[0].str)));
@@ -2954,11 +2959,11 @@ yyreduce:
        #endif
                free((yyvsp[0].str));
        }
-#line 2958 "util/configparser.c" /* yacc.c:1646  */
+#line 2963 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 270:
-#line 584 "./util/configparser.y" /* yacc.c:1646  */
+  case 273:
+#line 585 "./util/configparser.y" /* yacc.c:1646  */
     {
        #ifdef CLIENT_SUBNET
                OUTYY(("P(max_ecs_tree_size_ipv4:%s)\n", (yyvsp[0].str)));
@@ -2972,11 +2977,11 @@ yyreduce:
        #endif
                free((yyvsp[0].str));
        }
-#line 2976 "util/configparser.c" /* yacc.c:1646  */
+#line 2981 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 271:
-#line 599 "./util/configparser.y" /* yacc.c:1646  */
+  case 274:
+#line 600 "./util/configparser.y" /* yacc.c:1646  */
     {
        #ifdef CLIENT_SUBNET
                OUTYY(("P(max_ecs_tree_size_ipv6:%s)\n", (yyvsp[0].str)));
@@ -2990,11 +2995,11 @@ yyreduce:
        #endif
                free((yyvsp[0].str));
        }
-#line 2994 "util/configparser.c" /* yacc.c:1646  */
+#line 2999 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 272:
-#line 614 "./util/configparser.y" /* yacc.c:1646  */
+  case 275:
+#line 615 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_interface:%s)\n", (yyvsp[0].str)));
                if(cfg_parser->cfg->num_ifs == 0)
@@ -3006,11 +3011,11 @@ yyreduce:
                else
                        cfg_parser->cfg->ifs[cfg_parser->cfg->num_ifs++] = (yyvsp[0].str);
        }
-#line 3010 "util/configparser.c" /* yacc.c:1646  */
+#line 3015 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 273:
-#line 627 "./util/configparser.y" /* yacc.c:1646  */
+  case 276:
+#line 628 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_outgoing_interface:%s)\n", (yyvsp[0].str)));
                if(cfg_parser->cfg->num_out_ifs == 0)
@@ -3024,11 +3029,11 @@ yyreduce:
                        cfg_parser->cfg->out_ifs[
                                cfg_parser->cfg->num_out_ifs++] = (yyvsp[0].str);
        }
-#line 3028 "util/configparser.c" /* yacc.c:1646  */
+#line 3033 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 274:
-#line 642 "./util/configparser.y" /* yacc.c:1646  */
+  case 277:
+#line 643 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_outgoing_range:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0)
@@ -3036,11 +3041,11 @@ yyreduce:
                else cfg_parser->cfg->outgoing_num_ports = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3040 "util/configparser.c" /* yacc.c:1646  */
+#line 3045 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 275:
-#line 651 "./util/configparser.y" /* yacc.c:1646  */
+  case 278:
+#line 652 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_outgoing_port_permit:%s)\n", (yyvsp[0].str)));
                if(!cfg_mark_ports((yyvsp[0].str), 1, 
@@ -3048,11 +3053,11 @@ yyreduce:
                        yyerror("port number or range (\"low-high\") expected");
                free((yyvsp[0].str));
        }
-#line 3052 "util/configparser.c" /* yacc.c:1646  */
+#line 3057 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 276:
-#line 660 "./util/configparser.y" /* yacc.c:1646  */
+  case 279:
+#line 661 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_outgoing_port_avoid:%s)\n", (yyvsp[0].str)));
                if(!cfg_mark_ports((yyvsp[0].str), 0, 
@@ -3060,11 +3065,11 @@ yyreduce:
                        yyerror("port number or range (\"low-high\") expected");
                free((yyvsp[0].str));
        }
-#line 3064 "util/configparser.c" /* yacc.c:1646  */
+#line 3069 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 277:
-#line 669 "./util/configparser.y" /* yacc.c:1646  */
+  case 280:
+#line 670 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_outgoing_num_tcp:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3072,11 +3077,11 @@ yyreduce:
                else cfg_parser->cfg->outgoing_num_tcp = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3076 "util/configparser.c" /* yacc.c:1646  */
+#line 3081 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 278:
-#line 678 "./util/configparser.y" /* yacc.c:1646  */
+  case 281:
+#line 679 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_incoming_num_tcp:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3084,11 +3089,11 @@ yyreduce:
                else cfg_parser->cfg->incoming_num_tcp = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3088 "util/configparser.c" /* yacc.c:1646  */
+#line 3093 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 279:
-#line 687 "./util/configparser.y" /* yacc.c:1646  */
+  case 282:
+#line 688 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_interface_automatic:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3096,11 +3101,11 @@ yyreduce:
                else cfg_parser->cfg->if_automatic = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3100 "util/configparser.c" /* yacc.c:1646  */
+#line 3105 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 280:
-#line 696 "./util/configparser.y" /* yacc.c:1646  */
+  case 283:
+#line 697 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_do_ip4:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3108,11 +3113,11 @@ yyreduce:
                else cfg_parser->cfg->do_ip4 = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3112 "util/configparser.c" /* yacc.c:1646  */
+#line 3117 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 281:
-#line 705 "./util/configparser.y" /* yacc.c:1646  */
+  case 284:
+#line 706 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_do_ip6:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3120,11 +3125,11 @@ yyreduce:
                else cfg_parser->cfg->do_ip6 = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3124 "util/configparser.c" /* yacc.c:1646  */
+#line 3129 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 282:
-#line 714 "./util/configparser.y" /* yacc.c:1646  */
+  case 285:
+#line 715 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_do_udp:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3132,11 +3137,11 @@ yyreduce:
                else cfg_parser->cfg->do_udp = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3136 "util/configparser.c" /* yacc.c:1646  */
+#line 3141 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 283:
-#line 723 "./util/configparser.y" /* yacc.c:1646  */
+  case 286:
+#line 724 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_do_tcp:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3144,11 +3149,11 @@ yyreduce:
                else cfg_parser->cfg->do_tcp = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3148 "util/configparser.c" /* yacc.c:1646  */
+#line 3153 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 284:
-#line 732 "./util/configparser.y" /* yacc.c:1646  */
+  case 287:
+#line 733 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_prefer_ip6:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3156,11 +3161,11 @@ yyreduce:
                else cfg_parser->cfg->prefer_ip6 = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3160 "util/configparser.c" /* yacc.c:1646  */
+#line 3165 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 285:
-#line 741 "./util/configparser.y" /* yacc.c:1646  */
+  case 288:
+#line 742 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_tcp_mss:%s)\n", (yyvsp[0].str)));
                 if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3168,11 +3173,11 @@ yyreduce:
                 else cfg_parser->cfg->tcp_mss = atoi((yyvsp[0].str));
                 free((yyvsp[0].str));
        }
-#line 3172 "util/configparser.c" /* yacc.c:1646  */
+#line 3177 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 286:
-#line 750 "./util/configparser.y" /* yacc.c:1646  */
+  case 289:
+#line 751 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_outgoing_tcp_mss:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3180,11 +3185,11 @@ yyreduce:
                else cfg_parser->cfg->outgoing_tcp_mss = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3184 "util/configparser.c" /* yacc.c:1646  */
+#line 3189 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 287:
-#line 759 "./util/configparser.y" /* yacc.c:1646  */
+  case 290:
+#line 760 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_tcp_idle_timeout:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3196,11 +3201,11 @@ yyreduce:
                else cfg_parser->cfg->tcp_idle_timeout = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3200 "util/configparser.c" /* yacc.c:1646  */
+#line 3205 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 288:
-#line 772 "./util/configparser.y" /* yacc.c:1646  */
+  case 291:
+#line 773 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_tcp_keepalive:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3208,11 +3213,11 @@ yyreduce:
                else cfg_parser->cfg->do_tcp_keepalive = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3212 "util/configparser.c" /* yacc.c:1646  */
+#line 3217 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 289:
-#line 781 "./util/configparser.y" /* yacc.c:1646  */
+  case 292:
+#line 782 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_tcp_keepalive_timeout:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3224,11 +3229,11 @@ yyreduce:
                else cfg_parser->cfg->tcp_keepalive_timeout = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3228 "util/configparser.c" /* yacc.c:1646  */
+#line 3233 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 290:
-#line 794 "./util/configparser.y" /* yacc.c:1646  */
+  case 293:
+#line 795 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_tcp_upstream:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3236,11 +3241,11 @@ yyreduce:
                else cfg_parser->cfg->tcp_upstream = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3240 "util/configparser.c" /* yacc.c:1646  */
+#line 3245 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 291:
-#line 803 "./util/configparser.y" /* yacc.c:1646  */
+  case 294:
+#line 804 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_udp_upstream_without_downstream:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3248,11 +3253,11 @@ yyreduce:
                else cfg_parser->cfg->udp_upstream_without_downstream = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3252 "util/configparser.c" /* yacc.c:1646  */
+#line 3257 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 292:
-#line 812 "./util/configparser.y" /* yacc.c:1646  */
+  case 295:
+#line 813 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_ssl_upstream:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3260,31 +3265,31 @@ yyreduce:
                else cfg_parser->cfg->ssl_upstream = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3264 "util/configparser.c" /* yacc.c:1646  */
+#line 3269 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 293:
-#line 821 "./util/configparser.y" /* yacc.c:1646  */
+  case 296:
+#line 822 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_ssl_service_key:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->ssl_service_key);
                cfg_parser->cfg->ssl_service_key = (yyvsp[0].str);
        }
-#line 3274 "util/configparser.c" /* yacc.c:1646  */
+#line 3279 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 294:
-#line 828 "./util/configparser.y" /* yacc.c:1646  */
+  case 297:
+#line 829 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_ssl_service_pem:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->ssl_service_pem);
                cfg_parser->cfg->ssl_service_pem = (yyvsp[0].str);
        }
-#line 3284 "util/configparser.c" /* yacc.c:1646  */
+#line 3289 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 295:
-#line 835 "./util/configparser.y" /* yacc.c:1646  */
+  case 298:
+#line 836 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_ssl_port:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0)
@@ -3292,21 +3297,21 @@ yyreduce:
                else cfg_parser->cfg->ssl_port = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3296 "util/configparser.c" /* yacc.c:1646  */
+#line 3301 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 296:
-#line 844 "./util/configparser.y" /* yacc.c:1646  */
+  case 299:
+#line 845 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_tls_cert_bundle:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->tls_cert_bundle);
                cfg_parser->cfg->tls_cert_bundle = (yyvsp[0].str);
        }
-#line 3306 "util/configparser.c" /* yacc.c:1646  */
+#line 3311 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 297:
-#line 851 "./util/configparser.y" /* yacc.c:1646  */
+  case 300:
+#line 852 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_tls_win_cert:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3314,53 +3319,53 @@ yyreduce:
                else cfg_parser->cfg->tls_win_cert = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3318 "util/configparser.c" /* yacc.c:1646  */
+#line 3323 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 298:
-#line 860 "./util/configparser.y" /* yacc.c:1646  */
+  case 301:
+#line 861 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_tls_additional_port:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->tls_additional_port,
                        (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 3329 "util/configparser.c" /* yacc.c:1646  */
+#line 3334 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 299:
-#line 868 "./util/configparser.y" /* yacc.c:1646  */
+  case 302:
+#line 869 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_tls_ciphers:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->tls_ciphers);
                cfg_parser->cfg->tls_ciphers = (yyvsp[0].str);
        }
-#line 3339 "util/configparser.c" /* yacc.c:1646  */
+#line 3344 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 300:
-#line 875 "./util/configparser.y" /* yacc.c:1646  */
+  case 303:
+#line 876 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_tls_ciphersuites:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->tls_ciphersuites);
                cfg_parser->cfg->tls_ciphersuites = (yyvsp[0].str);
        }
-#line 3349 "util/configparser.c" /* yacc.c:1646  */
+#line 3354 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 301:
-#line 882 "./util/configparser.y" /* yacc.c:1646  */
+  case 304:
+#line 883 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_tls_session_ticket_keys:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_append(&cfg_parser->cfg->tls_session_ticket_keys,
                        (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 3360 "util/configparser.c" /* yacc.c:1646  */
+#line 3365 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 302:
-#line 890 "./util/configparser.y" /* yacc.c:1646  */
+  case 305:
+#line 891 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_use_systemd:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3368,11 +3373,11 @@ yyreduce:
                else cfg_parser->cfg->use_systemd = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3372 "util/configparser.c" /* yacc.c:1646  */
+#line 3377 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 303:
-#line 899 "./util/configparser.y" /* yacc.c:1646  */
+  case 306:
+#line 900 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_do_daemonize:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3380,11 +3385,11 @@ yyreduce:
                else cfg_parser->cfg->do_daemonize = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3384 "util/configparser.c" /* yacc.c:1646  */
+#line 3389 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 304:
-#line 908 "./util/configparser.y" /* yacc.c:1646  */
+  case 307:
+#line 909 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_use_syslog:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3397,11 +3402,11 @@ yyreduce:
 #endif
                free((yyvsp[0].str));
        }
-#line 3401 "util/configparser.c" /* yacc.c:1646  */
+#line 3406 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 305:
-#line 922 "./util/configparser.y" /* yacc.c:1646  */
+  case 308:
+#line 923 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_log_time_ascii:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3409,11 +3414,11 @@ yyreduce:
                else cfg_parser->cfg->log_time_ascii = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3413 "util/configparser.c" /* yacc.c:1646  */
+#line 3418 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 306:
-#line 931 "./util/configparser.y" /* yacc.c:1646  */
+  case 309:
+#line 932 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_log_queries:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3421,11 +3426,11 @@ yyreduce:
                else cfg_parser->cfg->log_queries = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3425 "util/configparser.c" /* yacc.c:1646  */
+#line 3430 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 307:
-#line 940 "./util/configparser.y" /* yacc.c:1646  */
+  case 310:
+#line 941 "./util/configparser.y" /* yacc.c:1646  */
     {
        OUTYY(("P(server_log_replies:%s)\n", (yyvsp[0].str)));
        if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3433,11 +3438,11 @@ yyreduce:
        else cfg_parser->cfg->log_replies = (strcmp((yyvsp[0].str), "yes")==0);
        free((yyvsp[0].str));
   }
-#line 3437 "util/configparser.c" /* yacc.c:1646  */
+#line 3442 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 308:
-#line 949 "./util/configparser.y" /* yacc.c:1646  */
+  case 311:
+#line 950 "./util/configparser.y" /* yacc.c:1646  */
     {
        OUTYY(("P(server_log_tag_queryreply:%s)\n", (yyvsp[0].str)));
        if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3445,11 +3450,11 @@ yyreduce:
        else cfg_parser->cfg->log_tag_queryreply = (strcmp((yyvsp[0].str), "yes")==0);
        free((yyvsp[0].str));
   }
-#line 3449 "util/configparser.c" /* yacc.c:1646  */
+#line 3454 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 309:
-#line 958 "./util/configparser.y" /* yacc.c:1646  */
+  case 312:
+#line 959 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_log_servfail:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3457,11 +3462,11 @@ yyreduce:
                else cfg_parser->cfg->log_servfail = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3461 "util/configparser.c" /* yacc.c:1646  */
+#line 3466 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 310:
-#line 967 "./util/configparser.y" /* yacc.c:1646  */
+  case 313:
+#line 968 "./util/configparser.y" /* yacc.c:1646  */
     {
        OUTYY(("P(server_log_local_actions:%s)\n", (yyvsp[0].str)));
        if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3469,31 +3474,31 @@ yyreduce:
        else cfg_parser->cfg->log_local_actions = (strcmp((yyvsp[0].str), "yes")==0);
        free((yyvsp[0].str));
   }
-#line 3473 "util/configparser.c" /* yacc.c:1646  */
+#line 3478 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 311:
-#line 976 "./util/configparser.y" /* yacc.c:1646  */
+  case 314:
+#line 977 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_chroot:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->chrootdir);
                cfg_parser->cfg->chrootdir = (yyvsp[0].str);
        }
-#line 3483 "util/configparser.c" /* yacc.c:1646  */
+#line 3488 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 312:
-#line 983 "./util/configparser.y" /* yacc.c:1646  */
+  case 315:
+#line 984 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_username:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->username);
                cfg_parser->cfg->username = (yyvsp[0].str);
        }
-#line 3493 "util/configparser.c" /* yacc.c:1646  */
+#line 3498 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 313:
-#line 990 "./util/configparser.y" /* yacc.c:1646  */
+  case 316:
+#line 991 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_directory:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->directory);
@@ -3518,105 +3523,105 @@ yyreduce:
                        }
                }
        }
-#line 3522 "util/configparser.c" /* yacc.c:1646  */
+#line 3527 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 314:
-#line 1016 "./util/configparser.y" /* yacc.c:1646  */
+  case 317:
+#line 1017 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_logfile:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->logfile);
                cfg_parser->cfg->logfile = (yyvsp[0].str);
                cfg_parser->cfg->use_syslog = 0;
        }
-#line 3533 "util/configparser.c" /* yacc.c:1646  */
+#line 3538 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 315:
-#line 1024 "./util/configparser.y" /* yacc.c:1646  */
+  case 318:
+#line 1025 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_pidfile:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->pidfile);
                cfg_parser->cfg->pidfile = (yyvsp[0].str);
        }
-#line 3543 "util/configparser.c" /* yacc.c:1646  */
+#line 3548 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 316:
-#line 1031 "./util/configparser.y" /* yacc.c:1646  */
+  case 319:
+#line 1032 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_root_hints:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->root_hints, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 3553 "util/configparser.c" /* yacc.c:1646  */
+#line 3558 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 317:
-#line 1038 "./util/configparser.y" /* yacc.c:1646  */
+  case 320:
+#line 1039 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_dlv_anchor_file:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->dlv_anchor_file);
                cfg_parser->cfg->dlv_anchor_file = (yyvsp[0].str);
        }
-#line 3563 "util/configparser.c" /* yacc.c:1646  */
+#line 3568 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 318:
-#line 1045 "./util/configparser.y" /* yacc.c:1646  */
+  case 321:
+#line 1046 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_dlv_anchor:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->dlv_anchor_list, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 3573 "util/configparser.c" /* yacc.c:1646  */
+#line 3578 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 319:
-#line 1052 "./util/configparser.y" /* yacc.c:1646  */
+  case 322:
+#line 1053 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_auto_trust_anchor_file:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->
                        auto_trust_anchor_file_list, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 3584 "util/configparser.c" /* yacc.c:1646  */
+#line 3589 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 320:
-#line 1060 "./util/configparser.y" /* yacc.c:1646  */
+  case 323:
+#line 1061 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_trust_anchor_file:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->
                        trust_anchor_file_list, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 3595 "util/configparser.c" /* yacc.c:1646  */
+#line 3600 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 321:
-#line 1068 "./util/configparser.y" /* yacc.c:1646  */
+  case 324:
+#line 1069 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_trusted_keys_file:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->
                        trusted_keys_file_list, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 3606 "util/configparser.c" /* yacc.c:1646  */
+#line 3611 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 322:
-#line 1076 "./util/configparser.y" /* yacc.c:1646  */
+  case 325:
+#line 1077 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_trust_anchor:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->trust_anchor_list, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 3616 "util/configparser.c" /* yacc.c:1646  */
+#line 3621 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 323:
-#line 1083 "./util/configparser.y" /* yacc.c:1646  */
+  case 326:
+#line 1084 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_trust_anchor_signaling:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3626,11 +3631,11 @@ yyreduce:
                                (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3630 "util/configparser.c" /* yacc.c:1646  */
+#line 3635 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 324:
-#line 1094 "./util/configparser.y" /* yacc.c:1646  */
+  case 327:
+#line 1095 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_root_key_sentinel:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3640,21 +3645,21 @@ yyreduce:
                                (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3644 "util/configparser.c" /* yacc.c:1646  */
+#line 3649 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 325:
-#line 1105 "./util/configparser.y" /* yacc.c:1646  */
+  case 328:
+#line 1106 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_domain_insecure:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->domain_insecure, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 3654 "util/configparser.c" /* yacc.c:1646  */
+#line 3659 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 326:
-#line 1112 "./util/configparser.y" /* yacc.c:1646  */
+  case 329:
+#line 1113 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_hide_identity:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3662,11 +3667,11 @@ yyreduce:
                else cfg_parser->cfg->hide_identity = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3666 "util/configparser.c" /* yacc.c:1646  */
+#line 3671 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 327:
-#line 1121 "./util/configparser.y" /* yacc.c:1646  */
+  case 330:
+#line 1122 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_hide_version:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3674,11 +3679,11 @@ yyreduce:
                else cfg_parser->cfg->hide_version = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3678 "util/configparser.c" /* yacc.c:1646  */
+#line 3683 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 328:
-#line 1130 "./util/configparser.y" /* yacc.c:1646  */
+  case 331:
+#line 1131 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_hide_trustanchor:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3686,53 +3691,53 @@ yyreduce:
                else cfg_parser->cfg->hide_trustanchor = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3690 "util/configparser.c" /* yacc.c:1646  */
+#line 3695 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 329:
-#line 1139 "./util/configparser.y" /* yacc.c:1646  */
+  case 332:
+#line 1140 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_identity:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->identity);
                cfg_parser->cfg->identity = (yyvsp[0].str);
        }
-#line 3700 "util/configparser.c" /* yacc.c:1646  */
+#line 3705 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 330:
-#line 1146 "./util/configparser.y" /* yacc.c:1646  */
+  case 333:
+#line 1147 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_version:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->version);
                cfg_parser->cfg->version = (yyvsp[0].str);
        }
-#line 3710 "util/configparser.c" /* yacc.c:1646  */
+#line 3715 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 331:
-#line 1153 "./util/configparser.y" /* yacc.c:1646  */
+  case 334:
+#line 1154 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_so_rcvbuf:%s)\n", (yyvsp[0].str)));
                if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->so_rcvbuf))
                        yyerror("buffer size expected");
                free((yyvsp[0].str));
        }
-#line 3721 "util/configparser.c" /* yacc.c:1646  */
+#line 3726 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 332:
-#line 1161 "./util/configparser.y" /* yacc.c:1646  */
+  case 335:
+#line 1162 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_so_sndbuf:%s)\n", (yyvsp[0].str)));
                if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->so_sndbuf))
                        yyerror("buffer size expected");
                free((yyvsp[0].str));
        }
-#line 3732 "util/configparser.c" /* yacc.c:1646  */
+#line 3737 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 333:
-#line 1169 "./util/configparser.y" /* yacc.c:1646  */
+  case 336:
+#line 1170 "./util/configparser.y" /* yacc.c:1646  */
     {
         OUTYY(("P(server_so_reuseport:%s)\n", (yyvsp[0].str)));
         if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3741,11 +3746,11 @@ yyreduce:
             (strcmp((yyvsp[0].str), "yes")==0);
         free((yyvsp[0].str));
     }
-#line 3745 "util/configparser.c" /* yacc.c:1646  */
+#line 3750 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 334:
-#line 1179 "./util/configparser.y" /* yacc.c:1646  */
+  case 337:
+#line 1180 "./util/configparser.y" /* yacc.c:1646  */
     {
         OUTYY(("P(server_ip_transparent:%s)\n", (yyvsp[0].str)));
         if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3754,11 +3759,11 @@ yyreduce:
             (strcmp((yyvsp[0].str), "yes")==0);
         free((yyvsp[0].str));
     }
-#line 3758 "util/configparser.c" /* yacc.c:1646  */
+#line 3763 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 335:
-#line 1189 "./util/configparser.y" /* yacc.c:1646  */
+  case 338:
+#line 1190 "./util/configparser.y" /* yacc.c:1646  */
     {
         OUTYY(("P(server_ip_freebind:%s)\n", (yyvsp[0].str)));
         if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3767,22 +3772,22 @@ yyreduce:
             (strcmp((yyvsp[0].str), "yes")==0);
         free((yyvsp[0].str));
     }
-#line 3771 "util/configparser.c" /* yacc.c:1646  */
+#line 3776 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 336:
-#line 1199 "./util/configparser.y" /* yacc.c:1646  */
+  case 339:
+#line 1200 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_stream_wait_size:%s)\n", (yyvsp[0].str)));
                if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->stream_wait_size))
                        yyerror("memory size expected");
                free((yyvsp[0].str));
        }
-#line 3782 "util/configparser.c" /* yacc.c:1646  */
+#line 3787 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 337:
-#line 1207 "./util/configparser.y" /* yacc.c:1646  */
+  case 340:
+#line 1208 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_edns_buffer_size:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0)
@@ -3794,11 +3799,11 @@ yyreduce:
                else cfg_parser->cfg->edns_buffer_size = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3798 "util/configparser.c" /* yacc.c:1646  */
+#line 3803 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 338:
-#line 1220 "./util/configparser.y" /* yacc.c:1646  */
+  case 341:
+#line 1221 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_msg_buffer_size:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0)
@@ -3808,22 +3813,22 @@ yyreduce:
                else cfg_parser->cfg->msg_buffer_size = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3812 "util/configparser.c" /* yacc.c:1646  */
+#line 3817 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 339:
-#line 1231 "./util/configparser.y" /* yacc.c:1646  */
+  case 342:
+#line 1232 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_msg_cache_size:%s)\n", (yyvsp[0].str)));
                if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->msg_cache_size))
                        yyerror("memory size expected");
                free((yyvsp[0].str));
        }
-#line 3823 "util/configparser.c" /* yacc.c:1646  */
+#line 3828 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 340:
-#line 1239 "./util/configparser.y" /* yacc.c:1646  */
+  case 343:
+#line 1240 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_msg_cache_slabs:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0)
@@ -3835,11 +3840,11 @@ yyreduce:
                }
                free((yyvsp[0].str));
        }
-#line 3839 "util/configparser.c" /* yacc.c:1646  */
+#line 3844 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 341:
-#line 1252 "./util/configparser.y" /* yacc.c:1646  */
+  case 344:
+#line 1253 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_num_queries_per_thread:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0)
@@ -3847,11 +3852,11 @@ yyreduce:
                else cfg_parser->cfg->num_queries_per_thread = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3851 "util/configparser.c" /* yacc.c:1646  */
+#line 3856 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 342:
-#line 1261 "./util/configparser.y" /* yacc.c:1646  */
+  case 345:
+#line 1262 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_jostle_timeout:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3859,11 +3864,11 @@ yyreduce:
                else cfg_parser->cfg->jostle_time = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3863 "util/configparser.c" /* yacc.c:1646  */
+#line 3868 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 343:
-#line 1270 "./util/configparser.y" /* yacc.c:1646  */
+  case 346:
+#line 1271 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_delay_close:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3871,11 +3876,11 @@ yyreduce:
                else cfg_parser->cfg->delay_close = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3875 "util/configparser.c" /* yacc.c:1646  */
+#line 3880 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 344:
-#line 1279 "./util/configparser.y" /* yacc.c:1646  */
+  case 347:
+#line 1280 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_unblock_lan_zones:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3884,11 +3889,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3888 "util/configparser.c" /* yacc.c:1646  */
+#line 3893 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 345:
-#line 1289 "./util/configparser.y" /* yacc.c:1646  */
+  case 348:
+#line 1290 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_insecure_lan_zones:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3897,22 +3902,22 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3901 "util/configparser.c" /* yacc.c:1646  */
+#line 3906 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 346:
-#line 1299 "./util/configparser.y" /* yacc.c:1646  */
+  case 349:
+#line 1300 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_rrset_cache_size:%s)\n", (yyvsp[0].str)));
                if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->rrset_cache_size))
                        yyerror("memory size expected");
                free((yyvsp[0].str));
        }
-#line 3912 "util/configparser.c" /* yacc.c:1646  */
+#line 3917 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 347:
-#line 1307 "./util/configparser.y" /* yacc.c:1646  */
+  case 350:
+#line 1308 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_rrset_cache_slabs:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0)
@@ -3924,11 +3929,11 @@ yyreduce:
                }
                free((yyvsp[0].str));
        }
-#line 3928 "util/configparser.c" /* yacc.c:1646  */
+#line 3933 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 348:
-#line 1320 "./util/configparser.y" /* yacc.c:1646  */
+  case 351:
+#line 1321 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_infra_host_ttl:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3936,22 +3941,22 @@ yyreduce:
                else cfg_parser->cfg->host_ttl = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3940 "util/configparser.c" /* yacc.c:1646  */
+#line 3945 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 349:
-#line 1329 "./util/configparser.y" /* yacc.c:1646  */
+  case 352:
+#line 1330 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_infra_lame_ttl:%s)\n", (yyvsp[0].str)));
                verbose(VERB_DETAIL, "ignored infra-lame-ttl: %s (option "
                        "removed, use infra-host-ttl)", (yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3951 "util/configparser.c" /* yacc.c:1646  */
+#line 3956 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 350:
-#line 1337 "./util/configparser.y" /* yacc.c:1646  */
+  case 353:
+#line 1338 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_infra_cache_numhosts:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0)
@@ -3959,22 +3964,22 @@ yyreduce:
                else cfg_parser->cfg->infra_cache_numhosts = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3963 "util/configparser.c" /* yacc.c:1646  */
+#line 3968 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 351:
-#line 1346 "./util/configparser.y" /* yacc.c:1646  */
+  case 354:
+#line 1347 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_infra_cache_lame_size:%s)\n", (yyvsp[0].str)));
                verbose(VERB_DETAIL, "ignored infra-cache-lame-size: %s "
                        "(option removed, use infra-cache-numhosts)", (yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3974 "util/configparser.c" /* yacc.c:1646  */
+#line 3979 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 352:
-#line 1354 "./util/configparser.y" /* yacc.c:1646  */
+  case 355:
+#line 1355 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_infra_cache_slabs:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0)
@@ -3986,11 +3991,11 @@ yyreduce:
                }
                free((yyvsp[0].str));
        }
-#line 3990 "util/configparser.c" /* yacc.c:1646  */
+#line 3995 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 353:
-#line 1367 "./util/configparser.y" /* yacc.c:1646  */
+  case 356:
+#line 1368 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_infra_cache_min_rtt:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3998,21 +4003,21 @@ yyreduce:
                else cfg_parser->cfg->infra_cache_min_rtt = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4002 "util/configparser.c" /* yacc.c:1646  */
+#line 4007 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 354:
-#line 1376 "./util/configparser.y" /* yacc.c:1646  */
+  case 357:
+#line 1377 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_target_fetch_policy:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->target_fetch_policy);
                cfg_parser->cfg->target_fetch_policy = (yyvsp[0].str);
        }
-#line 4012 "util/configparser.c" /* yacc.c:1646  */
+#line 4017 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 355:
-#line 1383 "./util/configparser.y" /* yacc.c:1646  */
+  case 358:
+#line 1384 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_harden_short_bufsize:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4021,11 +4026,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4025 "util/configparser.c" /* yacc.c:1646  */
+#line 4030 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 356:
-#line 1393 "./util/configparser.y" /* yacc.c:1646  */
+  case 359:
+#line 1394 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_harden_large_queries:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4034,11 +4039,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4038 "util/configparser.c" /* yacc.c:1646  */
+#line 4043 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 357:
-#line 1403 "./util/configparser.y" /* yacc.c:1646  */
+  case 360:
+#line 1404 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_harden_glue:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4047,11 +4052,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4051 "util/configparser.c" /* yacc.c:1646  */
+#line 4056 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 358:
-#line 1413 "./util/configparser.y" /* yacc.c:1646  */
+  case 361:
+#line 1414 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_harden_dnssec_stripped:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4060,11 +4065,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4064 "util/configparser.c" /* yacc.c:1646  */
+#line 4069 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 359:
-#line 1423 "./util/configparser.y" /* yacc.c:1646  */
+  case 362:
+#line 1424 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_harden_below_nxdomain:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4073,11 +4078,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4077 "util/configparser.c" /* yacc.c:1646  */
+#line 4082 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 360:
-#line 1433 "./util/configparser.y" /* yacc.c:1646  */
+  case 363:
+#line 1434 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_harden_referral_path:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4086,11 +4091,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4090 "util/configparser.c" /* yacc.c:1646  */
+#line 4095 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 361:
-#line 1443 "./util/configparser.y" /* yacc.c:1646  */
+  case 364:
+#line 1444 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_harden_algo_downgrade:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4099,11 +4104,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4103 "util/configparser.c" /* yacc.c:1646  */
+#line 4108 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 362:
-#line 1453 "./util/configparser.y" /* yacc.c:1646  */
+  case 365:
+#line 1454 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_use_caps_for_id:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4112,41 +4117,41 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4116 "util/configparser.c" /* yacc.c:1646  */
+#line 4121 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 363:
-#line 1463 "./util/configparser.y" /* yacc.c:1646  */
+  case 366:
+#line 1464 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_caps_whitelist:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->caps_whitelist, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 4126 "util/configparser.c" /* yacc.c:1646  */
+#line 4131 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 364:
-#line 1470 "./util/configparser.y" /* yacc.c:1646  */
+  case 367:
+#line 1471 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_private_address:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->private_address, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 4136 "util/configparser.c" /* yacc.c:1646  */
+#line 4141 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 365:
-#line 1477 "./util/configparser.y" /* yacc.c:1646  */
+  case 368:
+#line 1478 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_private_domain:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->private_domain, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 4146 "util/configparser.c" /* yacc.c:1646  */
+#line 4151 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 366:
-#line 1484 "./util/configparser.y" /* yacc.c:1646  */
+  case 369:
+#line 1485 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_prefetch:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4154,11 +4159,11 @@ yyreduce:
                else cfg_parser->cfg->prefetch = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4158 "util/configparser.c" /* yacc.c:1646  */
+#line 4163 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 367:
-#line 1493 "./util/configparser.y" /* yacc.c:1646  */
+  case 370:
+#line 1494 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_prefetch_key:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4166,11 +4171,11 @@ yyreduce:
                else cfg_parser->cfg->prefetch_key = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4170 "util/configparser.c" /* yacc.c:1646  */
+#line 4175 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 368:
-#line 1502 "./util/configparser.y" /* yacc.c:1646  */
+  case 371:
+#line 1503 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_deny_any:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4178,11 +4183,11 @@ yyreduce:
                else cfg_parser->cfg->deny_any = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4182 "util/configparser.c" /* yacc.c:1646  */
+#line 4187 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 369:
-#line 1511 "./util/configparser.y" /* yacc.c:1646  */
+  case 372:
+#line 1512 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_unwanted_reply_threshold:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4190,21 +4195,21 @@ yyreduce:
                else cfg_parser->cfg->unwanted_threshold = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4194 "util/configparser.c" /* yacc.c:1646  */
+#line 4199 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 370:
-#line 1520 "./util/configparser.y" /* yacc.c:1646  */
+  case 373:
+#line 1521 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_do_not_query_address:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->donotqueryaddrs, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 4204 "util/configparser.c" /* yacc.c:1646  */
+#line 4209 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 371:
-#line 1527 "./util/configparser.y" /* yacc.c:1646  */
+  case 374:
+#line 1528 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_do_not_query_localhost:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4213,11 +4218,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4217 "util/configparser.c" /* yacc.c:1646  */
+#line 4222 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 372:
-#line 1537 "./util/configparser.y" /* yacc.c:1646  */
+  case 375:
+#line 1538 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_access_control:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "deny")!=0 && strcmp((yyvsp[0].str), "refuse")!=0 &&
@@ -4236,21 +4241,21 @@ yyreduce:
                                fatal_exit("out of memory adding acl");
                }
        }
-#line 4240 "util/configparser.c" /* yacc.c:1646  */
+#line 4245 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 373:
-#line 1557 "./util/configparser.y" /* yacc.c:1646  */
+  case 376:
+#line 1558 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_module_conf:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->module_conf);
                cfg_parser->cfg->module_conf = (yyvsp[0].str);
        }
-#line 4250 "util/configparser.c" /* yacc.c:1646  */
+#line 4255 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 374:
-#line 1564 "./util/configparser.y" /* yacc.c:1646  */
+  case 377:
+#line 1565 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_val_override_date:%s)\n", (yyvsp[0].str)));
                if(*(yyvsp[0].str) == '\0' || strcmp((yyvsp[0].str), "0") == 0) {
@@ -4267,11 +4272,11 @@ yyreduce:
                }
                free((yyvsp[0].str));
        }
-#line 4271 "util/configparser.c" /* yacc.c:1646  */
+#line 4276 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 375:
-#line 1582 "./util/configparser.y" /* yacc.c:1646  */
+  case 378:
+#line 1583 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_val_sig_skew_min:%s)\n", (yyvsp[0].str)));
                if(*(yyvsp[0].str) == '\0' || strcmp((yyvsp[0].str), "0") == 0) {
@@ -4283,11 +4288,11 @@ yyreduce:
                }
                free((yyvsp[0].str));
        }
-#line 4287 "util/configparser.c" /* yacc.c:1646  */
+#line 4292 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 376:
-#line 1595 "./util/configparser.y" /* yacc.c:1646  */
+  case 379:
+#line 1596 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_val_sig_skew_max:%s)\n", (yyvsp[0].str)));
                if(*(yyvsp[0].str) == '\0' || strcmp((yyvsp[0].str), "0") == 0) {
@@ -4299,11 +4304,11 @@ yyreduce:
                }
                free((yyvsp[0].str));
        }
-#line 4303 "util/configparser.c" /* yacc.c:1646  */
+#line 4308 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 377:
-#line 1608 "./util/configparser.y" /* yacc.c:1646  */
+  case 380:
+#line 1609 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_cache_max_ttl:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4311,11 +4316,11 @@ yyreduce:
                else cfg_parser->cfg->max_ttl = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4315 "util/configparser.c" /* yacc.c:1646  */
+#line 4320 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 378:
-#line 1617 "./util/configparser.y" /* yacc.c:1646  */
+  case 381:
+#line 1618 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_cache_max_negative_ttl:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4323,11 +4328,11 @@ yyreduce:
                else cfg_parser->cfg->max_negative_ttl = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4327 "util/configparser.c" /* yacc.c:1646  */
+#line 4332 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 379:
-#line 1626 "./util/configparser.y" /* yacc.c:1646  */
+  case 382:
+#line 1627 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_cache_min_ttl:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4335,11 +4340,11 @@ yyreduce:
                else cfg_parser->cfg->min_ttl = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4339 "util/configparser.c" /* yacc.c:1646  */
+#line 4344 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 380:
-#line 1635 "./util/configparser.y" /* yacc.c:1646  */
+  case 383:
+#line 1636 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_bogus_ttl:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4347,11 +4352,11 @@ yyreduce:
                else cfg_parser->cfg->bogus_ttl = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4351 "util/configparser.c" /* yacc.c:1646  */
+#line 4356 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 381:
-#line 1644 "./util/configparser.y" /* yacc.c:1646  */
+  case 384:
+#line 1645 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_val_clean_additional:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4360,11 +4365,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4364 "util/configparser.c" /* yacc.c:1646  */
+#line 4369 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 382:
-#line 1654 "./util/configparser.y" /* yacc.c:1646  */
+  case 385:
+#line 1655 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_val_permissive_mode:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4373,11 +4378,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4377 "util/configparser.c" /* yacc.c:1646  */
+#line 4382 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 383:
-#line 1664 "./util/configparser.y" /* yacc.c:1646  */
+  case 386:
+#line 1665 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_aggressive_nsec:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4387,11 +4392,11 @@ yyreduce:
                                (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4391 "util/configparser.c" /* yacc.c:1646  */
+#line 4396 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 384:
-#line 1675 "./util/configparser.y" /* yacc.c:1646  */
+  case 387:
+#line 1676 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_ignore_cd_flag:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4399,11 +4404,11 @@ yyreduce:
                else cfg_parser->cfg->ignore_cd = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4403 "util/configparser.c" /* yacc.c:1646  */
+#line 4408 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 385:
-#line 1684 "./util/configparser.y" /* yacc.c:1646  */
+  case 388:
+#line 1685 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_serve_expired:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4411,11 +4416,11 @@ yyreduce:
                else cfg_parser->cfg->serve_expired = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4415 "util/configparser.c" /* yacc.c:1646  */
+#line 4420 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 386:
-#line 1693 "./util/configparser.y" /* yacc.c:1646  */
+  case 389:
+#line 1694 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_serve_expired_ttl:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4423,11 +4428,11 @@ yyreduce:
                else cfg_parser->cfg->serve_expired_ttl = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4427 "util/configparser.c" /* yacc.c:1646  */
+#line 4432 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 387:
-#line 1702 "./util/configparser.y" /* yacc.c:1646  */
+  case 390:
+#line 1703 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_serve_expired_ttl_reset:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4435,11 +4440,11 @@ yyreduce:
                else cfg_parser->cfg->serve_expired_ttl_reset = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4439 "util/configparser.c" /* yacc.c:1646  */
+#line 4444 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 388:
-#line 1711 "./util/configparser.y" /* yacc.c:1646  */
+  case 391:
+#line 1712 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_fake_dsa:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4451,11 +4456,11 @@ yyreduce:
 #endif
                free((yyvsp[0].str));
        }
-#line 4455 "util/configparser.c" /* yacc.c:1646  */
+#line 4460 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 389:
-#line 1724 "./util/configparser.y" /* yacc.c:1646  */
+  case 392:
+#line 1725 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_fake_sha1:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4467,11 +4472,11 @@ yyreduce:
 #endif
                free((yyvsp[0].str));
        }
-#line 4471 "util/configparser.c" /* yacc.c:1646  */
+#line 4476 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 390:
-#line 1737 "./util/configparser.y" /* yacc.c:1646  */
+  case 393:
+#line 1738 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_val_log_level:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4479,21 +4484,21 @@ yyreduce:
                else cfg_parser->cfg->val_log_level = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4483 "util/configparser.c" /* yacc.c:1646  */
+#line 4488 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 391:
-#line 1746 "./util/configparser.y" /* yacc.c:1646  */
+  case 394:
+#line 1747 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_val_nsec3_keysize_iterations:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->val_nsec3_key_iterations);
                cfg_parser->cfg->val_nsec3_key_iterations = (yyvsp[0].str);
        }
-#line 4493 "util/configparser.c" /* yacc.c:1646  */
+#line 4498 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 392:
-#line 1753 "./util/configparser.y" /* yacc.c:1646  */
+  case 395:
+#line 1754 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_add_holddown:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4501,11 +4506,11 @@ yyreduce:
                else cfg_parser->cfg->add_holddown = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4505 "util/configparser.c" /* yacc.c:1646  */
+#line 4510 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 393:
-#line 1762 "./util/configparser.y" /* yacc.c:1646  */
+  case 396:
+#line 1763 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_del_holddown:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4513,11 +4518,11 @@ yyreduce:
                else cfg_parser->cfg->del_holddown = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4517 "util/configparser.c" /* yacc.c:1646  */
+#line 4522 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 394:
-#line 1771 "./util/configparser.y" /* yacc.c:1646  */
+  case 397:
+#line 1772 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_keep_missing:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4525,11 +4530,11 @@ yyreduce:
                else cfg_parser->cfg->keep_missing = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4529 "util/configparser.c" /* yacc.c:1646  */
+#line 4534 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 395:
-#line 1780 "./util/configparser.y" /* yacc.c:1646  */
+  case 398:
+#line 1781 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_permit_small_holddown:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4538,22 +4543,22 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4542 "util/configparser.c" /* yacc.c:1646  */
+#line 4547 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 396:
-#line 1789 "./util/configparser.y" /* yacc.c:1646  */
+  case 399:
+#line 1790 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_key_cache_size:%s)\n", (yyvsp[0].str)));
                if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->key_cache_size))
                        yyerror("memory size expected");
                free((yyvsp[0].str));
        }
-#line 4553 "util/configparser.c" /* yacc.c:1646  */
+#line 4558 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 397:
-#line 1797 "./util/configparser.y" /* yacc.c:1646  */
+  case 400:
+#line 1798 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_key_cache_slabs:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0)
@@ -4565,22 +4570,22 @@ yyreduce:
                }
                free((yyvsp[0].str));
        }
-#line 4569 "util/configparser.c" /* yacc.c:1646  */
+#line 4574 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 398:
-#line 1810 "./util/configparser.y" /* yacc.c:1646  */
+  case 401:
+#line 1811 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_neg_cache_size:%s)\n", (yyvsp[0].str)));
                if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->neg_cache_size))
                        yyerror("memory size expected");
                free((yyvsp[0].str));
        }
-#line 4580 "util/configparser.c" /* yacc.c:1646  */
+#line 4585 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 399:
-#line 1818 "./util/configparser.y" /* yacc.c:1646  */
+  case 402:
+#line 1819 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_local_zone:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "static")!=0 && strcmp((yyvsp[0].str), "deny")!=0 &&
@@ -4612,21 +4617,21 @@ yyreduce:
                                fatal_exit("out of memory adding local-zone");
                }
        }
-#line 4616 "util/configparser.c" /* yacc.c:1646  */
+#line 4621 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 400:
-#line 1851 "./util/configparser.y" /* yacc.c:1646  */
+  case 403:
+#line 1852 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_local_data:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->local_data, (yyvsp[0].str)))
                        fatal_exit("out of memory adding local-data");
        }
-#line 4626 "util/configparser.c" /* yacc.c:1646  */
+#line 4631 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 401:
-#line 1858 "./util/configparser.y" /* yacc.c:1646  */
+  case 404:
+#line 1859 "./util/configparser.y" /* yacc.c:1646  */
     {
                char* ptr;
                OUTYY(("P(server_local_data_ptr:%s)\n", (yyvsp[0].str)));
@@ -4640,11 +4645,11 @@ yyreduce:
                        yyerror("local-data-ptr could not be reversed");
                }
        }
-#line 4644 "util/configparser.c" /* yacc.c:1646  */
+#line 4649 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 402:
-#line 1873 "./util/configparser.y" /* yacc.c:1646  */
+  case 405:
+#line 1874 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_minimal_responses:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4653,11 +4658,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4657 "util/configparser.c" /* yacc.c:1646  */
+#line 4662 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 403:
-#line 1883 "./util/configparser.y" /* yacc.c:1646  */
+  case 406:
+#line 1884 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_rrset_roundrobin:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4666,41 +4671,41 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4670 "util/configparser.c" /* yacc.c:1646  */
+#line 4675 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 404:
-#line 1893 "./util/configparser.y" /* yacc.c:1646  */
+  case 407:
+#line 1894 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_unknown_server_time_limit:%s)\n", (yyvsp[0].str)));
                cfg_parser->cfg->unknown_server_time_limit = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4680 "util/configparser.c" /* yacc.c:1646  */
+#line 4685 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 405:
-#line 1900 "./util/configparser.y" /* yacc.c:1646  */
+  case 408:
+#line 1901 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_max_udp_size:%s)\n", (yyvsp[0].str)));
                cfg_parser->cfg->max_udp_size = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4690 "util/configparser.c" /* yacc.c:1646  */
+#line 4695 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 406:
-#line 1907 "./util/configparser.y" /* yacc.c:1646  */
+  case 409:
+#line 1908 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dns64_prefix:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->dns64_prefix);
                cfg_parser->cfg->dns64_prefix = (yyvsp[0].str);
        }
-#line 4700 "util/configparser.c" /* yacc.c:1646  */
+#line 4705 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 407:
-#line 1914 "./util/configparser.y" /* yacc.c:1646  */
+  case 410:
+#line 1915 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_dns64_synthall:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4708,22 +4713,22 @@ yyreduce:
                else cfg_parser->cfg->dns64_synthall = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4712 "util/configparser.c" /* yacc.c:1646  */
+#line 4717 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 408:
-#line 1923 "./util/configparser.y" /* yacc.c:1646  */
+  case 411:
+#line 1924 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dns64_ignore_aaaa:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->dns64_ignore_aaaa,
                        (yyvsp[0].str)))
                        fatal_exit("out of memory adding dns64-ignore-aaaa");
        }
-#line 4723 "util/configparser.c" /* yacc.c:1646  */
+#line 4728 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 409:
-#line 1931 "./util/configparser.y" /* yacc.c:1646  */
+  case 412:
+#line 1932 "./util/configparser.y" /* yacc.c:1646  */
     {
                char* p, *s = (yyvsp[0].str);
                OUTYY(("P(server_define_tag:%s)\n", (yyvsp[0].str)));
@@ -4736,11 +4741,11 @@ yyreduce:
                }
                free((yyvsp[0].str));
        }
-#line 4740 "util/configparser.c" /* yacc.c:1646  */
+#line 4745 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 410:
-#line 1945 "./util/configparser.y" /* yacc.c:1646  */
+  case 413:
+#line 1946 "./util/configparser.y" /* yacc.c:1646  */
     {
                size_t len = 0;
                uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str),
@@ -4760,11 +4765,11 @@ yyreduce:
                        }
                }
        }
-#line 4764 "util/configparser.c" /* yacc.c:1646  */
+#line 4769 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 411:
-#line 1966 "./util/configparser.y" /* yacc.c:1646  */
+  case 414:
+#line 1967 "./util/configparser.y" /* yacc.c:1646  */
     {
                size_t len = 0;
                uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str),
@@ -4784,11 +4789,11 @@ yyreduce:
                        }
                }
        }
-#line 4788 "util/configparser.c" /* yacc.c:1646  */
+#line 4793 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 412:
-#line 1987 "./util/configparser.y" /* yacc.c:1646  */
+  case 415:
+#line 1988 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_access_control_tag_action:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str)));
                if(!cfg_str3list_insert(&cfg_parser->cfg->acl_tag_actions,
@@ -4799,11 +4804,11 @@ yyreduce:
                        free((yyvsp[0].str));
                }
        }
-#line 4803 "util/configparser.c" /* yacc.c:1646  */
+#line 4808 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 413:
-#line 1999 "./util/configparser.y" /* yacc.c:1646  */
+  case 416:
+#line 2000 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_access_control_tag_data:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str)));
                if(!cfg_str3list_insert(&cfg_parser->cfg->acl_tag_datas,
@@ -4814,11 +4819,11 @@ yyreduce:
                        free((yyvsp[0].str));
                }
        }
-#line 4818 "util/configparser.c" /* yacc.c:1646  */
+#line 4823 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 414:
-#line 2011 "./util/configparser.y" /* yacc.c:1646  */
+  case 417:
+#line 2012 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_local_zone_override:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str)));
                if(!cfg_str3list_insert(&cfg_parser->cfg->local_zone_overrides,
@@ -4829,11 +4834,11 @@ yyreduce:
                        free((yyvsp[0].str));
                }
        }
-#line 4833 "util/configparser.c" /* yacc.c:1646  */
+#line 4838 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 415:
-#line 2023 "./util/configparser.y" /* yacc.c:1646  */
+  case 418:
+#line 2024 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_access_control_view:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
                if(!cfg_str2list_insert(&cfg_parser->cfg->acl_view,
@@ -4841,11 +4846,11 @@ yyreduce:
                        yyerror("out of memory");
                }
        }
-#line 4845 "util/configparser.c" /* yacc.c:1646  */
+#line 4850 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 416:
-#line 2032 "./util/configparser.y" /* yacc.c:1646  */
+  case 419:
+#line 2033 "./util/configparser.y" /* yacc.c:1646  */
     {
                size_t len = 0;
                uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str),
@@ -4865,11 +4870,11 @@ yyreduce:
                        }
                }
        }
-#line 4869 "util/configparser.c" /* yacc.c:1646  */
+#line 4874 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 417:
-#line 2053 "./util/configparser.y" /* yacc.c:1646  */
+  case 420:
+#line 2054 "./util/configparser.y" /* yacc.c:1646  */
     { 
                OUTYY(("P(server_ip_ratelimit:%s)\n", (yyvsp[0].str))); 
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4877,11 +4882,11 @@ yyreduce:
                else cfg_parser->cfg->ip_ratelimit = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4881 "util/configparser.c" /* yacc.c:1646  */
+#line 4886 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 418:
-#line 2063 "./util/configparser.y" /* yacc.c:1646  */
+  case 421:
+#line 2064 "./util/configparser.y" /* yacc.c:1646  */
     { 
                OUTYY(("P(server_ratelimit:%s)\n", (yyvsp[0].str))); 
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4889,33 +4894,33 @@ yyreduce:
                else cfg_parser->cfg->ratelimit = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4893 "util/configparser.c" /* yacc.c:1646  */
+#line 4898 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 419:
-#line 2072 "./util/configparser.y" /* yacc.c:1646  */
+  case 422:
+#line 2073 "./util/configparser.y" /* yacc.c:1646  */
     {
        OUTYY(("P(server_ip_ratelimit_size:%s)\n", (yyvsp[0].str)));
        if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->ip_ratelimit_size))
                yyerror("memory size expected");
        free((yyvsp[0].str));
   }
-#line 4904 "util/configparser.c" /* yacc.c:1646  */
+#line 4909 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 420:
-#line 2080 "./util/configparser.y" /* yacc.c:1646  */
+  case 423:
+#line 2081 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_ratelimit_size:%s)\n", (yyvsp[0].str)));
                if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->ratelimit_size))
                        yyerror("memory size expected");
                free((yyvsp[0].str));
        }
-#line 4915 "util/configparser.c" /* yacc.c:1646  */
+#line 4920 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 421:
-#line 2088 "./util/configparser.y" /* yacc.c:1646  */
+  case 424:
+#line 2089 "./util/configparser.y" /* yacc.c:1646  */
     {
        OUTYY(("P(server_ip_ratelimit_slabs:%s)\n", (yyvsp[0].str)));
        if(atoi((yyvsp[0].str)) == 0)
@@ -4927,11 +4932,11 @@ yyreduce:
        }
        free((yyvsp[0].str));
   }
-#line 4931 "util/configparser.c" /* yacc.c:1646  */
+#line 4936 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 422:
-#line 2101 "./util/configparser.y" /* yacc.c:1646  */
+  case 425:
+#line 2102 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_ratelimit_slabs:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0)
@@ -4943,11 +4948,11 @@ yyreduce:
                }
                free((yyvsp[0].str));
        }
-#line 4947 "util/configparser.c" /* yacc.c:1646  */
+#line 4952 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 423:
-#line 2114 "./util/configparser.y" /* yacc.c:1646  */
+  case 426:
+#line 2115 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_ratelimit_for_domain:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) {
@@ -4961,11 +4966,11 @@ yyreduce:
                                        "ratelimit-for-domain");
                }
        }
-#line 4965 "util/configparser.c" /* yacc.c:1646  */
+#line 4970 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 424:
-#line 2129 "./util/configparser.y" /* yacc.c:1646  */
+  case 427:
+#line 2130 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_ratelimit_below_domain:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) {
@@ -4979,11 +4984,11 @@ yyreduce:
                                        "ratelimit-below-domain");
                }
        }
-#line 4983 "util/configparser.c" /* yacc.c:1646  */
+#line 4988 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 425:
-#line 2144 "./util/configparser.y" /* yacc.c:1646  */
+  case 428:
+#line 2145 "./util/configparser.y" /* yacc.c:1646  */
     { 
        OUTYY(("P(server_ip_ratelimit_factor:%s)\n", (yyvsp[0].str))); 
        if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4991,11 +4996,11 @@ yyreduce:
        else cfg_parser->cfg->ip_ratelimit_factor = atoi((yyvsp[0].str));
        free((yyvsp[0].str));
        }
-#line 4995 "util/configparser.c" /* yacc.c:1646  */
+#line 5000 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 426:
-#line 2153 "./util/configparser.y" /* yacc.c:1646  */
+  case 429:
+#line 2154 "./util/configparser.y" /* yacc.c:1646  */
     { 
                OUTYY(("P(server_ratelimit_factor:%s)\n", (yyvsp[0].str))); 
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5003,20 +5008,20 @@ yyreduce:
                else cfg_parser->cfg->ratelimit_factor = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 5007 "util/configparser.c" /* yacc.c:1646  */
+#line 5012 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 427:
-#line 2162 "./util/configparser.y" /* yacc.c:1646  */
+  case 430:
+#line 2163 "./util/configparser.y" /* yacc.c:1646  */
     { 
                OUTYY(("P(low-rtt option is deprecated, use fast-server-num instead)\n"));
                free((yyvsp[0].str));
        }
-#line 5016 "util/configparser.c" /* yacc.c:1646  */
+#line 5021 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 428:
-#line 2168 "./util/configparser.y" /* yacc.c:1646  */
+  case 431:
+#line 2169 "./util/configparser.y" /* yacc.c:1646  */
     { 
                OUTYY(("P(server_fast_server_num:%s)\n", (yyvsp[0].str))); 
                if(atoi((yyvsp[0].str)) <= 0)
@@ -5024,11 +5029,11 @@ yyreduce:
                else cfg_parser->cfg->fast_server_num = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 5028 "util/configparser.c" /* yacc.c:1646  */
+#line 5033 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 429:
-#line 2177 "./util/configparser.y" /* yacc.c:1646  */
+  case 432:
+#line 2178 "./util/configparser.y" /* yacc.c:1646  */
     { 
                OUTYY(("P(server_fast_server_permil:%s)\n", (yyvsp[0].str))); 
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -5036,11 +5041,11 @@ yyreduce:
                else cfg_parser->cfg->fast_server_permil = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 5040 "util/configparser.c" /* yacc.c:1646  */
+#line 5045 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 430:
-#line 2186 "./util/configparser.y" /* yacc.c:1646  */
+  case 433:
+#line 2187 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_qname_minimisation:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5049,11 +5054,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5053 "util/configparser.c" /* yacc.c:1646  */
+#line 5058 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 431:
-#line 2196 "./util/configparser.y" /* yacc.c:1646  */
+  case 434:
+#line 2197 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_qname_minimisation_strict:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5062,11 +5067,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5066 "util/configparser.c" /* yacc.c:1646  */
+#line 5071 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 432:
-#line 2206 "./util/configparser.y" /* yacc.c:1646  */
+  case 435:
+#line 2207 "./util/configparser.y" /* yacc.c:1646  */
     {
        #ifdef USE_IPSECMOD
                OUTYY(("P(server_ipsecmod_enabled:%s)\n", (yyvsp[0].str)));
@@ -5078,11 +5083,11 @@ yyreduce:
        #endif
                free((yyvsp[0].str));
        }
-#line 5082 "util/configparser.c" /* yacc.c:1646  */
+#line 5087 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 433:
-#line 2219 "./util/configparser.y" /* yacc.c:1646  */
+  case 436:
+#line 2220 "./util/configparser.y" /* yacc.c:1646  */
     {
        #ifdef USE_IPSECMOD
                OUTYY(("P(server_ipsecmod_ignore_bogus:%s)\n", (yyvsp[0].str)));
@@ -5094,11 +5099,11 @@ yyreduce:
        #endif
                free((yyvsp[0].str));
        }
-#line 5098 "util/configparser.c" /* yacc.c:1646  */
+#line 5103 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 434:
-#line 2232 "./util/configparser.y" /* yacc.c:1646  */
+  case 437:
+#line 2233 "./util/configparser.y" /* yacc.c:1646  */
     {
        #ifdef USE_IPSECMOD
                OUTYY(("P(server_ipsecmod_hook:%s)\n", (yyvsp[0].str)));
@@ -5109,11 +5114,11 @@ yyreduce:
                free((yyvsp[0].str));
        #endif
        }
-#line 5113 "util/configparser.c" /* yacc.c:1646  */
+#line 5118 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 435:
-#line 2244 "./util/configparser.y" /* yacc.c:1646  */
+  case 438:
+#line 2245 "./util/configparser.y" /* yacc.c:1646  */
     {
        #ifdef USE_IPSECMOD
                OUTYY(("P(server_ipsecmod_max_ttl:%s)\n", (yyvsp[0].str)));
@@ -5126,11 +5131,11 @@ yyreduce:
                free((yyvsp[0].str));
        #endif
        }
-#line 5130 "util/configparser.c" /* yacc.c:1646  */
+#line 5135 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 436:
-#line 2258 "./util/configparser.y" /* yacc.c:1646  */
+  case 439:
+#line 2259 "./util/configparser.y" /* yacc.c:1646  */
     {
        #ifdef USE_IPSECMOD
                OUTYY(("P(server_ipsecmod_whitelist:%s)\n", (yyvsp[0].str)));
@@ -5141,11 +5146,11 @@ yyreduce:
                free((yyvsp[0].str));
        #endif
        }
-#line 5145 "util/configparser.c" /* yacc.c:1646  */
+#line 5150 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 437:
-#line 2270 "./util/configparser.y" /* yacc.c:1646  */
+  case 440:
+#line 2271 "./util/configparser.y" /* yacc.c:1646  */
     {
        #ifdef USE_IPSECMOD
                OUTYY(("P(server_ipsecmod_strict:%s)\n", (yyvsp[0].str)));
@@ -5158,11 +5163,11 @@ yyreduce:
                free((yyvsp[0].str));
        #endif
        }
-#line 5162 "util/configparser.c" /* yacc.c:1646  */
+#line 5167 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 438:
-#line 2284 "./util/configparser.y" /* yacc.c:1646  */
+  case 441:
+#line 2285 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
                if(cfg_parser->cfg->stubs->name)
@@ -5171,31 +5176,31 @@ yyreduce:
                free(cfg_parser->cfg->stubs->name);
                cfg_parser->cfg->stubs->name = (yyvsp[0].str);
        }
-#line 5175 "util/configparser.c" /* yacc.c:1646  */
+#line 5180 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 439:
-#line 2294 "./util/configparser.y" /* yacc.c:1646  */
+  case 442:
+#line 2295 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(stub-host:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->hosts, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 5185 "util/configparser.c" /* yacc.c:1646  */
+#line 5190 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 440:
-#line 2301 "./util/configparser.y" /* yacc.c:1646  */
+  case 443:
+#line 2302 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(stub-addr:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->addrs, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 5195 "util/configparser.c" /* yacc.c:1646  */
+#line 5200 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 441:
-#line 2308 "./util/configparser.y" /* yacc.c:1646  */
+  case 444:
+#line 2309 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(stub-first:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5203,11 +5208,11 @@ yyreduce:
                else cfg_parser->cfg->stubs->isfirst=(strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5207 "util/configparser.c" /* yacc.c:1646  */
+#line 5212 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 442:
-#line 2317 "./util/configparser.y" /* yacc.c:1646  */
+  case 445:
+#line 2318 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(stub-no-cache:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5215,11 +5220,11 @@ yyreduce:
                else cfg_parser->cfg->stubs->no_cache=(strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5219 "util/configparser.c" /* yacc.c:1646  */
+#line 5224 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 443:
-#line 2326 "./util/configparser.y" /* yacc.c:1646  */
+  case 446:
+#line 2327 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(stub-ssl-upstream:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5228,11 +5233,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5232 "util/configparser.c" /* yacc.c:1646  */
+#line 5237 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 444:
-#line 2336 "./util/configparser.y" /* yacc.c:1646  */
+  case 447:
+#line 2337 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(stub-prime:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5241,11 +5246,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5245 "util/configparser.c" /* yacc.c:1646  */
+#line 5250 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 445:
-#line 2346 "./util/configparser.y" /* yacc.c:1646  */
+  case 448:
+#line 2347 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
                if(cfg_parser->cfg->forwards->name)
@@ -5254,31 +5259,31 @@ yyreduce:
                free(cfg_parser->cfg->forwards->name);
                cfg_parser->cfg->forwards->name = (yyvsp[0].str);
        }
-#line 5258 "util/configparser.c" /* yacc.c:1646  */
+#line 5263 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 446:
-#line 2356 "./util/configparser.y" /* yacc.c:1646  */
+  case 449:
+#line 2357 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(forward-host:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->hosts, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 5268 "util/configparser.c" /* yacc.c:1646  */
+#line 5273 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 447:
-#line 2363 "./util/configparser.y" /* yacc.c:1646  */
+  case 450:
+#line 2364 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(forward-addr:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->addrs, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 5278 "util/configparser.c" /* yacc.c:1646  */
+#line 5283 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 448:
-#line 2370 "./util/configparser.y" /* yacc.c:1646  */
+  case 451:
+#line 2371 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(forward-first:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5286,11 +5291,11 @@ yyreduce:
                else cfg_parser->cfg->forwards->isfirst=(strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5290 "util/configparser.c" /* yacc.c:1646  */
+#line 5295 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 449:
-#line 2379 "./util/configparser.y" /* yacc.c:1646  */
+  case 452:
+#line 2380 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(forward-no-cache:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5298,11 +5303,11 @@ yyreduce:
                else cfg_parser->cfg->forwards->no_cache=(strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5302 "util/configparser.c" /* yacc.c:1646  */
+#line 5307 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 450:
-#line 2388 "./util/configparser.y" /* yacc.c:1646  */
+  case 453:
+#line 2389 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(forward-ssl-upstream:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5311,11 +5316,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5315 "util/configparser.c" /* yacc.c:1646  */
+#line 5320 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 451:
-#line 2398 "./util/configparser.y" /* yacc.c:1646  */
+  case 454:
+#line 2399 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
                if(cfg_parser->cfg->auths->name)
@@ -5324,52 +5329,52 @@ yyreduce:
                free(cfg_parser->cfg->auths->name);
                cfg_parser->cfg->auths->name = (yyvsp[0].str);
        }
-#line 5328 "util/configparser.c" /* yacc.c:1646  */
+#line 5333 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 452:
-#line 2408 "./util/configparser.y" /* yacc.c:1646  */
+  case 455:
+#line 2409 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(zonefile:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->auths->zonefile);
                cfg_parser->cfg->auths->zonefile = (yyvsp[0].str);
        }
-#line 5338 "util/configparser.c" /* yacc.c:1646  */
+#line 5343 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 453:
-#line 2415 "./util/configparser.y" /* yacc.c:1646  */
+  case 456:
+#line 2416 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(master:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->auths->masters, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 5348 "util/configparser.c" /* yacc.c:1646  */
+#line 5353 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 454:
-#line 2422 "./util/configparser.y" /* yacc.c:1646  */
+  case 457:
+#line 2423 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(url:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->auths->urls, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 5358 "util/configparser.c" /* yacc.c:1646  */
+#line 5363 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 455:
-#line 2429 "./util/configparser.y" /* yacc.c:1646  */
+  case 458:
+#line 2430 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(allow-notify:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->auths->allow_notify,
                        (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 5369 "util/configparser.c" /* yacc.c:1646  */
+#line 5374 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 456:
-#line 2437 "./util/configparser.y" /* yacc.c:1646  */
+  case 459:
+#line 2438 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(for-downstream:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5378,11 +5383,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5382 "util/configparser.c" /* yacc.c:1646  */
+#line 5387 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 457:
-#line 2447 "./util/configparser.y" /* yacc.c:1646  */
+  case 460:
+#line 2448 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(for-upstream:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5391,11 +5396,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5395 "util/configparser.c" /* yacc.c:1646  */
+#line 5400 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 458:
-#line 2457 "./util/configparser.y" /* yacc.c:1646  */
+  case 461:
+#line 2458 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(fallback-enabled:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5404,11 +5409,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5408 "util/configparser.c" /* yacc.c:1646  */
+#line 5413 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 459:
-#line 2467 "./util/configparser.y" /* yacc.c:1646  */
+  case 462:
+#line 2468 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
                if(cfg_parser->cfg->views->name)
@@ -5417,11 +5422,11 @@ yyreduce:
                free(cfg_parser->cfg->views->name);
                cfg_parser->cfg->views->name = (yyvsp[0].str);
        }
-#line 5421 "util/configparser.c" /* yacc.c:1646  */
+#line 5426 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 460:
-#line 2477 "./util/configparser.y" /* yacc.c:1646  */
+  case 463:
+#line 2478 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(view_local_zone:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "static")!=0 && strcmp((yyvsp[0].str), "deny")!=0 &&
@@ -5452,11 +5457,11 @@ yyreduce:
                                fatal_exit("out of memory adding local-zone");
                }
        }
-#line 5456 "util/configparser.c" /* yacc.c:1646  */
+#line 5461 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 461:
-#line 2509 "./util/configparser.y" /* yacc.c:1646  */
+  case 464:
+#line 2510 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(view_response_ip:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
                validate_respip_action((yyvsp[0].str));
@@ -5465,33 +5470,33 @@ yyreduce:
                        fatal_exit("out of memory adding per-view "
                                "response-ip action");
        }
-#line 5469 "util/configparser.c" /* yacc.c:1646  */
+#line 5474 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 462:
-#line 2519 "./util/configparser.y" /* yacc.c:1646  */
+  case 465:
+#line 2520 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(view_response_ip_data:%s)\n", (yyvsp[-1].str)));
                if(!cfg_str2list_insert(
                        &cfg_parser->cfg->views->respip_data, (yyvsp[-1].str), (yyvsp[0].str)))
                        fatal_exit("out of memory adding response-ip-data");
        }
-#line 5480 "util/configparser.c" /* yacc.c:1646  */
+#line 5485 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 463:
-#line 2527 "./util/configparser.y" /* yacc.c:1646  */
+  case 466:
+#line 2528 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(view_local_data:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->views->local_data, (yyvsp[0].str))) {
                        fatal_exit("out of memory adding local-data");
                }
        }
-#line 5491 "util/configparser.c" /* yacc.c:1646  */
+#line 5496 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 464:
-#line 2535 "./util/configparser.y" /* yacc.c:1646  */
+  case 467:
+#line 2536 "./util/configparser.y" /* yacc.c:1646  */
     {
                char* ptr;
                OUTYY(("P(view_local_data_ptr:%s)\n", (yyvsp[0].str)));
@@ -5505,11 +5510,11 @@ yyreduce:
                        yyerror("local-data-ptr could not be reversed");
                }
        }
-#line 5509 "util/configparser.c" /* yacc.c:1646  */
+#line 5514 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 465:
-#line 2550 "./util/configparser.y" /* yacc.c:1646  */
+  case 468:
+#line 2551 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(view-first:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5517,19 +5522,19 @@ yyreduce:
                else cfg_parser->cfg->views->isfirst=(strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5521 "util/configparser.c" /* yacc.c:1646  */
+#line 5526 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 466:
-#line 2559 "./util/configparser.y" /* yacc.c:1646  */
+  case 469:
+#line 2560 "./util/configparser.y" /* yacc.c:1646  */
     { 
                OUTYY(("\nP(remote-control:)\n")); 
        }
-#line 5529 "util/configparser.c" /* yacc.c:1646  */
+#line 5534 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 477:
-#line 2570 "./util/configparser.y" /* yacc.c:1646  */
+  case 480:
+#line 2571 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(control_enable:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5538,11 +5543,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5542 "util/configparser.c" /* yacc.c:1646  */
+#line 5547 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 478:
-#line 2580 "./util/configparser.y" /* yacc.c:1646  */
+  case 481:
+#line 2581 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(control_port:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0)
@@ -5550,79 +5555,79 @@ yyreduce:
                else cfg_parser->cfg->control_port = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 5554 "util/configparser.c" /* yacc.c:1646  */
+#line 5559 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 479:
-#line 2589 "./util/configparser.y" /* yacc.c:1646  */
+  case 482:
+#line 2590 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(control_interface:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_append(&cfg_parser->cfg->control_ifs, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 5564 "util/configparser.c" /* yacc.c:1646  */
+#line 5569 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 480:
-#line 2596 "./util/configparser.y" /* yacc.c:1646  */
+  case 483:
+#line 2597 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(control_use_cert:%s)\n", (yyvsp[0].str)));
                cfg_parser->cfg->control_use_cert = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5574 "util/configparser.c" /* yacc.c:1646  */
+#line 5579 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 481:
-#line 2603 "./util/configparser.y" /* yacc.c:1646  */
+  case 484:
+#line 2604 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(rc_server_key_file:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->server_key_file);
                cfg_parser->cfg->server_key_file = (yyvsp[0].str);
        }
-#line 5584 "util/configparser.c" /* yacc.c:1646  */
+#line 5589 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 482:
-#line 2610 "./util/configparser.y" /* yacc.c:1646  */
+  case 485:
+#line 2611 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(rc_server_cert_file:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->server_cert_file);
                cfg_parser->cfg->server_cert_file = (yyvsp[0].str);
        }
-#line 5594 "util/configparser.c" /* yacc.c:1646  */
+#line 5599 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 483:
-#line 2617 "./util/configparser.y" /* yacc.c:1646  */
+  case 486:
+#line 2618 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(rc_control_key_file:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->control_key_file);
                cfg_parser->cfg->control_key_file = (yyvsp[0].str);
        }
-#line 5604 "util/configparser.c" /* yacc.c:1646  */
+#line 5609 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 484:
-#line 2624 "./util/configparser.y" /* yacc.c:1646  */
+  case 487:
+#line 2625 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(rc_control_cert_file:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->control_cert_file);
                cfg_parser->cfg->control_cert_file = (yyvsp[0].str);
        }
-#line 5614 "util/configparser.c" /* yacc.c:1646  */
+#line 5619 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 485:
-#line 2631 "./util/configparser.y" /* yacc.c:1646  */
+  case 488:
+#line 2632 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("\nP(dnstap:)\n"));
        }
-#line 5622 "util/configparser.c" /* yacc.c:1646  */
+#line 5627 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 500:
-#line 2648 "./util/configparser.y" /* yacc.c:1646  */
+  case 503:
+#line 2649 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dt_dnstap_enable:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5630,21 +5635,21 @@ yyreduce:
                else cfg_parser->cfg->dnstap = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5634 "util/configparser.c" /* yacc.c:1646  */
+#line 5639 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 501:
-#line 2657 "./util/configparser.y" /* yacc.c:1646  */
+  case 504:
+#line 2658 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dt_dnstap_socket_path:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->dnstap_socket_path);
                cfg_parser->cfg->dnstap_socket_path = (yyvsp[0].str);
        }
-#line 5644 "util/configparser.c" /* yacc.c:1646  */
+#line 5649 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 502:
-#line 2664 "./util/configparser.y" /* yacc.c:1646  */
+  case 505:
+#line 2665 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dt_dnstap_send_identity:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5652,11 +5657,11 @@ yyreduce:
                else cfg_parser->cfg->dnstap_send_identity = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5656 "util/configparser.c" /* yacc.c:1646  */
+#line 5661 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 503:
-#line 2673 "./util/configparser.y" /* yacc.c:1646  */
+  case 506:
+#line 2674 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dt_dnstap_send_version:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5664,31 +5669,31 @@ yyreduce:
                else cfg_parser->cfg->dnstap_send_version = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5668 "util/configparser.c" /* yacc.c:1646  */
+#line 5673 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 504:
-#line 2682 "./util/configparser.y" /* yacc.c:1646  */
+  case 507:
+#line 2683 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dt_dnstap_identity:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->dnstap_identity);
                cfg_parser->cfg->dnstap_identity = (yyvsp[0].str);
        }
-#line 5678 "util/configparser.c" /* yacc.c:1646  */
+#line 5683 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 505:
-#line 2689 "./util/configparser.y" /* yacc.c:1646  */
+  case 508:
+#line 2690 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dt_dnstap_version:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->dnstap_version);
                cfg_parser->cfg->dnstap_version = (yyvsp[0].str);
        }
-#line 5688 "util/configparser.c" /* yacc.c:1646  */
+#line 5693 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 506:
-#line 2696 "./util/configparser.y" /* yacc.c:1646  */
+  case 509:
+#line 2697 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dt_dnstap_log_resolver_query_messages:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5697,11 +5702,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5701 "util/configparser.c" /* yacc.c:1646  */
+#line 5706 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 507:
-#line 2706 "./util/configparser.y" /* yacc.c:1646  */
+  case 510:
+#line 2707 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dt_dnstap_log_resolver_response_messages:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5710,11 +5715,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5714 "util/configparser.c" /* yacc.c:1646  */
+#line 5719 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 508:
-#line 2716 "./util/configparser.y" /* yacc.c:1646  */
+  case 511:
+#line 2717 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dt_dnstap_log_client_query_messages:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5723,11 +5728,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5727 "util/configparser.c" /* yacc.c:1646  */
+#line 5732 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 509:
-#line 2726 "./util/configparser.y" /* yacc.c:1646  */
+  case 512:
+#line 2727 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dt_dnstap_log_client_response_messages:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5736,11 +5741,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5740 "util/configparser.c" /* yacc.c:1646  */
+#line 5745 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 510:
-#line 2736 "./util/configparser.y" /* yacc.c:1646  */
+  case 513:
+#line 2737 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dt_dnstap_log_forwarder_query_messages:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5749,11 +5754,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5753 "util/configparser.c" /* yacc.c:1646  */
+#line 5758 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 511:
-#line 2746 "./util/configparser.y" /* yacc.c:1646  */
+  case 514:
+#line 2747 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dt_dnstap_log_forwarder_response_messages:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5762,29 +5767,29 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5766 "util/configparser.c" /* yacc.c:1646  */
+#line 5771 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 512:
-#line 2756 "./util/configparser.y" /* yacc.c:1646  */
+  case 515:
+#line 2757 "./util/configparser.y" /* yacc.c:1646  */
     { 
                OUTYY(("\nP(python:)\n")); 
        }
-#line 5774 "util/configparser.c" /* yacc.c:1646  */
+#line 5779 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 516:
-#line 2765 "./util/configparser.y" /* yacc.c:1646  */
+  case 519:
+#line 2766 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(python-script:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->python_script);
                cfg_parser->cfg->python_script = (yyvsp[0].str);
        }
-#line 5784 "util/configparser.c" /* yacc.c:1646  */
+#line 5789 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 517:
-#line 2771 "./util/configparser.y" /* yacc.c:1646  */
+  case 520:
+#line 2772 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(disable_dnssec_lame_check:%s)\n", (yyvsp[0].str)));
                if (strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5793,21 +5798,21 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5797 "util/configparser.c" /* yacc.c:1646  */
+#line 5802 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 518:
-#line 2781 "./util/configparser.y" /* yacc.c:1646  */
+  case 521:
+#line 2782 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_log_identity:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->log_identity);
                cfg_parser->cfg->log_identity = (yyvsp[0].str);
        }
-#line 5807 "util/configparser.c" /* yacc.c:1646  */
+#line 5812 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 519:
-#line 2788 "./util/configparser.y" /* yacc.c:1646  */
+  case 522:
+#line 2789 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_response_ip:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
                validate_respip_action((yyvsp[0].str));
@@ -5815,30 +5820,30 @@ yyreduce:
                        (yyvsp[-1].str), (yyvsp[0].str)))
                        fatal_exit("out of memory adding response-ip");
        }
-#line 5819 "util/configparser.c" /* yacc.c:1646  */
+#line 5824 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 520:
-#line 2797 "./util/configparser.y" /* yacc.c:1646  */
+  case 523:
+#line 2798 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_response_ip_data:%s)\n", (yyvsp[-1].str)));
                if(!cfg_str2list_insert(&cfg_parser->cfg->respip_data,
                        (yyvsp[-1].str), (yyvsp[0].str)))
                        fatal_exit("out of memory adding response-ip-data");
        }
-#line 5830 "util/configparser.c" /* yacc.c:1646  */
+#line 5835 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 521:
-#line 2805 "./util/configparser.y" /* yacc.c:1646  */
+  case 524:
+#line 2806 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("\nP(dnscrypt:)\n"));
        }
-#line 5838 "util/configparser.c" /* yacc.c:1646  */
+#line 5843 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 534:
-#line 2821 "./util/configparser.y" /* yacc.c:1646  */
+  case 537:
+#line 2822 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dnsc_dnscrypt_enable:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5846,11 +5851,11 @@ yyreduce:
                else cfg_parser->cfg->dnscrypt = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5850 "util/configparser.c" /* yacc.c:1646  */
+#line 5855 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 535:
-#line 2831 "./util/configparser.y" /* yacc.c:1646  */
+  case 538:
+#line 2832 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dnsc_dnscrypt_port:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0)
@@ -5858,21 +5863,21 @@ yyreduce:
                else cfg_parser->cfg->dnscrypt_port = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 5862 "util/configparser.c" /* yacc.c:1646  */
+#line 5867 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 536:
-#line 2840 "./util/configparser.y" /* yacc.c:1646  */
+  case 539:
+#line 2841 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dnsc_dnscrypt_provider:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->dnscrypt_provider);
                cfg_parser->cfg->dnscrypt_provider = (yyvsp[0].str);
        }
-#line 5872 "util/configparser.c" /* yacc.c:1646  */
+#line 5877 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 537:
-#line 2847 "./util/configparser.y" /* yacc.c:1646  */
+  case 540:
+#line 2848 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dnsc_dnscrypt_provider_cert:%s)\n", (yyvsp[0].str)));
                if(cfg_strlist_find(cfg_parser->cfg->dnscrypt_provider_cert, (yyvsp[0].str)))
@@ -5880,21 +5885,21 @@ yyreduce:
                if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_provider_cert, (yyvsp[0].str)))
                        fatal_exit("out of memory adding dnscrypt-provider-cert");
        }
-#line 5884 "util/configparser.c" /* yacc.c:1646  */
+#line 5889 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 538:
-#line 2856 "./util/configparser.y" /* yacc.c:1646  */
+  case 541:
+#line 2857 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dnsc_dnscrypt_provider_cert_rotated:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_provider_cert_rotated, (yyvsp[0].str)))
                        fatal_exit("out of memory adding dnscrypt-provider-cert-rotated");
        }
-#line 5894 "util/configparser.c" /* yacc.c:1646  */
+#line 5899 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 539:
-#line 2863 "./util/configparser.y" /* yacc.c:1646  */
+  case 542:
+#line 2864 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dnsc_dnscrypt_secret_key:%s)\n", (yyvsp[0].str)));
                if(cfg_strlist_find(cfg_parser->cfg->dnscrypt_secret_key, (yyvsp[0].str)))
@@ -5902,22 +5907,22 @@ yyreduce:
                if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_secret_key, (yyvsp[0].str)))
                        fatal_exit("out of memory adding dnscrypt-secret-key");
        }
-#line 5906 "util/configparser.c" /* yacc.c:1646  */
+#line 5911 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 540:
-#line 2872 "./util/configparser.y" /* yacc.c:1646  */
+  case 543:
+#line 2873 "./util/configparser.y" /* yacc.c:1646  */
     {
        OUTYY(("P(dnscrypt_shared_secret_cache_size:%s)\n", (yyvsp[0].str)));
        if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->dnscrypt_shared_secret_cache_size))
                yyerror("memory size expected");
        free((yyvsp[0].str));
   }
-#line 5917 "util/configparser.c" /* yacc.c:1646  */
+#line 5922 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 541:
-#line 2880 "./util/configparser.y" /* yacc.c:1646  */
+  case 544:
+#line 2881 "./util/configparser.y" /* yacc.c:1646  */
     {
        OUTYY(("P(dnscrypt_shared_secret_cache_slabs:%s)\n", (yyvsp[0].str)));
        if(atoi((yyvsp[0].str)) == 0)
@@ -5929,22 +5934,22 @@ yyreduce:
        }
        free((yyvsp[0].str));
   }
-#line 5933 "util/configparser.c" /* yacc.c:1646  */
+#line 5938 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 542:
-#line 2893 "./util/configparser.y" /* yacc.c:1646  */
+  case 545:
+#line 2894 "./util/configparser.y" /* yacc.c:1646  */
     {
        OUTYY(("P(dnscrypt_nonce_cache_size:%s)\n", (yyvsp[0].str)));
        if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->dnscrypt_nonce_cache_size))
                yyerror("memory size expected");
        free((yyvsp[0].str));
   }
-#line 5944 "util/configparser.c" /* yacc.c:1646  */
+#line 5949 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 543:
-#line 2901 "./util/configparser.y" /* yacc.c:1646  */
+  case 546:
+#line 2902 "./util/configparser.y" /* yacc.c:1646  */
     {
        OUTYY(("P(dnscrypt_nonce_cache_slabs:%s)\n", (yyvsp[0].str)));
        if(atoi((yyvsp[0].str)) == 0)
@@ -5956,19 +5961,19 @@ yyreduce:
        }
        free((yyvsp[0].str));
   }
-#line 5960 "util/configparser.c" /* yacc.c:1646  */
+#line 5965 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 544:
-#line 2914 "./util/configparser.y" /* yacc.c:1646  */
+  case 547:
+#line 2915 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("\nP(cachedb:)\n"));
        }
-#line 5968 "util/configparser.c" /* yacc.c:1646  */
+#line 5973 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 552:
-#line 2924 "./util/configparser.y" /* yacc.c:1646  */
+  case 555:
+#line 2925 "./util/configparser.y" /* yacc.c:1646  */
     {
        #ifdef USE_CACHEDB
                OUTYY(("P(backend:%s)\n", (yyvsp[0].str)));
@@ -5982,11 +5987,11 @@ yyreduce:
                free((yyvsp[0].str));
        #endif
        }
-#line 5986 "util/configparser.c" /* yacc.c:1646  */
+#line 5991 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 553:
-#line 2939 "./util/configparser.y" /* yacc.c:1646  */
+  case 556:
+#line 2940 "./util/configparser.y" /* yacc.c:1646  */
     {
        #ifdef USE_CACHEDB
                OUTYY(("P(secret-seed:%s)\n", (yyvsp[0].str)));
@@ -6000,11 +6005,11 @@ yyreduce:
                free((yyvsp[0].str));
        #endif
        }
-#line 6004 "util/configparser.c" /* yacc.c:1646  */
+#line 6009 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 554:
-#line 2954 "./util/configparser.y" /* yacc.c:1646  */
+  case 557:
+#line 2955 "./util/configparser.y" /* yacc.c:1646  */
     {
        #if defined(USE_CACHEDB) && defined(USE_REDIS)
                OUTYY(("P(redis_server_host:%s)\n", (yyvsp[0].str)));
@@ -6015,11 +6020,11 @@ yyreduce:
                free((yyvsp[0].str));
        #endif
        }
-#line 6019 "util/configparser.c" /* yacc.c:1646  */
+#line 6024 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 555:
-#line 2966 "./util/configparser.y" /* yacc.c:1646  */
+  case 558:
+#line 2967 "./util/configparser.y" /* yacc.c:1646  */
     {
        #if defined(USE_CACHEDB) && defined(USE_REDIS)
                int port;
@@ -6033,11 +6038,11 @@ yyreduce:
        #endif
                free((yyvsp[0].str));
        }
-#line 6037 "util/configparser.c" /* yacc.c:1646  */
+#line 6042 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 556:
-#line 2981 "./util/configparser.y" /* yacc.c:1646  */
+  case 559:
+#line 2982 "./util/configparser.y" /* yacc.c:1646  */
     {
        #if defined(USE_CACHEDB) && defined(USE_REDIS)
                OUTYY(("P(redis_timeout:%s)\n", (yyvsp[0].str)));
@@ -6049,11 +6054,11 @@ yyreduce:
        #endif
                free((yyvsp[0].str));
        }
-#line 6053 "util/configparser.c" /* yacc.c:1646  */
+#line 6058 "util/configparser.c" /* yacc.c:1646  */
     break;
 
-  case 557:
-#line 2994 "./util/configparser.y" /* yacc.c:1646  */
+  case 560:
+#line 2995 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_tcp_connection_limit:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
                if (atoi((yyvsp[0].str)) < 0)
@@ -6063,11 +6068,11 @@ yyreduce:
                                fatal_exit("out of memory adding tcp connection limit");
                }
        }
-#line 6067 "util/configparser.c" /* yacc.c:1646  */
+#line 6072 "util/configparser.c" /* yacc.c:1646  */
     break;
 
 
-#line 6071 "util/configparser.c" /* yacc.c:1646  */
+#line 6076 "util/configparser.c" /* yacc.c:1646  */
       default: break;
     }
   /* User semantic actions sometimes alter yychar, and that requires
@@ -6295,7 +6300,7 @@ yyreturn:
 #endif
   return yyresult;
 }
-#line 3004 "./util/configparser.y" /* yacc.c:1906  */
+#line 3005 "./util/configparser.y" /* yacc.c:1906  */
 
 
 /* parse helper routines could be here */
index a4fbf3ead46c2265cfff4bf9d9dc43dd05d6d4b0..0cfd77a1a9a0f5fea7a5285306b08cecfb354036 100644 (file)
@@ -384,7 +384,8 @@ rpzstart: VAR_RPZ
        ;
 contents_rpz: contents_rpz content_rpz 
        | ;
-content_rpz: auth_name | auth_zonefile | rpz_tag
+content_rpz: auth_name | auth_zonefile | rpz_tag | auth_master | auth_url |
+          auth_allow_notify
        ;
 server_num_threads: VAR_NUM_THREADS STRING_ARG 
        { 
index 7b9d5494d960ef44c619f862d57f38ee77983c91..9d21b9cc9903ba0322bb0c5b8a3b7757ceac7f72 100644 (file)
@@ -386,3 +386,83 @@ packed_rrset_copy_alloc(struct ub_packed_rrset_key* key,
        packed_rrset_ttl_add(dd, now);
        return dk;
 }
+
+int
+packed_rrset_find_rr(struct packed_rrset_data* d, uint8_t* rdata, size_t len,
+       size_t* index)
+{
+       size_t i;
+       for(i=0; i<d->count; i++) {
+               if(d->rr_len[i] != len)
+                       continue;
+               if(memcmp(d->rr_data[i], rdata, len) == 0) {
+                       *index = i;
+                       return 1;
+               }
+       }
+       return 0;
+}
+
+struct packed_rrset_data*
+packed_rrset_remove_rr(struct packed_rrset_data* old, size_t index,
+       struct regional* region)
+{
+       struct packed_rrset_data* d;
+       size_t i;
+       if(index >= old->count + old->rrsig_count)
+               return NULL; /* index out of bounds */
+       if(region)
+               d = (struct packed_rrset_data*)regional_alloc(region,
+                       packed_rrset_sizeof(old) - ( sizeof(size_t) +
+                       sizeof(uint8_t*) + sizeof(time_t) + old->rr_len[index]));
+       else
+               d = (struct packed_rrset_data*)calloc(1,
+                       packed_rrset_sizeof(old) - ( sizeof(size_t) +
+                       sizeof(uint8_t*) + sizeof(time_t) + old->rr_len[index]));
+       if(!d) {
+               log_err("malloc failure");
+               return NULL;
+       }
+       d->ttl = old->ttl;
+       d->count = old->count;
+       d->rrsig_count = old->rrsig_count;
+       if(index < d->count) d->count--;
+       else d->rrsig_count--;
+       d->trust = old->trust;
+       d->security = old->security;
+
+       /* set rr_len, needed for ptr_fixup */
+       d->rr_len = (size_t*)((uint8_t*)d +
+               sizeof(struct packed_rrset_data));
+       if(index > 0)
+               memmove(d->rr_len, old->rr_len, (index)*sizeof(size_t));
+       if(index+1 < old->count+old->rrsig_count)
+               memmove(&d->rr_len[index], &old->rr_len[index+1],
+               (old->count+old->rrsig_count - (index+1))*sizeof(size_t));
+       packed_rrset_ptr_fixup(d);
+
+       /* move over ttls */
+       if(index > 0)
+               memmove(d->rr_ttl, old->rr_ttl, (index)*sizeof(time_t));
+       if(index+1 < old->count+old->rrsig_count)
+               memmove(&d->rr_ttl[index], &old->rr_ttl[index+1],
+               (old->count+old->rrsig_count - (index+1))*sizeof(time_t));
+       
+       /* move over rr_data */
+       for(i=0; i<d->count+d->rrsig_count; i++) {
+               size_t oldi;
+               if(i < index) oldi = i;
+               else oldi = i+1;
+               memmove(d->rr_data[i], old->rr_data[oldi], d->rr_len[i]);
+       }
+
+       /* recalc ttl (lowest of remaining RR ttls) */
+       if(d->count + d->rrsig_count > 0)
+               d->ttl = d->rr_ttl[0];
+       for(i=0; i<d->count+d->rrsig_count; i++) {
+               if(d->rr_ttl[i] < d->ttl)
+                       d->ttl = d->rr_ttl[i];
+       }
+
+       return d;
+}
index 3a5335ddfa5941984db48249ff0a55cdf84aca09..cb2664c050ab1759b6d6ec707fe4f6939bfbbfa1 100644 (file)
@@ -446,4 +446,28 @@ struct ub_packed_rrset_key* packed_rrset_copy_alloc(
        struct ub_packed_rrset_key* key, struct alloc_cache* alloc, 
        time_t now);
 
+/**
+ * Find RR index in packed rrset
+ * @param d: packed rrset
+ * @param rdata: RDATA of RR to find
+ * @param len: length of rdata
+ * @param index: pointer to int to store index of found RR
+ * @return 1 if RR found, 0 otherwise
+ */
+int
+packed_rrset_find_rr(struct packed_rrset_data* d, uint8_t* rdata, size_t len,
+       size_t* index);
+
+/**
+ * Remove RR from packed rrset
+ * @param old: packed rrset containing RR to remove
+ * @param index: index of RR to remove
+ * @param region: region to use for allocation of new packet RR. Malloc used if
+ *     NULL
+ * @return pointer to newly allocated packed rrset
+ */
+struct packed_rrset_data*
+packed_rrset_remove_rr(struct packed_rrset_data* old, size_t index,
+       struct regional* region);
+
 #endif /* UTIL_DATA_PACKED_RRSET_H */
index 5ead47f0f665b511224fd58513fd7d0d721cfc7e..6873ca9ab5f8afbb53563b6a3bea5637f963abca 100644 (file)
 8805,
 8807,
 8808,
+8809,
 8873,
 8880,
 8883,